testdsp5.py 9.3 KB

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