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 1598848 : static void fft15(LC3_FLOAT* vec)
16 : {
17 : LC3_FLOAT r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, i0, i1, i2, i3, i4, i5,
18 : i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8,
19 : tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17, tmp18, tmp19, tmp20, tmp21, tmp22, tmp23, tmp24,
20 : tmp25, tmp26, tmp27, tmp28, tmp29;
21 :
22 : /* Pre-additions real part */
23 1598848 : r1 = vec[2] + vec[8];
24 1598848 : r2 = vec[2] - vec[8];
25 1598848 : r3 = vec[4] + vec[16];
26 1598848 : r4 = vec[4] - vec[16];
27 1598848 : r5 = vec[6] + vec[24];
28 1598848 : r6 = vec[6] - vec[24];
29 1598848 : r7 = vec[10] + vec[20];
30 1598848 : r8 = vec[10] - vec[20];
31 1598848 : r9 = vec[12] + vec[18];
32 1598848 : r10 = vec[12] - vec[18];
33 1598848 : r11 = vec[14] + vec[26];
34 1598848 : r12 = vec[14] - vec[26];
35 1598848 : r13 = vec[22] + vec[28];
36 1598848 : r14 = vec[22] - vec[28];
37 :
38 1598848 : tmp2 = r1 + r3;
39 1598848 : tmp4 = r1 - r3;
40 1598848 : tmp6 = r2 + r14;
41 1598848 : tmp8 = r2 - r14;
42 1598848 : tmp10 = r4 + r12;
43 1598848 : tmp12 = r4 - r12;
44 1598848 : tmp14 = r5 + r9;
45 1598848 : tmp16 = r5 - r9;
46 1598848 : tmp18 = r11 + r13;
47 1598848 : tmp20 = r11 - r13;
48 :
49 : /* Pre-additions imaginary part */
50 1598848 : i1 = vec[3] + vec[9];
51 1598848 : i2 = vec[3] - vec[9];
52 1598848 : i3 = vec[5] + vec[17];
53 1598848 : i4 = vec[5] - vec[17];
54 1598848 : i5 = vec[7] + vec[25];
55 1598848 : i6 = vec[7] - vec[25];
56 1598848 : i7 = vec[11] + vec[21];
57 1598848 : i8 = vec[11] - vec[21];
58 1598848 : i9 = vec[13] + vec[19];
59 1598848 : i10 = vec[13] - vec[19];
60 1598848 : i11 = vec[15] + vec[27];
61 1598848 : i12 = vec[15] - vec[27];
62 1598848 : i13 = vec[23] + vec[29];
63 1598848 : i14 = vec[23] - vec[29];
64 :
65 1598848 : tmp3 = i1 + i3;
66 1598848 : tmp5 = i1 - i3;
67 1598848 : tmp7 = i2 + i14;
68 1598848 : tmp9 = i2 - i14;
69 1598848 : tmp11 = i4 + i12;
70 1598848 : tmp13 = i4 - i12;
71 1598848 : tmp15 = i5 + i9;
72 1598848 : tmp17 = i5 - i9;
73 1598848 : tmp19 = i11 + i13;
74 1598848 : tmp21 = i11 - i13;
75 :
76 : /* Pre-additions and core multiplications */
77 1598848 : tmp28 = tmp4 + tmp20;
78 1598848 : tmp29 = tmp5 + tmp21;
79 1598848 : r4 = tmp2 + tmp18;
80 1598848 : i4 = tmp3 + tmp19;
81 1598848 : r3 = (r4 + tmp14) * (LC3_FLOAT)-1.25;
82 1598848 : i3 = (i4 + tmp15) * (LC3_FLOAT)-1.25;
83 1598848 : r2 = (tmp29 - i8) * (LC3_FLOAT)-8.660254037844387e-1;
84 1598848 : i2 = (tmp28 - r8) * (LC3_FLOAT)8.660254037844387e-1;
85 1598848 : r1 = r4 + r7;
86 1598848 : i1 = i4 + i7;
87 1598848 : r0 = r1 + vec[0] + tmp14;
88 1598848 : i0 = i1 + vec[1] + tmp15;
89 1598848 : r7 = tmp4 - tmp20;
90 1598848 : i7 = tmp5 - tmp21;
91 1598848 : r8 = (tmp3 - tmp19) * (LC3_FLOAT)-4.841229182759272e-1;
92 1598848 : i8 = (tmp2 - tmp18) * (LC3_FLOAT)4.841229182759272e-1;
93 1598848 : tmp0 = tmp6 + r10;
94 1598848 : tmp1 = tmp7 + i10;
95 1598848 : tmp2 = r6 - tmp10;
96 1598848 : tmp3 = i6 - tmp11;
97 1598848 : r10 = tmp7 * (LC3_FLOAT)-2.308262652881440;
98 1598848 : i10 = tmp6 * (LC3_FLOAT)2.308262652881440;
99 1598848 : r11 = tmp8 * (LC3_FLOAT)1.332676064001459;
100 1598848 : i11 = tmp9 * (LC3_FLOAT)1.332676064001459;
101 1598848 : r6 = (r7 - tmp16) * (LC3_FLOAT)5.590169943749475e-1;
102 1598848 : i6 = (i7 - tmp17) * (LC3_FLOAT)5.590169943749475e-1;
103 1598848 : r12 = (tmp1 + tmp3) * (LC3_FLOAT)5.877852522924733e-1;
104 1598848 : i12 = (tmp0 + tmp2) * (LC3_FLOAT)-5.877852522924733e-1;
105 1598848 : r13 = (tmp7 - tmp11) * (LC3_FLOAT)-8.816778784387098e-1;
106 1598848 : i13 = (tmp6 - tmp10) * (LC3_FLOAT)8.816778784387098e-1;
107 1598848 : r14 = (tmp8 + tmp12) * (LC3_FLOAT)5.090369604551274e-1;
108 1598848 : i14 = (tmp9 + tmp13) * (LC3_FLOAT)5.090369604551274e-1;
109 1598848 : r16 = tmp11 * (LC3_FLOAT)5.449068960040204e-1;
110 1598848 : i16 = tmp10 * (LC3_FLOAT)-5.449068960040204e-1;
111 1598848 : r17 = tmp12 * (LC3_FLOAT)3.146021430912046e-1;
112 1598848 : i17 = tmp13 * (LC3_FLOAT)3.146021430912046e-1;
113 :
114 1598848 : r4 *= (LC3_FLOAT)1.875;
115 1598848 : i4 *= (LC3_FLOAT)1.875;
116 1598848 : r1 *= (LC3_FLOAT)-1.5;
117 1598848 : i1 *= (LC3_FLOAT)-1.5;
118 1598848 : r7 *= (LC3_FLOAT)-8.385254915624212e-1;
119 1598848 : i7 *= (LC3_FLOAT)-8.385254915624212e-1;
120 1598848 : r5 = tmp29 * (LC3_FLOAT)1.082531754730548;
121 1598848 : i5 = tmp28 * (LC3_FLOAT)-1.082531754730548;
122 1598848 : r9 = tmp1 * (LC3_FLOAT)1.538841768587627;
123 1598848 : i9 = tmp0 * (LC3_FLOAT)-1.538841768587627;
124 1598848 : r15 = tmp3 * (LC3_FLOAT)3.632712640026803e-1;
125 1598848 : i15 = tmp2 * (LC3_FLOAT)-3.632712640026803e-1;
126 :
127 : /* Post-additions real part */
128 1598848 : tmp2 = r0 + r1;
129 1598848 : tmp4 = r3 + r6;
130 1598848 : tmp6 = r3 - r6;
131 1598848 : tmp8 = r4 + r5;
132 1598848 : tmp10 = r4 - r5;
133 1598848 : tmp12 = r7 + r8;
134 1598848 : tmp14 = r7 - r8;
135 1598848 : tmp16 = r13 + r16;
136 1598848 : tmp18 = r14 + r17;
137 1598848 : tmp20 = r10 - r13;
138 1598848 : tmp22 = r11 - r14;
139 1598848 : tmp24 = r12 + r15;
140 1598848 : tmp26 = r12 - r9;
141 :
142 1598848 : r1 = tmp2 + r2;
143 1598848 : r2 = tmp2 - r2;
144 1598848 : r3 = tmp4 + tmp26;
145 1598848 : r4 = tmp4 - tmp26;
146 1598848 : r5 = tmp6 + tmp24;
147 1598848 : r6 = tmp6 - tmp24;
148 1598848 : r7 = tmp16 + tmp18;
149 1598848 : r8 = tmp16 - tmp18;
150 1598848 : r9 = tmp20 - tmp22;
151 1598848 : r10 = tmp20 + tmp22;
152 1598848 : r11 = r1 + tmp8;
153 1598848 : r12 = r2 + tmp10;
154 1598848 : r13 = r11 - tmp12;
155 1598848 : r14 = r12 - tmp14;
156 1598848 : r15 = r12 + tmp14;
157 1598848 : r16 = r11 + tmp12;
158 :
159 : /* Post-additions imaginary part */
160 1598848 : tmp3 = i0 + i1;
161 1598848 : tmp5 = i3 + i6;
162 1598848 : tmp7 = i3 - i6;
163 1598848 : tmp9 = i4 + i5;
164 1598848 : tmp11 = i4 - i5;
165 1598848 : tmp13 = i7 + i8;
166 1598848 : tmp15 = i7 - i8;
167 1598848 : tmp17 = i13 + i16;
168 1598848 : tmp19 = i14 + i17;
169 1598848 : tmp21 = i10 - i13;
170 1598848 : tmp23 = i11 - i14;
171 1598848 : tmp25 = i12 + i15;
172 1598848 : tmp27 = i12 - i9;
173 :
174 1598848 : i1 = tmp3 + i2;
175 1598848 : i2 = tmp3 - i2;
176 1598848 : i3 = tmp5 + tmp27;
177 1598848 : i4 = tmp5 - tmp27;
178 1598848 : i5 = tmp7 + tmp25;
179 1598848 : i6 = tmp7 - tmp25;
180 1598848 : i7 = tmp17 + tmp19;
181 1598848 : i8 = tmp17 - tmp19;
182 1598848 : i9 = tmp21 - tmp23;
183 1598848 : i10 = tmp21 + tmp23;
184 1598848 : i11 = i1 + tmp9;
185 1598848 : i12 = i2 + tmp11;
186 1598848 : i13 = i11 - tmp13;
187 1598848 : i14 = i12 - tmp15;
188 1598848 : i15 = i12 + tmp15;
189 1598848 : i16 = i11 + tmp13;
190 :
191 1598848 : *vec++ = r0;
192 1598848 : *vec++ = i0;
193 1598848 : *vec++ = r13 + r5 + r7;
194 1598848 : *vec++ = i13 + i5 + i7;
195 1598848 : *vec++ = r15 + r3 - r9;
196 1598848 : *vec++ = i15 + i3 - i9;
197 1598848 : *vec++ = r0 + r4;
198 1598848 : *vec++ = i0 + i4;
199 1598848 : *vec++ = r13 + r6 - r7;
200 1598848 : *vec++ = i13 + i6 - i7;
201 1598848 : *vec++ = r2;
202 1598848 : *vec++ = i2;
203 1598848 : *vec++ = r0 + r5;
204 1598848 : *vec++ = i0 + i5;
205 1598848 : *vec++ = r16 + r3 - r10;
206 1598848 : *vec++ = i16 + i3 - i10;
207 1598848 : *vec++ = r15 + r4 + r9;
208 1598848 : *vec++ = i15 + i4 + i9;
209 1598848 : *vec++ = r0 + r6;
210 1598848 : *vec++ = i0 + i6;
211 1598848 : *vec++ = r1;
212 1598848 : *vec++ = i1;
213 1598848 : *vec++ = r14 + r5 + r8;
214 1598848 : *vec++ = i14 + i5 + i8;
215 1598848 : *vec++ = r0 + r3;
216 1598848 : *vec++ = i0 + i3;
217 1598848 : *vec++ = r16 + r4 + r10;
218 1598848 : *vec++ = i16 + i4 + i10;
219 1598848 : *vec++ = r14 + r6 - r8;
220 1598848 : *vec++ = i14 + i6 - i8;
221 1598848 : }
222 :
223 2688071 : static void fft16(LC3_FLOAT* vec)
224 : {
225 2688071 : const LC3_FLOAT INV_SQRT2 = 7.071067811865475e-1;
226 2688071 : const LC3_FLOAT COS_PI_DIV8 = 9.238795325112867e-1;
227 2688071 : const LC3_FLOAT COS_3PI_DIV8 = 3.826834323650898e-1;
228 2688071 : const LC3_FLOAT SQRT2PLUS1 = 2.414213562373095;
229 2688071 : const LC3_FLOAT SQRT2MINUS1 = 4.142135623730952e-1;
230 :
231 : LC3_FLOAT temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17, temp18, temp19, temp110, temp111, temp112,
232 : temp113, temp114, temp115, temp20, temp21, temp22, temp23, temp24, temp25, temp26, temp27, temp28, temp29,
233 : temp210, temp211, temp212, temp213, temp214, temp215, vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8,
234 : vec9, vec10, vec11, vec12, vec13, vec14, vec15;
235 :
236 : /* even */
237 2688071 : vec0 = vec[0] + vec[16];
238 2688071 : vec1 = vec[1] + vec[17];
239 2688071 : vec2 = vec[2] + vec[18];
240 2688071 : vec3 = vec[3] + vec[19];
241 2688071 : vec4 = vec[4] + vec[20];
242 2688071 : vec5 = vec[5] + vec[21];
243 2688071 : vec6 = vec[6] + vec[22];
244 2688071 : vec7 = vec[7] + vec[23];
245 2688071 : vec8 = vec[8] + vec[24];
246 2688071 : vec9 = vec[9] + vec[25];
247 2688071 : vec10 = vec[10] + vec[26];
248 2688071 : vec11 = vec[11] + vec[27];
249 2688071 : vec12 = vec[12] + vec[28];
250 2688071 : vec13 = vec[13] + vec[29];
251 2688071 : vec14 = vec[14] + vec[30];
252 2688071 : vec15 = vec[15] + vec[31];
253 :
254 : /* Pre-additions */
255 2688071 : temp10 = vec0 + vec8;
256 2688071 : temp12 = vec0 - vec8;
257 2688071 : temp11 = vec1 + vec9;
258 2688071 : temp13 = vec1 - vec9;
259 2688071 : temp14 = vec2 + vec10;
260 2688071 : temp16 = vec2 - vec10;
261 2688071 : temp15 = vec3 + vec11;
262 2688071 : temp17 = vec3 - vec11;
263 2688071 : temp18 = vec4 + vec12;
264 2688071 : temp110 = vec4 - vec12;
265 2688071 : temp19 = vec5 + vec13;
266 2688071 : temp111 = vec5 - vec13;
267 2688071 : temp112 = vec6 + vec14;
268 2688071 : temp114 = vec6 - vec14;
269 2688071 : temp113 = vec7 + vec15;
270 2688071 : temp115 = vec7 - vec15;
271 :
272 : /* Pre-additions and core multiplications */
273 2688071 : temp20 = temp10 + temp18;
274 2688071 : temp24 = temp10 - temp18;
275 2688071 : temp21 = temp11 + temp19;
276 2688071 : temp25 = temp11 - temp19;
277 2688071 : temp28 = temp12 - temp111;
278 2688071 : temp210 = temp12 + temp111;
279 2688071 : temp29 = temp13 + temp110;
280 2688071 : temp211 = temp13 - temp110;
281 2688071 : temp22 = temp14 + temp112;
282 2688071 : temp27 = temp14 - temp112;
283 2688071 : temp23 = temp15 + temp113;
284 2688071 : temp26 = temp113 - temp15;
285 :
286 2688071 : temp11 = temp16 + temp114;
287 2688071 : temp12 = temp16 - temp114;
288 2688071 : temp10 = temp17 + temp115;
289 2688071 : temp13 = temp17 - temp115;
290 2688071 : temp212 = (temp10 + temp12) * INV_SQRT2;
291 2688071 : temp214 = (temp10 - temp12) * INV_SQRT2;
292 2688071 : temp213 = (temp13 - temp11) * INV_SQRT2;
293 2688071 : temp215 = (temp11 + temp13) * -INV_SQRT2;
294 :
295 : /* odd */
296 2688071 : vec0 = vec[0] - vec[16];
297 2688071 : vec1 = vec[1] - vec[17];
298 2688071 : vec2 = vec[2] - vec[18];
299 2688071 : vec3 = vec[3] - vec[19];
300 2688071 : vec4 = vec[4] - vec[20];
301 2688071 : vec5 = vec[5] - vec[21];
302 2688071 : vec6 = vec[6] - vec[22];
303 2688071 : vec7 = vec[7] - vec[23];
304 2688071 : vec8 = vec[8] - vec[24];
305 2688071 : vec9 = vec[9] - vec[25];
306 2688071 : vec10 = vec[10] - vec[26];
307 2688071 : vec11 = vec[11] - vec[27];
308 2688071 : vec12 = vec[12] - vec[28];
309 2688071 : vec13 = vec[13] - vec[29];
310 2688071 : vec14 = vec[14] - vec[30];
311 2688071 : vec15 = vec[15] - vec[31];
312 :
313 : /* Pre-additions and core multiplications */
314 2688071 : temp19 = (vec2 + vec14) * -COS_3PI_DIV8;
315 2688071 : temp110 = (vec2 - vec14) * COS_PI_DIV8;
316 2688071 : temp18 = (vec3 + vec15) * COS_3PI_DIV8;
317 2688071 : temp111 = (vec3 - vec15) * COS_PI_DIV8;
318 2688071 : temp15 = (vec4 + vec12) * -INV_SQRT2;
319 2688071 : temp16 = (vec4 - vec12) * INV_SQRT2;
320 2688071 : temp14 = (vec5 + vec13) * INV_SQRT2;
321 2688071 : temp17 = (vec5 - vec13) * INV_SQRT2;
322 2688071 : temp113 = (vec6 + vec10) * -COS_PI_DIV8;
323 2688071 : temp114 = (vec6 - vec10) * COS_3PI_DIV8;
324 2688071 : temp112 = (vec7 + vec11) * COS_PI_DIV8;
325 2688071 : temp115 = (vec7 - vec11) * COS_3PI_DIV8;
326 :
327 : /* Core multiplications */
328 2688071 : vec2 = temp18 * SQRT2PLUS1 - temp112 * SQRT2MINUS1;
329 2688071 : vec3 = temp19 * SQRT2PLUS1 - temp113 * SQRT2MINUS1;
330 2688071 : vec4 = temp110 * SQRT2MINUS1 - temp114 * SQRT2PLUS1;
331 2688071 : vec5 = temp111 * SQRT2MINUS1 - temp115 * SQRT2PLUS1;
332 :
333 : /* Post-additions */
334 2688071 : temp18 += temp112;
335 2688071 : temp19 += temp113;
336 2688071 : temp110 += temp114;
337 2688071 : temp111 += temp115;
338 2688071 : vec6 = vec0 + temp14;
339 2688071 : vec10 = vec0 - temp14;
340 2688071 : vec7 = vec1 + temp15;
341 2688071 : vec11 = vec1 - temp15;
342 :
343 2688071 : vec12 = temp16 - vec9;
344 2688071 : vec14 = temp16 + vec9;
345 2688071 : vec13 = vec8 + temp17;
346 2688071 : vec15 = vec8 - temp17;
347 :
348 2688071 : temp10 = vec6 - vec14;
349 2688071 : temp12 = vec6 + vec14;
350 2688071 : temp11 = vec7 + vec15;
351 2688071 : temp13 = vec7 - vec15;
352 2688071 : temp14 = vec10 + vec12;
353 2688071 : temp16 = vec10 - vec12;
354 2688071 : temp15 = vec11 + vec13;
355 2688071 : temp17 = vec11 - vec13;
356 :
357 2688071 : vec10 = temp18 + temp110;
358 2688071 : temp110 = temp18 - temp110;
359 2688071 : vec11 = temp19 + temp111;
360 2688071 : temp111 = temp19 - temp111;
361 :
362 2688071 : temp112 = vec2 + vec4;
363 2688071 : temp114 = vec2 - vec4;
364 2688071 : temp113 = vec3 + vec5;
365 2688071 : temp115 = vec3 - vec5;
366 :
367 : /* Post-additions */
368 2688071 : *vec++ = temp20 + temp22;
369 2688071 : *vec++ = temp21 + temp23;
370 2688071 : *vec++ = temp12 + vec10;
371 2688071 : *vec++ = temp13 + vec11;
372 2688071 : *vec++ = temp210 + temp212;
373 2688071 : *vec++ = temp211 + temp213;
374 2688071 : *vec++ = temp10 + temp112;
375 2688071 : *vec++ = temp11 + temp113;
376 2688071 : *vec++ = temp24 - temp26;
377 2688071 : *vec++ = temp25 - temp27;
378 2688071 : *vec++ = temp16 + temp114;
379 2688071 : *vec++ = temp17 + temp115;
380 2688071 : *vec++ = temp28 + temp214;
381 2688071 : *vec++ = temp29 + temp215;
382 2688071 : *vec++ = temp14 + temp110;
383 2688071 : *vec++ = temp15 + temp111;
384 2688071 : *vec++ = temp20 - temp22;
385 2688071 : *vec++ = temp21 - temp23;
386 2688071 : *vec++ = temp12 - vec10;
387 2688071 : *vec++ = temp13 - vec11;
388 2688071 : *vec++ = temp210 - temp212;
389 2688071 : *vec++ = temp211 - temp213;
390 2688071 : *vec++ = temp10 - temp112;
391 2688071 : *vec++ = temp11 - temp113;
392 2688071 : *vec++ = temp24 + temp26;
393 2688071 : *vec++ = temp25 + temp27;
394 2688071 : *vec++ = temp16 - temp114;
395 2688071 : *vec++ = temp17 - temp115;
396 2688071 : *vec++ = temp28 - temp214;
397 2688071 : *vec++ = temp29 - temp215;
398 2688071 : *vec++ = temp14 - temp110;
399 2688071 : *vec++ = temp15 - temp111;
400 2688071 : }
|