#include "jtest.h"
|
#include "ref.h"
|
#include "arr_desc.h"
|
#include "transform_templates.h"
|
#include "transform_test_data.h"
|
|
#define CFFT_SNR_THRESHOLD 120
|
|
/*
|
CFFT function test template. Arguments are: inverse-transform flag, function
|
suffix (q7/q15/q31/f32) and the output type (q7_t, q15_t, q31_t, float32_t)
|
*/
|
#define CFFT_TEST_BODY(ifft_flag, suffix, output_type) \
|
do \
|
{ \
|
/* Go through all arm_cfft_instances */ \
|
TEMPLATE_DO_ARR_DESC( \
|
cfft_inst_idx, const arm_cfft_instance_##suffix *, cfft_inst_ptr, \
|
transform_cfft_##suffix##_structs \
|
, \
|
\
|
TRANSFORM_PREPARE_INPLACE_INPUTS( \
|
transform_fft_##suffix##_inputs, \
|
cfft_inst_ptr->fftLen * \
|
sizeof(output_type) * \
|
2 /*complex_inputs*/); \
|
\
|
/* Display parameter values */ \
|
JTEST_DUMP_STRF("Block Size: %d\n" \
|
"Inverse-transform flag: %d\n", \
|
(int)cfft_inst_ptr->fftLen, \
|
(int)ifft_flag); \
|
\
|
/* Display cycle count and run test */ \
|
JTEST_COUNT_CYCLES( \
|
arm_cfft_##suffix(cfft_inst_ptr, \
|
(void *) transform_fft_inplace_input_fut, \
|
ifft_flag, /* IFFT Flag */ \
|
1)); /* Bitreverse flag */ \
|
ref_cfft_##suffix(cfft_inst_ptr, \
|
(void *) transform_fft_inplace_input_ref, \
|
ifft_flag, /* IFFT Flag */ \
|
1); /* Bitreverse flag */ \
|
\
|
/* Test correctness */ \
|
TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE( \
|
cfft_inst_ptr->fftLen, \
|
output_type)); \
|
\
|
return JTEST_TEST_PASSED; \
|
} while (0)
|
|
|
/*
|
CFFT function with downshift test template. Arguments are: inverse-transform flag,
|
function suffix (q7/q15/q31/f32) and the output type (q7_t, q15_t, q31_t, float32_t)
|
*/
|
#define CFFT_DOWNSHIFT_INPUT_TEST_BODY(ifft_flag, suffix, output_type) \
|
do \
|
{ \
|
/* Go through all arm_cfft_instances */ \
|
TEMPLATE_DO_ARR_DESC( \
|
cfft_inst_idx, const arm_cfft_instance_##suffix *, cfft_inst_ptr, \
|
transform_cfft_##suffix##_structs \
|
, \
|
\
|
TRANSFORM_PREPARE_INPLACE_INPUTS_DOWNSHIFT( \
|
transform_fft_##suffix##_inputs, \
|
cfft_inst_ptr->fftLen * \
|
sizeof(output_type) * \
|
2 /*complex_inputs*/, output_type); \
|
\
|
/* Display parameter values */ \
|
JTEST_DUMP_STRF("Block Size: %d\n" \
|
"Inverse-transform flag: %d\n", \
|
(int)cfft_inst_ptr->fftLen, \
|
(int)ifft_flag); \
|
\
|
/* Display cycle count and run test */ \
|
JTEST_COUNT_CYCLES( \
|
arm_cfft_##suffix(cfft_inst_ptr, \
|
(void *) transform_fft_inplace_input_fut, \
|
ifft_flag, /* IFFT Flag */ \
|
1)); /* Bitreverse flag */ \
|
ref_cfft_##suffix(cfft_inst_ptr, \
|
(void *) transform_fft_inplace_input_ref, \
|
ifft_flag, /* IFFT Flag */ \
|
1); /* Bitreverse flag */ \
|
\
|
/* Test correctness */ \
|
TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE( \
|
cfft_inst_ptr->fftLen, \
|
output_type)); \
|
\
|
return JTEST_TEST_PASSED; \
|
} while (0)
|
|
|
/* Test declarations */
|
JTEST_DEFINE_TEST(cfft_f32_test, cfft_f32)
|
{
|
CFFT_TEST_BODY((uint8_t) 0, f32, float32_t);
|
}
|
|
JTEST_DEFINE_TEST(cfft_f32_ifft_test, cfft_f32)
|
{
|
CFFT_TEST_BODY((uint8_t) 1, f32, float32_t);
|
}
|
|
JTEST_DEFINE_TEST(cfft_q31_test, cfft_q31)
|
{
|
CFFT_TEST_BODY((uint8_t) 0, q31, q31_t);
|
}
|
|
JTEST_DEFINE_TEST(cfft_q31_ifft_test, cfft_q31)
|
{
|
CFFT_TEST_BODY((uint8_t) 1, q31, q31_t);
|
}
|
|
JTEST_DEFINE_TEST(cfft_q15_test, cfft_q15)
|
{
|
CFFT_TEST_BODY((uint8_t) 0, q15, q15_t);
|
}
|
|
JTEST_DEFINE_TEST(cfft_q15_ifft_test, cfft_q15)
|
{
|
CFFT_TEST_BODY((uint8_t) 1, q15, q15_t);
|
}
|
|
/*--------------------------------------------------------------------------------*/
|
/* Collect all tests in a group */
|
/*--------------------------------------------------------------------------------*/
|
|
JTEST_DEFINE_GROUP(cfft_tests)
|
{
|
JTEST_TEST_CALL(cfft_f32_test);
|
JTEST_TEST_CALL(cfft_f32_ifft_test);
|
|
JTEST_TEST_CALL(cfft_q31_test);
|
JTEST_TEST_CALL(cfft_q31_ifft_test);
|
|
JTEST_TEST_CALL(cfft_q15_test);
|
JTEST_TEST_CALL(cfft_q15_ifft_test);
|
}
|