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