Subversion Repositories FuelGauge

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
#include "jtest.h"
2
#include "ref.h"
3
#include "arm_math.h"
4
#include "arr_desc.h"
5
#include "transform_templates.h"
6
#include "transform_test_data.h"
7
#include "type_abbrev.h"
8
#include <math.h>               /* sqrtf() */
9
 
10
/*--------------------------------------------------------------------------------*/
11
/* Aliases to aid macro expansion */
12
/*--------------------------------------------------------------------------------*/
13
#define ref_sqrt_f32(x) sqrtf(x)
14
 
15
/*--------------------------------------------------------------------------------*/
16
/* Test Definitions */
17
/*--------------------------------------------------------------------------------*/
18
 
19
/*
20
DCT function test template. Arguments are: function configuration suffix
21
(q7/q15/q31/f32) and input type (q7_t/q15_t/q31_t/float32_t)
22
*/
23
#define DCT4_DEFINE_TEST(suffix, input_type)                            \
24
    JTEST_DEFINE_TEST(arm_dct4_##suffix##_test, arm_dct4_##suffix)      \
25
    {                                                                   \
26
        CONCAT(arm_dct4_instance_,suffix) dct4_inst_fut        = {0};   \
27
        CONCAT(arm_rfft_instance_,suffix) rfft_inst_fut        = {0};   \
28
        CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_fut = {0};   \
29
                                                                        \
30
        CONCAT(arm_dct4_instance_,suffix) dct4_inst_ref        = {0};   \
31
        CONCAT(arm_rfft_instance_,suffix) rfft_inst_ref        = {0};   \
32
        CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_ref = {0};   \
33
                                                                        \
34
        /* Go through all dct lengths */                                \
35
        TEMPLATE_DO_ARR_DESC(                                           \
36
            fftlen_idx, uint16_t, fftlen, transform_dct_fftlens         \
37
            ,                                                           \
38
                                                                        \
39
            float32_t normalize_f32 =                                   \
40
                  ref_sqrt_f32((2.0f/(float32_t)fftlen));               \
41
            input_type normalize;                                       \
42
                                                                        \
43
            /* Calculate normalized DCT4 value for input_type. */       \
44
            TEST_CONVERT_FLOAT_TO(&normalize_f32, &normalize,           \
45
                                  1, input_type);                       \
46
                                                                        \
47
            /* Initialize the DCT4, RFFT, and CFFT instances */         \
48
            arm_dct4_init_##suffix(                                     \
49
                &dct4_inst_fut, &rfft_inst_fut, &cfft_inst_fut,         \
50
                fftlen,                                                 \
51
                fftlen/2,                                               \
52
                normalize);                                             \
53
                                                                        \
54
            arm_dct4_init_##suffix(                                     \
55
                &dct4_inst_ref, &rfft_inst_ref, &cfft_inst_ref,         \
56
                fftlen,                                                 \
57
                fftlen/2,                                               \
58
                normalize);                                             \
59
                                                                        \
60
             memset( transform_fft_input_fut,0,                         \
61
                     fftlen*sizeof(input_type));                        \
62
                                                                        \
63
            TRANSFORM_PREPARE_INPLACE_INPUTS(                           \
64
                transform_fft_##suffix##_inputs,                        \
65
                fftlen * sizeof(input_type));                           \
66
                                                                        \
67
            /* Display parameter values */                              \
68
            JTEST_DUMP_STRF("Block Size: %d\n",                         \
69
                         (int)fftlen);                                  \
70
                                                                        \
71
            /* Input provided as a scratch buffer. Inplace input is     \
72
             * actual input. Display cycle count and run test*/         \
73
            JTEST_COUNT_CYCLES(                                         \
74
                arm_dct4_##suffix(                                      \
75
                    &dct4_inst_fut,                                     \
76
                    (void *) transform_fft_input_fut,                   \
77
                    (void *) transform_fft_inplace_input_fut));         \
78
                                                                        \
79
             memset( transform_fft_input_ref,0,                         \
80
                     fftlen*sizeof(input_type));                        \
81
                                                                        \
82
            /* Input provided as a scratch buffer. Inplace input is */  \
83
            /* actual input. */                                         \
84
            ref_dct4_##suffix(                                          \
85
                &dct4_inst_ref,                                         \
86
                (void *) transform_fft_input_ref,                       \
87
                (void *) transform_fft_inplace_input_ref);              \
88
                                                                        \
89
            /* Test correctness */                                      \
90
            DCT_TRANSFORM_SNR_COMPARE_INTERFACE(                        \
91
                fftlen,                                                 \
92
                input_type));                                           \
93
                                                                        \
94
        return JTEST_TEST_PASSED;                                       \
95
    }
96
 
