testdsp5.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. import cmsisdsp as dsp
  2. import numpy as np
  3. from numpy.testing import assert_allclose
  4. from scipy.stats import entropy,tstd, tvar
  5. from scipy.special import logsumexp
  6. from scipy.linalg import cholesky,ldl,solve_triangular
  7. from scipy import signal
  8. def imToReal1D(a):
  9. ar=np.zeros(np.array(a.shape) * 2)
  10. ar[0::2]=a.real
  11. ar[1::2]=a.imag
  12. return(ar)
  13. def realToIm1D(ar):
  14. return(ar[0::2] + 1j * ar[1::2])
  15. print("Max and AbsMax")
  16. a=np.array([1.,-3.,4.,0.,-10.,8.])
  17. i=dsp.arm_absmax_no_idx_f32(a)
  18. print(i)
  19. assert i==10.0
  20. i=dsp.arm_absmax_no_idx_f64(a)
  21. print(i)
  22. assert i==10.0
  23. r,i=dsp.arm_absmax_f64(a)
  24. assert i==4
  25. assert r==10.0
  26. r,i=dsp.arm_max_f64(a)
  27. assert i==5
  28. assert r==8.0
  29. i=dsp.arm_max_no_idx_f32(a)
  30. print(i)
  31. assert i==8
  32. i=dsp.arm_max_no_idx_f64(a)
  33. print(i)
  34. assert i==8
  35. print("Min and AbsMin")
  36. a=np.array([1.,-3.,4.,0.5,-10.,8.])
  37. i=dsp.arm_absmin_no_idx_f32(a)
  38. print(i)
  39. assert i==0.5
  40. i=dsp.arm_absmin_no_idx_f64(a)
  41. print(i)
  42. assert i==0.5
  43. r,i=dsp.arm_absmin_f64(a)
  44. assert i==3
  45. assert r==0.5
  46. r,i=dsp.arm_min_f64(a)
  47. assert i==4
  48. assert r==-10
  49. i=dsp.arm_min_no_idx_f32(a)
  50. print(i)
  51. assert i==-10
  52. i=dsp.arm_min_no_idx_f64(a)
  53. print(i)
  54. assert i==-10
  55. print("Barycenter")
  56. a=[0] * 12
  57. w=np.array([[2] * 12])
  58. w[0,11]=3
  59. a[0] =[0., 0., -0.951057]
  60. a[1] =[0., 0., 0.951057]
  61. a[2] =[-0.850651, 0., -0.425325]
  62. a[3] =[0.850651, 0., 0.425325]
  63. a[4] =[0.688191, -0.5, -0.425325]
  64. a[5] =[0.688191, 0.5, -0.425325]
  65. a[6] =[-0.688191, -0.5, 0.425325]
  66. a[7] =[-0.688191, 0.5, 0.425325]
  67. a[8] =[-0.262866, -0.809017, -0.425325]
  68. a[9] =[-0.262866, 0.809017, -0.425325]
  69. a[10]=[0.262866, -0.809017, 0.425325]
  70. a[11]=[0.262866, 0.809017, 0.425325]
  71. scaled=a * w.T
  72. ref=np.sum(scaled,axis=0)/np.sum(w)
  73. print(ref)
  74. result=dsp.arm_barycenter_f32(np.array(a).reshape(12*3),w.reshape(12),12,3)
  75. print(result)
  76. assert_allclose(ref,result,1e-6)
  77. print("Weighted sum")
  78. nb=10
  79. s = np.random.randn(nb)
  80. w = np.random.randn(nb)
  81. ref=np.dot(s,w)/np.sum(w)
  82. print(ref)
  83. res=dsp.arm_weighted_sum_f32(s,w)
  84. print(res)
  85. assert_allclose(ref,res,2e-5)
  86. print("Entropy")
  87. s = np.abs(np.random.randn(nb))
  88. s = s / np.sum(s)
  89. ref=entropy(s)
  90. print(ref)
  91. res=dsp.arm_entropy_f32(s)
  92. print(res)
  93. assert_allclose(ref,res,1e-6)
  94. res=dsp.arm_entropy_f64(s)
  95. print(res)
  96. assert_allclose(ref,res,1e-10)
  97. print("Kullback-Leibler")
  98. sa = np.abs(np.random.randn(nb))
  99. sa = sa / np.sum(sa)
  100. sb = np.abs(np.random.randn(nb))
  101. sb = sb / np.sum(sb)
  102. ref=entropy(sa,sb)
  103. print(ref)
  104. res=dsp.arm_kullback_leibler_f32(sa,sb)
  105. print(res)
  106. assert_allclose(ref,res,1e-6)
  107. res=dsp.arm_kullback_leibler_f64(sa,sb)
  108. print(res)
  109. assert_allclose(ref,res,1e-10)
  110. print("Logsumexp")
  111. s = np.abs(np.random.randn(nb))
  112. s = s / np.sum(s)
  113. ref=logsumexp(s)
  114. print(ref)
  115. res=dsp.arm_logsumexp_f32(s)
  116. print(res)
  117. assert_allclose(ref,res,1e-6)
  118. print("Logsumexp dot prod")
  119. sa = np.abs(np.random.randn(nb))
  120. sa = sa / np.sum(sa)
  121. sb = np.abs(np.random.randn(nb))
  122. sb = sb / np.sum(sb)
  123. d = 0.001
  124. # It is a proba so must be in [0,1]
  125. # But restricted to ]d,1] so that the log exists
  126. sa = (1-d)*sa + d
  127. sb = (1-d)*sb + d
  128. ref=np.log(np.dot(sa,sb))
  129. print(ref)
  130. sa = np.log(sa)
  131. sb = np.log(sb)
  132. res=dsp.arm_logsumexp_dot_prod_f32(sa,sb)
  133. print(res)
  134. assert_allclose(ref,res,3e-6)
  135. print("vexp")
  136. sa = np.random.randn(nb)
  137. ref = np.exp(sa)
  138. print(ref)
  139. res=dsp.arm_vexp_f32(sa)
  140. print(res)
  141. assert_allclose(ref,res,1e-6)
  142. res=dsp.arm_vexp_f64(sa)
  143. print(res)
  144. assert_allclose(ref,res,1e-10)
  145. print("vlog")
  146. sa = np.abs(np.random.randn(nb)) + 0.001
  147. ref = np.log(sa)
  148. print(ref)
  149. res=dsp.arm_vlog_f32(sa)
  150. print(res)
  151. assert_allclose(ref,res,2e-5,1e-5)
  152. res=dsp.arm_vlog_f64(sa)
  153. print(res)
  154. assert_allclose(ref,res,2e-9,1e-9)
  155. print("Cholesky")
  156. a=np.array([[4,12,-16],[12,37,-43],[-16,-43,98]])
  157. ref=cholesky(a,lower=True)
  158. print(ref)
  159. status,res=dsp.arm_mat_cholesky_f32(a)
  160. print(res)
  161. assert_allclose(ref,res,1e-6,1e-6)
  162. status,res=dsp.arm_mat_cholesky_f64(a)
  163. print(res)
  164. assert_allclose(ref,res,1e-10,1e-10)
  165. print("LDLT")
  166. def swaprow(m,k,j):
  167. tmp = np.copy(m[j,:])
  168. m[j,:] = np.copy(m[k,:])
  169. m[k,:] = tmp
  170. return(m)
  171. # F32 test
  172. status,resl,resd,resperm=dsp.arm_mat_ldlt_f32(a)
  173. n=3
  174. p=np.identity(n)
  175. for k in range(0,n):
  176. p = swaprow(p,k,resperm[k])
  177. res=resl.dot(resd).dot(resl.T)
  178. permutedSrc=p.dot(a).dot(p.T)
  179. print(res)
  180. print(permutedSrc)
  181. assert_allclose(permutedSrc,res,1e-5,1e-5)
  182. # F64 test
  183. print("LDLT F64")
  184. status,resl,resd,resperm=dsp.arm_mat_ldlt_f64(a)
  185. n=3
  186. p=np.identity(n)
  187. for k in range(0,n):
  188. p = swaprow(p,k,resperm[k])
  189. res=resl.dot(resd).dot(resl.T)
  190. permutedSrc=p.dot(a).dot(p.T)
  191. print(res)
  192. print(permutedSrc)
  193. assert_allclose(permutedSrc,res,1e-9,1e-9)
  194. print("Solve lower triangular")
  195. a = np.array([[3, 0, 0, 0], [2, 1, 0, 0], [1, 0, 1, 0], [1, 1, 1, 1]])
  196. b = np.array([[4,2,4,2],[8,4,8,4]]).T
  197. x = solve_triangular(a, b,lower=True)
  198. print(a)
  199. print(b)
  200. print(x)
  201. b = np.array([[4,2,4,2],[8,4,8,4]]).T
  202. status,res=dsp.arm_mat_solve_lower_triangular_f32(a,b)
  203. print(res)
  204. assert_allclose(x,res,1e-5,1e-5)
  205. b = np.array([[4,2,4,2],[8,4,8,4]]).T
  206. status,res=dsp.arm_mat_solve_lower_triangular_f64(a,b)
  207. print(res)
  208. assert_allclose(x,res,1e-9,1e-9)
  209. print("Solve upper triangular")
  210. a = np.array([[3, 0, 0, 0], [2, 1, 0, 0], [1, 0, 1, 0], [1, 1, 1, 1]])
  211. b = np.array([[4,2,4,2],[8,4,8,4]]).T
  212. x = solve_triangular(a.T, b,lower=False)
  213. print(a.T)
  214. print(b)
  215. print(x)
  216. b = np.array([[4,2,4,2],[8,4,8,4]]).T
  217. status,res=dsp.arm_mat_solve_upper_triangular_f32(a.T,b)
  218. print(res)
  219. assert_allclose(x,res,1e-5,1e-5)
  220. b = np.array([[4,2,4,2],[8,4,8,4]]).T
  221. status,res=dsp.arm_mat_solve_upper_triangular_f64(a.T,b)
  222. print(res)
  223. assert_allclose(x,res,1e-9,1e-9)
  224. print("Mat mult f64")
  225. a = np.array([[3, 0, 0, 0], [2, 1, 0, 0], [1, 0, 1, 0], [1, 1, 1, 1]])
  226. b = np.array([[4,2,4,2],[8,4,8,4]]).T
  227. ref =a.dot(b)
  228. print(ref)
  229. status,res = dsp.arm_mat_mult_f64(a,b)
  230. print(res)
  231. assert_allclose(ref,res,1e-10,1e-10)
  232. print("mat sub f64")
  233. a = np.array([[3, 0, 0, 0], [2, 1, 0, 0], [1, 0, 1, 0], [1, 1, 1, 1]])
  234. b = a.T
  235. ref = a - b
  236. print(ref)
  237. status,res = dsp.arm_mat_sub_f64(a,b)
  238. print(res)
  239. assert_allclose(ref,res,1e-10,1e-10)
  240. print("abs f64")
  241. s = np.random.randn(nb)
  242. ref = np.abs(s)
  243. res=dsp.arm_abs_f64(s)
  244. print(ref)
  245. print(res)
  246. assert_allclose(ref,res,1e-10,1e-10)
  247. print("add f64")
  248. sa = np.random.randn(nb)
  249. sb = np.random.randn(nb)
  250. ref = sa + sb
  251. res=dsp.arm_add_f64(sa,sb)
  252. print(ref)
  253. print(res)
  254. assert_allclose(ref,res,1e-10,1e-10)
  255. print("sub f64")
  256. sa = np.random.randn(nb)
  257. sb = np.random.randn(nb)
  258. ref = sa - sb
  259. res=dsp.arm_sub_f64(sa,sb)
  260. print(ref)
  261. print(res)
  262. assert_allclose(ref,res,1e-10,1e-10)
  263. print("dot prod f64")
  264. sa = np.random.randn(nb)
  265. sb = np.random.randn(nb)
  266. ref = sa.dot(sb)
  267. res=dsp.arm_dot_prod_f64(sa,sb)
  268. print(ref)
  269. print(res)
  270. assert_allclose(ref,res,1e-10,1e-10)
  271. print("mult f64")
  272. sa = np.random.randn(nb)
  273. sb = np.random.randn(nb)
  274. ref = sa * sb
  275. res=dsp.arm_mult_f64(sa,sb)
  276. print(ref)
  277. print(res)
  278. assert_allclose(ref,res,1e-10,1e-10)
  279. print("negate f64")
  280. sa = np.random.randn(nb)
  281. ref = -sa
  282. res=dsp.arm_negate_f64(sa)
  283. print(ref)
  284. print(res)
  285. assert_allclose(ref,res,1e-10,1e-10)
  286. print("offset f64")
  287. sa = np.random.randn(nb)
  288. ref = sa + 0.1
  289. res=dsp.arm_offset_f64(sa,0.1)
  290. print(ref)
  291. print(res)
  292. assert_allclose(ref,res,1e-10,1e-10)
  293. print("scale f64")
  294. sa = np.random.randn(nb)
  295. ref = sa * 0.1
  296. res=dsp.arm_scale_f64(sa,0.1)
  297. print(ref)
  298. print(res)
  299. assert_allclose(ref,res,1e-10,1e-10)
  300. print("mean f64")
  301. sa = np.random.randn(nb)
  302. ref = np.mean(sa)
  303. res=dsp.arm_mean_f64(sa)
  304. print(ref)
  305. print(res)
  306. assert_allclose(ref,res,1e-10,1e-10)
  307. print("power f64")
  308. sa = np.random.randn(nb)
  309. ref = np.sum(sa * sa)
  310. res=dsp.arm_power_f64(sa)
  311. print(ref)
  312. print(res)
  313. assert_allclose(ref,res,1e-10,1e-10)
  314. print("std f64")
  315. sa = np.random.randn(nb)
  316. ref = tstd(sa)
  317. res=dsp.arm_std_f64(sa)
  318. print(ref)
  319. print(res)
  320. assert_allclose(ref,res,1e-10,1e-10)
  321. print("variance f64")
  322. sa = np.random.randn(nb)
  323. ref = tvar(sa)
  324. res=dsp.arm_var_f64(sa)
  325. print(ref)
  326. print(res)
  327. assert_allclose(ref,res,1e-10,1e-10)
  328. print("fill f64")
  329. nb=20
  330. ref = np.ones(nb)*4.0
  331. res = dsp.arm_fill_f64(4.0,nb)
  332. assert_allclose(ref,res,1e-10,1e-10)
  333. print("copy f64")
  334. nb=20
  335. sa = np.random.randn(nb)
  336. ref = sa
  337. res = dsp.arm_copy_f64(sa)
  338. assert_allclose(ref,res,1e-10,1e-10)
  339. print("arm_div_q63_to_q31")
  340. den=0x7FFF00000000
  341. num=0x10000
  342. ref=den//num
  343. res=dsp.arm_div_q63_to_q31(den,num)
  344. print(ref)
  345. print(res)
  346. print("fir f64")
  347. firf64 = dsp.arm_fir_instance_f64()
  348. dsp.arm_fir_init_f64(firf64,3,[1.,2,3],[0,0,0,0,0,0,0])
  349. filtered_x = signal.lfilter([3,2,1.], 1.0, [1,2,3,4,5,1,2,3,4,5])
  350. print(filtered_x)
  351. ra=dsp.arm_fir_f64(firf64,[1,2,3,4,5])
  352. rb=dsp.arm_fir_f64(firf64,[1,2,3,4,5])
  353. assert ((filtered_x == np.hstack([ra,rb])).all)
  354. print("arm_cmplx_mag")
  355. sa = np.random.randn(nb)
  356. ca = realToIm1D(sa)
  357. ref = np.abs(ca)
  358. print(ref)
  359. res=dsp.arm_cmplx_mag_f32(sa)
  360. print(res)
  361. assert_allclose(ref,res,1e-6,1e-6)
  362. res=dsp.arm_cmplx_mag_f64(sa)
  363. print(res)
  364. assert_allclose(ref,res,1e-10,1e-10)
  365. print("arm_cmplx_mag_squared")
  366. sa = np.random.randn(nb)
  367. ca = realToIm1D(sa)
  368. ref = np.abs(ca) * np.abs(ca)
  369. print(ref)
  370. res=dsp.arm_cmplx_mag_squared_f32(sa)
  371. print(res)
  372. assert_allclose(ref,res,1e-6,1e-6)
  373. res=dsp.arm_cmplx_mag_squared_f64(sa)
  374. print(res)
  375. assert_allclose(ref,res,1e-10,1e-10)
  376. print("cmplx mult")
  377. sa = np.random.randn(nb)
  378. ca = realToIm1D(sa)
  379. sb = np.random.randn(nb)
  380. cb = realToIm1D(sb)
  381. ref = imToReal1D(ca * cb)
  382. print(ref)
  383. res = dsp.arm_cmplx_mult_cmplx_f32(sa,sb)
  384. print(res)
  385. assert_allclose(ref,res,1e-6,1e-6)
  386. res = dsp.arm_cmplx_mult_cmplx_f64(sa,sb)
  387. print(res)
  388. assert_allclose(ref,res,1e-10,1e-10)