Hello Hannu, I have a python module that can reads ngspice data and export arbitrary vector to PWL source. I'm using it for quite long time. If You have any questions then please let me know.
I remember that I was using it to auto optimize a circuit: run ngspice from python, import it's data, perform a computation of a new waveform, export it then run ngspice again and so on. I think that I might be able to find this work as an example if You are interested. I hope this will help, Michael W. Dnia 12 września 2011 23:09 Hannu Vuolasaho <vuo...@msn.com> napisał(a): > > Hi! > > I have been playing with one guitar amplifier project for a while and so far > the amplifier design has been more or less copy and paste and simulate and > guess from graphs. However I bumped in net this blog post > > http://nordicnerd.blogspot.com/2011/08/active-speakers-spice-with-actual-audio.html > > Is it possible to do same thing? Input wav to simulator and get speaker's > output and hear it? I know it's not perfect but it could be very helpful. Has > someone done this before and provide some hints, examples or links? > > Best regards, > Hannu Vuolasaho > > > > _______________________________________________ > geda-user mailing list > geda-user@moria.seul.org > http://www.seul.org/cgi-bin/mailman/listinfo/geda-user >
#!/usr/bin/env python #NgSpice import / export import numpy, pylab import string, os, tempfile def fromng(file): """ Import ngspice file to dictionary tuple = fromng(file) """ ngimport = {} fng = open(file, 'r') #opens file while True: line = fng.readline() line = line.split() ltype = string.lower(line[0]) if ltype.find("title") != -1: ngimport.update(title = string.join(line[1:])) #title elif ltype.find("date") != -1: ngimport.update(date = string.join(line[1:])) #date elif ltype.find("plotname") != -1: ngimport.update(plot_name = string.join(line[1:])) #plot name elif ltype.find("flags") != -1: ngimport.update(flags = string.join(line[1:])) #flags elif ltype.find("no.") != -1: if string.lower(line[1]).find("variables") != -1: ngimport.update(no_variables = int(line[2])) #number of variables elif string.lower(line[1]).find("points") != -1: ngimport.update(no_points = int(line[2])) #number of points elif ltype.find("variables") != -1: vnames = [] for i in range(ngimport["no_variables"]): line = fng.readline() vnames.append(line.split()[1:]) #add variable name elif ltype.find("binary") != -1: break #now jump to binary data dat = numpy.fromfile(fng, 'd', ngimport["no_variables"]*ngimport["no_points"], '') #read all binary data fng.close() for i, var in enumerate(vnames): #create output tuple keys ngimport.update({var[0]: dat[i:len(dat):ngimport["no_variables"]]}) print var return ngimport #--------------------------------------------------------------------------------------------------- def fromHP(file, comment='%', delim=' '): """Reads file from HP oscilloscope data file""" data = pylab.load(file, comment,delim) chans = data.shape[1] #load file and extract number of collumns scopeimport = {"time": data[:,0]} #write time scopeimport["time"] = scopeimport["time"] - min(scopeimport["time"]) #fix time (move from negative) for i in range(1, chans): scopeimport.update({'ch%1d'%i: data[:,i]}) #add channels entry print 'ch%1d'%i print "Points %d"%len(scopeimport['ch1']) return scopeimport #---------------------------------------------------------------------------------------------------- def fromMET(file): """Reads file Metrix scope TXT file""" fmet = open(file, 'r') dt = float(fmet.readline().split()[1]) unit = fmet.readline() fmet.close() scopeimport = {"ch1": pylab.load(file, skiprows=2)} scopeimport["time"] = pylab.linspace(0, dt*2500, num=2500, endpoint=False) print "Points %d, %s"%(len(scopeimport["ch1"]), unit) return scopeimport #---------------------------------------------------------------------------------------------------- def topwl(file, time, data, subckt="pwlsource"): """Export data array (time, values) to PWL ngspice source""" fpwl = open(file, 'w') dstr = "*crated by topwl\n*number of points: %d\n.SUBCKT "%len(time) +subckt+ " 1 2\nV1 1 2 PWL\n" #header for t, d in zip(time, data): dstr = dstr + "+" + str(t) + " " + str(d) + "\n" dstr = dstr + ".ENDS\n" fpwl.write(dstr) fpwl.close() print "Written %d points to %s"%(len(time),file) return #---------------------------------------------------------------------------------------------------- def runng(cirfile): """Runs ngspice and loads returned data""" tmpcir = tempfile.mkstemp() fcir = open(cirfile, 'r') line = "*\n" iswrite = False while line: line = fcir.readline() if line[0] == '*': continue if line.find("write") != -1: #find where write directive is iswrite = True outfile = line.split()[1] #assume that write is first word break print "Running ngspice.... simulating %s"%cirfile os.system("libprm -n %s %s"%(cirfile, tmpcir[1])) #get libs and subckts os.system("ngspice %s"%tmpcir[1]) os.close(tmpcir[0]) os.remove(tmpcir[1]) if iswrite == True: print "Reading results from %s"%outfile out = fromng(outfile) return out print "No write directive found" return #---------------------------------------------------------------------------------------------------- if __name__ == "__main__": dat = fromng("test.dat") print dat.keys() print len(dat)
_______________________________________________ geda-user mailing list geda-user@moria.seul.org http://www.seul.org/cgi-bin/mailman/listinfo/geda-user