97
/*
98
  DCT function test template for fixed point data. Arguments are: function
99
  suffix (q7/q15/q31/f32), input type (q7_t/q15_t/q31_t/float32_t) and prefix
100
  (dct_4)
101
*/
102
#define DCT4_FIXED_POINT_DEFINE_TEST(suffix, input_type, prefix)           \
103
    JTEST_DEFINE_TEST(arm_dct4_##suffix##_test, arm_dct4_##suffix)         \
104
    {                                                                      \
105
        CONCAT(arm_dct4_instance_,suffix) dct4_inst_fut        = {0};      \
106
        CONCAT(arm_rfft_instance_,suffix) rfft_inst_fut        = {0};      \
107
        CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_fut = {0};      \
108
                                                                           \
109
        CONCAT(arm_dct4_instance_,suffix) dct4_inst_ref        = {0};      \
110
        CONCAT(arm_rfft_instance_,suffix) rfft_inst_ref        = {0};      \
111
        CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_ref = {0};      \
112
                                                                           \
113
        TEMPLATE_DO_ARR_DESC(                                              \
114
            fftlen_idx, uint16_t, fftlen, transform_dct_fftlens            \
115
            ,                                                              \
116
            uint32_t i;                                                    \
117
            float32_t normalize_f32 =                                      \
118
                  ref_sqrt_f32((2.0f/(float32_t)fftlen));                  \
119
            input_type normalize;                                          \
120
                                                                           \
121
            /* Calculate normalized DCT4 value for input_type. */          \
122
            TEST_CONVERT_FLOAT_TO(&normalize_f32, &normalize,              \
123
                                  1, input_type);                          \
124
                                                                           \
125
            /* Initialize the DCT4, RFFT, and CFFT instances */            \
126
            arm_dct4_init_##suffix(                                        \
127
                &dct4_inst_fut, &rfft_inst_fut, &cfft_inst_fut,            \
128
                fftlen,                                                    \
129
                fftlen/2,                                                  \
130
                normalize);                                                \
131
                                                                           \
132
            arm_dct4_init_##suffix(                                        \
133
                &dct4_inst_ref, &rfft_inst_ref, &cfft_inst_ref,            \
134
                fftlen,                                                    \
135
                fftlen/2,                                                  \
136
                normalize);                                                \
137
                                                                           \
138
             /* Input samples need to be downscaled by 1 bit to            \
139
              * avoid saturations in the Q31 DCT process,                  \
140
              * as the conversion from DCT2 to DCT4 involves               \
141
              * one subtraction.                                           \
142
              */                                                           \
143
             for(i=0; i < fftlen; i++)                                     \
144
             {                                                             \
145
               ((input_type*)transform_fft_inplace_input_fut)[i] =         \
146
                        prefix##transform_fft_##suffix##_inputs[i] >> 1;   \
147
               ((input_type*)transform_fft_inplace_input_ref)[i] =         \
148
                        prefix##transform_fft_##suffix##_inputs[i] >> 1;   \
149
             }                                                             \
150
                                                                           \
151
             memset( transform_fft_input_fut,0,                            \
152
                     fftlen*sizeof(input_type));                           \
153
                                                                           \
154
             /* Display test parameter values */                           \
155
            JTEST_DUMP_STRF("Block Size: %d\n",                            \
156
                         (int)fftlen);                                     \
157
                                                                           \
158
            /* Input provided as a scratch buffer. Inplace input is        \
159
             * actual input. */                                            \
160
            JTEST_COUNT_CYCLES(                                            \
161
                arm_dct4_##suffix(                                         \
162
                    &dct4_inst_fut,                                        \
163
                    (void *) transform_fft_input_fut,                      \
164
                    (void *) transform_fft_inplace_input_fut));            \
165
                                                                           \
166
             memset( transform_fft_input_ref,0,                            \
167
                     fftlen*sizeof(input_type));                           \
168
                                                                           \
169
            /* Input provided as a scratch buffer. Inplace input is */     \
170
            /* actual input. */                                            \
171
            ref_dct4_##suffix(                                             \
172
                &dct4_inst_ref,                                            \
173
                (void *) transform_fft_input_ref,                          \
174
                (void *) transform_fft_inplace_input_ref);                 \
175
                                                                           \
176
            /* Test correctness */                                         \
177
            DCT_TRANSFORM_SNR_COMPARE_INTERFACE(                           \
178
                fftlen,                                                    \
179
                input_type));                                              \
180
                                                                           \
181
        return JTEST_TEST_PASSED;                                          \
182
    }
183
 
184
DCT4_DEFINE_TEST(f32, float32_t);
185
DCT4_FIXED_POINT_DEFINE_TEST(q31, q31_t,);
186
DCT4_FIXED_POINT_DEFINE_TEST(q15, q15_t, dct4_);
187
 
188
/*--------------------------------------------------------------------------------*/
189
/* Collect all tests in a group */
190
/*--------------------------------------------------------------------------------*/
191
 
192
JTEST_DEFINE_GROUP(dct4_tests)
193
{
194
    JTEST_TEST_CALL(arm_dct4_f32_test);
195
    JTEST_TEST_CALL(arm_dct4_q31_test);
196
    JTEST_TEST_CALL(arm_dct4_q15_test);
197
}