BIQUADF64.cpp 4.2 KB

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