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

177 lines
4.9 KiB
Python
Executable File

import os.path
import numpy as np
import itertools
import Tools
import statsmodels.tsa.stattools
# 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 autocorr(x):
result = np.correlate(x, x, mode='full')
return result[result.size//2:]
def writeTests(config,format):
config.setOverwrite(False)
NBSAMPLES=128
inputsA=np.random.randn(NBSAMPLES)
inputsB=np.random.randn(NBSAMPLES)
inputsA = Tools.normalize(inputsA)
inputsB = Tools.normalize(inputsB)
if format==31:
# To avoid overflow. There is no saturation in CMSIS code for Q31 conv/corr
inputsA = inputsA / 16
inputsB = inputsB / 16
config.writeInput(1, inputsA,"InputsA")
config.writeInput(1, inputsB,"InputsB")
if format == 15:
nbs = [(14, 15), (14, 16), (14, 17), (14, 18), (14, 33), (15, 15),
(15, 16), (15, 17), (15, 18), (15, 33), (16, 15), (16, 16),
(16, 17), (16, 18), (16, 33), (17, 15), (17, 16), (17, 17),
(17, 18), (17, 33), (32, 15), (32, 16), (32, 17), (32, 18), (32, 33)]
elif format == 7 :
nbs = [(30, 31), (30, 32), (30, 33), (30, 34), (30, 49), (31, 31),
(31,32), (31, 33), (31, 34), (31, 49), (32, 31), (32, 32),
(32, 33), (32,34), (32, 49), (33, 31), (33, 32), (33, 33), (33, 34),
(33, 49), (48,31), (48, 32), (48, 33), (48, 34), (48, 49)]
else:
nbs = [(4, 1), (4, 2), (4, 3), (4, 8), (4, 11), (5, 1), (5, 2), (5, 3), (5, 8), (5, 11), (6, 1), (6, 2), (6, 3), (6, 8), (6, 11), (9, 1), (9, 2),
(9, 3), (9, 8), (9, 11), (10, 1), (10, 2), (10, 3), (10, 8), (10, 11), (11, 1), (11, 2), (11, 3), (11, 8), (11, 11), (12, 1), (12, 2),
(12, 3), (12, 8), (12, 11), (13, 1), (13, 2), (13, 3), (13, 8), (13, 11)]
nbTest = 1
for (na,nb) in nbs:
#print(na,nb)
ref = np.correlate(inputsA[0:na],inputsB[0:nb],"full")
if na > nb:
padding = na - nb
z = np.zeros(padding)
ref = np.concatenate((z,ref))
else:
padding = nb - na
z = np.zeros(padding)
ref = np.concatenate((ref,z))
config.writeReference(nbTest, ref)
nbTest = nbTest + 1
for (na,nb) in nbs:
#print(na,nb)
ref = np.convolve(inputsA[0:na],inputsB[0:nb],"full")
config.writeReference(nbTest, ref)
nbTest = nbTest + 1
# Levinson durbin tests
a = [Tools.loopnb(format,Tools.TAILONLY),
Tools.loopnb(format,Tools.BODYONLY),
Tools.loopnb(format,Tools.BODYANDTAIL),
]
a = list(np.unique(np.array(a)))
#a = [3]
# Errors of each levinson durbin test
err=[]
errTestID = nbTest
for na in a:
s = np.random.randn(na+1)
s = Tools.normalize(s)
phi = autocorr(s)
phi = Tools.normalize(phi)
config.writeInput(nbTest, phi,"InputPhi")
sigmav,arcoef,pacf,sigma,phi=statsmodels.tsa.stattools.levinson_durbin(phi,nlags=na,isacov=True)
err.append(sigmav)
config.writeReference(nbTest, arcoef)
nbTest = nbTest + 1
config.writeReference(errTestID, err,"LDErrors")
# Partial convolutions
config.setOverwrite(True)
inputsA=np.random.randn(NBSAMPLES)
inputsB=np.random.randn(NBSAMPLES)
inputsA = Tools.normalize(inputsA)
inputsB = Tools.normalize(inputsB)
config.writeInput(2, inputsA,"InputsA")
config.writeInput(2, inputsB,"InputsB")
(na,nb) = (6, 8)
# First = 3
numPoints=4
ref = np.convolve(inputsA[0:na],inputsB[0:nb],"full")
first=3
config.writeReference(nbTest, ref[first:first+numPoints])
nbTest = nbTest + 1
first=9
config.writeReference(nbTest, ref[first:first+numPoints])
nbTest = nbTest + 1
first=7
config.writeReference(nbTest, ref[first:first+numPoints])
nbTest = nbTest + 1
def generatePatterns():
PATTERNDIR = os.path.join("Patterns","DSP","Filtering","MISC","MISC")
PARAMDIR = os.path.join("Parameters","DSP","Filtering","MISC","MISC")
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()