BIQUADF16.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. #include "BIQUADF16.h"
  2. #include <stdio.h>
  3. #include "Error.h"
  4. #define SNR_THRESHOLD 27
  5. /*
  6. Reference patterns are generated with
  7. a double precision computation.
  8. */
  9. #define REL_ERROR (5.0e-2)
  10. #define ABS_ERROR (1.0e-1)
  11. void BIQUADF16::test_biquad_cascade_df1_ref()
  12. {
  13. float16_t *statep = state.ptr();
  14. float16_t *debugstatep = debugstate.ptr();
  15. const float16_t *coefsp = coefs.ptr();
  16. const float16_t *inputp = inputs.ptr();
  17. float16_t *outp = output.ptr();
  18. #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
  19. arm_biquad_mod_coef_f16 *coefsmodp = (arm_biquad_mod_coef_f16*)vecCoefs.ptr();
  20. #endif
  21. int blockSize;
  22. /*
  23. Python script is generating different tests with
  24. different blockSize and numTaps.
  25. We loop on those configs.
  26. */
  27. blockSize = inputs.nbSamples() >> 1;
  28. /*
  29. The filter is initialized with the coefs, blockSize and numTaps.
  30. */
  31. #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
  32. arm_biquad_cascade_df1_mve_init_f16(&this->Sdf1,3,coefsp,coefsmodp,statep);
  33. #else
  34. arm_biquad_cascade_df1_init_f16(&this->Sdf1,3,coefsp,statep);
  35. #endif
  36. /*
  37. Python script is filtering a 2*blockSize number of samples.
  38. We do the same filtering in two pass to check (indirectly that
  39. the state management of the fir is working.)
  40. */
  41. arm_biquad_cascade_df1_f16(&this->Sdf1,inputp,outp,blockSize);
  42. memcpy(debugstatep,statep,3*4*sizeof(float16_t));
  43. debugstatep += 3*4;
  44. outp += blockSize;
  45. inputp += blockSize;
  46. arm_biquad_cascade_df1_f16(&this->Sdf1,inputp,outp,blockSize);
  47. outp += blockSize;
  48. memcpy(debugstatep,statep,3*4*sizeof(float16_t));
  49. debugstatep += 3*4;
  50. ASSERT_EMPTY_TAIL(output);
  51. ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
  52. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  53. }
  54. void BIQUADF16::test_biquad_cascade_df2T_ref()
  55. {
  56. float16_t *statep = state.ptr();
  57. float16_t *coefsp = coefs.ptr();
  58. const float16_t *inputp = inputs.ptr();
  59. float16_t *outp = output.ptr();
  60. int blockSize;
  61. /*
  62. Python script is generating different tests with
  63. different blockSize and numTaps.
  64. We loop on those configs.
  65. */
  66. blockSize = inputs.nbSamples() >> 1;
  67. /*
  68. The filter is initialized with the coefs, blockSize and numTaps.
  69. */
  70. arm_biquad_cascade_df2T_init_f16(&this->Sdf2T,3,coefsp,statep);
  71. /*
  72. Python script is filtering a 2*blockSize number of samples.
  73. We do the same filtering in two pass to check (indirectly that
  74. the state management of the fir is working.)
  75. */
  76. arm_biquad_cascade_df2T_f16(&this->Sdf2T,inputp,outp,blockSize);
  77. outp += blockSize;
  78. inputp += blockSize;
  79. arm_biquad_cascade_df2T_f16(&this->Sdf2T,inputp,outp,blockSize);
  80. outp += blockSize;
  81. ASSERT_EMPTY_TAIL(output);
  82. ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
  83. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  84. }
  85. void BIQUADF16::test_biquad_cascade_df1_rand()
  86. {
  87. float16_t *statep = state.ptr();
  88. const float16_t *coefsp = coefs.ptr();
  89. const int16_t *configsp = configs.ptr();
  90. const float16_t *inputp = inputs.ptr();
  91. float16_t *outp = output.ptr();
  92. #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
  93. arm_biquad_mod_coef_f16 *coefsmodp = (arm_biquad_mod_coef_f16*)vecCoefs.ptr();
  94. #endif
  95. int blockSize;
  96. int numStages;
  97. unsigned long i;
  98. for(i=0;i < configs.nbSamples(); i+=2)
  99. {
  100. /*
  101. Python script is generating different tests with
  102. different blockSize and numTaps.
  103. We loop on those configs.
  104. */
  105. numStages = configsp[0];
  106. blockSize = configsp[1];
  107. configsp += 2;
  108. /*
  109. The filter is initialized with the coefs, blockSize and numTaps.
  110. */
  111. #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
  112. arm_biquad_cascade_df1_mve_init_f16(&this->Sdf1,numStages,coefsp,coefsmodp,statep);
  113. #else
  114. arm_biquad_cascade_df1_init_f16(&this->Sdf1,numStages,coefsp,statep);
  115. #endif
  116. /*
  117. Python script is filtering a 2*blockSize number of samples.
  118. We do the same filtering in two pass to check (indirectly that
  119. the state management of the fir is working.)
  120. */
  121. arm_biquad_cascade_df1_f16(&this->Sdf1,inputp,outp,blockSize);
  122. inputp += blockSize;
  123. outp += blockSize;
  124. coefsp += numStages * 5;
  125. }
  126. ASSERT_EMPTY_TAIL(output);
  127. ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
  128. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  129. }
  130. void BIQUADF16::test_biquad_cascade_df2T_rand()
  131. {
  132. float16_t *statep = state.ptr();
  133. const int16_t *configsp = configs.ptr();
  134. float16_t *coefsp = coefs.ptr();
  135. const float16_t *inputp = inputs.ptr();
  136. float16_t *outp = output.ptr();
  137. int blockSize;
  138. int numStages;
  139. unsigned long i;
  140. for(i=0;i < configs.nbSamples(); i+=2)
  141. {
  142. /*
  143. Python script is generating different tests with
  144. different blockSize and numTaps.
  145. We loop on those configs.
  146. */
  147. numStages = configsp[0];
  148. blockSize = configsp[1];
  149. configsp += 2;
  150. /*
  151. The filter is initialized with the coefs, blockSize and numTaps.
  152. */
  153. arm_biquad_cascade_df2T_init_f16(&this->Sdf2T,numStages,coefsp,statep);
  154. coefsp += numStages * 5;
  155. /*
  156. Python script is filtering a 2*blockSize number of samples.
  157. We do the same filtering in two pass to check (indirectly that
  158. the state management of the fir is working.)
  159. */
  160. arm_biquad_cascade_df2T_f16(&this->Sdf2T,inputp,outp,blockSize);
  161. outp += blockSize;
  162. inputp += blockSize;
  163. }
  164. ASSERT_EMPTY_TAIL(output);
  165. ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
  166. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  167. }
  168. void BIQUADF16::test_biquad_cascade_stereo_df2T_rand()
  169. {
  170. float16_t *statep = state.ptr();
  171. const int16_t *configsp = configs.ptr();
  172. const float16_t *coefsp = coefs.ptr();
  173. const float16_t *inputp = inputs.ptr();
  174. float16_t *outp = output.ptr();
  175. int blockSize;
  176. int numStages;
  177. unsigned long i;
  178. for(i=0;i < configs.nbSamples(); i+=2)
  179. {
  180. /*
  181. Python script is generating different tests with
  182. different blockSize and numTaps.
  183. We loop on those configs.
  184. */
  185. numStages = configsp[0];
  186. blockSize = configsp[1];
  187. configsp += 2;
  188. /*
  189. The filter is initialized with the coefs, blockSize and numTaps.
  190. */
  191. arm_biquad_cascade_stereo_df2T_init_f16(&this->SStereodf2T,numStages,coefsp,statep);
  192. coefsp += numStages * 5;
  193. /*
  194. Python script is filtering a 2*blockSize number of samples.
  195. We do the same filtering in two pass to check (indirectly that
  196. the state management of the fir is working.)
  197. */
  198. arm_biquad_cascade_stereo_df2T_f16(&this->SStereodf2T,inputp,outp,blockSize);
  199. outp += 2*blockSize;
  200. inputp += 2*blockSize;
  201. }
  202. ASSERT_EMPTY_TAIL(output);
  203. ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
  204. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  205. }
  206. void BIQUADF16::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  207. {
  208. (void)params;
  209. switch(id)
  210. {
  211. case BIQUADF16::TEST_BIQUAD_CASCADE_DF1_REF_1:
  212. debugstate.create(2*64,BIQUADF16::STATE_F16_ID,mgr);
  213. inputs.reload(BIQUADF16::BIQUADINPUTS_F16_ID,mgr);
  214. coefs.reload(BIQUADF16::BIQUADCOEFS_F16_ID,mgr);
  215. ref.reload(BIQUADF16::BIQUADREFS_F16_ID,mgr);
  216. #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
  217. /* Max num stages is 47 in Python script */
  218. vecCoefs.create(96*47,BIQUADF16::OUT_F16_ID,mgr);
  219. #endif
  220. break;
  221. case BIQUADF16::TEST_BIQUAD_CASCADE_DF2T_REF_2:
  222. vecCoefs.create(64,BIQUADF16::OUT_F16_ID,mgr);
  223. inputs.reload(BIQUADF16::BIQUADINPUTS_F16_ID,mgr);
  224. coefs.reload(BIQUADF16::BIQUADCOEFS_F16_ID,mgr);
  225. ref.reload(BIQUADF16::BIQUADREFS_F16_ID,mgr);
  226. break;
  227. case BIQUADF16::TEST_BIQUAD_CASCADE_DF1_RAND_3:
  228. inputs.reload(BIQUADF16::ALLBIQUADINPUTS_F16_ID,mgr);
  229. coefs.reload(BIQUADF16::ALLBIQUADCOEFS_F16_ID,mgr);
  230. ref.reload(BIQUADF16::ALLBIQUADREFS_F16_ID,mgr);
  231. configs.reload(BIQUADF16::ALLBIQUADCONFIGS_S16_ID,mgr);
  232. #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
  233. /* Max num stages is 47 in Python script */
  234. vecCoefs.create(96*47,BIQUADF16::OUT_F16_ID,mgr);
  235. #endif
  236. break;
  237. case BIQUADF16::TEST_BIQUAD_CASCADE_DF2T_RAND_4:
  238. vecCoefs.create(512,BIQUADF16::OUT_F16_ID,mgr);
  239. inputs.reload(BIQUADF16::ALLBIQUADINPUTS_F16_ID,mgr);
  240. coefs.reload(BIQUADF16::ALLBIQUADCOEFS_F16_ID,mgr);
  241. ref.reload(BIQUADF16::ALLBIQUADREFS_F16_ID,mgr);
  242. configs.reload(BIQUADF16::ALLBIQUADCONFIGS_S16_ID,mgr);
  243. break;
  244. case BIQUADF16::TEST_BIQUAD_CASCADE_STEREO_DF2T_RAND_5:
  245. inputs.reload(BIQUADF16::ALLBIQUADSTEREOINPUTS_F16_ID,mgr);
  246. coefs.reload(BIQUADF16::ALLBIQUADCOEFS_F16_ID,mgr);
  247. ref.reload(BIQUADF16::ALLBIQUADSTEREOREFS_F16_ID,mgr);
  248. configs.reload(BIQUADF16::ALLBIQUADCONFIGS_S16_ID,mgr);
  249. break;
  250. }
  251. output.create(ref.nbSamples(),BIQUADF16::OUT_F16_ID,mgr);
  252. state.create(128,BIQUADF16::STATE_F16_ID,mgr);
  253. }
  254. void BIQUADF16::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  255. {
  256. (void)id;
  257. output.dump(mgr);
  258. switch(id)
  259. {
  260. case BIQUADF16::TEST_BIQUAD_CASCADE_DF1_REF_1:
  261. debugstate.dump(mgr);
  262. break;
  263. }
  264. }