124 lines
3.3 KiB
Python
Executable File
124 lines
3.3 KiB
Python
Executable File
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()
|