| #include "jtest.h" |
| #include "ref.h" |
| #include "arm_math.h" |
| #include "arr_desc.h" |
| #include "transform_templates.h" |
| #include "transform_test_data.h" |
| #include "type_abbrev.h" |
| #include <math.h> /* sqrtf() */ |
| |
| /*--------------------------------------------------------------------------------*/ |
| /* Aliases to aid macro expansion */ |
| /*--------------------------------------------------------------------------------*/ |
| #define ref_sqrt_f32(x) sqrtf(x) |
| |
| /*--------------------------------------------------------------------------------*/ |
| /* Test Definitions */ |
| /*--------------------------------------------------------------------------------*/ |
| |
| /* |
| DCT function test template. Arguments are: function configuration suffix |
| (q7/q15/q31/f32) and input type (q7_t/q15_t/q31_t/float32_t) |
| */ |
| #define DCT4_DEFINE_TEST(suffix, input_type) \ |
| JTEST_DEFINE_TEST(arm_dct4_##suffix##_test, arm_dct4_##suffix) \ |
| { \ |
| CONCAT(arm_dct4_instance_,suffix) dct4_inst_fut = {0}; \ |
| CONCAT(arm_rfft_instance_,suffix) rfft_inst_fut = {0}; \ |
| CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_fut = {0}; \ |
| \ |
| CONCAT(arm_dct4_instance_,suffix) dct4_inst_ref = {0}; \ |
| CONCAT(arm_rfft_instance_,suffix) rfft_inst_ref = {0}; \ |
| CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_ref = {0}; \ |
| \ |
| /* Go through all dct lengths */ \ |
| TEMPLATE_DO_ARR_DESC( \ |
| fftlen_idx, uint16_t, fftlen, transform_dct_fftlens \ |
| , \ |
| \ |
| float32_t normalize_f32 = \ |
| ref_sqrt_f32((2.0f/(float32_t)fftlen)); \ |
| input_type normalize; \ |
| \ |
| /* Calculate normalized DCT4 value for input_type. */ \ |
| TEST_CONVERT_FLOAT_TO(&normalize_f32, &normalize, \ |
| 1, input_type); \ |
| \ |
| /* Initialize the DCT4, RFFT, and CFFT instances */ \ |
| arm_dct4_init_##suffix( \ |
| &dct4_inst_fut, &rfft_inst_fut, &cfft_inst_fut, \ |
| fftlen, \ |
| fftlen/2, \ |
| normalize); \ |
| \ |
| arm_dct4_init_##suffix( \ |
| &dct4_inst_ref, &rfft_inst_ref, &cfft_inst_ref, \ |
| fftlen, \ |
| fftlen/2, \ |
| normalize); \ |
| \ |
| memset( transform_fft_input_fut,0, \ |
| fftlen*sizeof(input_type)); \ |
| \ |
| TRANSFORM_PREPARE_INPLACE_INPUTS( \ |
| transform_fft_##suffix##_inputs, \ |
| fftlen * sizeof(input_type)); \ |
| \ |
| /* Display parameter values */ \ |
| JTEST_DUMP_STRF("Block Size: %d\n", \ |
| (int)fftlen); \ |
| \ |
| /* Input provided as a scratch buffer. Inplace input is \ |
| * actual input. Display cycle count and run test*/ \ |
| JTEST_COUNT_CYCLES( \ |
| arm_dct4_##suffix( \ |
| &dct4_inst_fut, \ |
| (void *) transform_fft_input_fut, \ |
| (void *) transform_fft_inplace_input_fut)); \ |
| \ |
| memset( transform_fft_input_ref,0, \ |
| fftlen*sizeof(input_type)); \ |
| \ |
| /* Input provided as a scratch buffer. Inplace input is */ \ |
| /* actual input. */ \ |
| ref_dct4_##suffix( \ |
| &dct4_inst_ref, \ |
| (void *) transform_fft_input_ref, \ |
| (void *) transform_fft_inplace_input_ref); \ |
| \ |
| /* Test correctness */ \ |
| DCT_TRANSFORM_SNR_COMPARE_INTERFACE( \ |
| fftlen, \ |
| input_type)); \ |
| \ |
| return JTEST_TEST_PASSED; \ |
| } |
| |
| /* |
| DCT function test template for fixed point data. Arguments are: function |
| suffix (q7/q15/q31/f32), input type (q7_t/q15_t/q31_t/float32_t) and prefix |
| (dct_4) |
| */ |
| #define DCT4_FIXED_POINT_DEFINE_TEST(suffix, input_type, prefix) \ |
| JTEST_DEFINE_TEST(arm_dct4_##suffix##_test, arm_dct4_##suffix) \ |
| { \ |
| CONCAT(arm_dct4_instance_,suffix) dct4_inst_fut = {0}; \ |
| CONCAT(arm_rfft_instance_,suffix) rfft_inst_fut = {0}; \ |
| CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_fut = {0}; \ |
| \ |
| CONCAT(arm_dct4_instance_,suffix) dct4_inst_ref = {0}; \ |
| CONCAT(arm_rfft_instance_,suffix) rfft_inst_ref = {0}; \ |
| CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_ref = {0}; \ |
| \ |
| TEMPLATE_DO_ARR_DESC( \ |
| fftlen_idx, uint16_t, fftlen, transform_dct_fftlens \ |
| , \ |
| uint32_t i; \ |
| float32_t normalize_f32 = \ |
| ref_sqrt_f32((2.0f/(float32_t)fftlen)); \ |
| input_type normalize; \ |
| \ |
| /* Calculate normalized DCT4 value for input_type. */ \ |
| TEST_CONVERT_FLOAT_TO(&normalize_f32, &normalize, \ |
| 1, input_type); \ |
| \ |
| /* Initialize the DCT4, RFFT, and CFFT instances */ \ |
| arm_dct4_init_##suffix( \ |
| &dct4_inst_fut, &rfft_inst_fut, &cfft_inst_fut, \ |
| fftlen, \ |
| fftlen/2, \ |
| normalize); \ |
| \ |
| arm_dct4_init_##suffix( \ |
| &dct4_inst_ref, &rfft_inst_ref, &cfft_inst_ref, \ |
| fftlen, \ |
| fftlen/2, \ |
| normalize); \ |
| \ |
| /* Input samples need to be downscaled by 1 bit to \ |
| * avoid saturations in the Q31 DCT process, \ |
| * as the conversion from DCT2 to DCT4 involves \ |
| * one subtraction. \ |
| */ \ |
| for(i=0; i < fftlen; i++) \ |
| { \ |
| ((input_type*)transform_fft_inplace_input_fut)[i] = \ |
| prefix##transform_fft_##suffix##_inputs[i] >> 1; \ |
| ((input_type*)transform_fft_inplace_input_ref)[i] = \ |
| prefix##transform_fft_##suffix##_inputs[i] >> 1; \ |
| } \ |
| \ |
| memset( transform_fft_input_fut,0, \ |
| fftlen*sizeof(input_type)); \ |
| \ |
| /* Display test parameter values */ \ |
| JTEST_DUMP_STRF("Block Size: %d\n", \ |
| (int)fftlen); \ |
| \ |
| /* Input provided as a scratch buffer. Inplace input is \ |
| * actual input. */ \ |
| JTEST_COUNT_CYCLES( \ |
| arm_dct4_##suffix( \ |
| &dct4_inst_fut, \ |
| (void *) transform_fft_input_fut, \ |
| (void *) transform_fft_inplace_input_fut)); \ |
| \ |
| memset( transform_fft_input_ref,0, \ |
| fftlen*sizeof(input_type)); \ |
| \ |
| /* Input provided as a scratch buffer. Inplace input is */ \ |
| /* actual input. */ \ |
| ref_dct4_##suffix( \ |
| &dct4_inst_ref, \ |
| (void *) transform_fft_input_ref, \ |
| (void *) transform_fft_inplace_input_ref); \ |
| \ |
| /* Test correctness */ \ |
| DCT_TRANSFORM_SNR_COMPARE_INTERFACE( \ |
| fftlen, \ |
| input_type)); \ |
| \ |
| return JTEST_TEST_PASSED; \ |
| } |
| |
| DCT4_DEFINE_TEST(f32, float32_t); |
| DCT4_FIXED_POINT_DEFINE_TEST(q31, q31_t,); |
| DCT4_FIXED_POINT_DEFINE_TEST(q15, q15_t, dct4_); |
| |
| /*--------------------------------------------------------------------------------*/ |
| /* Collect all tests in a group */ |
| /*--------------------------------------------------------------------------------*/ |
| |
| JTEST_DEFINE_GROUP(dct4_tests) |
| { |
| JTEST_TEST_CALL(arm_dct4_f32_test); |
| JTEST_TEST_CALL(arm_dct4_q31_test); |
| JTEST_TEST_CALL(arm_dct4_q15_test); |
| } |