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 <[email protected]> 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
> [email protected]
> 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
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user