RMUL2025/lib/cmsis_5/CMSIS/DSP/Testing/PatternGeneration/FIR.py

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()