1 /*
2 * Copyright (c) 2021 Stephanos Ioannidis <root@stephanos.io>
3 * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 #include <zephyr/ztest.h>
9 #include <zephyr/kernel.h>
10 #include <stdlib.h>
11 #include <arm_math.h>
12 #include <arm_const_structs.h>
13 #include "../../common/test_common.h"
14
15 #include "cq15.pat"
16
17 #define SNR_ERROR_THRESH_FFT ((float32_t)30)
18 #define SNR_ERROR_THRESH_IFFT ((float32_t)5)
19
test_arm_cfft_q15(const q15_t * input,const q15_t * ref,size_t length)20 static void test_arm_cfft_q15(
21 const q15_t *input, const q15_t *ref, size_t length)
22 {
23 arm_cfft_instance_q15 inst;
24 q15_t *output;
25 arm_status status;
26
27 /* Initialise instance */
28 status = arm_cfft_init_q15(&inst, length / 2);
29
30 zassert_equal(status, ARM_MATH_SUCCESS,
31 ASSERT_MSG_INCORRECT_COMP_RESULT);
32
33 /* Allocate output buffer */
34 output = malloc(length * sizeof(q15_t));
35 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
36
37 /* Load data in place */
38 memcpy(output, input, length * sizeof(q15_t));
39
40 /* Run test function */
41 arm_cfft_q15(&inst, output, false, true);
42
43 /* Validate output */
44 zassert_true(
45 test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH_FFT),
46 ASSERT_MSG_SNR_LIMIT_EXCEED);
47
48 /* Free output buffer */
49 free(output);
50 }
51
52 DEFINE_TEST_VARIANT3(transform_cq15,
53 arm_cfft_q15, noisy_16,
54 in_cfft_noisy_16, ref_cfft_noisy_16, 32);
55
56 DEFINE_TEST_VARIANT3(transform_cq15,
57 arm_cfft_q15, noisy_32,
58 in_cfft_noisy_32, ref_cfft_noisy_32, 64);
59
60 DEFINE_TEST_VARIANT3(transform_cq15,
61 arm_cfft_q15, noisy_64,
62 in_cfft_noisy_64, ref_cfft_noisy_64, 128);
63
64 DEFINE_TEST_VARIANT3(transform_cq15,
65 arm_cfft_q15, noisy_128,
66 in_cfft_noisy_128, ref_cfft_noisy_128, 256);
67
68 DEFINE_TEST_VARIANT3(transform_cq15,
69 arm_cfft_q15, noisy_256,
70 in_cfft_noisy_256, ref_cfft_noisy_256, 512);
71
72 DEFINE_TEST_VARIANT3(transform_cq15,
73 arm_cfft_q15, noisy_512,
74 in_cfft_noisy_512, ref_cfft_noisy_512, 1024);
75
76 DEFINE_TEST_VARIANT3(transform_cq15,
77 arm_cfft_q15, noisy_1024,
78 in_cfft_noisy_1024, ref_cfft_noisy_1024, 2048);
79
80 DEFINE_TEST_VARIANT3(transform_cq15,
81 arm_cfft_q15, noisy_2048,
82 in_cfft_noisy_2048, ref_cfft_noisy_2048, 4096);
83
84 DEFINE_TEST_VARIANT3(transform_cq15,
85 arm_cfft_q15, noisy_4096,
86 in_cfft_noisy_4096, ref_cfft_noisy_4096, 8192);
87
88 DEFINE_TEST_VARIANT3(transform_cq15,
89 arm_cfft_q15, step_16,
90 in_cfft_step_16, ref_cfft_step_16, 32);
91
92 DEFINE_TEST_VARIANT3(transform_cq15,
93 arm_cfft_q15, step_32,
94 in_cfft_step_32, ref_cfft_step_32, 64);
95
96 DEFINE_TEST_VARIANT3(transform_cq15,
97 arm_cfft_q15, step_64,
98 in_cfft_step_64, ref_cfft_step_64, 128);
99
100 DEFINE_TEST_VARIANT3(transform_cq15,
101 arm_cfft_q15, step_128,
102 in_cfft_step_128, ref_cfft_step_128, 256);
103
104 DEFINE_TEST_VARIANT3(transform_cq15,
105 arm_cfft_q15, step_256,
106 in_cfft_step_256, ref_cfft_step_256, 512);
107
108 DEFINE_TEST_VARIANT3(transform_cq15,
109 arm_cfft_q15, step_512,
110 in_cfft_step_512, ref_cfft_step_512, 1024);
111
112 DEFINE_TEST_VARIANT3(transform_cq15,
113 arm_cfft_q15, step_1024,
114 in_cfft_step_1024, ref_cfft_step_1024, 2048);
115
116 DEFINE_TEST_VARIANT3(transform_cq15,
117 arm_cfft_q15, step_2048,
118 in_cfft_step_2048, ref_cfft_step_2048, 4096);
119
120 DEFINE_TEST_VARIANT3(transform_cq15,
121 arm_cfft_q15, step_4096,
122 in_cfft_step_4096, ref_cfft_step_4096, 8192);
123
test_arm_cifft_q15(int scale_factor,const q15_t * input,const q15_t * ref,size_t length)124 static void test_arm_cifft_q15(
125 int scale_factor, const q15_t *input, const q15_t *ref, size_t length)
126 {
127 arm_cfft_instance_q15 inst;
128 size_t index;
129 q15_t *output, *scaled_ref;
130 arm_status status;
131
132 /* Initialise instance */
133 status = arm_cfft_init_q15(&inst, length / 2);
134
135 zassert_equal(status, ARM_MATH_SUCCESS,
136 ASSERT_MSG_INCORRECT_COMP_RESULT);
137
138 /* Allocate buffers */
139 output = malloc(length * sizeof(q15_t));
140 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
141
142 scaled_ref = malloc(length * sizeof(q15_t));
143 zassert_not_null(scaled_ref, ASSERT_MSG_BUFFER_ALLOC_FAILED);
144
145 /* Load data in place */
146 memcpy(output, input, length * sizeof(q15_t));
147
148 /* Run test function */
149 arm_cfft_q15(&inst, output, true, true);
150
151 /* Scale reference data */
152 for (index = 0; index < length; index++) {
153 scaled_ref[index] = ref[index] >> scale_factor;
154 }
155
156 /* Validate output */
157 zassert_true(
158 test_snr_error_q15(length, output, scaled_ref,
159 SNR_ERROR_THRESH_IFFT),
160 ASSERT_MSG_SNR_LIMIT_EXCEED);
161
162 /* Free output buffer */
163 free(output);
164 free(scaled_ref);
165 }
166
167 DEFINE_TEST_VARIANT4(transform_cq15,
168 arm_cifft_q15, noisy_16, 4,
169 in_cifft_noisy_16, in_cfft_noisy_16, 32);
170
171 DEFINE_TEST_VARIANT4(transform_cq15,
172 arm_cifft_q15, noisy_32, 5,
173 in_cifft_noisy_32, in_cfft_noisy_32, 64);
174
175 DEFINE_TEST_VARIANT4(transform_cq15,
176 arm_cifft_q15, noisy_64, 6,
177 in_cifft_noisy_64, in_cfft_noisy_64, 128);
178
179 DEFINE_TEST_VARIANT4(transform_cq15,
180 arm_cifft_q15, noisy_128, 7,
181 in_cifft_noisy_128, in_cfft_noisy_128, 256);
182
183 DEFINE_TEST_VARIANT4(transform_cq15,
184 arm_cifft_q15, noisy_256, 8,
185 in_cifft_noisy_256, in_cfft_noisy_256, 512);
186
187 DEFINE_TEST_VARIANT4(transform_cq15,
188 arm_cifft_q15, noisy_512, 9,
189 in_cifft_noisy_512, in_cfft_noisy_512, 1024);
190
191 DEFINE_TEST_VARIANT4(transform_cq15,
192 arm_cifft_q15, noisy_1024, 10,
193 in_cifft_noisy_1024, in_cfft_noisy_1024, 2048);
194
195 DEFINE_TEST_VARIANT4(transform_cq15,
196 arm_cifft_q15, noisy_2048, 11,
197 in_cifft_noisy_2048, in_cfft_noisy_2048, 4096);
198
199 DEFINE_TEST_VARIANT4(transform_cq15,
200 arm_cifft_q15, noisy_4096, 12,
201 in_cifft_noisy_4096, in_cfft_noisy_4096, 8192);
202
203 DEFINE_TEST_VARIANT4(transform_cq15,
204 arm_cifft_q15, step_16, 4,
205 in_cifft_step_16, in_cfft_step_16, 32);
206
207 DEFINE_TEST_VARIANT4(transform_cq15,
208 arm_cifft_q15, step_32, 5,
209 in_cifft_step_32, in_cfft_step_32, 64);
210
211 DEFINE_TEST_VARIANT4(transform_cq15,
212 arm_cifft_q15, step_64, 6,
213 in_cifft_step_64, in_cfft_step_64, 128);
214
215 DEFINE_TEST_VARIANT4(transform_cq15,
216 arm_cifft_q15, step_128, 7,
217 in_cifft_step_128, in_cfft_step_128, 256);
218
219 DEFINE_TEST_VARIANT4(transform_cq15,
220 arm_cifft_q15, step_256, 8,
221 in_cifft_step_256, in_cfft_step_256, 512);
222
223 DEFINE_TEST_VARIANT4(transform_cq15,
224 arm_cifft_q15, step_512, 9,
225 in_cifft_step_512, in_cfft_step_512, 1024);
226
227 DEFINE_TEST_VARIANT4(transform_cq15,
228 arm_cifft_q15, step_1024, 10,
229 in_cifft_step_1024, in_cfft_step_1024, 2048);
230
231 DEFINE_TEST_VARIANT4(transform_cq15,
232 arm_cifft_q15, step_2048, 11,
233 in_cifft_step_2048, in_cfft_step_2048, 4096);
234
235 DEFINE_TEST_VARIANT4(transform_cq15,
236 arm_cifft_q15, step_4096, 12,
237 in_cifft_step_4096, in_cfft_step_4096, 8192);
238
239 ZTEST_SUITE(transform_cq15, NULL, NULL, NULL, NULL, NULL);
240