blob: 9fb8834d76d813c166dbcd2f9b1fb71ef51256db [file] [log] [blame]
#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); */
}