BIQUADF64.cpp 4.0 KB

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