blob: f55e7b31cce8a28922c78b323ceeed6270e4d065 [file] [log] [blame]
#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 <math.h> /* 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);
}