BIQUADF64.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #include "BIQUADF64.h"
  2. #include <stdio.h>
  3. #include "Error.h"
  4. #define SNR_THRESHOLD 98
  5. /*
  6. Reference patterns are generated with
  7. a double precision computation.
  8. */
  9. #define REL_ERROR (1.2e-3)
  10. #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
  11. static __ALIGNED(8) float64_t coeffArray[64];
  12. #endif
  13. void BIQUADF64::test_biquad_cascade_df2T_ref()
  14. {
  15. float64_t *statep = state.ptr();
  16. float64_t *coefsp = coefs.ptr();
  17. float64_t *inputp = inputs.ptr();
  18. float64_t *outp = output.ptr();
  19. int blockSize;
  20. /*
  21. Python script is generating different tests with
  22. different blockSize and numTaps.
  23. We loop on those configs.
  24. */
  25. blockSize = inputs.nbSamples() >> 1;
  26. /*
  27. The filter is initialized with the coefs, blockSize and numTaps.
  28. */
  29. arm_biquad_cascade_df2T_init_f64(&this->Sdf2T,3,coefsp,statep);
  30. /*
  31. Python script is filtering a 2*blockSize number of samples.
  32. We do the same filtering in two pass to check (indirectly that
  33. the state management of the fir is working.)
  34. */
  35. arm_biquad_cascade_df2T_f64(&this->Sdf2T,inputp,outp,blockSize);
  36. outp += blockSize;
  37. inputp += blockSize;
  38. arm_biquad_cascade_df2T_f64(&this->Sdf2T,inputp,outp,blockSize);
  39. outp += blockSize;
  40. ASSERT_EMPTY_TAIL(output);
  41. ASSERT_SNR(output,ref,(float64_t)SNR_THRESHOLD);
  42. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  43. }
  44. void BIQUADF64::test_biquad_cascade_df2T_rand()
  45. {
  46. float64_t *statep = state.ptr();
  47. const int16_t *configsp = configs.ptr();
  48. float64_t *coefsp = coefs.ptr();
  49. float64_t *inputp = inputs.ptr();
  50. float64_t *outp = output.ptr();
  51. int blockSize;
  52. int numStages;
  53. int i;
  54. for(i=0;i < configs.nbSamples(); i+=2)
  55. {
  56. /*
  57. Python script is generating different tests with
  58. different blockSize and numTaps.
  59. We loop on those configs.
  60. */
  61. numStages = configsp[0];
  62. blockSize = configsp[1];
  63. configsp += 2;
  64. /*
  65. The filter is initialized with the coefs, blockSize and numTaps.
  66. */
  67. arm_biquad_cascade_df2T_init_f64(&this->Sdf2T,numStages,coefsp,statep);
  68. coefsp += numStages * 5;
  69. /*
  70. Python script is filtering a 2*blockSize number of samples.
  71. We do the same filtering in two pass to check (indirectly that
  72. the state management of the fir is working.)
  73. */
  74. arm_biquad_cascade_df2T_f64(&this->Sdf2T,inputp,outp,blockSize);
  75. outp += blockSize;
  76. inputp += blockSize;
  77. }
  78. ASSERT_EMPTY_TAIL(output);
  79. ASSERT_SNR(output,ref,(float64_t)SNR_THRESHOLD);
  80. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  81. }
  82. void BIQUADF64::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  83. {
  84. switch(id)
  85. {
  86. case BIQUADF64::TEST_BIQUAD_CASCADE_DF2T_REF_1:
  87. inputs.reload(BIQUADF64::BIQUADINPUTS_F64_ID,mgr);
  88. coefs.reload(BIQUADF64::BIQUADCOEFS_F64_ID,mgr);
  89. ref.reload(BIQUADF64::BIQUADREFS_F64_ID,mgr);
  90. break;
  91. case BIQUADF64::TEST_BIQUAD_CASCADE_DF2T_RAND_2:
  92. inputs.reload(BIQUADF64::ALLBIQUADINPUTS_F64_ID,mgr);
  93. coefs.reload(BIQUADF64::ALLBIQUADCOEFS_F64_ID,mgr);
  94. ref.reload(BIQUADF64::ALLBIQUADREFS_F64_ID,mgr);
  95. configs.reload(BIQUADF64::ALLBIQUADCONFIGS_S16_ID,mgr);
  96. break;
  97. }
  98. output.create(ref.nbSamples(),BIQUADF64::OUT_F64_ID,mgr);
  99. state.create(128,BIQUADF64::STATE_F64_ID,mgr);
  100. }
  101. void BIQUADF64::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  102. {
  103. output.dump(mgr);
  104. }