testdsp2.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. import cmsisdsp as dsp
  2. import numpy as np
  3. from scipy import signal
  4. from scipy.fftpack import dct
  5. import cmsisdsp.fixedpoint as f
  6. from pyquaternion import Quaternion
  7. import colorama
  8. from colorama import init,Fore, Back, Style
  9. import statsmodels.tsa.stattools
  10. import scipy.spatial
  11. init()
  12. def printTitle(s):
  13. print("\n" + Fore.GREEN + Style.BRIGHT + s + Style.RESET_ALL)
  14. def printSubTitle(s):
  15. print("\n" + Style.BRIGHT + s + Style.RESET_ALL)
  16. def imToReal2D(a):
  17. ar=np.zeros(np.array(a.shape) * [1,2])
  18. ar[::,0::2]=a.real
  19. ar[::,1::2]=a.imag
  20. return(ar)
  21. def realToIm2D(ar):
  22. return(ar[::,0::2] + 1j * ar[::,1::2])
  23. def normalize(a):
  24. return(a/np.max(np.abs(a)))
  25. def autocorr(x):
  26. result = np.correlate(x, x, mode='full')
  27. return result[result.size//2:]
  28. #################### MAX AND ABSMAX ##################################
  29. printTitle("Max and AbsMax")
  30. a=np.array([1.,-3.,4.,0.,-10.,8.])
  31. printSubTitle("Float tests")
  32. i=dsp.arm_max_f32(a)
  33. print(i)
  34. i=dsp.arm_absmax_f32(a)
  35. print(i)
  36. printSubTitle("Fixed point tests")
  37. # Normalize for fixed point tests
  38. a = a / i[0]
  39. a31 = f.toQ31(a)
  40. i=dsp.arm_absmax_q31(a31)
  41. print(f.Q31toF32(i[0]),i[1])
  42. a15 = f.toQ15(a)
  43. i=dsp.arm_absmax_q15(a15)
  44. print(f.Q15toF32(i[0]),i[1])
  45. a7 = f.toQ7(a)
  46. i=dsp.arm_absmax_q7(a7)
  47. print(f.Q7toF32(i[0]),i[1])
  48. ################### MIN AND ABSMIN ################################
  49. printTitle("Min and AbsMin")
  50. a=np.array([1.,-3.,4.,0.5,-10.,8.])
  51. printSubTitle("Float tests")
  52. i=dsp.arm_min_f32(a)
  53. print(i)
  54. i=dsp.arm_absmin_f32(a)
  55. print(i)
  56. printSubTitle("Fixed point tests")
  57. # Normalize for fixed point tests
  58. idx=i[1]
  59. i=dsp.arm_absmax_f32(a)
  60. a = a / i[0]
  61. print(a)
  62. print(a[idx])
  63. a31 = f.toQ31(a)
  64. i=dsp.arm_absmin_q31(a31)
  65. print(f.Q31toF32(i[0]),i[1])
  66. a8 = f.toQ15(a)
  67. i=dsp.arm_absmin_q15(a8)
  68. print(f.Q15toF32(i[0]),i[1])
  69. a7 = f.toQ7(a)
  70. i=dsp.arm_absmin_q7(a7)
  71. print(f.Q7toF32(i[0]),i[1])
  72. ##################### CLIPPING ###################
  73. printTitle("Clipping tests tests")
  74. a=np.array([1.,-3.,4.,0.5,-10.,8.])
  75. i=dsp.arm_absmax_f32(a)
  76. minBound =-5.0
  77. maxBound =6.0
  78. b=dsp.arm_clip_f32(a,minBound,maxBound)
  79. print(a)
  80. print(b)
  81. a = a / i[0]
  82. print(a)
  83. minBound = minBound / i[0]
  84. maxBound = maxBound / i[0]
  85. print(minBound,maxBound)
  86. b=dsp.arm_clip_q31(f.toQ31(a),f.toQ31(minBound),f.toQ31(maxBound))
  87. print(f.Q31toF32(b))
  88. b=dsp.arm_clip_q15(f.toQ15(a),f.toQ15(minBound),f.toQ15(maxBound))
  89. print(f.Q15toF32(b))
  90. b=dsp.arm_clip_q7(f.toQ7(a),f.toQ7(minBound),f.toQ7(maxBound))
  91. print(f.Q7toF32(b))
  92. ############### MAT VECTOR MULT
  93. printTitle("Matrix x Vector")
  94. a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
  95. b=np.array([-2,-1,3,4])
  96. c = np.dot(a,b)
  97. print(c)
  98. c = dsp.arm_mat_vec_mult_f32(a,b)
  99. print(c)
  100. printSubTitle("Fixed point")
  101. normalizationFactor=2.0*np.sqrt(np.max(np.abs(c)))
  102. a=a/normalizationFactor
  103. b=b/normalizationFactor
  104. print(np.dot(a,b))
  105. c=dsp.arm_mat_vec_mult_q31(f.toQ31(a),f.toQ31(b))
  106. print(f.Q31toF32(c))
  107. c=dsp.arm_mat_vec_mult_q15(f.toQ15(a),f.toQ15(b))
  108. print(f.Q15toF32(c))
  109. c=dsp.arm_mat_vec_mult_q7(f.toQ7(a),f.toQ7(b))
  110. print(f.Q7toF32(c))
  111. ############### MATRIX MULTIPLY
  112. printTitle("Matrix x Matrix")
  113. a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
  114. b=np.array([[1.,2,3],[5.1,6,7],[9.1,10,11],[5,8,4]])
  115. print(np.dot(a , b))
  116. c=dsp.arm_mat_mult_f32(a,b)
  117. print(c[1])
  118. printSubTitle("Fixed point")
  119. printSubTitle(" F32")
  120. normalizationFactor=2.0*np.sqrt(np.max(np.abs(c[1])))
  121. a = a / normalizationFactor
  122. b = b / normalizationFactor
  123. c=dsp.arm_mat_mult_f32(a,b)
  124. print(c[1])
  125. print("")
  126. af = f.toQ31(a)
  127. bf = f.toQ31(b)
  128. nbSamples = a.size
  129. tmp=np.zeros(nbSamples)
  130. c1 = dsp.arm_mat_mult_q31(af,bf)
  131. c2 = dsp.arm_mat_mult_opt_q31(af,bf,tmp)
  132. printSubTitle(" Q31")
  133. print(f.Q31toF32(c1[1]))
  134. print(f.Q31toF32(c2[1]))
  135. printSubTitle(" Q15")
  136. print("")
  137. af = f.toQ15(a)
  138. bf = f.toQ15(b)
  139. s=bf.shape
  140. nb=s[0]*s[1]
  141. tmp=np.zeros(nb)
  142. c = dsp.arm_mat_mult_q15(af,bf,tmp)
  143. print(f.Q15toF32(c[1]))
  144. printSubTitle(" Q7")
  145. print("")
  146. af = f.toQ7(a)
  147. bf = f.toQ7(b)
  148. s=bf.shape
  149. nb=s[0]*s[1]
  150. tmp=np.zeros(nb)
  151. c = dsp.arm_mat_mult_q7(af,bf,tmp)
  152. print(f.Q7toF32(c[1]))
  153. ################# MAT TRANSPOSE #################
  154. printTitle("Transposition")
  155. a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
  156. normalizationFactor=np.max(np.abs(c[1]))
  157. a = a / normalizationFactor
  158. print(np.transpose(a))
  159. print("")
  160. r=dsp.arm_mat_trans_f32(a)
  161. print(r[1])
  162. print("")
  163. r=dsp.arm_mat_trans_q31(f.toQ31(a))
  164. print(f.Q31toF32(r[1]))
  165. print("")
  166. r=dsp.arm_mat_trans_q15(f.toQ15(a))
  167. print(f.Q15toF32(r[1]))
  168. print("")
  169. r=dsp.arm_mat_trans_q7(f.toQ7(a))
  170. print(f.Q7toF32(r[1]))
  171. print("")
  172. ################## FILL FUNCTIONS #################
  173. v=0.22
  174. nb=10
  175. a=np.full((nb,),v)
  176. print(a)
  177. a=dsp.arm_fill_f32(v,nb)
  178. print(a)
  179. a=f.Q31toF32(dsp.arm_fill_q31(f.toQ31(v),nb))
  180. print(a)
  181. a=f.Q15toF32(dsp.arm_fill_q15(f.toQ15(v),nb))
  182. print(a)
  183. a=f.Q7toF32(dsp.arm_fill_q7(f.toQ7(v),nb))
  184. print(a)
  185. ################# COMPLEX MAT TRANSPOSE #################
  186. printTitle("Complex Transposition")
  187. a=np.array([[1. + 0.0j ,2 + 1.0j,3 + 0.0j,4 + 2.0j],
  188. [5 + 1.0j,6 + 2.0j,7 + 3.0j,8 + 1.0j],
  189. [9 - 2.0j,10 + 1.0j,11 - 4.0j,12 + 1.0j]])
  190. normalizationFactor=np.max(np.abs(c[1]))
  191. a = a / normalizationFactor
  192. print(np.transpose(a))
  193. print("")
  194. r=dsp.arm_mat_cmplx_trans_f32(imToReal2D(a))
  195. print(realToIm2D(r[1]))
  196. print("")
  197. r=dsp.arm_mat_cmplx_trans_q31(f.toQ31(imToReal2D(a)))
  198. print(realToIm2D(f.Q31toF32(r[1])))
  199. print("")
  200. r=dsp.arm_mat_cmplx_trans_q15(f.toQ15(imToReal2D(a)))
  201. print(realToIm2D(f.Q15toF32(r[1])))
  202. print("")
  203. ################ Levinson ##################
  204. printTitle("Levinson Durbin")
  205. na=5
  206. s = np.random.randn(na+1)
  207. s = normalize(s)
  208. phi = autocorr(s)
  209. phi = normalize(phi)
  210. sigmav,arcoef,pacf,sigma,phi1=statsmodels.tsa.stattools.levinson_durbin(phi,nlags=na,isacov=True)
  211. print(arcoef)
  212. print(sigmav)
  213. (a,err)=dsp.arm_levinson_durbin_f32(phi,na)
  214. print(a)
  215. print(err)
  216. phiQ31 = f.toQ31(phi)
  217. (aQ31,errQ31)=dsp.arm_levinson_durbin_q31(phiQ31,na)
  218. print(f.Q31toF32(aQ31))
  219. print(f.Q31toF32(errQ31))
  220. ################## Bitwise operations #################
  221. printTitle("Bitwise operations")
  222. def genBitvectors(nb,format):
  223. if format == 31:
  224. maxVal = 0x7fffffff
  225. if format == 15:
  226. maxVal = 0x7fff
  227. if format == 7:
  228. maxVal = 0x7f
  229. minVal = -maxVal-1
  230. return(np.random.randint(minVal, maxVal, size=nb))
  231. NBSAMPLES=10
  232. printSubTitle("u32")
  233. su32A=genBitvectors(NBSAMPLES,31)
  234. su32B=genBitvectors(NBSAMPLES,31)
  235. ffff = (np.ones(NBSAMPLES)*(-1)).astype(int)
  236. ref=np.bitwise_and(su32A, su32B)
  237. #print(ref)
  238. result=dsp.arm_and_u32(su32A, su32B).astype(int)
  239. print(result-ref)
  240. ref=np.bitwise_or(su32A, su32B)
  241. #print(ref)
  242. result=dsp.arm_or_u32(su32A, su32B).astype(int)
  243. print(result-ref)
  244. ref=np.bitwise_xor(su32A, su32B)
  245. #print(ref)
  246. result=dsp.arm_xor_u32(su32A, su32B).astype(int)
  247. print(result-ref)
  248. ref=np.bitwise_xor(ffff, su32A)
  249. #print(ref)
  250. result=dsp.arm_not_u32(su32A).astype(int)
  251. print(result-ref)
  252. printSubTitle("u16")
  253. su16A=genBitvectors(NBSAMPLES,15)
  254. su16B=genBitvectors(NBSAMPLES,15)
  255. ffff = (np.ones(NBSAMPLES)*(-1)).astype(int)
  256. ref=np.bitwise_and(su16A, su16B)
  257. #print(ref)
  258. result=dsp.arm_and_u16(su16A, su16B).astype(np.short)
  259. print(result-ref)
  260. ref=np.bitwise_or(su16A, su16B)
  261. #print(ref)
  262. result=dsp.arm_or_u16(su16A, su16B).astype(np.short)
  263. print(result-ref)
  264. ref=np.bitwise_xor(su16A, su16B)
  265. #print(ref)
  266. result=dsp.arm_xor_u16(su16A, su16B).astype(np.short)
  267. print(result-ref)
  268. ref=np.bitwise_xor(ffff, su16A)
  269. #print(ref)
  270. result=dsp.arm_not_u16(su16A).astype(np.short)
  271. print(result-ref)
  272. printSubTitle("u8")
  273. su8A=genBitvectors(NBSAMPLES,7)
  274. su8B=genBitvectors(NBSAMPLES,7)
  275. ref=np.bitwise_and(su8A, su8B)
  276. #print(ref)
  277. result=dsp.arm_and_u8(su8A, su8B).astype(np.byte)
  278. print(result-ref)
  279. ref=np.bitwise_or(su8A, su8B)
  280. #print(ref)
  281. result=dsp.arm_or_u8(su8A, su8B).astype(np.byte)
  282. print(result-ref)
  283. ref=np.bitwise_xor(su8A, su8B)
  284. #print(ref)
  285. result=dsp.arm_xor_u8(su8A, su8B).astype(np.byte)
  286. print(result-ref)
  287. ref=np.bitwise_xor(ffff, su8A)
  288. #print(ref)
  289. result=dsp.arm_not_u8(su8A).astype(np.byte)
  290. print(result-ref)
  291. #################### Quaternion tests ##################
  292. NBSAMPLES=3
  293. def flattenQuat(l):
  294. return(np.array([list(x) for x in l]).reshape(4*len(l)))
  295. def flattenRot(l):
  296. return(np.array([list(x) for x in l]).reshape(9*len(l)))
  297. # q and -q are representing the same rotation.
  298. # So there is an ambiguity for the tests.
  299. # We force the real part of be positive.
  300. def mkQuaternion(mat):
  301. q=Quaternion(matrix=mat)
  302. if q.scalar < 0:
  303. return(-q)
  304. else:
  305. return(q)
  306. a=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
  307. src=flattenQuat(a)
  308. res=flattenQuat([x.normalised for x in a])
  309. print(res)
  310. output=dsp.arm_quaternion_normalize_f32(src)
  311. print(output)
  312. print("")
  313. res=flattenQuat([x.conjugate for x in a])
  314. print(res)
  315. output=dsp.arm_quaternion_conjugate_f32(src)
  316. print(output)
  317. print("")
  318. res=flattenQuat([x.inverse for x in a])
  319. print(res)
  320. output=dsp.arm_quaternion_inverse_f32(src)
  321. print(output)
  322. print("")
  323. res=[x.norm for x in a]
  324. print(res)
  325. output=dsp.arm_quaternion_norm_f32(src)
  326. print(output)
  327. print("")
  328. a=[x.normalised for x in a]
  329. ra=[x.rotation_matrix for x in a]
  330. rb=[mkQuaternion(x) for x in ra]
  331. srca=flattenQuat(a)
  332. resa=dsp.arm_quaternion2rotation_f32(srca)
  333. resb=dsp.arm_rotation2quaternion_f32(resa)
  334. print(ra)
  335. print(resa)
  336. print("")
  337. print(rb)
  338. print(resb)#
  339. a=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
  340. b=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
  341. c = np.array(a) * np.array(b)
  342. print(c)
  343. srca=flattenQuat(a)
  344. srcb=flattenQuat(b)
  345. resc=dsp.arm_quaternion_product_f32(srca,srcb)
  346. print(resc)
  347. print(a[0]*b[0])
  348. res=dsp.arm_quaternion_product_single_f32(srca[0:4],srcb[0:4])
  349. print(res)