FIRF32.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "FIRF32.h"
  2. #include "Error.h"
  3. #define SNR_THRESHOLD 120
  4. /*
  5. Reference patterns are generated with
  6. a double precision computation.
  7. */
  8. #define REL_ERROR (3.0e-5)
  9. #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
  10. static __ALIGNED(8) float32_t coeffArray[32];
  11. #endif
  12. void FIRF32::test_fir_f32()
  13. {
  14. const int16_t *configp = configs.ptr();
  15. float32_t *statep = state.ptr();
  16. const float32_t *orgcoefsp = coefs.ptr();
  17. const float32_t *coefsp;
  18. const float32_t *inputp = inputs.ptr();
  19. float32_t *outp = output.ptr();
  20. int i,j;
  21. int blockSize;
  22. int numTaps;
  23. int nb=0;
  24. /*
  25. Python script is generating different tests with
  26. different blockSize and numTaps.
  27. We loop on those configs.
  28. */
  29. for(i=0; i < configs.nbSamples() ; i += 2)
  30. {
  31. blockSize = configp[0];
  32. numTaps = configp[1];
  33. #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
  34. /* Copy coefficients and pad to zero
  35. */
  36. memset(coeffArray,0,32);
  37. for(j=0;j < numTaps; j++)
  38. {
  39. coeffArray[j] = orgcoefsp[j];
  40. }
  41. coefsp = coeffArray;
  42. #else
  43. coefsp = orgcoefsp;
  44. #endif
  45. /*
  46. The filter is initialized with the coefs, blockSize and numTaps.
  47. */
  48. arm_fir_init_f32(&this->S,numTaps,coefsp,statep,blockSize);
  49. /*
  50. Input pointer is reset since the same input pattern is used
  51. */
  52. inputp = inputs.ptr();
  53. /*
  54. Python script is filtering a 2*blockSize number of samples.
  55. We do the same filtering in two pass to check (indirectly that
  56. the state management of the fir is working.)
  57. */
  58. arm_fir_f32(&this->S,inputp,outp,blockSize);
  59. outp += blockSize;
  60. inputp += blockSize;
  61. arm_fir_f32(&this->S,inputp,outp,blockSize);
  62. outp += blockSize;
  63. configp += 2;
  64. orgcoefsp += numTaps;
  65. nb += 2*blockSize;
  66. }
  67. ASSERT_EMPTY_TAIL(output);
  68. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  69. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  70. }
  71. void FIRF32::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  72. {
  73. Testing::nbSamples_t nb=MAX_NB_SAMPLES;
  74. switch(id)
  75. {
  76. case FIRF32::TEST_FIR_F32_1:
  77. break;
  78. }
  79. inputs.reload(FIRF32::FIRINPUTS_F32_ID,mgr);
  80. coefs.reload(FIRF32::FIRCOEFS_F32_ID,mgr);
  81. configs.reload(FIRF32::FIRCONFIGS_S16_ID,mgr);
  82. ref.reload(FIRF32::FIRREFS_F32_ID,mgr);
  83. output.create(ref.nbSamples(),FIRF32::OUT_F32_ID,mgr);
  84. /* Max blockSize + numTaps - 1 as generated by Python script */
  85. state.create(47,FIRF32::OUT_F32_ID,mgr);
  86. }
  87. void FIRF32::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  88. {
  89. output.dump(mgr);
  90. }