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