testdsp2.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. import cmsisdsp as dsp
  2. import numpy as np
  3. from scipy import signal
  4. from scipy.fftpack import dct
  5. import 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. a8 = f.toQ15(a)
  43. i=dsp.arm_absmax_q15(a8)
  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. normalizationFactor=2.0*np.sqrt(np.max(np.abs(c[1])))
  120. a = a / normalizationFactor
  121. b = b / normalizationFactor
  122. c=dsp.arm_mat_mult_f32(a,b)
  123. print(c[1])
  124. print("")
  125. af = f.toQ31(a)
  126. bf = f.toQ31(b)
  127. c = dsp.arm_mat_mult_q31(af,bf)
  128. print(f.Q31toF32(c[1]))
  129. print("")
  130. af = f.toQ15(a)
  131. bf = f.toQ15(b)
  132. s=bf.shape
  133. nb=s[0]*s[1]
  134. tmp=np.zeros(nb)
  135. c = dsp.arm_mat_mult_q15(af,bf,tmp)
  136. print(f.Q15toF32(c[1]))
  137. print("")
  138. af = f.toQ7(a)
  139. bf = f.toQ7(b)
  140. s=bf.shape
  141. nb=s[0]*s[1]
  142. tmp=np.zeros(nb)
  143. c = dsp.arm_mat_mult_q7(af,bf,tmp)
  144. print(f.Q7toF32(c[1]))
  145. ################# MAT TRANSPOSE #################
  146. printTitle("Transposition")
  147. a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
  148. normalizationFactor=np.max(np.abs(c[1]))
  149. a = a / normalizationFactor
  150. print(np.transpose(a))
  151. print("")
  152. r=dsp.arm_mat_trans_f32(a)
  153. print(r[1])
  154. print("")
  155. r=dsp.arm_mat_trans_q31(f.toQ31(a))
  156. print(f.Q31toF32(r[1]))
  157. print("")
  158. r=dsp.arm_mat_trans_q15(f.toQ15(a))
  159. print(f.Q15toF32(r[1]))
  160. print("")
  161. r=dsp.arm_mat_trans_q7(f.toQ7(a))
  162. print(f.Q7toF32(r[1]))
  163. print("")
  164. ################## FILL FUNCTIONS #################
  165. v=0.22
  166. nb=10
  167. a=np.full((nb,),v)
  168. print(a)
  169. a=dsp.arm_fill_f32(v,nb)
  170. print(a)
  171. a=f.Q31toF32(dsp.arm_fill_q31(f.toQ31(v),nb))
  172. print(a)
  173. a=f.Q15toF32(dsp.arm_fill_q15(f.toQ15(v),nb))
  174. print(a)
  175. a=f.Q7toF32(dsp.arm_fill_q7(f.toQ7(v),nb))
  176. print(a)
  177. ################# COMPLEX MAT TRANSPOSE #################
  178. printTitle("Complex Transposition")
  179. a=np.array([[1. + 0.0j ,2 + 1.0j,3 + 0.0j,4 + 2.0j],
  180. [5 + 1.0j,6 + 2.0j,7 + 3.0j,8 + 1.0j],
  181. [9 - 2.0j,10 + 1.0j,11 - 4.0j,12 + 1.0j]])
  182. normalizationFactor=np.max(np.abs(c[1]))
  183. a = a / normalizationFactor
  184. print(np.transpose(a))
  185. print("")
  186. r=dsp.arm_mat_cmplx_trans_f32(imToReal2D(a))
  187. print(realToIm2D(r[1]))
  188. print("")
  189. r=dsp.arm_mat_cmplx_trans_q31(f.toQ31(imToReal2D(a)))
  190. print(realToIm2D(f.Q31toF32(r[1])))
  191. print("")
  192. r=dsp.arm_mat_cmplx_trans_q15(f.toQ15(imToReal2D(a)))
  193. print(realToIm2D(f.Q15toF32(r[1])))
  194. print("")
  195. ################ Levinson ##################
  196. printTitle("Levinson Durbin")
  197. na=5
  198. s = np.random.randn(na+1)
  199. s = normalize(s)
  200. phi = autocorr(s)
  201. phi = normalize(phi)
  202. sigmav,arcoef,pacf,sigma,phi1=statsmodels.tsa.stattools.levinson_durbin(phi,nlags=na,isacov=True)
  203. print(arcoef)
  204. print(sigmav)
  205. (a,err)=dsp.arm_levinson_durbin_f32(phi,na)
  206. print(a)
  207. print(err)
  208. phiQ31 = f.toQ31(phi)
  209. (aQ31,errQ31)=dsp.arm_levinson_durbin_q31(phiQ31,na)
  210. print(f.Q31toF32(aQ31))
  211. print(f.Q31toF32(errQ31))
  212. ################## Bitwise operations #################
  213. printTitle("Bitwise operations")
  214. def genBitvectors(nb,format):
  215. if format == 31:
  216. maxVal = 0x7fffffff
  217. if format == 15:
  218. maxVal = 0x7fff
  219. if format == 7:
  220. maxVal = 0x7f
  221. minVal = -maxVal-1
  222. return(np.random.randint(minVal, maxVal, size=nb))
  223. NBSAMPLES=10
  224. printSubTitle("u32")
  225. su32A=genBitvectors(NBSAMPLES,31)
  226. su32B=genBitvectors(NBSAMPLES,31)
  227. ffff = (np.ones(NBSAMPLES)*(-1)).astype(np.int)
  228. ref=np.bitwise_and(su32A, su32B)
  229. #print(ref)
  230. result=dsp.arm_and_u32(su32A, su32B).astype(int)
  231. print(result-ref)
  232. ref=np.bitwise_or(su32A, su32B)
  233. #print(ref)
  234. result=dsp.arm_or_u32(su32A, su32B).astype(int)
  235. print(result-ref)
  236. ref=np.bitwise_xor(su32A, su32B)
  237. #print(ref)
  238. result=dsp.arm_xor_u32(su32A, su32B).astype(int)
  239. print(result-ref)
  240. ref=np.bitwise_xor(ffff, su32A)
  241. #print(ref)
  242. result=dsp.arm_not_u32(su32A).astype(int)
  243. print(result-ref)
  244. printSubTitle("u16")
  245. su16A=genBitvectors(NBSAMPLES,15)
  246. su16B=genBitvectors(NBSAMPLES,15)
  247. ffff = (np.ones(NBSAMPLES)*(-1)).astype(np.int)
  248. ref=np.bitwise_and(su16A, su16B)
  249. #print(ref)
  250. result=dsp.arm_and_u16(su16A, su16B).astype(np.short)
  251. print(result-ref)
  252. ref=np.bitwise_or(su16A, su16B)
  253. #print(ref)
  254. result=dsp.arm_or_u16(su16A, su16B).astype(np.short)
  255. print(result-ref)
  256. ref=np.bitwise_xor(su16A, su16B)
  257. #print(ref)
  258. result=dsp.arm_xor_u16(su16A, su16B).astype(np.short)
  259. print(result-ref)
  260. ref=np.bitwise_xor(ffff, su16A)
  261. #print(ref)
  262. result=dsp.arm_not_u16(su16A).astype(np.short)
  263. print(result-ref)
  264. printSubTitle("u8")
  265. su8A=genBitvectors(NBSAMPLES,7)
  266. su8B=genBitvectors(NBSAMPLES,7)
  267. ref=np.bitwise_and(su8A, su8B)
  268. #print(ref)
  269. result=dsp.arm_and_u8(su8A, su8B).astype(np.byte)
  270. print(result-ref)
  271. ref=np.bitwise_or(su8A, su8B)
  272. #print(ref)
  273. result=dsp.arm_or_u8(su8A, su8B).astype(np.byte)
  274. print(result-ref)
  275. ref=np.bitwise_xor(su8A, su8B)
  276. #print(ref)
  277. result=dsp.arm_xor_u8(su8A, su8B).astype(np.byte)
  278. print(result-ref)
  279. ref=np.bitwise_xor(ffff, su8A)
  280. #print(ref)
  281. result=dsp.arm_not_u8(su8A).astype(np.byte)
  282. print(result-ref)
  283. #################### Quaternion tests ##################
  284. NBSAMPLES=3
  285. def flattenQuat(l):
  286. return(np.array([list(x) for x in l]).reshape(4*len(l)))
  287. def flattenRot(l):
  288. return(np.array([list(x) for x in l]).reshape(9*len(l)))
  289. # q and -q are representing the same rotation.
  290. # So there is an ambiguity for the tests.
  291. # We force the real part of be positive.
  292. def mkQuaternion(mat):
  293. q=Quaternion(matrix=mat)
  294. if q.scalar < 0:
  295. return(-q)
  296. else:
  297. return(q)
  298. a=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
  299. src=flattenQuat(a)
  300. res=flattenQuat([x.normalised for x in a])
  301. print(res)
  302. output=dsp.arm_quaternion_normalize_f32(src)
  303. print(output)
  304. print("")
  305. res=flattenQuat([x.conjugate for x in a])
  306. print(res)
  307. output=dsp.arm_quaternion_conjugate_f32(src)
  308. print(output)
  309. print("")
  310. res=flattenQuat([x.inverse for x in a])
  311. print(res)
  312. output=dsp.arm_quaternion_inverse_f32(src)
  313. print(output)
  314. print("")
  315. res=[x.norm for x in a]
  316. print(res)
  317. output=dsp.arm_quaternion_norm_f32(src)
  318. print(output)
  319. print("")
  320. a=[x.normalised for x in a]
  321. ra=[x.rotation_matrix for x in a]
  322. rb=[mkQuaternion(x) for x in ra]
  323. srca=flattenQuat(a)
  324. resa=dsp.arm_quaternion2rotation_f32(srca)
  325. resb=dsp.arm_rotation2quaternion_f32(resa)
  326. print(ra)
  327. print(resa)
  328. print("")
  329. print(rb)
  330. print(resb)#
  331. a=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
  332. b=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
  333. c = np.array(a) * np.array(b)
  334. print(c)
  335. srca=flattenQuat(a)
  336. srcb=flattenQuat(b)
  337. resc=dsp.arm_quaternion_product_f32(srca,srcb)
  338. print(resc)
  339. print(a[0]*b[0])
  340. res=dsp.arm_quaternion_product_single_f32(srca[0:4],srcb[0:4])
  341. print(res)