1 #include "MFCCQ31.h" 2 #include <stdio.h> 3 #include "Error.h" 4 5 #include "mfccdata.h" 6 7 #define SNR_THRESHOLD 66 8 9 /* 10 11 Reference patterns are generated with 12 a double precision computation. 13 14 */ 15 #define ABS_ERROR ((q31_t)49000) 16 17 18 19 test_mfcc_q31()20 void MFCCQ31::test_mfcc_q31() 21 { 22 const q31_t *inp1=input1.ptr(); 23 q31_t *tmpinp=tmpin.ptr(); 24 q31_t *outp=output.ptr(); 25 q31_t *tmpp=tmp.ptr(); 26 27 28 memcpy((void*)tmpinp,(void*)inp1,sizeof(q31_t)*this->fftLen); 29 arm_mfcc_q31(&mfcc,tmpinp,outp,tmpp); 30 31 ASSERT_EMPTY_TAIL(output); 32 33 ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD); 34 35 ASSERT_NEAR_EQ(output,ref,ABS_ERROR); 36 37 } 38 39 setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)40 void MFCCQ31::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr) 41 { 42 43 (void)params; 44 45 Testing::nbSamples_t nb=MAX_NB_SAMPLES; 46 47 48 switch(id) 49 { 50 case MFCCQ31::TEST_MFCC_Q31_1: 51 { 52 nb = 256; 53 this->fftLen = nb; 54 ref.reload(MFCCQ31::REF_MFCC_NOISE_256_Q31_ID,mgr,nb); 55 input1.reload(MFCCQ31::INPUTS_MFCC_NOISE_256_Q31_ID,mgr,nb); 56 arm_mfcc_init_q31(&mfcc, 57 nb,20,13,mfcc_dct_coefs_config1_q31, 58 mfcc_filter_pos_config3_q31,mfcc_filter_len_config3_q31, 59 mfcc_filter_coefs_config3_q31, 60 mfcc_window_coefs_config3_q31); 61 tmp.create(2*nb,MFCCQ31::TMP_MFCC_Q31_ID,mgr); 62 tmpin.create(nb,MFCCQ31::TMPIN_MFCC_Q31_ID,mgr); 63 } 64 break; 65 66 case MFCCQ31::TEST_MFCC_Q31_2: 67 { 68 nb = 512; 69 this->fftLen = nb; 70 ref.reload(MFCCQ31::REF_MFCC_NOISE_512_Q31_ID,mgr,nb); 71 input1.reload(MFCCQ31::INPUTS_MFCC_NOISE_512_Q31_ID,mgr,nb); 72 arm_mfcc_init_q31(&mfcc, 73 nb,20,13,mfcc_dct_coefs_config1_q31, 74 mfcc_filter_pos_config2_q31,mfcc_filter_len_config2_q31, 75 mfcc_filter_coefs_config2_q31, 76 mfcc_window_coefs_config2_q31); 77 tmp.create(2*nb,MFCCQ31::TMP_MFCC_Q31_ID,mgr); 78 tmpin.create(nb,MFCCQ31::TMPIN_MFCC_Q31_ID,mgr); 79 } 80 break; 81 case MFCCQ31::TEST_MFCC_Q31_3: 82 { 83 nb = 1024; 84 this->fftLen = nb; 85 ref.reload(MFCCQ31::REF_MFCC_NOISE_1024_Q31_ID,mgr,nb); 86 input1.reload(MFCCQ31::INPUTS_MFCC_NOISE_1024_Q31_ID,mgr,nb); 87 arm_mfcc_init_q31(&mfcc, 88 nb,20,13,mfcc_dct_coefs_config1_q31, 89 mfcc_filter_pos_config1_q31,mfcc_filter_len_config1_q31, 90 mfcc_filter_coefs_config1_q31, 91 mfcc_window_coefs_config1_q31); 92 tmp.create(2*nb,MFCCQ31::TMP_MFCC_Q31_ID,mgr); 93 tmpin.create(nb,MFCCQ31::TMPIN_MFCC_Q31_ID,mgr); 94 95 } 96 break; 97 98 case MFCCQ31::TEST_MFCC_Q31_4: 99 { 100 nb = 256; 101 this->fftLen = nb; 102 ref.reload(MFCCQ31::REF_MFCC_SINE_256_Q31_ID,mgr,nb); 103 input1.reload(MFCCQ31::INPUTS_MFCC_SINE_256_Q31_ID,mgr,nb); 104 arm_mfcc_init_q31(&mfcc, 105 nb,20,13,mfcc_dct_coefs_config1_q31, 106 mfcc_filter_pos_config3_q31,mfcc_filter_len_config3_q31, 107 mfcc_filter_coefs_config3_q31, 108 mfcc_window_coefs_config3_q31); 109 tmp.create(2*nb,MFCCQ31::TMP_MFCC_Q31_ID,mgr); 110 tmpin.create(nb,MFCCQ31::TMPIN_MFCC_Q31_ID,mgr); 111 } 112 break; 113 114 case MFCCQ31::TEST_MFCC_Q31_5: 115 { 116 nb = 512; 117 this->fftLen = nb; 118 ref.reload(MFCCQ31::REF_MFCC_SINE_512_Q31_ID,mgr,nb); 119 input1.reload(MFCCQ31::INPUTS_MFCC_SINE_512_Q31_ID,mgr,nb); 120 arm_mfcc_init_q31(&mfcc, 121 nb,20,13,mfcc_dct_coefs_config1_q31, 122 mfcc_filter_pos_config2_q31,mfcc_filter_len_config2_q31, 123 mfcc_filter_coefs_config2_q31, 124 mfcc_window_coefs_config2_q31); 125 tmp.create(2*nb,MFCCQ31::TMP_MFCC_Q31_ID,mgr); 126 tmpin.create(nb,MFCCQ31::TMPIN_MFCC_Q31_ID,mgr); 127 } 128 break; 129 case MFCCQ31::TEST_MFCC_Q31_6: 130 { 131 nb = 1024; 132 this->fftLen = nb; 133 ref.reload(MFCCQ31::REF_MFCC_SINE_1024_Q31_ID,mgr,nb); 134 input1.reload(MFCCQ31::INPUTS_MFCC_SINE_1024_Q31_ID,mgr,nb); 135 arm_mfcc_init_q31(&mfcc, 136 nb,20,13,mfcc_dct_coefs_config1_q31, 137 mfcc_filter_pos_config1_q31,mfcc_filter_len_config1_q31, 138 mfcc_filter_coefs_config1_q31, 139 mfcc_window_coefs_config1_q31); 140 tmp.create(2*nb,MFCCQ31::TMP_MFCC_Q31_ID,mgr); 141 tmpin.create(nb,MFCCQ31::TMPIN_MFCC_Q31_ID,mgr); 142 143 } 144 break; 145 146 } 147 148 149 output.create(ref.nbSamples(),MFCCQ31::OUTPUT_MFCC_Q31_ID,mgr); 150 151 } 152 tearDown(Testing::testID_t id,Client::PatternMgr * mgr)153 void MFCCQ31::tearDown(Testing::testID_t id,Client::PatternMgr *mgr) 154 { 155 (void)id; 156 (void)mgr; 157 //output.dump(mgr); 158 } 159