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