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