Line data Source code
1 : /******************************************************************************************************
2 :
3 : (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
4 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
5 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
6 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
7 : contributors to this repository. All Rights Reserved.
8 :
9 : This software is protected by copyright law and by international treaties.
10 : The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
11 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
12 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
13 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
14 : contributors to this repository retain full ownership rights in their respective contributions in
15 : the software. This notice grants no license of any kind, including but not limited to patent
16 : license, nor is any license granted by implication, estoppel or otherwise.
17 :
18 : Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
19 : contributions.
20 :
21 : This software is provided "AS IS", without any express or implied warranties. The software is in the
22 : development stage. It is intended exclusively for experts who have experience with such software and
23 : solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
24 : and fitness for a particular purpose are hereby disclaimed and excluded.
25 :
26 : Any dispute, controversy or claim arising under or in relation to providing this software shall be
27 : submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
28 : accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
29 : the United Nations Convention on Contracts on the International Sales of Goods.
30 :
31 : *******************************************************************************************************/
32 :
33 : /*====================================================================================
34 : EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
35 : ====================================================================================*/
36 :
37 : #include <stdint.h>
38 : #include "options.h"
39 : #include <assert.h>
40 : #include "prot.h"
41 : #include "ivas_cnst.h"
42 : #include "wmc_auto.h"
43 :
44 : #if __STDC_VERSION__ >= 199901L
45 : #if defined __ICL
46 : #define restrict __restrict
47 : #endif
48 : #else
49 : #define restrict
50 : #endif
51 :
52 :
53 : static void fft8( float *vec );
54 : static void fft10( float *vec );
55 : static void fft16( float *vec );
56 : static void fft20( float *vec );
57 : static void fft30( float *vec );
58 : static void fft5s( float *x, const int16_t stride );
59 :
60 :
61 : #define COS_PI_DIV8 9.238795325112867e-1f
62 : #define COS_3PI_DIV8 3.826834323650898e-1f
63 : #define SQRT2PLUS1 2.414213562373095f
64 : #define SQRT2MINUS1 4.142135623730952e-1f
65 :
66 :
67 : /*******************************************************************************
68 : Functionname: fft8
69 : *******************************************************************************
70 :
71 : Description: 8-point FFT. Complex-valued input takes 52 real additions
72 : and 4 real multiplications.
73 :
74 : Arguments: vec - pointer to data (interleaved real / imaginary parts)
75 :
76 : Return: none
77 :
78 : *******************************************************************************/
79 16726404 : static void fft8( float *restrict vec )
80 : {
81 : float temp1[16];
82 : float temp2[16];
83 :
84 :
85 : /* Pre-additions */
86 16726404 : temp1[0] = vec[0] + vec[8];
87 16726404 : temp1[2] = vec[0] - vec[8];
88 16726404 : temp1[1] = vec[1] + vec[9];
89 16726404 : temp1[3] = vec[1] - vec[9];
90 16726404 : temp1[4] = vec[2] + vec[10];
91 16726404 : temp1[6] = vec[2] - vec[10];
92 16726404 : temp1[5] = vec[3] + vec[11];
93 16726404 : temp1[7] = vec[3] - vec[11];
94 16726404 : temp1[8] = vec[4] + vec[12];
95 16726404 : temp1[10] = vec[4] - vec[12];
96 16726404 : temp1[9] = vec[5] + vec[13];
97 16726404 : temp1[11] = vec[5] - vec[13];
98 16726404 : temp1[12] = vec[6] + vec[14];
99 16726404 : temp1[14] = vec[6] - vec[14];
100 16726404 : temp1[13] = vec[7] + vec[15];
101 16726404 : temp1[15] = vec[7] - vec[15];
102 :
103 : /* Pre-additions and core multiplications */
104 16726404 : temp2[0] = temp1[0] + temp1[8];
105 16726404 : temp2[4] = temp1[0] - temp1[8];
106 16726404 : temp2[1] = temp1[1] + temp1[9];
107 16726404 : temp2[5] = temp1[1] - temp1[9];
108 16726404 : temp2[8] = temp1[2] - temp1[11];
109 16726404 : temp2[10] = temp1[2] + temp1[11];
110 16726404 : temp2[9] = temp1[3] + temp1[10];
111 16726404 : temp2[11] = temp1[3] - temp1[10];
112 16726404 : temp2[2] = temp1[4] + temp1[12];
113 16726404 : temp2[7] = temp1[4] - temp1[12];
114 16726404 : temp2[3] = temp1[5] + temp1[13];
115 16726404 : temp2[6] = temp1[13] - temp1[5];
116 :
117 16726404 : temp1[1] = temp1[6] + temp1[14];
118 16726404 : temp1[2] = temp1[6] - temp1[14];
119 16726404 : temp1[0] = temp1[7] + temp1[15];
120 16726404 : temp1[3] = temp1[7] - temp1[15];
121 :
122 16726404 : temp2[12] = ( temp1[0] + temp1[2] ) * INV_SQRT2;
123 16726404 : temp2[14] = ( temp1[0] - temp1[2] ) * INV_SQRT2;
124 16726404 : temp2[13] = ( temp1[3] - temp1[1] ) * INV_SQRT2;
125 16726404 : temp2[15] = ( temp1[1] + temp1[3] ) * -INV_SQRT2;
126 :
127 : /* Post-additions */
128 16726404 : vec[0] = temp2[0] + temp2[2];
129 16726404 : vec[8] = temp2[0] - temp2[2];
130 16726404 : vec[1] = temp2[1] + temp2[3];
131 16726404 : vec[9] = temp2[1] - temp2[3];
132 16726404 : vec[4] = temp2[4] - temp2[6];
133 16726404 : vec[12] = temp2[4] + temp2[6];
134 16726404 : vec[5] = temp2[5] - temp2[7];
135 16726404 : vec[13] = temp2[5] + temp2[7];
136 16726404 : vec[6] = temp2[8] + temp2[14];
137 16726404 : vec[14] = temp2[8] - temp2[14];
138 16726404 : vec[7] = temp2[9] + temp2[15];
139 16726404 : vec[15] = temp2[9] - temp2[15];
140 16726404 : vec[2] = temp2[10] + temp2[12];
141 16726404 : vec[10] = temp2[10] - temp2[12];
142 16726404 : vec[3] = temp2[11] + temp2[13];
143 16726404 : vec[11] = temp2[11] - temp2[13];
144 :
145 16726404 : return;
146 : }
147 :
148 :
149 : /*******************************************************************************
150 : Functionname: fft16
151 : *******************************************************************************
152 :
153 : Description: 16-point FFT. Complex-valued input takes 144 real additions and
154 : 24 real multiplications.
155 :
156 : Arguments: vec - pointer to data (interleaved real / imaginary parts)
157 :
158 : Return: none
159 :
160 : *******************************************************************************/
161 : /* fast implementation, completely unrolled and inlined */
162 11628 : static void fft16( float *restrict vec )
163 : {
164 : float temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17,
165 : temp18, temp19, temp110, temp111, temp112, temp113, temp114, temp115;
166 : float temp20, temp21, temp22, temp23, temp24, temp25, temp26, temp27,
167 : temp28, temp29, temp210, temp211, temp212, temp213, temp214, temp215;
168 : float vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7,
169 : vec8, vec9, vec10, vec11, vec12, vec13, vec14, vec15;
170 :
171 :
172 : /* even */
173 11628 : vec0 = vec[0] + vec[16];
174 11628 : vec1 = vec[1] + vec[17];
175 11628 : vec2 = vec[2] + vec[18];
176 11628 : vec3 = vec[3] + vec[19];
177 11628 : vec4 = vec[4] + vec[20];
178 11628 : vec5 = vec[5] + vec[21];
179 11628 : vec6 = vec[6] + vec[22];
180 11628 : vec7 = vec[7] + vec[23];
181 11628 : vec8 = vec[8] + vec[24];
182 11628 : vec9 = vec[9] + vec[25];
183 11628 : vec10 = vec[10] + vec[26];
184 11628 : vec11 = vec[11] + vec[27];
185 11628 : vec12 = vec[12] + vec[28];
186 11628 : vec13 = vec[13] + vec[29];
187 11628 : vec14 = vec[14] + vec[30];
188 11628 : vec15 = vec[15] + vec[31];
189 :
190 : /* Pre-additions */
191 11628 : temp10 = vec0 + vec8;
192 11628 : temp12 = vec0 - vec8;
193 11628 : temp11 = vec1 + vec9;
194 11628 : temp13 = vec1 - vec9;
195 11628 : temp14 = vec2 + vec10;
196 11628 : temp16 = vec2 - vec10;
197 11628 : temp15 = vec3 + vec11;
198 11628 : temp17 = vec3 - vec11;
199 11628 : temp18 = vec4 + vec12;
200 11628 : temp110 = vec4 - vec12;
201 11628 : temp19 = vec5 + vec13;
202 11628 : temp111 = vec5 - vec13;
203 11628 : temp112 = vec6 + vec14;
204 11628 : temp114 = vec6 - vec14;
205 11628 : temp113 = vec7 + vec15;
206 11628 : temp115 = vec7 - vec15;
207 :
208 : /* Pre-additions and core multiplications */
209 11628 : temp20 = temp10 + temp18;
210 11628 : temp24 = temp10 - temp18;
211 11628 : temp21 = temp11 + temp19;
212 11628 : temp25 = temp11 - temp19;
213 11628 : temp28 = temp12 - temp111;
214 11628 : temp210 = temp12 + temp111;
215 11628 : temp29 = temp13 + temp110;
216 11628 : temp211 = temp13 - temp110;
217 11628 : temp22 = temp14 + temp112;
218 11628 : temp27 = temp14 - temp112;
219 11628 : temp23 = temp15 + temp113;
220 11628 : temp26 = temp113 - temp15;
221 :
222 11628 : temp11 = temp16 + temp114;
223 11628 : temp12 = temp16 - temp114;
224 11628 : temp10 = temp17 + temp115;
225 11628 : temp13 = temp17 - temp115;
226 :
227 11628 : temp212 = ( temp10 + temp12 ) * INV_SQRT2;
228 11628 : temp214 = ( temp10 - temp12 ) * INV_SQRT2;
229 11628 : temp213 = ( temp13 - temp11 ) * INV_SQRT2;
230 11628 : temp215 = ( temp11 + temp13 ) * -INV_SQRT2;
231 :
232 :
233 : /* odd */
234 11628 : vec0 = vec[0] - vec[16];
235 11628 : vec1 = vec[1] - vec[17];
236 11628 : vec2 = vec[2] - vec[18];
237 11628 : vec3 = vec[3] - vec[19];
238 11628 : vec4 = vec[4] - vec[20];
239 11628 : vec5 = vec[5] - vec[21];
240 11628 : vec6 = vec[6] - vec[22];
241 11628 : vec7 = vec[7] - vec[23];
242 11628 : vec8 = vec[8] - vec[24];
243 11628 : vec9 = vec[9] - vec[25];
244 11628 : vec10 = vec[10] - vec[26];
245 11628 : vec11 = vec[11] - vec[27];
246 11628 : vec12 = vec[12] - vec[28];
247 11628 : vec13 = vec[13] - vec[29];
248 11628 : vec14 = vec[14] - vec[30];
249 11628 : vec15 = vec[15] - vec[31];
250 :
251 : /* Pre-additions and core multiplications */
252 11628 : temp19 = ( vec2 + vec14 ) * -COS_3PI_DIV8;
253 11628 : temp110 = ( vec2 - vec14 ) * COS_PI_DIV8;
254 11628 : temp18 = ( vec3 + vec15 ) * COS_3PI_DIV8;
255 11628 : temp111 = ( vec3 - vec15 ) * COS_PI_DIV8;
256 11628 : temp15 = ( vec4 + vec12 ) * -INV_SQRT2;
257 11628 : temp16 = ( vec4 - vec12 ) * INV_SQRT2;
258 11628 : temp14 = ( vec5 + vec13 ) * INV_SQRT2;
259 11628 : temp17 = ( vec5 - vec13 ) * INV_SQRT2;
260 11628 : temp113 = ( vec6 + vec10 ) * -COS_PI_DIV8;
261 11628 : temp114 = ( vec6 - vec10 ) * COS_3PI_DIV8;
262 11628 : temp112 = ( vec7 + vec11 ) * COS_PI_DIV8;
263 11628 : temp115 = ( vec7 - vec11 ) * COS_3PI_DIV8;
264 :
265 : /* Core multiplications */
266 11628 : vec2 = temp18 * SQRT2PLUS1 - temp112 * SQRT2MINUS1;
267 11628 : vec3 = temp19 * SQRT2PLUS1 - temp113 * SQRT2MINUS1;
268 11628 : vec4 = temp110 * SQRT2MINUS1 - temp114 * SQRT2PLUS1;
269 11628 : vec5 = temp111 * SQRT2MINUS1 - temp115 * SQRT2PLUS1;
270 :
271 : /* Post-additions */
272 11628 : temp18 += temp112;
273 11628 : temp19 += temp113;
274 11628 : temp110 += temp114;
275 11628 : temp111 += temp115;
276 :
277 11628 : vec6 = vec0 + temp14;
278 11628 : vec10 = vec0 - temp14;
279 11628 : vec7 = vec1 + temp15;
280 11628 : vec11 = vec1 - temp15;
281 :
282 11628 : vec12 = temp16 - vec9;
283 11628 : vec14 = temp16 + vec9;
284 11628 : vec13 = vec8 + temp17;
285 11628 : vec15 = vec8 - temp17;
286 :
287 11628 : temp10 = vec6 - vec14;
288 11628 : temp12 = vec6 + vec14;
289 11628 : temp11 = vec7 + vec15;
290 11628 : temp13 = vec7 - vec15;
291 11628 : temp14 = vec10 + vec12;
292 11628 : temp16 = vec10 - vec12;
293 11628 : temp15 = vec11 + vec13;
294 11628 : temp17 = vec11 - vec13;
295 :
296 11628 : vec10 = temp18 + temp110;
297 11628 : temp110 = temp18 - temp110;
298 11628 : vec11 = temp19 + temp111;
299 11628 : temp111 = temp19 - temp111;
300 :
301 11628 : temp112 = vec2 + vec4;
302 11628 : temp114 = vec2 - vec4;
303 11628 : temp113 = vec3 + vec5;
304 11628 : temp115 = vec3 - vec5;
305 :
306 :
307 : /* Post-additions */
308 11628 : *vec++ = temp20 + temp22;
309 11628 : *vec++ = temp21 + temp23;
310 11628 : *vec++ = temp12 + vec10;
311 11628 : *vec++ = temp13 + vec11;
312 11628 : *vec++ = temp210 + temp212;
313 11628 : *vec++ = temp211 + temp213;
314 11628 : *vec++ = temp10 + temp112;
315 11628 : *vec++ = temp11 + temp113;
316 11628 : *vec++ = temp24 - temp26;
317 11628 : *vec++ = temp25 - temp27;
318 11628 : *vec++ = temp16 + temp114;
319 11628 : *vec++ = temp17 + temp115;
320 11628 : *vec++ = temp28 + temp214;
321 11628 : *vec++ = temp29 + temp215;
322 11628 : *vec++ = temp14 + temp110;
323 11628 : *vec++ = temp15 + temp111;
324 11628 : *vec++ = temp20 - temp22;
325 11628 : *vec++ = temp21 - temp23;
326 11628 : *vec++ = temp12 - vec10;
327 11628 : *vec++ = temp13 - vec11;
328 11628 : *vec++ = temp210 - temp212;
329 11628 : *vec++ = temp211 - temp213;
330 11628 : *vec++ = temp10 - temp112;
331 11628 : *vec++ = temp11 - temp113;
332 11628 : *vec++ = temp24 + temp26;
333 11628 : *vec++ = temp25 + temp27;
334 11628 : *vec++ = temp16 - temp114;
335 11628 : *vec++ = temp17 - temp115;
336 11628 : *vec++ = temp28 - temp214;
337 11628 : *vec++ = temp29 - temp215;
338 11628 : *vec++ = temp14 - temp110;
339 11628 : *vec++ = temp15 - temp111;
340 :
341 11628 : return;
342 : }
343 :
344 :
345 : /*******************************************************************************
346 : Functionname: fft15
347 : *******************************************************************************
348 :
349 : Description: 15-point FFT. Complex-valued input takes 176 real additions
350 : and 34 real multiplications.
351 :
352 : Arguments: vec - pointer to data (interleaved real / imaginary parts)
353 :
354 : Return: none
355 :
356 : *******************************************************************************/
357 278042136 : static void fft15( float *restrict vec )
358 : {
359 :
360 : float r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17;
361 : float i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17;
362 : float tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9,
363 : tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17, tmp18, tmp19,
364 : tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27, tmp28, tmp29;
365 :
366 :
367 : /* Pre-additions real part */
368 278042136 : r1 = vec[2] + vec[8];
369 278042136 : r2 = vec[2] - vec[8];
370 278042136 : r3 = vec[4] + vec[16];
371 278042136 : r4 = vec[4] - vec[16];
372 278042136 : r5 = vec[6] + vec[24];
373 278042136 : r6 = vec[6] - vec[24];
374 278042136 : r7 = vec[10] + vec[20];
375 278042136 : r8 = vec[10] - vec[20];
376 278042136 : r9 = vec[12] + vec[18];
377 278042136 : r10 = vec[12] - vec[18];
378 278042136 : r11 = vec[14] + vec[26];
379 278042136 : r12 = vec[14] - vec[26];
380 278042136 : r13 = vec[22] + vec[28];
381 278042136 : r14 = vec[22] - vec[28];
382 :
383 278042136 : tmp2 = r1 + r3;
384 278042136 : tmp4 = r1 - r3;
385 278042136 : tmp6 = r2 + r14;
386 278042136 : tmp8 = r2 - r14;
387 278042136 : tmp10 = r4 + r12;
388 278042136 : tmp12 = r4 - r12;
389 278042136 : tmp14 = r5 + r9;
390 278042136 : tmp16 = r5 - r9;
391 278042136 : tmp18 = r11 + r13;
392 278042136 : tmp20 = r11 - r13;
393 :
394 : /* Pre-additions imaginary part */
395 278042136 : i1 = vec[3] + vec[9];
396 278042136 : i2 = vec[3] - vec[9];
397 278042136 : i3 = vec[5] + vec[17];
398 278042136 : i4 = vec[5] - vec[17];
399 278042136 : i5 = vec[7] + vec[25];
400 278042136 : i6 = vec[7] - vec[25];
401 278042136 : i7 = vec[11] + vec[21];
402 278042136 : i8 = vec[11] - vec[21];
403 278042136 : i9 = vec[13] + vec[19];
404 278042136 : i10 = vec[13] - vec[19];
405 278042136 : i11 = vec[15] + vec[27];
406 278042136 : i12 = vec[15] - vec[27];
407 278042136 : i13 = vec[23] + vec[29];
408 278042136 : i14 = vec[23] - vec[29];
409 :
410 278042136 : tmp3 = i1 + i3;
411 278042136 : tmp5 = i1 - i3;
412 278042136 : tmp7 = i2 + i14;
413 278042136 : tmp9 = i2 - i14;
414 278042136 : tmp11 = i4 + i12;
415 278042136 : tmp13 = i4 - i12;
416 278042136 : tmp15 = i5 + i9;
417 278042136 : tmp17 = i5 - i9;
418 278042136 : tmp19 = i11 + i13;
419 278042136 : tmp21 = i11 - i13;
420 :
421 :
422 : /* Pre-additions and core multiplications */
423 278042136 : tmp28 = tmp4 + tmp20;
424 278042136 : tmp29 = tmp5 + tmp21;
425 278042136 : r4 = tmp2 + tmp18;
426 278042136 : i4 = tmp3 + tmp19;
427 278042136 : r3 = ( r4 + tmp14 ) * -1.25f;
428 278042136 : i3 = ( i4 + tmp15 ) * -1.25f;
429 278042136 : r2 = ( tmp29 - i8 ) * -8.660254037844387e-1f;
430 278042136 : i2 = ( tmp28 - r8 ) * 8.660254037844387e-1f;
431 278042136 : r1 = r4 + r7;
432 278042136 : i1 = i4 + i7;
433 278042136 : r0 = r1 + vec[0] + tmp14;
434 278042136 : i0 = i1 + vec[1] + tmp15;
435 278042136 : r7 = tmp4 - tmp20;
436 278042136 : i7 = tmp5 - tmp21;
437 278042136 : r8 = ( tmp3 - tmp19 ) * -4.841229182759272e-1f;
438 278042136 : i8 = ( tmp2 - tmp18 ) * 4.841229182759272e-1f;
439 278042136 : tmp0 = tmp6 + r10;
440 278042136 : tmp1 = tmp7 + i10;
441 278042136 : tmp2 = r6 - tmp10;
442 278042136 : tmp3 = i6 - tmp11;
443 278042136 : r10 = tmp7 * -2.308262652881440f;
444 278042136 : i10 = tmp6 * 2.308262652881440f;
445 278042136 : r11 = tmp8 * 1.332676064001459f;
446 278042136 : i11 = tmp9 * 1.332676064001459f;
447 278042136 : r6 = ( r7 - tmp16 ) * 5.590169943749475e-1f;
448 278042136 : i6 = ( i7 - tmp17 ) * 5.590169943749475e-1f;
449 278042136 : r12 = ( tmp1 + tmp3 ) * 5.877852522924733e-1f;
450 278042136 : i12 = ( tmp0 + tmp2 ) * -5.877852522924733e-1f;
451 278042136 : r13 = ( tmp7 - tmp11 ) * -8.816778784387098e-1f;
452 278042136 : i13 = ( tmp6 - tmp10 ) * 8.816778784387098e-1f;
453 278042136 : r14 = ( tmp8 + tmp12 ) * 5.090369604551274e-1f;
454 278042136 : i14 = ( tmp9 + tmp13 ) * 5.090369604551274e-1f;
455 278042136 : r16 = tmp11 * 5.449068960040204e-1f;
456 278042136 : i16 = tmp10 * -5.449068960040204e-1f;
457 278042136 : r17 = tmp12 * 3.146021430912046e-1f;
458 278042136 : i17 = tmp13 * 3.146021430912046e-1f;
459 :
460 278042136 : r4 *= 1.875f;
461 278042136 : i4 *= 1.875f;
462 278042136 : r1 *= -1.5f;
463 278042136 : i1 *= -1.5f;
464 278042136 : r7 *= -8.385254915624212e-1f;
465 278042136 : i7 *= -8.385254915624212e-1f;
466 278042136 : r5 = tmp29 * 1.082531754730548f;
467 278042136 : i5 = tmp28 * -1.082531754730548f;
468 278042136 : r9 = tmp1 * 1.538841768587627f;
469 278042136 : i9 = tmp0 * -1.538841768587627f;
470 278042136 : r15 = tmp3 * 3.632712640026803e-1f;
471 278042136 : i15 = tmp2 * -3.632712640026803e-1f;
472 :
473 :
474 : /* Post-additions real part */
475 278042136 : tmp2 = r0 + r1;
476 278042136 : tmp4 = r3 + r6;
477 278042136 : tmp6 = r3 - r6;
478 278042136 : tmp8 = r4 + r5;
479 278042136 : tmp10 = r4 - r5;
480 278042136 : tmp12 = r7 + r8;
481 278042136 : tmp14 = r7 - r8;
482 278042136 : tmp16 = r13 + r16;
483 278042136 : tmp18 = r14 + r17;
484 278042136 : tmp20 = r10 - r13;
485 278042136 : tmp22 = r11 - r14;
486 278042136 : tmp24 = r12 + r15;
487 278042136 : tmp26 = r12 - r9;
488 :
489 278042136 : r1 = tmp2 + r2;
490 278042136 : r2 = tmp2 - r2;
491 278042136 : r3 = tmp4 + tmp26;
492 278042136 : r4 = tmp4 - tmp26;
493 278042136 : r5 = tmp6 + tmp24;
494 278042136 : r6 = tmp6 - tmp24;
495 278042136 : r7 = tmp16 + tmp18;
496 278042136 : r8 = tmp16 - tmp18;
497 278042136 : r9 = tmp20 - tmp22;
498 278042136 : r10 = tmp20 + tmp22;
499 278042136 : r11 = r1 + tmp8;
500 278042136 : r12 = r2 + tmp10;
501 278042136 : r13 = r11 - tmp12;
502 278042136 : r14 = r12 - tmp14;
503 278042136 : r15 = r12 + tmp14;
504 278042136 : r16 = r11 + tmp12;
505 :
506 : /* Post-additions imaginary part */
507 278042136 : tmp3 = i0 + i1;
508 278042136 : tmp5 = i3 + i6;
509 278042136 : tmp7 = i3 - i6;
510 278042136 : tmp9 = i4 + i5;
511 278042136 : tmp11 = i4 - i5;
512 278042136 : tmp13 = i7 + i8;
513 278042136 : tmp15 = i7 - i8;
514 278042136 : tmp17 = i13 + i16;
515 278042136 : tmp19 = i14 + i17;
516 278042136 : tmp21 = i10 - i13;
517 278042136 : tmp23 = i11 - i14;
518 278042136 : tmp25 = i12 + i15;
519 278042136 : tmp27 = i12 - i9;
520 :
521 278042136 : i1 = tmp3 + i2;
522 278042136 : i2 = tmp3 - i2;
523 278042136 : i3 = tmp5 + tmp27;
524 278042136 : i4 = tmp5 - tmp27;
525 278042136 : i5 = tmp7 + tmp25;
526 278042136 : i6 = tmp7 - tmp25;
527 278042136 : i7 = tmp17 + tmp19;
528 278042136 : i8 = tmp17 - tmp19;
529 278042136 : i9 = tmp21 - tmp23;
530 278042136 : i10 = tmp21 + tmp23;
531 278042136 : i11 = i1 + tmp9;
532 278042136 : i12 = i2 + tmp11;
533 278042136 : i13 = i11 - tmp13;
534 278042136 : i14 = i12 - tmp15;
535 278042136 : i15 = i12 + tmp15;
536 278042136 : i16 = i11 + tmp13;
537 :
538 278042136 : *vec++ = r0;
539 278042136 : *vec++ = i0;
540 278042136 : *vec++ = r13 + r5 + r7;
541 278042136 : *vec++ = i13 + i5 + i7;
542 278042136 : *vec++ = r15 + r3 - r9;
543 278042136 : *vec++ = i15 + i3 - i9;
544 278042136 : *vec++ = r0 + r4;
545 278042136 : *vec++ = i0 + i4;
546 278042136 : *vec++ = r13 + r6 - r7;
547 278042136 : *vec++ = i13 + i6 - i7;
548 278042136 : *vec++ = r2;
549 278042136 : *vec++ = i2;
550 278042136 : *vec++ = r0 + r5;
551 278042136 : *vec++ = i0 + i5;
552 278042136 : *vec++ = r16 + r3 - r10;
553 278042136 : *vec++ = i16 + i3 - i10;
554 278042136 : *vec++ = r15 + r4 + r9;
555 278042136 : *vec++ = i15 + i4 + i9;
556 278042136 : *vec++ = r0 + r6;
557 278042136 : *vec++ = i0 + i6;
558 278042136 : *vec++ = r1;
559 278042136 : *vec++ = i1;
560 278042136 : *vec++ = r14 + r5 + r8;
561 278042136 : *vec++ = i14 + i5 + i8;
562 278042136 : *vec++ = r0 + r3;
563 278042136 : *vec++ = i0 + i3;
564 278042136 : *vec++ = r16 + r4 + r10;
565 278042136 : *vec++ = i16 + i4 + i10;
566 278042136 : *vec++ = r14 + r6 - r8;
567 278042136 : *vec++ = i14 + i6 - i8;
568 :
569 278042136 : return;
570 : }
571 :
572 : /*******************************************************************************
573 : Functionname: fft5s
574 : *******************************************************************************
575 :
576 : Description: 5-point FFT.
577 :
578 : Arguments: x - pointer to input data (interleaved real / imaginary parts)
579 : stride - stride for input data
580 :
581 : Return: none
582 :
583 : *******************************************************************************/
584 : static const float C51 = 0.9510565162951535f;
585 : static const float C52 = -1.5388417685876270f;
586 : static const float C53 = -0.3632712640026803f;
587 : static const float C54 = 0.5590169943749475f;
588 : static const float C55 = -1.25f;
589 :
590 0 : static void fft5s( float *x, const int16_t stride )
591 : {
592 : float r1, r2, r3, r4;
593 : float s1, s2, s3, s4;
594 : float t;
595 : /* real part */
596 0 : r1 = x[1 * stride] + x[4 * stride];
597 0 : r4 = x[1 * stride] - x[4 * stride];
598 0 : r3 = x[2 * stride] + x[3 * stride];
599 0 : r2 = x[2 * stride] - x[3 * stride];
600 0 : t = ( r1 - r3 ) * C54;
601 0 : r1 = r1 + r3;
602 0 : x[0] = x[0] + r1;
603 0 : r1 = x[0] + ( r1 * C55 );
604 0 : r3 = r1 - t;
605 0 : r1 = r1 + t;
606 0 : t = ( r4 + r2 ) * C51;
607 0 : r4 = t + ( r4 * C52 );
608 0 : r2 = t + ( r2 * C53 );
609 :
610 : /* imaginary part */
611 0 : s1 = x[1 * stride + 1] + x[4 * stride + 1];
612 0 : s4 = x[1 * stride + 1] - x[4 * stride + 1];
613 0 : s3 = x[2 * stride + 1] + x[3 * stride + 1];
614 0 : s2 = x[2 * stride + 1] - x[3 * stride + 1];
615 0 : t = ( s1 - s3 ) * C54;
616 0 : s1 = s1 + s3;
617 0 : x[1] = x[1] + s1;
618 0 : s1 = x[1] + ( s1 * C55 );
619 0 : s3 = s1 - t;
620 0 : s1 = s1 + t;
621 0 : t = ( s4 + s2 ) * C51;
622 0 : s4 = t + ( s4 * C52 );
623 0 : s2 = t + ( s2 * C53 );
624 :
625 : /* combination */
626 0 : x[1 * stride] = r1 + s2;
627 0 : x[4 * stride] = r1 - s2;
628 0 : x[2 * stride] = r3 - s4;
629 0 : x[3 * stride] = r3 + s4;
630 :
631 0 : x[1 * stride + 1] = s1 - r2;
632 0 : x[4 * stride + 1] = s1 + r2;
633 0 : x[2 * stride + 1] = s3 + r4;
634 0 : x[3 * stride + 1] = s3 - r4;
635 0 : }
636 :
637 :
638 : /**
639 : * \brief Function performs a complex 10-point FFT
640 : * The FFT is performed inplace. The result of the FFT
641 : * is scaled by SCALEFACTOR10 bits.
642 : *
643 : * WOPS FLC version: 1093 cycles
644 : * WOPS with 32x16 bit multiplications: 196 cycles
645 : *
646 : * \param [i/o] re real input / output
647 : * \param [i/o] im imag input / output
648 : * \param [i ] s stride real and imag input / output
649 : *
650 : * \return void
651 : */
652 32599848 : static void fft10( float *restrict vec )
653 : {
654 : float t;
655 : float r1, r2, r3, r4;
656 : float s1, s2, s3, s4;
657 : float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
658 : float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
659 :
660 : /* 2 fft5 stages */
661 :
662 : /* real part */
663 32599848 : r1 = vec[12] + vec[8];
664 32599848 : r4 = vec[12] - vec[8];
665 32599848 : r3 = vec[4] + vec[16];
666 32599848 : r2 = vec[4] - vec[16];
667 32599848 : t = ( r1 - r3 ) * C54;
668 32599848 : r1 = r1 + r3;
669 32599848 : y00 = vec[0] + r1;
670 32599848 : r1 = y00 + ( r1 * C55 );
671 32599848 : r3 = r1 - t;
672 32599848 : r1 = r1 + t;
673 32599848 : t = ( r4 + r2 ) * C51;
674 32599848 : r4 = t + ( r4 * C52 );
675 32599848 : r2 = t + ( r2 * C53 );
676 :
677 : /* imaginary part */
678 32599848 : s1 = vec[13] + vec[9];
679 32599848 : s4 = vec[13] - vec[9];
680 32599848 : s3 = vec[5] + vec[17];
681 32599848 : s2 = vec[5] - vec[17];
682 32599848 : t = ( s1 - s3 ) * C54;
683 32599848 : s1 = s1 + s3;
684 32599848 : y01 = vec[1] + s1;
685 32599848 : s1 = y01 + ( s1 * C55 );
686 32599848 : s3 = s1 - t;
687 32599848 : s1 = s1 + t;
688 32599848 : t = ( s4 + s2 ) * C51;
689 32599848 : s4 = t + ( s4 * C52 );
690 32599848 : s2 = t + ( s2 * C53 );
691 :
692 : /* combination */
693 32599848 : y04 = r1 + s2;
694 32599848 : y16 = r1 - s2;
695 32599848 : y08 = r3 - s4;
696 32599848 : y12 = r3 + s4;
697 32599848 : y05 = s1 - r2;
698 32599848 : y17 = s1 + r2;
699 32599848 : y09 = s3 + r4;
700 32599848 : y13 = s3 - r4;
701 :
702 : /* real part */
703 32599848 : r1 = vec[2] + vec[18];
704 32599848 : r4 = vec[2] - vec[18];
705 32599848 : r3 = vec[14] + vec[6];
706 32599848 : r2 = vec[14] - vec[6];
707 32599848 : t = ( r1 - r3 ) * C54;
708 32599848 : r1 = r1 + r3;
709 32599848 : y02 = vec[10] + r1;
710 32599848 : r1 = y02 + ( r1 * C55 );
711 32599848 : r3 = r1 - t;
712 32599848 : r1 = r1 + t;
713 32599848 : t = ( r4 + r2 ) * C51;
714 32599848 : r4 = t + ( r4 * C52 );
715 32599848 : r2 = t + ( r2 * C53 );
716 :
717 : /* imaginary part */
718 32599848 : s1 = vec[3] + vec[19];
719 32599848 : s4 = vec[3] - vec[19];
720 32599848 : s3 = vec[15] + vec[7];
721 32599848 : s2 = vec[15] - vec[7];
722 32599848 : t = ( s1 - s3 ) * C54;
723 32599848 : s1 = s1 + s3;
724 32599848 : y03 = vec[11] + s1;
725 32599848 : s1 = y03 + ( s1 * C55 );
726 32599848 : s3 = s1 - t;
727 32599848 : s1 = s1 + t;
728 32599848 : t = ( s4 + s2 ) * C51;
729 32599848 : s4 = t + ( s4 * C52 );
730 32599848 : s2 = t + ( s2 * C53 );
731 :
732 : /* combination */
733 32599848 : y06 = r1 + s2;
734 32599848 : y18 = r1 - s2;
735 32599848 : y10 = r3 - s4;
736 32599848 : y14 = r3 + s4;
737 32599848 : y07 = s1 - r2;
738 32599848 : y19 = s1 + r2;
739 32599848 : y11 = s3 + r4;
740 32599848 : y15 = s3 - r4;
741 :
742 : /* 5 fft2 stages */
743 32599848 : vec[0] = y00 + y02;
744 32599848 : vec[1] = y01 + y03;
745 32599848 : vec[2] = y12 - y14;
746 32599848 : vec[3] = y13 - y15;
747 32599848 : vec[4] = y04 + y06;
748 32599848 : vec[5] = y05 + y07;
749 32599848 : vec[6] = y16 - y18;
750 32599848 : vec[7] = y17 - y19;
751 32599848 : vec[8] = y08 + y10;
752 32599848 : vec[9] = y09 + y11;
753 32599848 : vec[10] = y00 - y02;
754 32599848 : vec[11] = y01 - y03;
755 32599848 : vec[12] = y12 + y14;
756 32599848 : vec[13] = y13 + y15;
757 32599848 : vec[14] = y04 - y06;
758 32599848 : vec[15] = y05 - y07;
759 32599848 : vec[16] = y16 + y18;
760 32599848 : vec[17] = y17 + y19;
761 32599848 : vec[18] = y08 - y10;
762 32599848 : vec[19] = y09 - y11;
763 :
764 32599848 : return;
765 : }
766 :
767 : /**
768 : * \brief Function performs a complex 20-point FFT
769 : * The FFT is performed inplace. The result of the FFT
770 : * is scaled by SCALEFACTOR20 bits.
771 : *
772 : * WOPS FLC version: 1509 cycles
773 : * WOPS with 32x16 bit multiplications: 432 cycles
774 : *
775 : * \param [i/o] re real input / output
776 : * \param [i/o] im imag input / output
777 : * \param [i ] s stride real and imag input / output
778 : *
779 : * \return void
780 : */
781 49281840 : static void fft20( float *signal )
782 : {
783 49281840 : const int16_t s = 2;
784 49281840 : float *re = signal, *im = signal + 1;
785 : float r1, r2, r3, r4;
786 : float s1, s2, s3, s4;
787 : float x0, x1, x2, x3, x4;
788 : float t, t0, t1, t2, t3, t4, t5, t6, t7;
789 : float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
790 : float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
791 : float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29;
792 : float y30, y31, y32, y33, y34, y35, y36, y37, y38, y39;
793 :
794 : /* 1. FFT5 stage */
795 :
796 : /* real part */
797 49281840 : x0 = re[s * 0];
798 49281840 : x1 = re[s * 16];
799 49281840 : x2 = re[s * 12];
800 49281840 : x3 = re[s * 8];
801 49281840 : x4 = re[s * 4];
802 49281840 : r1 = x1 + x4;
803 49281840 : r4 = x1 - x4;
804 49281840 : r3 = x2 + x3;
805 49281840 : r2 = x2 - x3;
806 49281840 : t = ( r1 - r3 ) * C54;
807 49281840 : r1 = r1 + r3;
808 49281840 : y00 = x0 + r1;
809 49281840 : r1 = y00 + ( r1 * C55 );
810 49281840 : r3 = r1 - t;
811 49281840 : r1 = r1 + t;
812 49281840 : t = ( r4 + r2 ) * C51;
813 49281840 : r4 = t + ( r4 * C52 );
814 49281840 : r2 = t + ( r2 * C53 );
815 :
816 : /* imaginary part */
817 49281840 : x0 = im[s * 0];
818 49281840 : x1 = im[s * 16];
819 49281840 : x2 = im[s * 12];
820 49281840 : x3 = im[s * 8];
821 49281840 : x4 = im[s * 4];
822 49281840 : s1 = x1 + x4;
823 49281840 : s4 = x1 - x4;
824 49281840 : s3 = x2 + x3;
825 49281840 : s2 = x2 - x3;
826 49281840 : t = ( s1 - s3 ) * C54;
827 49281840 : s1 = ( s1 + s3 );
828 49281840 : y01 = ( x0 + s1 );
829 49281840 : s1 = y01 + ( s1 * C55 );
830 49281840 : s3 = ( s1 - t );
831 49281840 : s1 = ( s1 + t );
832 49281840 : t = ( s4 + s2 ) * C51;
833 49281840 : s4 = t + ( s4 * C52 );
834 49281840 : s2 = t + ( s2 * C53 );
835 :
836 : /* combination */
837 49281840 : y08 = ( r1 + s2 );
838 49281840 : y32 = ( r1 - s2 );
839 49281840 : y16 = ( r3 - s4 );
840 49281840 : y24 = ( r3 + s4 );
841 :
842 49281840 : y09 = ( s1 - r2 );
843 49281840 : y33 = ( s1 + r2 );
844 49281840 : y17 = ( s3 + r4 );
845 49281840 : y25 = ( s3 - r4 );
846 :
847 : /* 2. FFT5 stage */
848 :
849 : /* real part */
850 49281840 : x0 = re[s * 5];
851 49281840 : x1 = re[s * 1];
852 49281840 : x2 = re[s * 17];
853 49281840 : x3 = re[s * 13];
854 49281840 : x4 = re[s * 9];
855 49281840 : r1 = ( x1 + x4 );
856 49281840 : r4 = ( x1 - x4 );
857 49281840 : r3 = ( x2 + x3 );
858 49281840 : r2 = ( x2 - x3 );
859 49281840 : t = ( r1 - r3 ) * C54;
860 49281840 : r1 = ( r1 + r3 );
861 49281840 : y02 = ( x0 + r1 );
862 49281840 : r1 = y02 + ( r1 * C55 );
863 49281840 : r3 = ( r1 - t );
864 49281840 : r1 = ( r1 + t );
865 49281840 : t = ( r4 + r2 ) * C51;
866 49281840 : r4 = t + ( r4 * C52 );
867 49281840 : r2 = t + ( r2 * C53 );
868 :
869 : /* imaginary part */
870 49281840 : x0 = im[s * 5];
871 49281840 : x1 = im[s * 1];
872 49281840 : x2 = im[s * 17];
873 49281840 : x3 = im[s * 13];
874 49281840 : x4 = im[s * 9];
875 49281840 : s1 = ( x1 + x4 );
876 49281840 : s4 = ( x1 - x4 );
877 49281840 : s3 = ( x2 + x3 );
878 49281840 : s2 = ( x2 - x3 );
879 49281840 : t = ( s1 - s3 ) * C54;
880 49281840 : s1 = ( s1 + s3 );
881 49281840 : y03 = ( x0 + s1 );
882 49281840 : s1 = y03 + ( s1 * C55 );
883 49281840 : s3 = ( s1 - t );
884 49281840 : s1 = ( s1 + t );
885 49281840 : t = ( s4 + s2 ) * C51;
886 49281840 : s4 = t + ( s4 * C52 );
887 49281840 : s2 = t + ( s2 * C53 );
888 :
889 : /* combination */
890 49281840 : y10 = ( r1 + s2 );
891 49281840 : y34 = ( r1 - s2 );
892 49281840 : y18 = ( r3 - s4 );
893 49281840 : y26 = ( r3 + s4 );
894 :
895 49281840 : y11 = ( s1 - r2 );
896 49281840 : y35 = ( s1 + r2 );
897 49281840 : y19 = ( s3 + r4 );
898 49281840 : y27 = ( s3 - r4 );
899 :
900 : /* 3. FFT5 stage */
901 :
902 : /* real part */
903 49281840 : x0 = re[s * 10];
904 49281840 : x1 = re[s * 6];
905 49281840 : x2 = re[s * 2];
906 49281840 : x3 = re[s * 18];
907 49281840 : x4 = re[s * 14];
908 49281840 : r1 = ( x1 + x4 );
909 49281840 : r4 = ( x1 - x4 );
910 49281840 : r3 = ( x2 + x3 );
911 49281840 : r2 = ( x2 - x3 );
912 49281840 : t = ( r1 - r3 ) * C54;
913 49281840 : r1 = ( r1 + r3 );
914 49281840 : y04 = ( x0 + r1 );
915 49281840 : r1 = y04 + ( r1 * C55 );
916 49281840 : r3 = ( r1 - t );
917 49281840 : r1 = ( r1 + t );
918 49281840 : t = ( r4 + r2 ) * C51;
919 49281840 : r4 = t + ( r4 * C52 );
920 49281840 : r2 = t + ( r2 * C53 );
921 :
922 : /* imaginary part */
923 49281840 : x0 = im[s * 10];
924 49281840 : x1 = im[s * 6];
925 49281840 : x2 = im[s * 2];
926 49281840 : x3 = im[s * 18];
927 49281840 : x4 = im[s * 14];
928 49281840 : s1 = ( x1 + x4 );
929 49281840 : s4 = ( x1 - x4 );
930 49281840 : s3 = ( x2 + x3 );
931 49281840 : s2 = ( x2 - x3 );
932 49281840 : t = ( s1 - s3 ) * C54;
933 49281840 : s1 = ( s1 + s3 );
934 49281840 : y05 = ( x0 + s1 );
935 49281840 : s1 = y05 + ( s1 * C55 );
936 49281840 : s3 = ( s1 - t );
937 49281840 : s1 = ( s1 + t );
938 49281840 : t = ( s4 + s2 ) * C51;
939 49281840 : s4 = t + ( s4 * C52 );
940 49281840 : s2 = t + ( s2 * C53 );
941 :
942 : /* combination */
943 49281840 : y12 = ( r1 + s2 );
944 49281840 : y36 = ( r1 - s2 );
945 49281840 : y20 = ( r3 - s4 );
946 49281840 : y28 = ( r3 + s4 );
947 :
948 49281840 : y13 = ( s1 - r2 );
949 49281840 : y37 = ( s1 + r2 );
950 49281840 : y21 = ( s3 + r4 );
951 49281840 : y29 = ( s3 - r4 );
952 :
953 : /* 4. FFT5 stage */
954 :
955 : /* real part */
956 49281840 : x0 = re[s * 15];
957 49281840 : x1 = re[s * 11];
958 49281840 : x2 = re[s * 7];
959 49281840 : x3 = re[s * 3];
960 49281840 : x4 = re[s * 19];
961 49281840 : r1 = ( x1 + x4 );
962 49281840 : r4 = ( x1 - x4 );
963 49281840 : r3 = ( x2 + x3 );
964 49281840 : r2 = ( x2 - x3 );
965 49281840 : t = ( r1 - r3 ) * C54;
966 49281840 : r1 = ( r1 + r3 );
967 49281840 : y06 = ( x0 + r1 );
968 49281840 : r1 = y06 + ( r1 * C55 );
969 49281840 : r3 = ( r1 - t );
970 49281840 : r1 = ( r1 + t );
971 49281840 : t = ( r4 + r2 ) * C51;
972 49281840 : r4 = t + ( r4 * C52 );
973 49281840 : r2 = t + ( r2 * C53 );
974 :
975 : /* imaginary part */
976 49281840 : x0 = im[s * 15];
977 49281840 : x1 = im[s * 11];
978 49281840 : x2 = im[s * 7];
979 49281840 : x3 = im[s * 3];
980 49281840 : x4 = im[s * 19];
981 49281840 : s1 = ( x1 + x4 );
982 49281840 : s4 = ( x1 - x4 );
983 49281840 : s3 = ( x2 + x3 );
984 49281840 : s2 = ( x2 - x3 );
985 49281840 : t = ( s1 - s3 ) * C54;
986 49281840 : s1 = ( s1 + s3 );
987 49281840 : y07 = ( x0 + s1 );
988 49281840 : s1 = y07 + ( s1 * C55 );
989 49281840 : s3 = ( s1 - t );
990 49281840 : s1 = ( s1 + t );
991 49281840 : t = ( s4 + s2 ) * C51;
992 49281840 : s4 = t + ( s4 * C52 );
993 49281840 : s2 = t + ( s2 * C53 );
994 :
995 : /* combination */
996 49281840 : y14 = ( r1 + s2 );
997 49281840 : y38 = ( r1 - s2 );
998 49281840 : y22 = ( r3 - s4 );
999 49281840 : y30 = ( r3 + s4 );
1000 :
1001 49281840 : y15 = ( s1 - r2 );
1002 49281840 : y39 = ( s1 + r2 );
1003 49281840 : y23 = ( s3 + r4 );
1004 49281840 : y31 = ( s3 - r4 );
1005 :
1006 :
1007 : /* 1. FFT4 stage */
1008 :
1009 : /* Pre-additions */
1010 49281840 : t0 = ( y00 + y04 );
1011 49281840 : t2 = ( y00 - y04 );
1012 49281840 : t1 = ( y01 + y05 );
1013 49281840 : t3 = ( y01 - y05 );
1014 49281840 : t4 = ( y02 + y06 );
1015 49281840 : t7 = ( y02 - y06 );
1016 49281840 : t5 = ( y07 + y03 );
1017 49281840 : t6 = ( y07 - y03 );
1018 :
1019 : /* Post-additions */
1020 49281840 : re[s * 0] = ( t0 + t4 );
1021 49281840 : im[s * 0] = ( t1 + t5 );
1022 49281840 : re[s * 5] = ( t2 - t6 );
1023 49281840 : im[s * 5] = ( t3 - t7 );
1024 49281840 : re[s * 10] = ( t0 - t4 );
1025 49281840 : im[s * 10] = ( t1 - t5 );
1026 49281840 : re[s * 15] = ( t2 + t6 );
1027 49281840 : im[s * 15] = ( t3 + t7 );
1028 :
1029 : /* 2. FFT4 stage */
1030 :
1031 : /* Pre-additions */
1032 49281840 : t0 = ( y08 + y12 );
1033 49281840 : t2 = ( y08 - y12 );
1034 49281840 : t1 = ( y09 + y13 );
1035 49281840 : t3 = ( y09 - y13 );
1036 49281840 : t4 = ( y10 + y14 );
1037 49281840 : t7 = ( y10 - y14 );
1038 49281840 : t5 = ( y15 + y11 );
1039 49281840 : t6 = ( y15 - y11 );
1040 :
1041 : /* Post-additions */
1042 49281840 : re[s * 4] = ( t0 + t4 );
1043 49281840 : im[s * 4] = ( t1 + t5 );
1044 49281840 : re[s * 9] = ( t2 - t6 );
1045 49281840 : im[s * 9] = ( t3 - t7 );
1046 49281840 : re[s * 14] = ( t0 - t4 );
1047 49281840 : im[s * 14] = ( t1 - t5 );
1048 49281840 : re[s * 19] = ( t2 + t6 );
1049 49281840 : im[s * 19] = ( t3 + t7 );
1050 :
1051 :
1052 : /* 3. FFT4 stage */
1053 :
1054 : /* Pre-additions */
1055 49281840 : t0 = ( y16 + y20 );
1056 49281840 : t2 = ( y16 - y20 );
1057 49281840 : t1 = ( y17 + y21 );
1058 49281840 : t3 = ( y17 - y21 );
1059 49281840 : t4 = ( y18 + y22 );
1060 49281840 : t7 = ( y18 - y22 );
1061 49281840 : t5 = ( y23 + y19 );
1062 49281840 : t6 = ( y23 - y19 );
1063 :
1064 : /* Post-additions */
1065 49281840 : re[s * 8] = ( t0 + t4 );
1066 49281840 : im[s * 8] = ( t1 + t5 );
1067 49281840 : re[s * 13] = ( t2 - t6 );
1068 49281840 : im[s * 13] = ( t3 - t7 );
1069 49281840 : re[s * 18] = ( t0 - t4 );
1070 49281840 : im[s * 18] = ( t1 - t5 );
1071 49281840 : re[s * 3] = ( t2 + t6 );
1072 49281840 : im[s * 3] = ( t3 + t7 );
1073 :
1074 : /* 4. FFT4 stage */
1075 :
1076 : /* Pre-additions */
1077 49281840 : t0 = ( y24 + y28 );
1078 49281840 : t2 = ( y24 - y28 );
1079 49281840 : t1 = ( y25 + y29 );
1080 49281840 : t3 = ( y25 - y29 );
1081 49281840 : t4 = ( y26 + y30 );
1082 49281840 : t7 = ( y26 - y30 );
1083 49281840 : t5 = ( y31 + y27 );
1084 49281840 : t6 = ( y31 - y27 );
1085 :
1086 : /* Post-additions */
1087 49281840 : re[s * 12] = ( t0 + t4 );
1088 49281840 : im[s * 12] = ( t1 + t5 );
1089 49281840 : re[s * 17] = ( t2 - t6 );
1090 49281840 : im[s * 17] = ( t3 - t7 );
1091 49281840 : re[s * 2] = ( t0 - t4 );
1092 49281840 : im[s * 2] = ( t1 - t5 );
1093 49281840 : re[s * 7] = ( t2 + t6 );
1094 49281840 : im[s * 7] = ( t3 + t7 );
1095 :
1096 : /* 5. FFT4 stage */
1097 :
1098 : /* Pre-additions */
1099 49281840 : t0 = ( y32 + y36 );
1100 49281840 : t2 = ( y32 - y36 );
1101 49281840 : t1 = ( y33 + y37 );
1102 49281840 : t3 = ( y33 - y37 );
1103 49281840 : t4 = ( y34 + y38 );
1104 49281840 : t7 = ( y34 - y38 );
1105 49281840 : t5 = ( y39 + y35 );
1106 49281840 : t6 = ( y39 - y35 );
1107 :
1108 : /* Post-additions */
1109 49281840 : re[s * 16] = ( t0 + t4 );
1110 49281840 : im[s * 16] = ( t1 + t5 );
1111 49281840 : re[s * 1] = ( t2 - t6 );
1112 49281840 : im[s * 1] = ( t3 - t7 );
1113 49281840 : re[s * 6] = ( t0 - t4 );
1114 49281840 : im[s * 6] = ( t1 - t5 );
1115 49281840 : re[s * 11] = ( t2 + t6 );
1116 49281840 : im[s * 11] = ( t3 + t7 );
1117 :
1118 49281840 : return;
1119 : }
1120 :
1121 : /*******************************************************************************
1122 : Functionname: fft30
1123 : *******************************************************************************
1124 :
1125 : Description: 30-point FFT.
1126 :
1127 : Arguments: in - pointer to data (interleaved real / imaginary parts)
1128 :
1129 : Return: none
1130 :
1131 : *******************************************************************************/
1132 :
1133 139021068 : static void fft30( float *restrict in )
1134 : {
1135 : int16_t i;
1136 : float temp[60];
1137 139021068 : float *temp_l = temp;
1138 139021068 : float *temp_lu = temp + 2 * 8;
1139 139021068 : float *temp_h = temp + 2 * 15;
1140 139021068 : float *temp_hu = temp + 2 * 15 + 2 * 8;
1141 139021068 : float *in_l = in + 2 * 0;
1142 139021068 : float *in_h = in + 2 * 15;
1143 1112168544 : for ( i = 0; i < 7; i++ )
1144 : {
1145 973147476 : *temp_l++ = *in_l++;
1146 973147476 : *temp_l++ = *in_l++;
1147 973147476 : *temp_h++ = *in_h++;
1148 973147476 : *temp_h++ = *in_h++;
1149 973147476 : *temp_l++ = *in_h++;
1150 973147476 : *temp_l++ = *in_h++;
1151 973147476 : *temp_h++ = *in_l++;
1152 973147476 : *temp_h++ = *in_l++;
1153 : }
1154 139021068 : *temp_l++ = *in_l++;
1155 139021068 : *temp_l++ = *in_l++;
1156 139021068 : *temp_h++ = *in_h++;
1157 139021068 : *temp_h++ = *in_h++;
1158 139021068 : temp_l = temp;
1159 139021068 : temp_h = temp + 30;
1160 139021068 : fft15( temp_l );
1161 139021068 : fft15( temp_h );
1162 :
1163 139021068 : in_l = in + 2 * 0;
1164 139021068 : in_h = in + 2 * 15;
1165 1112168544 : for ( i = 0; i < 7; i++ )
1166 : {
1167 973147476 : *in_l++ = *temp_l + *temp_h;
1168 973147476 : *in_h++ = *temp_l++ - *temp_h++;
1169 973147476 : *in_l++ = *temp_l + *temp_h;
1170 973147476 : *in_h++ = *temp_l++ - *temp_h++;
1171 :
1172 973147476 : *in_h++ = *temp_lu + *temp_hu;
1173 973147476 : *in_l++ = *temp_lu++ - *temp_hu++;
1174 973147476 : *in_h++ = *temp_lu + *temp_hu;
1175 973147476 : *in_l++ = *temp_lu++ - *temp_hu++;
1176 : }
1177 139021068 : *in_l++ = *temp_l + *temp_h;
1178 139021068 : *in_h++ = *temp_l++ - *temp_h++;
1179 139021068 : *in_l++ = *temp_l + *temp_h;
1180 139021068 : *in_h++ = *temp_l++ - *temp_h++;
1181 :
1182 139021068 : return;
1183 : }
1184 :
1185 : /*-------------------------------------------------------------------*
1186 : * fft_cldfb()
1187 : *
1188 : * Interface functions FFT subroutines
1189 : *--------------------------------------------------------------------*/
1190 237640788 : void fft_cldfb(
1191 : float *data, /* i/o: input/output vector */
1192 : const int16_t size /* size of fft operation */
1193 : )
1194 : {
1195 :
1196 237640788 : switch ( size )
1197 : {
1198 0 : case 5:
1199 0 : fft5s( data, 2 );
1200 0 : break;
1201 16726404 : case 8:
1202 16726404 : fft8( data );
1203 16726404 : break;
1204 32599848 : case 10:
1205 32599848 : fft10( data );
1206 32599848 : break;
1207 11628 : case 16:
1208 11628 : fft16( data );
1209 11628 : break;
1210 49281840 : case 20:
1211 49281840 : fft20( data );
1212 49281840 : break;
1213 139021068 : case 30:
1214 139021068 : fft30( data );
1215 139021068 : break;
1216 :
1217 0 : default:
1218 0 : assert( 0 );
1219 : break;
1220 : }
1221 :
1222 237640788 : return;
1223 : }
|