| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- import os.path
- import numpy as np
- import itertools
- import Tools
- from scipy import signal
- #from pylab import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show,semilogx, semilogy
- import math
- # Those patterns are used for tests and benchmarks.
- # For tests, there is the need to add tests for saturation
- def cartesian(*somelists):
- r=[]
- for element in itertools.product(*somelists):
- r.append(element)
- return(r)
- def writeBenchmarks(config):
- NBSAMPLES=512 # 512 for stereo
- NUMSTAGES = 4
- samples=np.random.randn(NBSAMPLES)
- coefs=np.random.randn(NUMSTAGES*5)
- samples = Tools.normalize(samples)
- coefs = Tools.normalize(coefs)
-
- # Used for benchmarks
- config.writeInput(1, samples,"Samples")
- config.writeInput(1, coefs,"Coefs")
- def getCoefs(n,sos,format):
- if format==15:
- coefs=np.reshape(np.hstack((np.insert(sos[:,:3],1,0.0,axis=1),-sos[:,4:])),n*6)
- else:
- coefs=np.reshape(np.hstack((sos[:,:3],-sos[:,4:])),n*5)
-
- if format==31:
- # Postshift must be 2 in the tests
- coefs = coefs / 4.0
- if format==15:
- # Postshift must be 2 in the tests
- coefs = coefs / 4.0
- return(coefs)
- def genSos(numTaps):
- zeros=[]
- poles=[]
- for i in range(0,numTaps):
- phase = np.random.rand()*2.0 * math.pi
- z = np.exp(1j*phase)
- phase = np.random.rand()*2.0 * math.pi
- amplitude = np.random.rand()*0.7
- p = np.exp(1j*phase) * amplitude
- zeros += [z,np.conj(z)]
- poles += [p,np.conj(p)]
-
- g = 0.02
- sos = signal.zpk2sos(zeros,poles,g)
- return(sos)
- def writeTests(config,format):
- # Write test with fixed and known patterns
- NB = 100
- t = np.linspace(0, 1,NB)
- sig = Tools.normalize(np.sin(2*np.pi*5*t)+np.random.randn(len(t)) * 0.2 + 0.4*np.sin(2*np.pi*20*t))
- if format==31:
- sig = 1.0*sig / (1 << 2)
- #if format==15:
- # sig = 1.0*sig / 2.0
- p0 = np.exp(1j*0.05) * 0.98
- p1 = np.exp(1j*0.25) * 0.9
- p2 = np.exp(1j*0.45) * 0.97
-
- z0 = np.exp(1j*0.02)
- z1 = np.exp(1j*0.65)
- z2 = np.exp(1j*1.0)
-
- g = 0.02
-
- sos = signal.zpk2sos(
- [z0,np.conj(z0),z1,np.conj(z1),z2,np.conj(z2)]
- ,[p0, np.conj(p0),p1, np.conj(p1),p2, np.conj(p2)]
- ,g)
- coefs=getCoefs(3,sos,format)
-
- res=signal.sosfilt(sos,sig)
- config.writeInput(1, sig,"BiquadInput")
- config.writeInput(1, res,"BiquadOutput")
- config.writeInput(1, coefs,"BiquadCoefs")
- #if format==0:
- # figure()
- # plot(sig)
- # figure()
- # plot(res)
- # show()
- # Now random patterns to test different tail sizes
- # and number of loops
- numStages = [Tools.loopnb(format,Tools.TAILONLY),
- Tools.loopnb(format,Tools.BODYONLY),
- Tools.loopnb(format,Tools.BODYANDTAIL)
- ]
- blockSize=[Tools.loopnb(format,Tools.TAILONLY),
- Tools.loopnb(format,Tools.BODYONLY),
- Tools.loopnb(format,Tools.BODYANDTAIL)
- ]
- allConfigs = cartesian(numStages, blockSize)
-
- allconf=[]
- allcoefs=[]
- allsamples=[]
- allStereo=[]
- alloutputs=[]
- allStereoOutputs=[]
- for (n,b) in allConfigs:
- samples=np.random.randn(b)
- samples = Tools.normalize(samples)
- samplesB=np.random.randn(b)
- samplesB = Tools.normalize(samplesB)
- stereo = np.empty((samples.size + samplesB.size,), dtype=samples.dtype)
- stereo[0::2] = samples
- stereo[1::2] = samplesB
- sos = genSos(n)
- coefs=getCoefs(n,sos,format)
-
- output=signal.sosfilt(sos,samples)
- outputB=signal.sosfilt(sos,samplesB)
- stereoOutput = np.empty((output.size + outputB.size,), dtype=output.dtype)
- stereoOutput[0::2] = output
- stereoOutput[1::2] = outputB
- allStereoOutputs += list(stereoOutput)
- alloutputs += list(output)
- allconf += [n,b]
- allcoefs += list(coefs)
- allsamples += list(samples)
- allStereo += list(stereo)
- config.writeReferenceS16(2,allconf,"AllBiquadConfigs")
- config.writeInput(2,allsamples,"AllBiquadInputs")
- config.writeInput(2,allcoefs,"AllBiquadCoefs")
- config.writeReference(2,alloutputs,"AllBiquadRefs")
- # Stereo version only for floats
- if format==0 or format==16:
- config.writeInput(2,allStereo,"AllBiquadStereoInputs")
- config.writeReference(2,allStereoOutputs,"AllBiquadStereoRefs")
-
- def generatePatterns():
- PATTERNDIR = os.path.join("Patterns","DSP","Filtering","BIQUAD","BIQUAD")
- PARAMDIR = os.path.join("Parameters","DSP","Filtering","BIQUAD","BIQUAD")
-
- configf64=Tools.Config(PATTERNDIR,PARAMDIR,"f64")
- configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
- configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
- configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
- configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
- #configq7=Tools.Config(PATTERNDIR,PARAMDIR,"q7")
-
-
-
- writeBenchmarks(configf32)
- writeBenchmarks(configf16)
- writeBenchmarks(configq31)
- writeBenchmarks(configq15)
- writeBenchmarks(configf64)
- writeTests(configf32,0)
- writeTests(configf16,16)
- writeTests(configq31,31)
- writeTests(configq15,15)
- writeTests(configf64,64)
-
- #writeTests(configq7)
- if __name__ == '__main__':
- generatePatterns()
|