summaryrefslogtreecommitdiff
path: root/fw/midi-dials/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/dct4_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/midi-dials/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/dct4_tests.c')
-rw-r--r--fw/midi-dials/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/dct4_tests.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/fw/midi-dials/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/dct4_tests.c b/fw/midi-dials/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/dct4_tests.c
new file mode 100644
index 0000000..aae5a42
--- /dev/null
+++ b/fw/midi-dials/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/dct4_tests.c
@@ -0,0 +1,197 @@
+#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);
+}