147 lines
4.4 KiB
Python
Executable File
147 lines
4.4 KiB
Python
Executable File
import os.path
|
|
import numpy as np
|
|
import itertools
|
|
import Tools
|
|
from scipy.interpolate import interp1d,interp2d,CubicSpline
|
|
|
|
# Those patterns are used for tests and benchmarks.
|
|
# For tests, there is the need to add tests for saturation
|
|
|
|
# Get lists of points in row order for use in CMSIS function
|
|
def getLinearPoints(x,y):
|
|
return(np.array([[p[1],p[0]] for p in np.array(np.meshgrid(y,x)).T.reshape(-1,2)]))
|
|
|
|
def writeTests(config,format):
|
|
# Linear interpolation test
|
|
NBSAMPLES=40
|
|
|
|
x = np.linspace(0, NBSAMPLES, num=NBSAMPLES+1, endpoint=True)
|
|
y = np.cos(-x**2/(NBSAMPLES - 1))
|
|
f = interp1d(x, y)
|
|
data=x+0.5
|
|
data=data[:-1]
|
|
z = f(data)
|
|
|
|
if format != 0 and format != 16:
|
|
data = data / 2.0**11
|
|
if format != 0 and format != 16:
|
|
config.writeInputQ31(1, data,"Input")
|
|
else:
|
|
config.writeInput(1, data)
|
|
config.writeInput(1, y,"YVals")
|
|
|
|
ref = z
|
|
config.writeReference(1, ref)
|
|
|
|
# Bilinear interpolation test
|
|
x = np.arange(-3.14, 3.14, 1.0)
|
|
y = np.arange(-3.14, 3.14, 0.8)
|
|
xx, yy = np.meshgrid(x, y)
|
|
z = np.sin(xx**2+yy**2)
|
|
f = interp2d(x, y, z, kind='linear')
|
|
|
|
|
|
# Configuration for the test (to initialize the bilinear structure)
|
|
matrixSize=[np.size(x),np.size(y)]
|
|
|
|
# Generate reference value for bilinear instance
|
|
# getLinearPoints ensure they are in row order
|
|
samples = getLinearPoints(x,y)
|
|
# We recompute the value of the function on the samples in row
|
|
# order
|
|
yvals = np.array([np.sin(i[0]**2+i[1]**2) for i in samples])
|
|
|
|
|
|
# Now we generate other points. The points where we want to evaluate
|
|
# the function.
|
|
# In Python they must be rescale between -3.14 and tghe max x or max y defined above.
|
|
# In CMSIS they will be between 1 and numRow-1 or numCols-1.
|
|
# Since we add 0.5 to be sure we are between grid point, we use
|
|
# numCols-2 as bound to be sured we are <= numCols-1
|
|
numCols = np.size(x)
|
|
numRows = np.size(y)
|
|
|
|
NBX = 10
|
|
NBY = 15
|
|
|
|
# The CMSIS indexes
|
|
ix = np.linspace(0, numCols-3, num=NBX, endpoint=True)+0.5
|
|
iy = np.linspace(0, numRows-3, num=NBY, endpoint=True)+0.5
|
|
|
|
|
|
# The corresponding Python values
|
|
ixVal = ((ix ) / (numCols-1)) * (x[-1] + 3.14) - 3.14
|
|
iyVal = ((iy ) / (numRows-1)) * (y[-1] + 3.14) - 3.14
|
|
|
|
# Input samples for CMSIS.
|
|
inputSamples = getLinearPoints(ix,iy)
|
|
|
|
# We compute the Python interpolated function on the values
|
|
inputVals = getLinearPoints(ixVal,iyVal)
|
|
ref=np.array([f(i[0],i[1]) for i in inputVals])
|
|
|
|
|
|
if format != 0 and format != 16:
|
|
inputSamples = inputSamples / 2.0**11
|
|
data = inputSamples.reshape(np.size(inputSamples))
|
|
if format != 0 and format != 16:
|
|
config.writeInputQ31(2, data,"Input")
|
|
else:
|
|
config.writeInput(2, data)
|
|
|
|
config.writeInput(2, yvals.reshape(np.size(yvals)),"YVals")
|
|
config.writeReference(2, ref.reshape(np.size(ref)))
|
|
config.writeInputS16(2, matrixSize,"Config")
|
|
|
|
|
|
|
|
x = [0,3,10,20]
|
|
config.writeInput(3,x,"InputX")
|
|
y = [0,9,100,400]
|
|
config.writeInput(3,y,"InputY")
|
|
xnew = np.arange(0,20,1)
|
|
config.writeInput(3,xnew,"OutputX")
|
|
ynew = CubicSpline(x,y)
|
|
config.writeReference(3, ynew(xnew))
|
|
|
|
x = np.arange(0, 2*np.pi+np.pi/4, np.pi/4)
|
|
config.writeInput(4,x,"InputX")
|
|
y = np.sin(x)
|
|
config.writeInput(4,y,"InputY")
|
|
xnew = np.arange(0, 2*np.pi+np.pi/16, np.pi/16)
|
|
config.writeInput(4,xnew,"OutputX")
|
|
ynew = CubicSpline(x,y,bc_type="natural")
|
|
config.writeReference(4, ynew(xnew))
|
|
|
|
x = [0,3,10]
|
|
config.writeInput(5,x,"InputX")
|
|
y = x
|
|
config.writeInput(5,y,"InputY")
|
|
xnew = np.arange(-10,20,1)
|
|
config.writeInput(5,xnew,"OutputX")
|
|
ynew = CubicSpline(x,y)
|
|
config.writeReference(5, ynew(xnew))
|
|
|
|
|
|
|
|
|
|
def generatePatterns():
|
|
PATTERNDIR = os.path.join("Patterns","DSP","Interpolation","Interpolation")
|
|
PARAMDIR = os.path.join("Parameters","DSP","Interpolation","Interpolation")
|
|
|
|
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")
|
|
|
|
writeTests(configf32,0)
|
|
writeTests(configf16,16)
|
|
writeTests(configq31,31)
|
|
writeTests(configq15,15)
|
|
writeTests(configq7,7)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
generatePatterns()
|