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