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