cmsis_tests.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. #pragma once
  2. extern "C" {
  3. #include "arm_math_types.h"
  4. #include "arm_math_types_f16.h"
  5. #include "dsp/filtering_functions.h"
  6. #include "dsp/matrix_functions.h"
  7. #include "dsp/matrix_functions_f16.h"
  8. }
  9. template<typename T>
  10. struct NameOfType;
  11. template<typename T>
  12. struct TailForTests;
  13. template<>
  14. struct NameOfType<float64_t>
  15. {
  16. constexpr static const char* v="float64_t";
  17. constexpr static const char* xls="f64";
  18. };
  19. template<>
  20. struct NameOfType<float32_t>
  21. {
  22. constexpr static const char* v="float32_t";
  23. constexpr static const char* xls="f32";
  24. };
  25. #if !defined(DISABLEFLOAT16)
  26. template<>
  27. struct NameOfType<float16_t>
  28. {
  29. constexpr static const char* v="float16_t";
  30. constexpr static const char* xls="f16";
  31. };
  32. #endif
  33. template<>
  34. struct NameOfType<Q31>
  35. {
  36. constexpr static const char* v="q31";
  37. constexpr static const char* xls="q31";
  38. };
  39. template<>
  40. struct NameOfType<Q15>
  41. {
  42. constexpr static const char* v="q15";
  43. constexpr static const char* xls="q15";
  44. };
  45. template<>
  46. struct NameOfType<Q7>
  47. {
  48. constexpr static const char* v="q7";
  49. constexpr static const char* xls="q7";
  50. };
  51. template<>
  52. struct TailForTests<double>
  53. {
  54. constexpr static const int tail = 1;
  55. constexpr static const int loop = 2;
  56. };
  57. template<>
  58. struct TailForTests<float>
  59. {
  60. constexpr static const int tail = 3;
  61. constexpr static const int loop = 2*4;
  62. };
  63. #if !defined(DISABLEFLOAT16)
  64. template<>
  65. struct TailForTests<float16_t>
  66. {
  67. constexpr static const int tail = 7;
  68. constexpr static const int loop = 2*8;
  69. };
  70. #endif
  71. template<>
  72. struct TailForTests<Q31>
  73. {
  74. constexpr static const int tail = 3;
  75. constexpr static const int loop = 2*4;
  76. };
  77. template<>
  78. struct TailForTests<Q15>
  79. {
  80. constexpr static const int tail = 7;
  81. constexpr static const int loop = 2*8;
  82. };
  83. template<>
  84. struct TailForTests<Q7>
  85. {
  86. constexpr static const int tail = 15;
  87. constexpr static const int loop = 2*16;
  88. };
  89. #include "common_tests.h"
  90. #if !defined(DISABLEFLOAT16)
  91. extern void cmsisdsp_add(const float16_t* a,
  92. const float16_t* b,
  93. float16_t* c,
  94. uint32_t l);
  95. #endif
  96. extern void cmsisdsp_add(const float64_t* a,
  97. const float64_t* b,
  98. float64_t* c,
  99. uint32_t l);
  100. extern void cmsisdsp_add(const float32_t* a,
  101. const float32_t* b,
  102. float32_t* c,
  103. uint32_t l);
  104. extern void cmsisdsp_add(const Q31* a,
  105. const Q31* b,
  106. Q31* c,
  107. uint32_t l);
  108. extern void cmsisdsp_add(const Q15* a,
  109. const Q15* b,
  110. Q15* c,
  111. uint32_t l);
  112. extern void cmsisdsp_add(const Q7* a,
  113. const Q7* b,
  114. Q7* c,
  115. uint32_t l);
  116. extern void cmsisdsp_mat_add(const float32_t* a,
  117. const float32_t* b,
  118. float32_t* c,
  119. uint32_t row,uint32_t col);
  120. #if !defined(DISABLEFLOAT16)
  121. extern void cmsisdsp_mat_add(const float16_t* a,
  122. const float16_t* b,
  123. float16_t* c,
  124. uint32_t row,uint32_t col);
  125. #endif
  126. extern void cmsisdsp_mat_add(const Q31* a,
  127. const Q31* b,
  128. Q31* c,
  129. uint32_t row,uint32_t col);
  130. extern void cmsisdsp_mat_add(const Q15* a,
  131. const Q15* b,
  132. Q15* c,
  133. uint32_t row,uint32_t col);
  134. extern void cmsisdsp_mat_add(const Q7* a,
  135. const Q7* b,
  136. Q7* c,
  137. uint32_t row,uint32_t col);
  138. #if !defined(DISABLEFLOAT16)
  139. extern void cmsisdsp_dot(const float16_t* a,
  140. const float16_t* b,
  141. float16_t &c,
  142. uint32_t l);
  143. #endif
  144. extern void cmsisdsp_dot(const float64_t* a,
  145. const float64_t* b,
  146. float64_t &c,
  147. uint32_t l);
  148. extern void cmsisdsp_dot(const float32_t* a,
  149. const float32_t* b,
  150. float32_t &c,
  151. uint32_t l);
  152. extern void cmsisdsp_dot(const Q31* a,
  153. const Q31* b,
  154. Q<15,48> &c,
  155. uint32_t l);
  156. extern void cmsisdsp_dot(const Q15* a,
  157. const Q15* b,
  158. Q<33,30> &c,
  159. uint32_t l);
  160. extern void cmsisdsp_dot(const Q7* a,
  161. const Q7* b,
  162. Q<17,14> &c,
  163. uint32_t l);
  164. extern void cmsisdsp_dot_expr(const double* a,
  165. const double* b,
  166. const double* c,
  167. const double* d,
  168. double* tmp1,
  169. double* tmp2,
  170. const double scale,
  171. double &r,
  172. uint32_t l);
  173. extern void cmsisdsp_dot_expr(const float32_t* a,
  174. const float32_t* b,
  175. const float32_t* c,
  176. const float32_t* d,
  177. float32_t* tmp1,
  178. float32_t* tmp2,
  179. const float32_t scale,
  180. float32_t &r,
  181. uint32_t l);
  182. #if !defined(DISABLEFLOAT16)
  183. extern void cmsisdsp_dot_expr(const float16_t* a,
  184. const float16_t* b,
  185. const float16_t* c,
  186. const float16_t* d,
  187. float16_t* tmp1,
  188. float16_t* tmp2,
  189. const float16_t scale,
  190. float16_t &r,
  191. uint32_t l);
  192. #endif
  193. extern void cmsisdsp_dot_expr(const Q7* a,
  194. const Q7* b,
  195. const Q7* c,
  196. const Q7* d,
  197. Q7* tmp1,
  198. Q7* tmp2,
  199. const Q7 scale,
  200. Q<17,14> &r,
  201. uint32_t l);
  202. extern void cmsisdsp_dot_expr(const Q15* a,
  203. const Q15* b,
  204. const Q15* c,
  205. const Q15* d,
  206. Q15* tmp1,
  207. Q15* tmp2,
  208. const Q15 scale,
  209. Q<33,30> &r,
  210. uint32_t l);
  211. extern void cmsisdsp_dot_expr(const Q31* a,
  212. const Q31* b,
  213. const Q31* c,
  214. const Q31* d,
  215. Q31* tmp1,
  216. Q31* tmp2,
  217. const Q31 scale,
  218. Q<15,48> &r,
  219. uint32_t l);
  220. extern void cmsisdsp_fir(const arm_fir_instance_f32 * S,
  221. const float32_t * pSrc,
  222. float32_t * pDst,
  223. uint32_t blockSize);
  224. extern void cmsisdsp_fir(const arm_fir_instance_q7 * S,
  225. const Q7 * pSrc,
  226. Q7 * pDst,
  227. uint32_t blockSize);
  228. extern void cmsisdsp_fir(const arm_fir_instance_q15 * S,
  229. const Q15 * pSrc,
  230. Q15 * pDst,
  231. uint32_t blockSize);
  232. extern void cmsisdsp_fir(const arm_fir_instance_q31 * S,
  233. const Q31 * pSrc,
  234. Q31 * pDst,
  235. uint32_t blockSize);
  236. template<typename T>
  237. struct CMSISOuter {
  238. static void run(const T *a,
  239. const T *b,
  240. T *res,
  241. const uint32_t r,const uint32_t c)
  242. {
  243. DISABLE_LOOP_UNROLL
  244. for(unsigned int row=0; row<r ; row ++ )
  245. {
  246. DISABLE_LOOP_UNROLL
  247. for(unsigned int col=0; col<c ; col ++ )
  248. {
  249. res[row*c+col] = a[row]*b[col];
  250. }
  251. }
  252. }
  253. };
  254. #if defined(ARM_MATH_MVEI) || defined(ARM_MATH_MVEF)
  255. extern void _cmsis_outer(const float32_t *a,
  256. const float32_t *b,
  257. float32_t *res,
  258. const uint32_t r,const uint32_t c);
  259. #if !defined(DISABLEFLOAT16)
  260. extern void _cmsis_outer(const float16_t *a,
  261. const float16_t *b,
  262. float16_t *res,
  263. const uint32_t r,const uint32_t c);
  264. #endif
  265. extern void _cmsis_outer(const Q7 *a,
  266. const Q7 *b,
  267. Q7 *res,
  268. const uint32_t r,const uint32_t c);
  269. extern void _cmsis_outer(const Q15 *a,
  270. const Q15 *b,
  271. Q15 *res,
  272. const uint32_t r,const uint32_t c);
  273. extern void _cmsis_outer(const Q31 *a,
  274. const Q31 *b,
  275. Q31 *res,
  276. const uint32_t r,const uint32_t c);
  277. template<>
  278. struct CMSISOuter<float32_t> {
  279. static void run(const float32_t *a,
  280. const float32_t *b,
  281. float32_t *res,
  282. const uint32_t r,const uint32_t c)
  283. {
  284. _cmsis_outer(a,b,res,r,c);
  285. }
  286. };
  287. #if !defined(DISABLEFLOAT16)
  288. template<>
  289. struct CMSISOuter<float16_t> {
  290. static void run(const float16_t *a,
  291. const float16_t *b,
  292. float16_t *res,
  293. const uint32_t r,const uint32_t c)
  294. {
  295. _cmsis_outer(a,b,res,r,c);
  296. }
  297. };
  298. #endif
  299. template<>
  300. struct CMSISOuter<Q31> {
  301. static void run(const Q31 *a,
  302. const Q31 *b,
  303. Q31 *res,
  304. const uint32_t r,const uint32_t c)
  305. {
  306. _cmsis_outer(a,b,res,r,c);
  307. }
  308. };
  309. template<>
  310. struct CMSISOuter<Q15> {
  311. static void run(const Q15 *a,
  312. const Q15 *b,
  313. Q15 *res,
  314. const uint32_t r,const uint32_t c)
  315. {
  316. _cmsis_outer(a,b,res,r,c);
  317. }
  318. };
  319. template<>
  320. struct CMSISOuter<Q7> {
  321. static void run(const Q7 *a,
  322. const Q7 *b,
  323. Q7 *res,
  324. const uint32_t r,const uint32_t c)
  325. {
  326. _cmsis_outer(a,b,res,r,c);
  327. }
  328. };
  329. #endif
  330. extern void cmsis_init_householder(double *f,const int nb);
  331. extern void cmsis_init_householder(float32_t *f,const int nb);
  332. #if !defined(DISABLEFLOAT16)
  333. extern void cmsis_init_householder(float16_t *f,const int nb);
  334. #endif
  335. extern void cmsis_init_qr(double *f,const int r,const int c);
  336. extern void cmsis_init_qr(float32_t *f,const int r,const int c);
  337. #if !defined(DISABLEFLOAT16)
  338. extern void cmsis_init_qr(float16_t *f,const int r,const int c);
  339. #endif
  340. extern void cmsis_init_cholesky(double *f,const int r,const int c);
  341. extern void cmsis_init_cholesky(float32_t *f,const int r,const int c);
  342. #if !defined(DISABLEFLOAT16)
  343. extern void cmsis_init_cholesky(float16_t *f,const int r,const int c);
  344. #endif
  345. extern void cmsis_mat_mult(const arm_matrix_instance_f64* a,
  346. const arm_matrix_instance_f64* b,
  347. arm_matrix_instance_f64 *c,
  348. double *pState);
  349. extern void cmsis_mat_mult(const arm_matrix_instance_f32* a,
  350. const arm_matrix_instance_f32* b,
  351. arm_matrix_instance_f32 *c,
  352. float32_t *pState);
  353. #if !defined(DISABLEFLOAT16)
  354. extern void cmsis_mat_mult(const arm_matrix_instance_f16* a,
  355. const arm_matrix_instance_f16* b,
  356. arm_matrix_instance_f16 *c,
  357. float16_t *pState);
  358. #endif
  359. extern void cmsis_mat_mult(const arm_matrix_instance_q7* a,
  360. const arm_matrix_instance_q7* b,
  361. arm_matrix_instance_q7 *c,
  362. q7_t *pState);
  363. extern void cmsis_mat_mult(const arm_matrix_instance_q15* a,
  364. const arm_matrix_instance_q15* b,
  365. arm_matrix_instance_q15 *c,
  366. q15_t *pState);
  367. extern void cmsis_mat_mult(const arm_matrix_instance_q31* a,
  368. const arm_matrix_instance_q31* b,
  369. arm_matrix_instance_q31 *c,
  370. q31_t *pState);
  371. extern void cmsis_mat_trans(const arm_matrix_instance_q7* a,
  372. arm_matrix_instance_q7* b);
  373. extern void cmsis_mat_trans(const arm_matrix_instance_q15* a,
  374. arm_matrix_instance_q15* b);
  375. extern void cmsis_mat_trans(const arm_matrix_instance_q31* a,
  376. arm_matrix_instance_q31* b);
  377. #if !defined(DISABLEFLOAT16)
  378. extern void cmsis_mat_trans(const arm_matrix_instance_f16* a,
  379. arm_matrix_instance_f16* b);
  380. #endif
  381. extern void cmsis_mat_trans(const arm_matrix_instance_f64* a,
  382. arm_matrix_instance_f64* b);
  383. extern void cmsis_mat_trans(const arm_matrix_instance_f32* a,
  384. arm_matrix_instance_f32* b);
  385. extern double cmsis_householder(const double *,double* ,uint32_t);
  386. extern float32_t cmsis_householder(const float32_t *,float32_t* ,uint32_t);
  387. #if !defined(DISABLEFLOAT16)
  388. extern float16_t cmsis_householder(const float16_t *,float16_t* ,uint32_t);
  389. #endif
  390. extern void cmsis_mat_vec_mult(
  391. const arm_matrix_instance_f64 *pSrcMat,
  392. const double *pVec,
  393. double *pDst);
  394. extern void cmsis_mat_vec_mult(
  395. const arm_matrix_instance_f32 *pSrcMat,
  396. const float32_t *pVec,
  397. float32_t *pDst);
  398. #if !defined(DISABLEFLOAT16)
  399. extern void cmsis_mat_vec_mult(
  400. const arm_matrix_instance_f16 *pSrcMat,
  401. const float16_t *pVec,
  402. float16_t *pDst);
  403. #endif
  404. extern void cmsis_mat_vec_mult(
  405. const arm_matrix_instance_q31 *pSrcMat,
  406. const Q31 *pVec,
  407. Q31 *pDst);
  408. extern void cmsis_mat_vec_mult(
  409. const arm_matrix_instance_q15 *pSrcMat,
  410. const Q15 *pVec,
  411. Q15 *pDst);
  412. extern void cmsis_mat_vec_mult(
  413. const arm_matrix_instance_q7 *pSrcMat,
  414. const Q7 *pVec,
  415. Q7 *pDst);
  416. extern arm_status cmsis_qr(
  417. const arm_matrix_instance_f64 * pSrc,
  418. const double threshold,
  419. arm_matrix_instance_f64 * pOutR,
  420. arm_matrix_instance_f64 * pOutQ,
  421. double * pOutTau,
  422. double *pTmpA,
  423. double *pTmpB
  424. );
  425. extern arm_status cmsis_qr(
  426. const arm_matrix_instance_f32 * pSrc,
  427. const float32_t threshold,
  428. arm_matrix_instance_f32 * pOutR,
  429. arm_matrix_instance_f32 * pOutQ,
  430. float32_t * pOutTau,
  431. float32_t *pTmpA,
  432. float32_t *pTmpB
  433. );
  434. #if !defined(DISABLEFLOAT16)
  435. extern arm_status cmsis_qr(
  436. const arm_matrix_instance_f16 * pSrc,
  437. const float16_t threshold,
  438. arm_matrix_instance_f16 * pOutR,
  439. arm_matrix_instance_f16 * pOutQ,
  440. float16_t * pOutTau,
  441. float16_t *pTmpA,
  442. float16_t *pTmpB
  443. );
  444. #endif
  445. extern arm_status cmsis_cholesky(
  446. const arm_matrix_instance_f64 * src,
  447. arm_matrix_instance_f64 * dst);
  448. extern arm_status cmsis_cholesky(
  449. const arm_matrix_instance_f32 * src,
  450. arm_matrix_instance_f32 * dst);
  451. #if !defined(DISABLEFLOAT16)
  452. extern arm_status cmsis_cholesky(
  453. const arm_matrix_instance_f16 * src,
  454. arm_matrix_instance_f16 * dst);
  455. #endif
  456. extern void cmsis_complex_mat_vec(
  457. const arm_matrix_instance_f64 * src,
  458. const double * a,
  459. const double * b,
  460. const double scalar,
  461. double * tmp,
  462. double * dst);
  463. extern void cmsis_complex_mat_vec(
  464. const arm_matrix_instance_f32 * src,
  465. const float32_t * a,
  466. const float32_t * b,
  467. const float32_t scalar,
  468. float32_t * tmp,
  469. float32_t * dst);
  470. #if !defined(DISABLEFLOAT16)
  471. extern void cmsis_complex_mat_vec(
  472. const arm_matrix_instance_f16 * src,
  473. const float16_t * a,
  474. const float16_t * b,
  475. const float16_t scalar,
  476. float16_t * tmp,
  477. float16_t * dst);
  478. #endif
  479. extern void cmsis_complex_mat_vec(
  480. const arm_matrix_instance_q31 * src,
  481. const Q31 * a,
  482. const Q31 * b,
  483. const Q31 scalar,
  484. Q31 * tmp,
  485. Q31 * dst);
  486. extern void cmsis_complex_mat_vec(
  487. const arm_matrix_instance_q15 * src,
  488. const Q15 * a,
  489. const Q15 * b,
  490. const Q15 scalar,
  491. Q15 * tmp,
  492. Q15 * dst);
  493. extern void cmsis_complex_mat_vec(
  494. const arm_matrix_instance_q7 * src,
  495. const Q7 * a,
  496. const Q7 * b,
  497. const Q7 scalar,
  498. Q7 * tmp,
  499. Q7 * dst);
  500. template<typename T>
  501. struct CMSISMatrixType;
  502. template<>
  503. struct CMSISMatrixType<double>
  504. {
  505. typedef arm_matrix_instance_f64 type;
  506. typedef double scalar;
  507. };
  508. template<>
  509. struct CMSISMatrixType<float32_t>
  510. {
  511. typedef arm_matrix_instance_f32 type;
  512. typedef float32_t scalar;
  513. };
  514. #if !defined(DISABLEFLOAT16)
  515. template<>
  516. struct CMSISMatrixType<float16_t>
  517. {
  518. typedef arm_matrix_instance_f16 type;
  519. typedef float16_t scalar;
  520. };
  521. #endif
  522. template<>
  523. struct CMSISMatrixType<Q7>
  524. {
  525. typedef arm_matrix_instance_q7 type;
  526. typedef q7_t scalar;
  527. };
  528. template<>
  529. struct CMSISMatrixType<Q15>
  530. {
  531. typedef arm_matrix_instance_q15 type;
  532. typedef q15_t scalar;
  533. };
  534. template<>
  535. struct CMSISMatrixType<Q31>
  536. {
  537. typedef arm_matrix_instance_q31 type;
  538. typedef q31_t scalar;
  539. };
  540. template<typename T>
  541. struct TestConstant;
  542. template<>
  543. struct TestConstant<double>
  544. {
  545. constexpr static double v = 0.2;
  546. constexpr static double small = 0.001;
  547. };
  548. template<>
  549. struct TestConstant<float32_t>
  550. {
  551. constexpr static float v = 0.2f;
  552. constexpr static float small = 0.001f;
  553. };
  554. #if !defined(DISABLEFLOAT16)
  555. template<>
  556. struct TestConstant<float16_t>
  557. {
  558. constexpr static float16_t v = 0.2f;
  559. constexpr static float16_t small = 0.001f;
  560. };
  561. #endif
  562. template<>
  563. struct TestConstant<Q7>
  564. {
  565. constexpr static Q7 v = 0.2_q7;
  566. constexpr static Q7 small = 0.001_q7;
  567. };
  568. template<>
  569. struct TestConstant<Q15>
  570. {
  571. constexpr static Q15 v = 0.2_q15;
  572. constexpr static Q15 small = 0.001_q15;
  573. };
  574. template<>
  575. struct TestConstant<Q31>
  576. {
  577. constexpr static Q31 v = 0.2_q31;
  578. constexpr static Q31 small = 0.001_q31;
  579. };