| #ifndef _TRANSFORM_TEMPLATES_H_ |
| #define _TRANSFORM_TEMPLATES_H_ |
| |
| /*--------------------------------------------------------------------------------*/ |
| /* Includes */ |
| /*--------------------------------------------------------------------------------*/ |
| |
| #include "test_templates.h" |
| #include <string.h> /* memcpy() */ |
| |
| /*--------------------------------------------------------------------------------*/ |
| /* Group Specific Templates */ |
| /*--------------------------------------------------------------------------------*/ |
| |
| /** |
| * Comparison SNR thresholds for the data types used in transform_tests. |
| */ |
| #define TRANSFORM_SNR_THRESHOLD_float32_t 90 |
| #define TRANSFORM_SNR_THRESHOLD_q31_t 90 |
| #define TRANSFORM_SNR_THRESHOLD_q15_t 30 |
| |
| #define DCT4_TRANSFORM_SNR_THRESHOLD_float32_t 80 |
| #define DCT4_TRANSFORM_SNR_THRESHOLD_q31_t 75 |
| #define DCT4_TRANSFORM_SNR_THRESHOLD_q15_t 11 |
| |
| /** |
| * Compare the outputs from the function under test and the reference |
| * function using SNR. |
| */ |
| #define TRANSFORM_SNR_COMPARE_INTERFACE(block_size, \ |
| output_type) \ |
| do \ |
| { \ |
| TEST_CONVERT_AND_ASSERT_SNR( \ |
| transform_fft_output_f32_ref, \ |
| (output_type *) transform_fft_output_ref, \ |
| transform_fft_output_f32_fut, \ |
| (output_type *) transform_fft_output_fut, \ |
| block_size, \ |
| output_type, \ |
| TRANSFORM_SNR_THRESHOLD_##output_type \ |
| ); \ |
| } while (0) |
| |
| /** |
| * Compare the outputs from the function under test and the reference |
| * function using SNR. |
| */ |
| #define DCT_TRANSFORM_SNR_COMPARE_INTERFACE(block_size, \ |
| output_type) \ |
| do \ |
| { \ |
| TEST_CONVERT_AND_ASSERT_SNR( \ |
| transform_fft_output_f32_ref, \ |
| (output_type *) transform_fft_output_ref, \ |
| transform_fft_output_f32_fut, \ |
| (output_type *) transform_fft_output_fut, \ |
| block_size, \ |
| output_type, \ |
| DCT4_TRANSFORM_SNR_THRESHOLD_##output_type \ |
| ); \ |
| } while (0) \ |
| |
| /** |
| * Specialization on #TRANSFORM_SNR_COMPARE_INTERFACE() to fix the block_size |
| * for complex datasets. |
| */ |
| #define TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE(block_size, output_type) \ |
| /* Complex numbers have two components*/ \ |
| TRANSFORM_SNR_COMPARE_INTERFACE(block_size * 2, output_type ) |
| |
| /** |
| * This macro copys data from the input_ptr into input arrays. |
| * |
| * Some functions modify their input data; in order to provide the same data to |
| * multiple tests, copies must be made so the changes from one function don't |
| * impact the others. |
| */ |
| #define TRANSFORM_COPY_INPUTS(input_ptr, \ |
| bytes) \ |
| do \ |
| { \ |
| memcpy( \ |
| transform_fft_input_fut, \ |
| input_ptr, \ |
| bytes); \ |
| memcpy( \ |
| transform_fft_input_ref, \ |
| input_ptr, \ |
| bytes); \ |
| } while (0) |
| |
| /** |
| * This macro copys data from the input_ptr into input arrays. It also creates |
| * symmetric input data for rfft inverse. |
| * |
| * The 4.534234f just makes the middle entry of the array semi random. It's |
| * actual value doesn't seem to matter much. |
| * |
| * Some functions modify their input data; in order to provide the same data to |
| * multiple tests, copies must be made so the changes from one function don't |
| * impact the others. |
| */ |
| #define TRANSFORM_PREPARE_INVERSE_INPUTS(input_ptr, \ |
| fftlen, input_type, bytes) \ |
| do \ |
| { \ |
| uint32_t i; \ |
| \ |
| memcpy( \ |
| transform_fft_input_fut, \ |
| input_ptr, \ |
| bytes); \ |
| \ |
| ((input_type*)transform_fft_input_fut)[1] = 0; \ |
| ((input_type*)transform_fft_input_fut)[fftlen + 0] = 0; \ |
| ((input_type*)transform_fft_input_fut)[fftlen + 1] = 0; \ |
| for(i=1;i<fftlen/2;i++) \ |
| { \ |
| *((input_type*)transform_fft_input_fut + fftlen + 2*i + 0) = \ |
| *((input_type*)transform_fft_input_fut + fftlen - 2*i + 0); \ |
| *((input_type*)transform_fft_input_fut + fftlen + 2*i + 1) = \ |
| -(*((input_type*)transform_fft_input_fut + fftlen - 2*i + 1)); \ |
| \ |
| } \ |
| \ |
| memcpy( \ |
| transform_fft_input_ref, \ |
| transform_fft_input_fut, \ |
| bytes * 2); \ |
| } while (0) |
| |
| /** |
| * This macro copys data from the input_ptr into the in-place input arrays. |
| * |
| * Some functions modify their input data; in order to provide the same data to |
| * multiple tests, copies must be made so the changes from one function don't |
| * impact the others. |
| */ |
| #define TRANSFORM_PREPARE_INPLACE_INPUTS_DOWNSHIFT(input_ptr, \ |
| bytes, \ |
| type) \ |
| do \ |
| { \ |
| uint32_t i; \ |
| memcpy( \ |
| transform_fft_inplace_input_fut, \ |
| input_ptr, \ |
| bytes); \ |
| memcpy( \ |
| transform_fft_inplace_input_ref, \ |
| input_ptr, \ |
| bytes); \ |
| for(i=0;i<bytes/sizeof(type);i++) { \ |
| *((type*)transform_fft_inplace_input_fut + i) >>= 1; \ |
| *((type*)transform_fft_inplace_input_ref + i) >>= 1;} \ |
| } while (0) |
| |
| /** |
| * This macro copys data from the input_ptr into the in-place input arrays. |
| * |
| * Some functions modify their input data; in order to provide the same data to |
| * multiple tests, copies must be made so the changes from one function don't |
| * impact the others. |
| */ |
| #define TRANSFORM_PREPARE_INPLACE_INPUTS(input_ptr, \ |
| bytes) \ |
| do \ |
| { \ |
| memcpy( \ |
| transform_fft_inplace_input_fut, \ |
| input_ptr, \ |
| bytes); \ |
| memcpy( \ |
| transform_fft_inplace_input_ref, \ |
| input_ptr, \ |
| bytes); \ |
| } while (0) |
| |
| |
| #endif /* _TRANSFORM_TEMPLATES_H_ */ |