#include "jtest.h" #include "ref.h" #include "arr_desc.h" #include "transform_templates.h" #include "transform_test_data.h" #include "type_abbrev.h" /*--------------------------------------------------------------------------------*/ /* Macros and Defines */ /*--------------------------------------------------------------------------------*/ #define CFFT_FN_NAME(fn_specifier, type_suffix) \ arm_cfft_##fn_specifier##_##type_suffix \ #define CFFT_TEST_NAME(fn_specifier, type_suffix, config_suffix) \ arm_cfft_##fn_specifier##_##type_suffix##_##config_suffix##_test \ /*--------------------------------------------------------------------------------*/ /* Function Aliases */ /*--------------------------------------------------------------------------------*/ /* These aliases allow expansions in the CFFT_FAMILY_DEFINE_TEST() template to make sense */ #define arm_cfft_mag_init_f32 arm_cfft_radix4_init_f32 #define arm_cfft_mag_init_q31 arm_cfft_radix4_init_q31 #define arm_cfft_mag_init_q15 arm_cfft_radix4_init_q15 #define arm_cfft_mag_instance_f32 arm_cfft_radix4_instance_f32 #define arm_cfft_mag_instance_q31 arm_cfft_radix4_instance_q31 #define arm_cfft_mag_instance_q15 arm_cfft_radix4_instance_q15 #define transform_mag_fftlens transform_radix4_fftlens /*--------------------------------------------------------------------------------*/ /* Test Definition */ /*--------------------------------------------------------------------------------*/ /** * Defines a test for the family of CFFT transforms. * * The family of CFFT transforms includes: * * - arm_cfft_radix4_xxx * - arm_cfft_radix2_xxx * - arm_cfft_mag_xxx * * Where xxx can be f32, q31, or q15. * * @param fn_specifier Allowed values: radix4, radix2, mag. * @param type_suffix Allowed values: f32, q31, q15. * * @param config_suffix Used to differentiate test names based configuration * (in this case whether the ifft_flag is set or not.) * @param comparison_interface Macro name used to compare reference and fut * outputs. * * @param output_tpe The type of variable contained in the output * (e.g. float32_t, uint32_t, etc). * * @param ifft_flag Determines whether the arm_cfft_instance_xxx is configured * for an inverse FFT. */ #define CFFT_FAMILY_DEFINE_TEST(fn_specifier, \ type_suffix, \ config_suffix, /* Delineate between test configs*/ \ comparison_interface, \ output_type, \ ifft_flag) \ JTEST_DEFINE_TEST(CFFT_TEST_NAME(fn_specifier, type_suffix, \ config_suffix), \ CFFT_FN_NAME(fn_specifier, type_suffix)) \ { \ arm_cfft_##fn_specifier##_instance_##type_suffix cfft_inst_fut; \ arm_cfft_##fn_specifier##_instance_##type_suffix cfft_inst_ref; \ \ TEMPLATE_DO_ARR_DESC( \ fftlen_idx, uint16_t, fftlen, transform_##fn_specifier##_fftlens \ , \ \ /* Initialize the cfft instance */ \ arm_cfft_##fn_specifier##_init_##type_suffix( \ &cfft_inst_fut, fftlen, ifft_flag, (uint8_t)1); \ arm_cfft_##fn_specifier##_init_##type_suffix( \ &cfft_inst_ref, fftlen, ifft_flag, (uint8_t)1); \ \ TRANSFORM_PREPARE_INPLACE_INPUTS( \ transform_fft_##type_suffix##_inputs, \ fftlen * \ sizeof(TYPE_FROM_ABBREV(type_suffix)) * \ 2 /*complex_inputs*/); \ \ /* Display parameter values */ \ JTEST_DUMP_STRF("Block Size: %d\n" \ "Inverse-transform flag: %d\n", \ (int)fftlen, \ (int)ifft_flag); \ \ /* Display cycle count and run test */ \ JTEST_COUNT_CYCLES( \ arm_cfft_##fn_specifier##_##type_suffix( \ &cfft_inst_fut, \ (void*) transform_fft_inplace_input_fut)); \ \ ref_cfft_##fn_specifier##_##type_suffix( \ &cfft_inst_ref, \ (void *) transform_fft_inplace_input_ref); \ \ /* Test correctness */ \ comparison_interface( \ fftlen, \ output_type)); \ \ return JTEST_TEST_PASSED; \ } /** * Bulk wrapper for all tests instantiated using #CFFT_FAMILY_DEFINE_TEST(). * * This macro allows several test definitions to share the same config_suffix * and ifft_flag settings. */ #define CFFT_FAMILY_DEFINE_ALL_TESTS(config_suffix, ifft_flag) \ /* Radix2 tests*/ \ CFFT_FAMILY_DEFINE_TEST(radix2, q31, config_suffix, \ TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE, \ TYPE_FROM_ABBREV(q31), \ ifft_flag); \ CFFT_FAMILY_DEFINE_TEST(radix2, q15, config_suffix, \ TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE, \ TYPE_FROM_ABBREV(q15), \ ifft_flag); \ /* Radix4 tests*/ \ CFFT_FAMILY_DEFINE_TEST(radix4, q31, config_suffix, \ TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE, \ TYPE_FROM_ABBREV(q31), \ ifft_flag); \ CFFT_FAMILY_DEFINE_TEST(radix4, q15, config_suffix, \ TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE, \ TYPE_FROM_ABBREV(q15), \ ifft_flag) /* /\* Mag tests*\/ \ */ /* CFFT_FAMILY_DEFINE_TEST(mag, f32, config_suffix, \ */ /* TRANSFORM_SNR_COMPARE_INTERFACE, \ */ /* TYPE_FROM_ABBREV(f32), \ */ /* ifft_flag); \ */ /* CFFT_FAMILY_DEFINE_TEST(mag, q31, config_suffix, \ */ /* TRANSFORM_SNR_COMPARE_INTERFACE, \ */ /* TYPE_FROM_ABBREV(q31), \ */ /* ifft_flag); \ */ /* CFFT_FAMILY_DEFINE_TEST(mag, q15, config_suffix, \ */ /* TRANSFORM_SNR_COMPARE_INTERFACE, \ */ /* TYPE_FROM_ABBREV(q15), \ */ /* ifft_flag) */ CFFT_FAMILY_DEFINE_ALL_TESTS(forward, 0U); CFFT_FAMILY_DEFINE_ALL_TESTS(inverse, 1U); /*--------------------------------------------------------------------------------*/ /* Collect all tests in a group */ /*--------------------------------------------------------------------------------*/ JTEST_DEFINE_GROUP(cfft_family_tests) { /* Forward FFT tests */ JTEST_TEST_CALL(arm_cfft_radix2_q31_forward_test); JTEST_TEST_CALL(arm_cfft_radix2_q15_forward_test); JTEST_TEST_CALL(arm_cfft_radix4_q31_forward_test); JTEST_TEST_CALL(arm_cfft_radix4_q15_forward_test); /* Inverse FFT Tests */ JTEST_TEST_CALL(arm_cfft_radix2_q31_inverse_test); JTEST_TEST_CALL(arm_cfft_radix2_q15_inverse_test); JTEST_TEST_CALL(arm_cfft_radix4_q31_inverse_test); JTEST_TEST_CALL(arm_cfft_radix4_q15_inverse_test); /* Magnitude tests removed from the DSP Library. Keeping them here in case minds are changed. */ /* JTEST_TEST_CALL(arm_cfft_mag_f32_forward_test); */ /* JTEST_TEST_CALL(arm_cfft_mag_q31_forward_test); */ /* JTEST_TEST_CALL(arm_cfft_mag_q15_forward_test); */ /* JTEST_TEST_CALL(arm_cfft_mag_f32_inverse_test); */ /* JTEST_TEST_CALL(arm_cfft_mag_q31_inverse_test); */ /* JTEST_TEST_CALL(arm_cfft_mag_q15_inverse_test); */ }