| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 |
- import cmsisdsp as dsp
- import numpy as np
- from scipy import signal
- from scipy.fftpack import dct
- import cmsisdsp.fixedpoint as f
- from pyquaternion import Quaternion
- import colorama
- from colorama import init,Fore, Back, Style
- import statsmodels.tsa.stattools
- import scipy.spatial
- 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)
- def imToReal2D(a):
- ar=np.zeros(np.array(a.shape) * [1,2])
- ar[::,0::2]=a.real
- ar[::,1::2]=a.imag
- return(ar)
- def realToIm2D(ar):
- return(ar[::,0::2] + 1j * ar[::,1::2])
- def normalize(a):
- return(a/np.max(np.abs(a)))
- def autocorr(x):
- result = np.correlate(x, x, mode='full')
- return result[result.size//2:]
- #################### MAX AND ABSMAX ##################################
- printTitle("Max and AbsMax")
- a=np.array([1.,-3.,4.,0.,-10.,8.])
- printSubTitle("Float tests")
- i=dsp.arm_max_f32(a)
- print(i)
- i=dsp.arm_absmax_f32(a)
- print(i)
- printSubTitle("Fixed point tests")
- # Normalize for fixed point tests
- a = a / i[0]
- a31 = f.toQ31(a)
- i=dsp.arm_absmax_q31(a31)
- print(f.Q31toF32(i[0]),i[1])
- a15 = f.toQ15(a)
- i=dsp.arm_absmax_q15(a15)
- print(f.Q15toF32(i[0]),i[1])
- a7 = f.toQ7(a)
- i=dsp.arm_absmax_q7(a7)
- print(f.Q7toF32(i[0]),i[1])
- ################### MIN AND ABSMIN ################################
- printTitle("Min and AbsMin")
- a=np.array([1.,-3.,4.,0.5,-10.,8.])
- printSubTitle("Float tests")
- i=dsp.arm_min_f32(a)
- print(i)
- i=dsp.arm_absmin_f32(a)
- print(i)
- printSubTitle("Fixed point tests")
- # Normalize for fixed point tests
- idx=i[1]
- i=dsp.arm_absmax_f32(a)
- a = a / i[0]
- print(a)
- print(a[idx])
- a31 = f.toQ31(a)
- i=dsp.arm_absmin_q31(a31)
- print(f.Q31toF32(i[0]),i[1])
- a8 = f.toQ15(a)
- i=dsp.arm_absmin_q15(a8)
- print(f.Q15toF32(i[0]),i[1])
- a7 = f.toQ7(a)
- i=dsp.arm_absmin_q7(a7)
- print(f.Q7toF32(i[0]),i[1])
- ##################### CLIPPING ###################
- printTitle("Clipping tests tests")
- a=np.array([1.,-3.,4.,0.5,-10.,8.])
- i=dsp.arm_absmax_f32(a)
- minBound =-5.0
- maxBound =6.0
- b=dsp.arm_clip_f32(a,minBound,maxBound)
- print(a)
- print(b)
- a = a / i[0]
- print(a)
- minBound = minBound / i[0]
- maxBound = maxBound / i[0]
- print(minBound,maxBound)
- b=dsp.arm_clip_q31(f.toQ31(a),f.toQ31(minBound),f.toQ31(maxBound))
- print(f.Q31toF32(b))
- b=dsp.arm_clip_q15(f.toQ15(a),f.toQ15(minBound),f.toQ15(maxBound))
- print(f.Q15toF32(b))
- b=dsp.arm_clip_q7(f.toQ7(a),f.toQ7(minBound),f.toQ7(maxBound))
- print(f.Q7toF32(b))
- ############### MAT VECTOR MULT
- printTitle("Matrix x Vector")
- a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
- b=np.array([-2,-1,3,4])
- c = np.dot(a,b)
- print(c)
- c = dsp.arm_mat_vec_mult_f32(a,b)
- print(c)
- printSubTitle("Fixed point")
- normalizationFactor=2.0*np.sqrt(np.max(np.abs(c)))
- a=a/normalizationFactor
- b=b/normalizationFactor
- print(np.dot(a,b))
- c=dsp.arm_mat_vec_mult_q31(f.toQ31(a),f.toQ31(b))
- print(f.Q31toF32(c))
- c=dsp.arm_mat_vec_mult_q15(f.toQ15(a),f.toQ15(b))
- print(f.Q15toF32(c))
- c=dsp.arm_mat_vec_mult_q7(f.toQ7(a),f.toQ7(b))
- print(f.Q7toF32(c))
- ############### MATRIX MULTIPLY
- printTitle("Matrix x Matrix")
- a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
- b=np.array([[1.,2,3],[5.1,6,7],[9.1,10,11],[5,8,4]])
- print(np.dot(a , b))
- c=dsp.arm_mat_mult_f32(a,b)
- print(c[1])
- printSubTitle("Fixed point")
- printSubTitle(" F32")
- normalizationFactor=2.0*np.sqrt(np.max(np.abs(c[1])))
- a = a / normalizationFactor
- b = b / normalizationFactor
- c=dsp.arm_mat_mult_f32(a,b)
- print(c[1])
- print("")
- af = f.toQ31(a)
- bf = f.toQ31(b)
- nbSamples = a.size
- tmp=np.zeros(nbSamples)
- c1 = dsp.arm_mat_mult_q31(af,bf)
- c2 = dsp.arm_mat_mult_opt_q31(af,bf,tmp)
- printSubTitle(" Q31")
- print(f.Q31toF32(c1[1]))
- print(f.Q31toF32(c2[1]))
- printSubTitle(" Q15")
- print("")
- af = f.toQ15(a)
- bf = f.toQ15(b)
- s=bf.shape
- nb=s[0]*s[1]
- tmp=np.zeros(nb)
- c = dsp.arm_mat_mult_q15(af,bf,tmp)
- print(f.Q15toF32(c[1]))
- printSubTitle(" Q7")
- print("")
- af = f.toQ7(a)
- bf = f.toQ7(b)
- s=bf.shape
- nb=s[0]*s[1]
- tmp=np.zeros(nb)
- c = dsp.arm_mat_mult_q7(af,bf,tmp)
- print(f.Q7toF32(c[1]))
- ################# MAT TRANSPOSE #################
- printTitle("Transposition")
- a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
- normalizationFactor=np.max(np.abs(c[1]))
- a = a / normalizationFactor
- print(np.transpose(a))
- print("")
- r=dsp.arm_mat_trans_f32(a)
- print(r[1])
- print("")
- r=dsp.arm_mat_trans_q31(f.toQ31(a))
- print(f.Q31toF32(r[1]))
- print("")
- r=dsp.arm_mat_trans_q15(f.toQ15(a))
- print(f.Q15toF32(r[1]))
- print("")
- r=dsp.arm_mat_trans_q7(f.toQ7(a))
- print(f.Q7toF32(r[1]))
- print("")
- ################## FILL FUNCTIONS #################
- v=0.22
- nb=10
- a=np.full((nb,),v)
- print(a)
- a=dsp.arm_fill_f32(v,nb)
- print(a)
- a=f.Q31toF32(dsp.arm_fill_q31(f.toQ31(v),nb))
- print(a)
- a=f.Q15toF32(dsp.arm_fill_q15(f.toQ15(v),nb))
- print(a)
- a=f.Q7toF32(dsp.arm_fill_q7(f.toQ7(v),nb))
- print(a)
- ################# COMPLEX MAT TRANSPOSE #################
- printTitle("Complex Transposition")
- a=np.array([[1. + 0.0j ,2 + 1.0j,3 + 0.0j,4 + 2.0j],
- [5 + 1.0j,6 + 2.0j,7 + 3.0j,8 + 1.0j],
- [9 - 2.0j,10 + 1.0j,11 - 4.0j,12 + 1.0j]])
- normalizationFactor=np.max(np.abs(c[1]))
- a = a / normalizationFactor
- print(np.transpose(a))
- print("")
- r=dsp.arm_mat_cmplx_trans_f32(imToReal2D(a))
- print(realToIm2D(r[1]))
- print("")
- r=dsp.arm_mat_cmplx_trans_q31(f.toQ31(imToReal2D(a)))
- print(realToIm2D(f.Q31toF32(r[1])))
- print("")
- r=dsp.arm_mat_cmplx_trans_q15(f.toQ15(imToReal2D(a)))
- print(realToIm2D(f.Q15toF32(r[1])))
- print("")
- ################ Levinson ##################
- printTitle("Levinson Durbin")
- na=5
- s = np.random.randn(na+1)
- s = normalize(s)
- phi = autocorr(s)
- phi = normalize(phi)
- sigmav,arcoef,pacf,sigma,phi1=statsmodels.tsa.stattools.levinson_durbin(phi,nlags=na,isacov=True)
-
- print(arcoef)
- print(sigmav)
- (a,err)=dsp.arm_levinson_durbin_f32(phi,na)
- print(a)
- print(err)
- phiQ31 = f.toQ31(phi)
- (aQ31,errQ31)=dsp.arm_levinson_durbin_q31(phiQ31,na)
- print(f.Q31toF32(aQ31))
- print(f.Q31toF32(errQ31))
- ################## Bitwise operations #################
- printTitle("Bitwise operations")
- def genBitvectors(nb,format):
- if format == 31:
- maxVal = 0x7fffffff
- if format == 15:
- maxVal = 0x7fff
- if format == 7:
- maxVal = 0x7f
- minVal = -maxVal-1
-
- return(np.random.randint(minVal, maxVal, size=nb))
- NBSAMPLES=10
- printSubTitle("u32")
- su32A=genBitvectors(NBSAMPLES,31)
- su32B=genBitvectors(NBSAMPLES,31)
- ffff = (np.ones(NBSAMPLES)*(-1)).astype(int)
- ref=np.bitwise_and(su32A, su32B)
- #print(ref)
- result=dsp.arm_and_u32(su32A, su32B).astype(int)
- print(result-ref)
- ref=np.bitwise_or(su32A, su32B)
- #print(ref)
- result=dsp.arm_or_u32(su32A, su32B).astype(int)
- print(result-ref)
- ref=np.bitwise_xor(su32A, su32B)
- #print(ref)
- result=dsp.arm_xor_u32(su32A, su32B).astype(int)
- print(result-ref)
- ref=np.bitwise_xor(ffff, su32A)
- #print(ref)
- result=dsp.arm_not_u32(su32A).astype(int)
- print(result-ref)
- printSubTitle("u16")
- su16A=genBitvectors(NBSAMPLES,15)
- su16B=genBitvectors(NBSAMPLES,15)
- ffff = (np.ones(NBSAMPLES)*(-1)).astype(int)
- ref=np.bitwise_and(su16A, su16B)
- #print(ref)
- result=dsp.arm_and_u16(su16A, su16B).astype(np.short)
- print(result-ref)
- ref=np.bitwise_or(su16A, su16B)
- #print(ref)
- result=dsp.arm_or_u16(su16A, su16B).astype(np.short)
- print(result-ref)
- ref=np.bitwise_xor(su16A, su16B)
- #print(ref)
- result=dsp.arm_xor_u16(su16A, su16B).astype(np.short)
- print(result-ref)
- ref=np.bitwise_xor(ffff, su16A)
- #print(ref)
- result=dsp.arm_not_u16(su16A).astype(np.short)
- print(result-ref)
- printSubTitle("u8")
- su8A=genBitvectors(NBSAMPLES,7)
- su8B=genBitvectors(NBSAMPLES,7)
- ref=np.bitwise_and(su8A, su8B)
- #print(ref)
- result=dsp.arm_and_u8(su8A, su8B).astype(np.byte)
- print(result-ref)
- ref=np.bitwise_or(su8A, su8B)
- #print(ref)
- result=dsp.arm_or_u8(su8A, su8B).astype(np.byte)
- print(result-ref)
- ref=np.bitwise_xor(su8A, su8B)
- #print(ref)
- result=dsp.arm_xor_u8(su8A, su8B).astype(np.byte)
- print(result-ref)
- ref=np.bitwise_xor(ffff, su8A)
- #print(ref)
- result=dsp.arm_not_u8(su8A).astype(np.byte)
- print(result-ref)
- #################### Quaternion tests ##################
- NBSAMPLES=3
- def flattenQuat(l):
- return(np.array([list(x) for x in l]).reshape(4*len(l)))
- def flattenRot(l):
- return(np.array([list(x) for x in l]).reshape(9*len(l)))
- # q and -q are representing the same rotation.
- # So there is an ambiguity for the tests.
- # We force the real part of be positive.
- def mkQuaternion(mat):
- q=Quaternion(matrix=mat)
- if q.scalar < 0:
- return(-q)
- else:
- return(q)
- a=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
- src=flattenQuat(a)
- res=flattenQuat([x.normalised for x in a])
- print(res)
- output=dsp.arm_quaternion_normalize_f32(src)
- print(output)
- print("")
- res=flattenQuat([x.conjugate for x in a])
- print(res)
- output=dsp.arm_quaternion_conjugate_f32(src)
- print(output)
- print("")
- res=flattenQuat([x.inverse for x in a])
- print(res)
- output=dsp.arm_quaternion_inverse_f32(src)
- print(output)
- print("")
- res=[x.norm for x in a]
- print(res)
- output=dsp.arm_quaternion_norm_f32(src)
- print(output)
- print("")
- a=[x.normalised for x in a]
- ra=[x.rotation_matrix for x in a]
- rb=[mkQuaternion(x) for x in ra]
- srca=flattenQuat(a)
- resa=dsp.arm_quaternion2rotation_f32(srca)
- resb=dsp.arm_rotation2quaternion_f32(resa)
- print(ra)
- print(resa)
- print("")
- print(rb)
- print(resb)#
- a=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
- b=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
- c = np.array(a) * np.array(b)
- print(c)
- srca=flattenQuat(a)
- srcb=flattenQuat(b)
- resc=dsp.arm_quaternion_product_f32(srca,srcb)
- print(resc)
- print(a[0]*b[0])
- res=dsp.arm_quaternion_product_single_f32(srca[0:4],srcb[0:4])
- print(res)
|