#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 /* 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); }