Line data Source code
1 : /******************************************************************************
2 : * ETSI TS 103 634 V1.5.1 *
3 : * Low Complexity Communication Codec Plus (LC3plus) *
4 : * *
5 : * Copyright licence is solely granted through ETSI Intellectual Property *
6 : * Rights Policy, 3rd April 2019. No patent licence is granted by implication, *
7 : * estoppel or otherwise. *
8 : ******************************************************************************/
9 :
10 : /* guard against unindended includes */
11 : #ifndef INCLUDED_FROM_IISFFT_C
12 : #error "this file must not be included"
13 : #endif
14 :
15 0 : static void fft32(LC3_FLOAT* vec)
16 : {
17 0 : const LC3_FLOAT INV_SQRT2 = 7.071067811865475e-1;
18 0 : const LC3_FLOAT COS_PI_DIV8 = 9.238795325112867e-1;
19 0 : const LC3_FLOAT COS_3PI_DIV8 = 3.826834323650898e-1;
20 0 : const LC3_FLOAT SQRT2PLUS1 = 2.414213562373095;
21 0 : const LC3_FLOAT SQRT2MINUS1 = 4.142135623730952e-1;
22 :
23 : const LC3_FLOAT c[4] = {9.807852804032304e-1, 8.314696123025452e-1, 5.555702330196023e-1, 1.950903220161283e-1};
24 :
25 : LC3_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15,
26 : temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17, temp18, temp19, temp110, temp111, temp112,
27 : temp113, temp114, temp115, temp20, temp21, temp22, temp23, temp24, temp25, temp26, temp27, temp28, temp29,
28 : temp210, temp211, temp212, temp213, temp214, temp215, temp30, temp31, temp32, temp33, temp34, temp35, temp36,
29 : temp37, temp38, temp39, temp310, temp311, temp312, temp313, temp314, temp315, temp316, temp317, temp318,
30 : temp319, temp320, temp321, temp322, temp323, temp324, temp325, temp326, temp327, temp328, temp329, temp330,
31 : temp331, temp40, temp41, temp42, temp43, temp44, temp45, temp46, temp47, temp48, temp49, temp410, temp411,
32 : temp412, temp413, temp414, temp415;
33 :
34 0 : temp20 = vec[2] - vec[34];
35 0 : temp21 = vec[3] - vec[35];
36 0 : temp30 = vec[0] + vec[32];
37 0 : temp31 = vec[1] + vec[33];
38 0 : temp32 = vec[2] + vec[34];
39 0 : temp33 = vec[3] + vec[35];
40 :
41 0 : temp22 = vec[6] - vec[38];
42 0 : temp23 = vec[7] - vec[39];
43 0 : temp34 = vec[4] + vec[36];
44 0 : temp35 = vec[5] + vec[37];
45 0 : temp36 = vec[6] + vec[38];
46 0 : temp37 = vec[7] + vec[39];
47 :
48 0 : temp24 = vec[10] - vec[42];
49 0 : temp25 = vec[11] - vec[43];
50 0 : temp38 = vec[8] + vec[40];
51 0 : temp39 = vec[9] + vec[41];
52 0 : temp310 = vec[10] + vec[42];
53 0 : temp311 = vec[11] + vec[43];
54 :
55 0 : temp26 = vec[14] - vec[46];
56 0 : temp27 = vec[15] - vec[47];
57 0 : temp312 = vec[12] + vec[44];
58 0 : temp313 = vec[13] + vec[45];
59 0 : temp314 = vec[14] + vec[46];
60 0 : temp315 = vec[15] + vec[47];
61 :
62 0 : temp28 = vec[18] - vec[50];
63 0 : temp29 = vec[19] - vec[51];
64 0 : temp316 = vec[16] + vec[48];
65 0 : temp317 = vec[17] + vec[49];
66 0 : temp318 = vec[18] + vec[50];
67 0 : temp319 = vec[19] + vec[51];
68 :
69 0 : temp210 = vec[22] - vec[54];
70 0 : temp211 = vec[23] - vec[55];
71 0 : temp320 = vec[20] + vec[52];
72 0 : temp321 = vec[21] + vec[53];
73 0 : temp322 = vec[22] + vec[54];
74 0 : temp323 = vec[23] + vec[55];
75 :
76 0 : temp212 = vec[26] - vec[58];
77 0 : temp213 = vec[27] - vec[59];
78 0 : temp324 = vec[24] + vec[56];
79 0 : temp325 = vec[25] + vec[57];
80 0 : temp326 = vec[26] + vec[58];
81 0 : temp327 = vec[27] + vec[59];
82 :
83 0 : temp214 = vec[30] - vec[62];
84 0 : temp215 = vec[31] - vec[63];
85 0 : temp328 = vec[28] + vec[60];
86 0 : temp329 = vec[29] + vec[61];
87 0 : temp330 = vec[30] + vec[62];
88 0 : temp331 = vec[31] + vec[63];
89 :
90 : /* Pre-additions */
91 0 : temp41 = -(temp20 + temp214);
92 0 : temp42 = temp20 - temp214;
93 0 : temp40 = temp21 + temp215;
94 0 : temp43 = temp21 - temp215;
95 0 : temp45 = -(temp22 + temp212);
96 0 : temp46 = temp22 - temp212;
97 0 : temp44 = temp23 + temp213;
98 0 : temp47 = temp23 - temp213;
99 0 : temp49 = -(temp24 + temp210);
100 0 : temp410 = temp24 - temp210;
101 0 : temp48 = temp25 + temp211;
102 0 : temp411 = temp25 - temp211;
103 0 : temp413 = -(temp26 + temp28);
104 0 : temp414 = temp26 - temp28;
105 0 : temp412 = temp27 + temp29;
106 0 : temp415 = temp27 - temp29;
107 :
108 : /* Core multiplications */
109 0 : temp20 = temp40 * c[3] + temp44 * c[2] + temp48 * c[1] + temp412 * c[0];
110 0 : temp24 = temp40 * c[2] + temp44 * c[0] + temp48 * c[3] - temp412 * c[1];
111 0 : temp28 = temp40 * c[1] + temp44 * c[3] - temp48 * c[0] + temp412 * c[2];
112 0 : temp212 = temp40 * c[0] - temp44 * c[1] + temp48 * c[2] - temp412 * c[3];
113 0 : temp21 = temp41 * c[3] + temp45 * c[2] + temp49 * c[1] + temp413 * c[0];
114 0 : temp25 = temp41 * c[2] + temp45 * c[0] + temp49 * c[3] - temp413 * c[1];
115 0 : temp29 = temp41 * c[1] + temp45 * c[3] - temp49 * c[0] + temp413 * c[2];
116 0 : temp213 = temp41 * c[0] - temp45 * c[1] + temp49 * c[2] - temp413 * c[3];
117 0 : temp22 = temp42 * c[0] + temp46 * c[1] + temp410 * c[2] + temp414 * c[3];
118 0 : temp26 = temp42 * c[1] - temp46 * c[3] - temp410 * c[0] - temp414 * c[2];
119 0 : temp210 = temp42 * c[2] - temp46 * c[0] + temp410 * c[3] + temp414 * c[1];
120 0 : temp214 = temp42 * c[3] - temp46 * c[2] + temp410 * c[1] - temp414 * c[0];
121 0 : temp23 = temp43 * c[0] + temp47 * c[1] + temp411 * c[2] + temp415 * c[3];
122 0 : temp27 = temp43 * c[1] - temp47 * c[3] - temp411 * c[0] - temp415 * c[2];
123 0 : temp211 = temp43 * c[2] - temp47 * c[0] + temp411 * c[3] + temp415 * c[1];
124 0 : temp215 = temp43 * c[3] - temp47 * c[2] + temp411 * c[1] - temp415 * c[0];
125 :
126 : /* Post-additions */
127 0 : temp40 = temp20 + temp22;
128 0 : temp414 = temp20 - temp22;
129 0 : temp41 = temp21 + temp23;
130 0 : temp415 = temp21 - temp23;
131 0 : temp42 = temp24 + temp26;
132 0 : temp412 = temp24 - temp26;
133 0 : temp43 = temp25 + temp27;
134 0 : temp413 = temp25 - temp27;
135 0 : temp44 = temp28 + temp210;
136 0 : temp410 = temp28 - temp210;
137 0 : temp45 = temp29 + temp211;
138 0 : temp411 = temp29 - temp211;
139 0 : temp46 = temp212 + temp214;
140 0 : temp48 = temp212 - temp214;
141 0 : temp47 = temp213 + temp215;
142 0 : temp49 = temp213 - temp215;
143 :
144 : /* fft16(temp3); */
145 : /* even */
146 0 : temp10 = temp30 + temp316;
147 0 : temp11 = temp31 + temp317;
148 0 : temp12 = temp32 + temp318;
149 0 : temp13 = temp33 + temp319;
150 0 : temp14 = temp34 + temp320;
151 0 : temp15 = temp35 + temp321;
152 0 : temp16 = temp36 + temp322;
153 0 : temp17 = temp37 + temp323;
154 0 : temp18 = temp38 + temp324;
155 0 : temp19 = temp39 + temp325;
156 0 : temp110 = temp310 + temp326;
157 0 : temp111 = temp311 + temp327;
158 0 : temp112 = temp312 + temp328;
159 0 : temp113 = temp313 + temp329;
160 0 : temp114 = temp314 + temp330;
161 0 : temp115 = temp315 + temp331;
162 :
163 : /* Pre-additions */
164 0 : tmp0 = temp10 + temp18;
165 0 : tmp2 = temp10 - temp18;
166 0 : tmp1 = temp11 + temp19;
167 0 : tmp3 = temp11 - temp19;
168 0 : tmp4 = temp12 + temp110;
169 0 : tmp6 = temp12 - temp110;
170 0 : tmp5 = temp13 + temp111;
171 0 : tmp7 = temp13 - temp111;
172 0 : tmp8 = temp14 + temp112;
173 0 : tmp10 = temp14 - temp112;
174 0 : tmp9 = temp15 + temp113;
175 0 : tmp11 = temp15 - temp113;
176 0 : tmp12 = temp16 + temp114;
177 0 : tmp14 = temp16 - temp114;
178 0 : tmp13 = temp17 + temp115;
179 0 : tmp15 = temp17 - temp115;
180 :
181 : /* Pre-additions and core multiplications */
182 0 : temp20 = tmp0 + tmp8;
183 0 : temp24 = tmp0 - tmp8;
184 0 : temp21 = tmp1 + tmp9;
185 0 : temp25 = tmp1 - tmp9;
186 0 : temp28 = tmp2 - tmp11;
187 0 : temp210 = tmp2 + tmp11;
188 0 : temp29 = tmp3 + tmp10;
189 0 : temp211 = tmp3 - tmp10;
190 0 : temp22 = tmp4 + tmp12;
191 0 : temp27 = tmp4 - tmp12;
192 0 : temp23 = tmp5 + tmp13;
193 0 : temp26 = tmp13 - tmp5;
194 :
195 0 : tmp1 = tmp6 + tmp14;
196 0 : tmp2 = tmp6 - tmp14;
197 0 : tmp0 = tmp7 + tmp15;
198 0 : tmp3 = tmp7 - tmp15;
199 0 : temp212 = (tmp0 + tmp2) * INV_SQRT2;
200 0 : temp214 = (tmp0 - tmp2) * INV_SQRT2;
201 0 : temp213 = (tmp3 - tmp1) * INV_SQRT2;
202 0 : temp215 = (tmp1 + tmp3) * -INV_SQRT2;
203 :
204 : /* odd */
205 0 : temp10 = temp30 - temp316;
206 0 : temp11 = temp31 - temp317;
207 0 : temp12 = temp32 - temp318;
208 0 : temp13 = temp33 - temp319;
209 0 : temp14 = temp34 - temp320;
210 0 : temp15 = temp35 - temp321;
211 0 : temp16 = temp36 - temp322;
212 0 : temp17 = temp37 - temp323;
213 0 : temp18 = temp38 - temp324;
214 0 : temp19 = temp39 - temp325;
215 0 : temp110 = temp310 - temp326;
216 0 : temp111 = temp311 - temp327;
217 0 : temp112 = temp312 - temp328;
218 0 : temp113 = temp313 - temp329;
219 0 : temp114 = temp314 - temp330;
220 0 : temp115 = temp315 - temp331;
221 :
222 : /* Post-additions */
223 0 : temp30 = temp20 + temp22;
224 0 : temp316 = temp20 - temp22;
225 0 : temp31 = temp21 + temp23;
226 0 : temp317 = temp21 - temp23;
227 0 : temp38 = temp24 - temp26;
228 0 : temp324 = temp24 + temp26;
229 0 : temp39 = temp25 - temp27;
230 0 : temp325 = temp25 + temp27;
231 0 : temp312 = temp28 + temp214;
232 0 : temp328 = temp28 - temp214;
233 0 : temp313 = temp29 + temp215;
234 0 : temp329 = temp29 - temp215;
235 0 : temp34 = temp210 + temp212;
236 0 : temp320 = temp210 - temp212;
237 0 : temp35 = temp211 + temp213;
238 0 : temp321 = temp211 - temp213;
239 :
240 : /* Pre-additions and core multiplications */
241 0 : tmp9 = (temp12 + temp114) * -COS_3PI_DIV8;
242 0 : tmp10 = (temp12 - temp114) * COS_PI_DIV8;
243 0 : tmp8 = (temp13 + temp115) * COS_3PI_DIV8;
244 0 : tmp11 = (temp13 - temp115) * COS_PI_DIV8;
245 0 : tmp5 = (temp14 + temp112) * -INV_SQRT2;
246 0 : tmp6 = (temp14 - temp112) * INV_SQRT2;
247 0 : tmp4 = (temp15 + temp113) * INV_SQRT2;
248 0 : tmp7 = (temp15 - temp113) * INV_SQRT2;
249 0 : tmp13 = (temp16 + temp110) * -COS_PI_DIV8;
250 0 : tmp14 = (temp16 - temp110) * COS_3PI_DIV8;
251 0 : tmp12 = (temp17 + temp111) * COS_PI_DIV8;
252 0 : tmp15 = (temp17 - temp111) * COS_3PI_DIV8;
253 :
254 : /* Core multiplications */
255 0 : temp12 = tmp8 * SQRT2PLUS1 - tmp12 * SQRT2MINUS1;
256 0 : temp13 = tmp9 * SQRT2PLUS1 - tmp13 * SQRT2MINUS1;
257 0 : temp14 = tmp10 * SQRT2MINUS1 - tmp14 * SQRT2PLUS1;
258 0 : temp15 = tmp11 * SQRT2MINUS1 - tmp15 * SQRT2PLUS1;
259 :
260 : /* Post-additions */
261 0 : tmp8 += tmp12;
262 0 : tmp9 += tmp13;
263 0 : tmp10 += tmp14;
264 0 : tmp11 += tmp15;
265 0 : temp16 = temp10 + tmp4;
266 0 : temp110 = temp10 - tmp4;
267 0 : temp17 = temp11 + tmp5;
268 0 : temp111 = temp11 - tmp5;
269 :
270 0 : temp112 = tmp6 - temp19;
271 0 : temp114 = tmp6 + temp19;
272 0 : temp113 = temp18 + tmp7;
273 0 : temp115 = temp18 - tmp7;
274 :
275 0 : tmp0 = temp16 - temp114;
276 0 : tmp2 = temp16 + temp114;
277 0 : tmp1 = temp17 + temp115;
278 0 : tmp3 = temp17 - temp115;
279 0 : tmp4 = temp110 + temp112;
280 0 : tmp6 = temp110 - temp112;
281 0 : tmp5 = temp111 + temp113;
282 0 : tmp7 = temp111 - temp113;
283 :
284 0 : temp110 = tmp8 + tmp10;
285 0 : tmp10 = tmp8 - tmp10;
286 0 : temp111 = tmp9 + tmp11;
287 0 : tmp11 = tmp9 - tmp11;
288 :
289 0 : tmp12 = temp12 + temp14;
290 0 : tmp14 = temp12 - temp14;
291 0 : tmp13 = temp13 + temp15;
292 0 : tmp15 = temp13 - temp15;
293 :
294 0 : temp32 = tmp2 + temp110;
295 0 : temp318 = tmp2 - temp110;
296 0 : temp33 = tmp3 + temp111;
297 0 : temp319 = tmp3 - temp111;
298 0 : temp36 = tmp0 + tmp12;
299 0 : temp322 = tmp0 - tmp12;
300 0 : temp37 = tmp1 + tmp13;
301 0 : temp323 = tmp1 - tmp13;
302 0 : temp314 = tmp4 + tmp10;
303 0 : temp330 = tmp4 - tmp10;
304 0 : temp315 = tmp5 + tmp11;
305 0 : temp331 = tmp5 - tmp11;
306 0 : temp310 = tmp6 + tmp14;
307 0 : temp326 = tmp6 - tmp14;
308 0 : temp311 = tmp7 + tmp15;
309 0 : temp327 = tmp7 - tmp15;
310 : /* fft16(temp3); end */
311 :
312 : /* fft8even(temp1); */
313 0 : temp10 = vec[0] - vec[32];
314 0 : temp11 = vec[1] - vec[33];
315 0 : temp12 = vec[4] - vec[36];
316 0 : temp13 = vec[5] - vec[37];
317 0 : temp14 = vec[8] - vec[40];
318 0 : temp15 = vec[9] - vec[41];
319 0 : temp16 = vec[12] - vec[44];
320 0 : temp17 = vec[13] - vec[45];
321 0 : temp18 = vec[16] - vec[48];
322 0 : temp19 = vec[17] - vec[49];
323 0 : temp110 = vec[20] - vec[52];
324 0 : temp111 = vec[21] - vec[53];
325 0 : temp112 = vec[24] - vec[56];
326 0 : temp113 = vec[25] - vec[57];
327 0 : temp114 = vec[28] - vec[60];
328 0 : temp115 = vec[29] - vec[61];
329 :
330 : /* Pre-additions and core multiplications */
331 0 : tmp9 = (temp12 + temp114) * -COS_3PI_DIV8;
332 0 : tmp10 = (temp12 - temp114) * COS_PI_DIV8;
333 0 : tmp8 = (temp13 + temp115) * COS_3PI_DIV8;
334 0 : tmp11 = (temp13 - temp115) * COS_PI_DIV8;
335 0 : tmp5 = (temp14 + temp112) * -INV_SQRT2;
336 0 : tmp6 = (temp14 - temp112) * INV_SQRT2;
337 0 : tmp4 = (temp15 + temp113) * INV_SQRT2;
338 0 : tmp7 = (temp15 - temp113) * INV_SQRT2;
339 0 : tmp13 = (temp16 + temp110) * -COS_PI_DIV8;
340 0 : tmp14 = (temp16 - temp110) * COS_3PI_DIV8;
341 0 : tmp12 = (temp17 + temp111) * COS_PI_DIV8;
342 0 : tmp15 = (temp17 - temp111) * COS_3PI_DIV8;
343 :
344 : /* Core multiplications */
345 0 : temp12 = tmp8 * SQRT2PLUS1 - tmp12 * SQRT2MINUS1;
346 0 : temp13 = tmp9 * SQRT2PLUS1 - tmp13 * SQRT2MINUS1;
347 0 : temp14 = tmp10 * SQRT2MINUS1 - tmp14 * SQRT2PLUS1;
348 0 : temp15 = tmp11 * SQRT2MINUS1 - tmp15 * SQRT2PLUS1;
349 :
350 : /* Post-additions */
351 0 : tmp8 += tmp12;
352 0 : tmp9 += tmp13;
353 0 : tmp10 += tmp14;
354 0 : tmp11 += tmp15;
355 0 : temp16 = temp10 + tmp4;
356 0 : temp110 = temp10 - tmp4;
357 0 : temp17 = temp11 + tmp5;
358 0 : temp111 = temp11 - tmp5;
359 :
360 0 : temp112 = tmp6 - temp19;
361 0 : temp114 = tmp6 + temp19;
362 0 : temp113 = temp18 + tmp7;
363 0 : temp115 = temp18 - tmp7;
364 :
365 0 : tmp0 = temp16 - temp114;
366 0 : tmp2 = temp16 + temp114;
367 0 : tmp1 = temp17 + temp115;
368 0 : tmp3 = temp17 - temp115;
369 0 : tmp4 = temp110 + temp112;
370 0 : tmp6 = temp110 - temp112;
371 0 : tmp5 = temp111 + temp113;
372 0 : tmp7 = temp111 - temp113;
373 :
374 0 : temp110 = tmp8 + tmp10;
375 0 : tmp10 = tmp8 - tmp10;
376 0 : temp111 = tmp9 + tmp11;
377 0 : tmp11 = tmp9 - tmp11;
378 :
379 0 : tmp12 = temp12 + temp14;
380 0 : tmp14 = temp12 - temp14;
381 0 : tmp13 = temp13 + temp15;
382 0 : tmp15 = temp13 - temp15;
383 :
384 0 : temp10 = tmp2 + temp110;
385 0 : temp18 = tmp2 - temp110;
386 0 : temp11 = tmp3 + temp111;
387 0 : temp19 = tmp3 - temp111;
388 0 : temp12 = tmp0 + tmp12;
389 0 : temp110 = tmp0 - tmp12;
390 0 : temp13 = tmp1 + tmp13;
391 0 : temp111 = tmp1 - tmp13;
392 0 : temp16 = tmp4 + tmp10;
393 0 : temp114 = tmp4 - tmp10;
394 0 : temp17 = tmp5 + tmp11;
395 0 : temp115 = tmp5 - tmp11;
396 0 : temp14 = tmp6 + tmp14;
397 0 : temp112 = tmp6 - tmp14;
398 0 : temp15 = tmp7 + tmp15;
399 0 : temp113 = tmp7 - tmp15;
400 : /* fft8even(temp1); end */
401 :
402 0 : *vec++ = temp30;
403 0 : *vec++ = temp31;
404 0 : *vec++ = temp10 + temp40;
405 0 : *vec++ = temp11 + temp41;
406 0 : *vec++ = temp32;
407 0 : *vec++ = temp33;
408 0 : *vec++ = temp12 + temp42;
409 0 : *vec++ = temp13 + temp43;
410 0 : *vec++ = temp34;
411 0 : *vec++ = temp35;
412 0 : *vec++ = temp14 + temp44;
413 0 : *vec++ = temp15 + temp45;
414 0 : *vec++ = temp36;
415 0 : *vec++ = temp37;
416 0 : *vec++ = temp16 + temp46;
417 0 : *vec++ = temp17 + temp47;
418 0 : *vec++ = temp38;
419 0 : *vec++ = temp39;
420 0 : *vec++ = temp18 + temp48;
421 0 : *vec++ = temp19 + temp49;
422 0 : *vec++ = temp310;
423 0 : *vec++ = temp311;
424 0 : *vec++ = temp110 + temp410;
425 0 : *vec++ = temp111 + temp411;
426 0 : *vec++ = temp312;
427 0 : *vec++ = temp313;
428 0 : *vec++ = temp112 + temp412;
429 0 : *vec++ = temp113 + temp413;
430 0 : *vec++ = temp314;
431 0 : *vec++ = temp315;
432 0 : *vec++ = temp114 + temp414;
433 0 : *vec++ = temp115 + temp415;
434 0 : *vec++ = temp316;
435 0 : *vec++ = temp317;
436 0 : *vec++ = temp10 - temp40;
437 0 : *vec++ = temp11 - temp41;
438 0 : *vec++ = temp318;
439 0 : *vec++ = temp319;
440 0 : *vec++ = temp12 - temp42;
441 0 : *vec++ = temp13 - temp43;
442 0 : *vec++ = temp320;
443 0 : *vec++ = temp321;
444 0 : *vec++ = temp14 - temp44;
445 0 : *vec++ = temp15 - temp45;
446 0 : *vec++ = temp322;
447 0 : *vec++ = temp323;
448 0 : *vec++ = temp16 - temp46;
449 0 : *vec++ = temp17 - temp47;
450 0 : *vec++ = temp324;
451 0 : *vec++ = temp325;
452 0 : *vec++ = temp18 - temp48;
453 0 : *vec++ = temp19 - temp49;
454 0 : *vec++ = temp326;
455 0 : *vec++ = temp327;
456 0 : *vec++ = temp110 - temp410;
457 0 : *vec++ = temp111 - temp411;
458 0 : *vec++ = temp328;
459 0 : *vec++ = temp329;
460 0 : *vec++ = temp112 - temp412;
461 0 : *vec++ = temp113 - temp413;
462 0 : *vec++ = temp330;
463 0 : *vec++ = temp331;
464 0 : *vec++ = temp114 - temp414;
465 0 : *vec++ = temp115 - temp415;
466 0 : }
|