| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- 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
- # 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 writeTests(config,format):
- NBSAMPLES=256
- NUMTAPS = 64
- samples=np.random.randn(NBSAMPLES)
- refs=np.random.randn(NBSAMPLES)
- taps=np.random.randn(NUMTAPS)
- samples = Tools.normalize(samples)
- refs = Tools.normalize(refs)
- taps = Tools.normalize(taps)
-
- ### For benchmarks
- config.writeInput(1, samples,"Samples")
- config.writeInput(1, taps,"Coefs")
- config.writeInput(1, refs,"Refs")
- ### For tests
- # blocksize 1 2 3 8 11
- # taps 1 2 3 4 5 6 7 8 11 25
- # state numTaps + blockSize - 1
- # ref blockSize
- # Maximum number of samples for all tested FIR configurations is 2*23
- t = np.linspace(0, 1, 2*23)
- x = np.sin(2*np.pi*50*t)+np.random.randn(len(t)) * 0.08
- x = Tools.normalize(x)
- # To avoid saturation
- x = x / 30.0
-
- config.writeInput(1, x,"FirInput")
- tapConfigs=[]
- output=[]
- defs=[]
- if format == Tools.F64 or format == 0 or format == 31:
- blk = [1, 2, 3, 8, 9,10,11, 16, 23]
- taps = [1, 2, 3, 4, 5, 6, 7, 8, 11, 16, 23, 25]
- elif format == 15 or format == 16:
- blk = [1, 2, 3, 12,13,14,15]
- taps = [2, 3, 4, 5, 6, 7, 8, 11, 25]
- elif format == 7:
- blk = [1, 2, 3 ,20,21,22,23]
- taps = [1, 2, 3, 4, 5, 6, 7, 8, 11, 25]
- configs = cartesian(blk,taps)
- nb=1
- for (b,t) in configs:
- nbTaps=t
- # nbTaps + 2 to be sure all coefficients are not saturated
- pythonCoefs = np.array(list(range(1,nbTaps+1)))/(1.0*(nbTaps+2))
- coefs=pythonCoefs
- if format == 15:
- if t % 2 == 1:
- nbTaps = nbTaps + 1
- coefs = np.append(coefs,[0.0])
-
- out=signal.lfilter(pythonCoefs,[1.0],x[0:2*b])
- output += list(out)
- coefs = list(coefs)
- coefs.reverse()
- tapConfigs += coefs
- defs += [b,nbTaps]
- nb = nb + 1
- config.writeInput(1, output,"FirRefs")
- config.writeInput(1, tapConfigs,"FirCoefs")
- config.writeReferenceS16(1,defs,"FirConfigs")
-
- def generatePatterns():
- PATTERNDIR = os.path.join("Patterns","DSP","Filtering","FIR","FIR")
- PARAMDIR = os.path.join("Parameters","DSP","Filtering","FIR","FIR")
-
- 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")
-
- configf32.setOverwrite(False)
- configf16.setOverwrite(False)
- configq31.setOverwrite(False)
- configq15.setOverwrite(False)
- configq7.setOverwrite(False)
-
- writeTests(configf64,Tools.F64)
- writeTests(configf32,0)
- writeTests(configf16,16)
- writeTests(configq31,31)
- writeTests(configq15,15)
- writeTests(configq7,7)
- if __name__ == '__main__':
- generatePatterns()
|