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