You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.3 KiB
Python
117 lines
2.3 KiB
Python
# New functions for version 1.4 of the Python wrapper
|
|
import cmsisdsp as dsp
|
|
import cmsisdsp.fixedpoint as f
|
|
import numpy as np
|
|
import math
|
|
import colorama
|
|
from colorama import init,Fore, Back, Style
|
|
|
|
init()
|
|
|
|
def printTitle(s):
|
|
print("\n" + Fore.GREEN + Style.BRIGHT + s + Style.RESET_ALL)
|
|
|
|
def printSubTitle(s):
|
|
print("\n" + Style.BRIGHT + s + Style.RESET_ALL)
|
|
|
|
printTitle("ArcTan2")
|
|
|
|
angles=[0,
|
|
math.pi/4,
|
|
math.pi/2,
|
|
3*math.pi/4,
|
|
math.pi,
|
|
5*math.pi/4,
|
|
3*math.pi/2,
|
|
7*math.pi/4
|
|
]
|
|
|
|
x = np.cos(angles)
|
|
y = np.sin(angles)
|
|
|
|
vals=list(zip(y,x))
|
|
|
|
printSubTitle("Atan2 Reference")
|
|
ref=np.array([np.arctan2(yv,xv) for (yv,xv) in vals])/math.pi*180
|
|
print(ref)
|
|
|
|
printSubTitle("Atan2 F32")
|
|
resf32=np.array([dsp.arm_atan2_f32(yv,xv)[1] for (yv,xv) in vals])/math.pi*180
|
|
print(resf32)
|
|
print(np.isclose(ref,resf32,1e-6,1e-6))
|
|
|
|
printSubTitle("Atan2 Q31")
|
|
xQ31=f.toQ31(x)
|
|
yQ31=f.toQ31(y)
|
|
valsQ31=list(zip(yQ31,xQ31))
|
|
|
|
resq31=4*f.Q31toF32(np.array([dsp.arm_atan2_q31(yv,xv)[1] for (yv,xv) in valsQ31]))/math.pi*180
|
|
print(resq31)
|
|
print(np.isclose(ref,resq31,1e-8,1e-8))
|
|
|
|
printSubTitle("Atan2 Q15")
|
|
xQ15=f.toQ15(x)
|
|
yQ15=f.toQ15(y)
|
|
valsQ15=list(zip(yQ15,xQ15))
|
|
|
|
resq15=4*f.Q15toF32(np.array([dsp.arm_atan2_q15(yv,xv)[1] for (yv,xv) in valsQ15]))/math.pi*180
|
|
print(resq15)
|
|
print(np.isclose(ref,resq15,1e-3,1e-3))
|
|
|
|
printTitle("MSE")
|
|
|
|
NBSAMPLES = 50
|
|
|
|
def mse(a,b):
|
|
err = a - b
|
|
return(np.dot(err,err) / len(a))
|
|
|
|
a=np.random.randn(NBSAMPLES)
|
|
a = a / np.max(np.abs(a))
|
|
|
|
b=np.random.randn(NBSAMPLES)
|
|
b = b / np.max(np.abs(b))
|
|
|
|
printSubTitle("MSE Reference")
|
|
ref = mse(a,b)
|
|
print(ref)
|
|
|
|
printSubTitle("MSE f64")
|
|
resf64= dsp.arm_mse_f64(a,b)
|
|
print(resf64)
|
|
print(np.isclose(ref,resf64,1e-14,1e-14))
|
|
|
|
printSubTitle("MSE f32")
|
|
resf32 = dsp.arm_mse_f32(a,b)
|
|
print(resf32)
|
|
print(np.isclose(ref,resf32,1e-7,1e-7))
|
|
|
|
printSubTitle("MSE Q31")
|
|
aQ31 = f.toQ31(a)
|
|
bQ31 = f.toQ31(b)
|
|
|
|
resQ31 = f.Q31toF32(dsp.arm_mse_q31(aQ31,bQ31))
|
|
print(resQ31)
|
|
print(np.isclose(ref,resQ31,1e-7,1e-7))
|
|
|
|
aQ15 = f.toQ15(a)
|
|
bQ15 = f.toQ15(b)
|
|
|
|
printSubTitle("MSE Q15")
|
|
resQ15 = dsp.arm_mse_q15(aQ15,bQ15)
|
|
print("%04X" % resQ15)
|
|
resQ15 = f.Q15toF32(resQ15)
|
|
print(resQ15)
|
|
print(np.isclose(ref,resQ15,1e-4,1e-4))
|
|
|
|
aQ7 = f.toQ7(a)
|
|
bQ7 = f.toQ7(b)
|
|
|
|
printSubTitle("MSE Q7")
|
|
resQ7 = dsp.arm_mse_q7(aQ7,bQ7)
|
|
print("%04X" % resQ7)
|
|
resQ7 = f.Q7toF32(resQ7)
|
|
print(resQ7)
|
|
print(np.isclose(ref,resQ7,1e-2,1e-2))
|
|
|