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 : /*====================================================================================
35 : 3GPP TS26.258 Aug 24, 2023. IVAS Codec Version IVAS-FL-1.0
36 : ====================================================================================*/
37 :
38 : /*====================================================================================
39 : EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
40 : ====================================================================================*/
41 :
42 : #include <assert.h>
43 : #include <stdint.h>
44 : #include "options.h"
45 : #include <math.h>
46 : #include "cnst.h"
47 : #include "prot_fx.h"
48 : #include "rom_com.h"
49 : #include "rom_com_fx.h"
50 : #include "wmc_auto.h"
51 : #include "complex_basop.h"
52 :
53 : #ifdef _MSC_VER
54 : #pragma warning( disable : 4310 )
55 : #endif
56 :
57 : /*-----------------------------------------------------------------*
58 : * Local constants
59 : *-----------------------------------------------------------------*/
60 :
61 : #define Mpy_32_xx Mpy_32_16_1
62 :
63 : #define FFTC( x ) WORD322WORD16( (Word32) x )
64 :
65 : /* DCT related */
66 : #define KP559016994_16FX ( FFTC( 1200479845 ) ) /* EDCT & EMDCT constants Q15*/
67 : #define KP951056516_16FX ( FFTC( 2042378325 ) ) /* EDCT & EMDCT constants Q15*/
68 : #define KP587785252_16FX ( FFTC( 1262259213 ) ) /* EDCT & EMDCT constants Q15*/
69 :
70 : #define FFT_15PONIT_WNK1 ( FFTC( 0x478dde64 ) ) /* EDCT & EMDCT constants Q15*/
71 : #define FFT_15PONIT_WNK2 ( FFTC( 0x79bc3854 ) ) /* EDCT & EMDCT constants Q15*/
72 : #define FFT_15PONIT_WNK3 ( FFTC( 0x4B3C8C0D ) ) /* EDCT & EMDCT constants Q15*/
73 : #define FFT_15PONIT_WNK4 ( FFTC( 0x6ED9EBA0 ) ) /* EDCT & EMDCT constants Q15*/
74 : #define FFT_15PONIT_WNK5 ( FFTC( 0x20000000 ) ) /* EDCT & EMDCT constants Q15*/
75 :
76 : /* FFT constants */
77 : #define FFT_C31 ( FFTC( 0x91261468 ) ) /* FL2WORD32( -0.86602540) -sqrt(3)/2 Q15*/
78 : #define FFT_C51 ( FFTC( 0x79bc3854 ) ) /* FL2WORD32( 0.95105652) Q15*/
79 : #define FFT_C52 ( FFTC( 0x9d839db0 ) ) /* FL2WORD32(-1.53884180/2) Q15*/
80 : #define FFT_C53 ( FFTC( 0xd18053ce ) ) /* FL2WORD32(-0.36327126) Q15*/
81 : #define FFT_C54 ( FFTC( 0x478dde64 ) ) /* FL2WORD32( 0.55901699) Q15*/
82 : #define FFT_C55 ( FFTC( 0xb0000001 ) ) /* FL2WORD32(-1.25/2) Q15*/
83 : #define FFT_C61 ( FFTC( 0x6ED9EBA0 ) ) // Q15
84 : #define FFT_C81 ( FFTC( 0x5a82799a ) ) // Q15
85 : #define FFT_C82 ( FFTC( 0xa57d8666 ) ) // Q15
86 : #define FFT_C161 ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1) INV_SQRT2 Q15*/
87 : #define FFT_C162 ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) -INV_SQRT2 Q15*/
88 : #define FFT_C163 ( FFTC( 0x7641af3d ) ) /* FL2WORD32( 9.238795325112867e-1) COS_PI_DIV8 Q15*/
89 : #define FFT_C164 ( FFTC( 0x89be50c3 ) ) /* FL2WORD32(-9.238795325112867e-1) -COS_PI_DIV8 Q15*/
90 : #define FFT_C165 ( FFTC( 0x30fbc54d ) ) /* FL2WORD32( 3.826834323650898e-1) COS_3PI_DIV8 Q15*/
91 : #define FFT_C166 ( FFTC( 0xcf043ab3 ) ) /* FL2WORD32(-3.826834323650898e-1) -COS_3PI_DIV8 Q15*/
92 :
93 : #define SCALEFACTOR16 ( 0 )
94 : #define SCALEFACTOR20 ( 0 )
95 : /*-----------------------------------------------------------------*
96 : * Local function prototypes
97 : *-----------------------------------------------------------------*/
98 :
99 : static void cdftForw( Word16 n, Word32 *a, const Word16 *ip, const Word16 *w );
100 : static void bitrv2_SR( Word16 n, const Word16 *ip, Word32 *a );
101 : static void cftfsub( Word16 n, Word32 *a, const Word16 *w );
102 : static void cft1st( Word16 n, Word32 *a, const Word16 *w );
103 : static void cftmdl( Word16 n, Word16 l, Word32 *a, const Word16 *w );
104 : static void fft16_ivas( Word32 *x, Word32 *y, const Word16 *Idx );
105 : static void fft5_shift1( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
106 : static void fft8( Word32 *x, Word32 *y, const Word16 *Idx );
107 : static void fft15_shift2( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
108 : static void fft15_shift8( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
109 : static void fft5_shift4( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
110 : static void fft5_32( Word32 *zRe, Word32 *zIm, const Word16 *Idx );
111 : static void fft64( Word32 *x, Word32 *y, const Word16 *Idx );
112 : static void fft32_15( Word32 *x, Word32 *y, const Word16 *Idx );
113 : static void fft32_5( Word32 *x, Word32 *y, const Word16 *Idx );
114 : static void fft8_5( Word32 *x, Word32 *y, const Word16 *Idx );
115 : static void fft5_8( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
116 : static void fft4_5( Word32 *x, Word32 *y, const Word16 *Idx );
117 : static void fft5_4( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
118 :
119 : void DoRTFTn_fx_ivas(
120 : Word32 *x, /* i/o: real part of input and output data */
121 : Word32 *y, /* i/o: imaginary part of input and output data */
122 : const Word16 n /* i : size of the FFT n=(2^k) up to 1024 */
123 : );
124 : /*-----------------------------------------------------------------*
125 : * fft15_shift2()
126 : * 15-point FFT with 2-point circular shift
127 : *-----------------------------------------------------------------*/
128 :
129 0 : static void fft15_shift2(
130 : Word16 n1, /* i : length of data */
131 : Word32 *zRe, /* i/o: real part of input and output data Qx */
132 : Word32 *zIm, /* i/o: imaginary part of input and output data Qx */
133 : const Word16 *Idx /* i : pointer of the address table Q0 */
134 : )
135 : {
136 : Word16 in0, in8, in16, in24, in32, in1, in9, in17, in25, in33, in2, in10, in18, in26, in34;
137 : Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15;
138 : Word32 fi16, fi17, fi18, fi19, fi20, fi21, fi22, fi23, fi24, fi25, fi26, fi27, fi28, fi29, fi30;
139 : Word32 f2i1, f2i2, f2i3, f2i4, f2i5, f2i6, f2i7, f2i8, f2i9, f2i10, f2i11, f2i12;
140 : Word32 f2i13, f2i14, f2i15, f2i16, f2i17, f2i18, f2i19, f2i20, f2i21, f2i22, f2i23, f2i24;
141 : Word32 f3i1, f3i2, f3i3, f3i4, f3i5, f3i6, f3i7, f3i8, f3i9, f3i10, f3i11, f3i12, f3i13, f3i14, f3i15;
142 : Word32 f4i1, f4i2, f4i3, f4i4, f4i5, f4i6, f4i7, f4i8, f4i9;
143 : Word32 f4i10, f4i11, f4i12, f4i13, f4i14, f4i15, f4i16, f4i17, f4i18, f4i19, f4i20, fo1, fo2, fo3, fo4;
144 : Word32 fo5, fo6, fo7, fo8, fo9, fo10, fo11, fo12, fo13, fo14, fo15, fo16, fo17, fo18;
145 : Word32 f2o1, f2o2, f2o3, f2o4, f2o5, f2o6, f2o7, f2o8, f2o9, f2o10, f2o11, f2o12, f2o13;
146 : Word32 f2o14, f2o15, f3o1, f3o2, f3o3, f3o4, f3o5, f3o6, f3o7, f3o8, f3o9, f3o10, f3o11;
147 : Word32 f3o12, f3o13, f3o14, f3o15, f4o1, f4o2, f4o3, f4o4, f4o5, f4o6;
148 : Word32 f4o7, f4o8, f4o9, f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f4o16, f4o17, f4o18, f4o19;
149 :
150 0 : in0 = Idx[0];
151 0 : move16();
152 0 : in8 = Idx[n1];
153 0 : move16();
154 0 : in16 = Idx[n1 * 2];
155 0 : move16();
156 0 : in24 = Idx[( n1 * 3 )];
157 0 : move16();
158 0 : in32 = Idx[n1 * 4];
159 0 : move16();
160 0 : in1 = Idx[( n1 * 5 )];
161 0 : move16();
162 0 : in9 = Idx[n1 * 6];
163 0 : move16();
164 0 : in17 = Idx[( n1 * 7 )];
165 0 : move16();
166 0 : in25 = Idx[n1 * 8];
167 0 : move16();
168 0 : in33 = Idx[( n1 * 9 )];
169 0 : move16();
170 0 : in2 = Idx[n1 * 10];
171 0 : move16();
172 0 : in10 = Idx[( n1 * 11 )];
173 0 : move16();
174 0 : in18 = Idx[n1 * 12];
175 0 : move16();
176 0 : in26 = Idx[( n1 * 13 )];
177 0 : move16();
178 0 : in34 = Idx[n1 * 14];
179 0 : move16();
180 :
181 0 : f2i13 = zRe[in0]; // Qx
182 0 : move32();
183 0 : f2i14 = zIm[in0]; // Qx
184 0 : move32();
185 0 : f2i21 = zRe[in1]; // Qx
186 0 : move32();
187 0 : f2i22 = zRe[in2]; // Qx
188 0 : move32();
189 0 : f2i23 = zIm[in1]; // Qx
190 0 : move32();
191 0 : f2i24 = zIm[in2]; // Qx
192 0 : move32();
193 :
194 0 : f2i15 = L_add( f2i21, f2i22 );
195 0 : f2i16 = Mpy_32_16_1( L_sub( f2i22, f2i21 ), FFT_15PONIT_WNK4 ); // Qx
196 0 : f2i17 = Mpy_32_16_1( L_sub( f2i23, f2i24 ), FFT_15PONIT_WNK4 ); // Qx
197 0 : f2i18 = L_add( f2i23, f2i24 );
198 0 : fi1 = L_add( f2i13, f2i15 );
199 0 : fi2 = L_add( f2i14, f2i18 );
200 :
201 0 : f2i19 = L_sub( f2i13, L_shr( f2i15, 1 ) );
202 0 : f2i20 = L_sub( f2i14, L_shr( f2i18, 1 ) );
203 0 : fi3 = L_sub( f2i19, f2i17 );
204 0 : fi4 = L_add( f2i19, f2i17 );
205 0 : fi5 = L_add( f2i16, f2i20 );
206 0 : fi6 = L_sub( f2i20, f2i16 );
207 :
208 0 : f3i1 = zRe[in9]; // Qx
209 0 : move32();
210 0 : f4i2 = zRe[in10]; // Qx
211 0 : move32();
212 0 : f4i3 = zRe[in8]; // Qx
213 0 : move32();
214 0 : f3i2 = L_add( f4i2, f4i3 );
215 0 : f3i3 = L_sub( f3i1, L_shr( f3i2, 1 ) );
216 0 : f3i4 = Mpy_32_16_1( L_sub( f4i3, f4i2 ), FFT_15PONIT_WNK4 ); // Qx
217 :
218 0 : f3i5 = zIm[in9]; // Qx
219 0 : move32();
220 0 : f4i4 = zIm[in10]; // Qx
221 0 : move32();
222 0 : f4i5 = zIm[in8]; // Qx
223 0 : move32();
224 0 : f3i6 = L_add( f4i4, f4i5 );
225 0 : f3i7 = Mpy_32_16_1( L_sub( f4i4, f4i5 ), FFT_15PONIT_WNK4 ); // Qx
226 0 : f3i8 = L_sub( f3i5, L_shr( f3i6, 1 ) );
227 :
228 0 : f3i9 = zRe[in33]; // Qx
229 0 : move32();
230 0 : f4i6 = zRe[in34]; // Qx
231 0 : move32();
232 0 : f4i7 = zRe[in32]; // Qx
233 0 : move32();
234 0 : f3i10 = L_add( f4i6, f4i7 );
235 0 : f3i11 = L_sub( f3i9, L_shr( f3i10, 1 ) );
236 0 : f3i12 = Mpy_32_16_1( L_sub( f4i7, f4i6 ), FFT_15PONIT_WNK4 ); // Qx
237 :
238 0 : f3i13 = zIm[in33]; // Qx
239 0 : move32();
240 0 : f4i8 = zIm[in34]; // Qx
241 0 : move32();
242 0 : f4i9 = zIm[in32]; // Qx
243 0 : move32();
244 0 : f3i14 = L_add( f4i8, f4i9 );
245 0 : f3i15 = Mpy_32_16_1( L_sub( f4i8, f4i9 ), FFT_15PONIT_WNK4 ); // Qx
246 0 : f4i1 = L_sub( f3i13, L_shr( f3i14, 1 ) );
247 :
248 0 : fi7 = L_add( f3i1, f3i2 );
249 0 : fi8 = L_add( f3i9, f3i10 );
250 0 : fi9 = L_add( fi7, fi8 );
251 0 : fi10 = L_sub( f3i3, f3i7 );
252 0 : fi11 = L_sub( f3i11, f3i15 );
253 0 : fi12 = L_add( fi10, fi11 );
254 0 : fi13 = L_add( f3i5, f3i6 );
255 0 : fi14 = L_add( f3i13, f3i14 );
256 0 : fi15 = L_add( fi13, fi14 );
257 0 : fi16 = L_sub( f3i8, f3i4 );
258 0 : fi17 = L_sub( f4i1, f3i12 );
259 0 : fi18 = L_add( fi16, fi17 );
260 0 : fi19 = L_add( f3i4, f3i8 );
261 0 : fi20 = L_add( f3i12, f4i1 );
262 0 : fi21 = L_add( fi19, fi20 );
263 0 : fi22 = L_add( f3i3, f3i7 );
264 0 : fi23 = L_add( f3i11, f3i15 );
265 0 : fi24 = L_add( fi22, fi23 );
266 :
267 0 : f4i10 = zRe[in24]; // Qx
268 0 : move32();
269 0 : fo6 = zRe[in25]; // Qx
270 0 : move32();
271 0 : fo7 = zRe[in26]; // Qx
272 0 : move32();
273 0 : f4i11 = L_add( fo6, fo7 );
274 0 : f4i12 = L_sub( f4i10, L_shr( f4i11, 1 ) );
275 0 : f4i13 = Mpy_32_16_1( L_sub( fo7, fo6 ), FFT_15PONIT_WNK4 ); // Qx
276 :
277 0 : f4i14 = zIm[in24]; // Qx
278 0 : move32();
279 0 : fo8 = zIm[in25]; // Qx
280 0 : move32();
281 0 : fo9 = zIm[in26]; // Qx
282 0 : move32();
283 0 : f4i15 = L_add( fo8, fo9 );
284 0 : f4i16 = Mpy_32_16_1( L_sub( fo8, fo9 ), FFT_15PONIT_WNK4 ); // Qx
285 0 : f4i17 = L_sub( f4i14, L_shr( f4i15, 1 ) );
286 :
287 0 : f4i18 = zRe[in18]; // Qx
288 0 : move32();
289 0 : f2o10 = zRe[in16]; // Qx
290 0 : move32();
291 0 : f2o11 = zRe[in17]; // Qx
292 0 : move32();
293 0 : f4i19 = L_add( f2o10, f2o11 );
294 0 : f4i20 = L_sub( f4i18, L_shr( f4i19, 1 ) );
295 0 : fo1 = Mpy_32_16_1( L_sub( f2o11, f2o10 ), FFT_15PONIT_WNK4 ); // Qx
296 :
297 0 : fo2 = zIm[in18]; // Qx
298 0 : move32();
299 0 : f2o12 = zIm[in16]; // Qx
300 0 : move32();
301 0 : f2o13 = zIm[in17]; // Qx
302 0 : move32();
303 0 : fo3 = L_add( f2o12, f2o13 );
304 0 : fo4 = Mpy_32_16_1( L_sub( f2o12, f2o13 ), FFT_15PONIT_WNK4 ); // Qx
305 0 : fo5 = L_sub( fo2, L_shr( fo3, 1 ) );
306 :
307 0 : fi25 = L_add( f4i10, f4i11 );
308 0 : fi26 = L_add( f4i18, f4i19 );
309 0 : fi27 = L_add( fi25, fi26 );
310 0 : fi28 = L_sub( f4i12, f4i16 );
311 0 : fi29 = L_sub( f4i20, fo4 );
312 0 : fi30 = L_add( fi28, fi29 );
313 0 : f2i1 = L_add( f4i14, f4i15 );
314 0 : f2i2 = L_add( fo2, fo3 );
315 0 : f2i3 = L_add( f2i1, f2i2 );
316 0 : f2i4 = L_sub( f4i17, f4i13 );
317 0 : f2i5 = L_sub( fo5, fo1 );
318 0 : f2i6 = L_add( f2i4, f2i5 );
319 0 : f2i7 = L_add( f4i13, f4i17 );
320 0 : f2i8 = L_add( fo1, fo5 );
321 0 : f2i9 = L_add( f2i7, f2i8 );
322 0 : f2i10 = L_add( f4i12, f4i16 );
323 0 : f2i11 = L_add( f4i20, fo4 );
324 0 : f2i12 = L_add( f2i10, f2i11 );
325 :
326 0 : fo10 = Mpy_32_16_1( L_sub( fi27, fi9 ), FFT_15PONIT_WNK1 ); // Qx
327 0 : fo11 = L_add( fi27, fi9 );
328 0 : fo12 = L_sub( fi1, Mpy_32_16_1( fo11, FFT_15PONIT_WNK5 ) ); // Qx
329 0 : fo15 = L_sub( fi13, fi14 );
330 0 : fo16 = L_sub( f2i1, f2i2 );
331 0 : fo13 = L_sub( Mpy_32_16_1( fo15, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo16, FFT_15PONIT_WNK3 ) ); // Qx
332 0 : fo14 = L_add( Mpy_32_16_1( fo15, FFT_15PONIT_WNK3 ), Mpy_32_16_1( fo16, FFT_15PONIT_WNK2 ) ); // Qx
333 :
334 0 : zRe[in0] = L_add( fi1, fo11 );
335 0 : move32();
336 0 : fo17 = L_add( fo10, fo12 );
337 0 : zRe[in18] = L_sub( fo17, fo14 );
338 0 : move32();
339 0 : zRe[in24] = L_add( fo17, fo14 );
340 0 : move32();
341 0 : fo18 = L_sub( fo12, fo10 );
342 0 : zRe[in9] = L_sub( fo18, fo13 );
343 0 : move32();
344 0 : zRe[in33] = L_add( fo18, fo13 );
345 0 : move32();
346 :
347 0 : f2o1 = Mpy_32_16_1( L_sub( f2i3, fi15 ), FFT_15PONIT_WNK1 ); // Qx
348 0 : f2o2 = L_add( f2i3, fi15 );
349 0 : f2o3 = L_sub( fi2, Mpy_32_16_1( f2o2, FFT_15PONIT_WNK5 ) ); // Qx
350 0 : f2o6 = L_sub( fi7, fi8 );
351 0 : f2o7 = L_sub( fi25, fi26 );
352 0 : f2o4 = L_sub( Mpy_32_16_1( f2o6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f2o7, FFT_15PONIT_WNK3 ) ); // Qx
353 0 : f2o5 = L_add( Mpy_32_16_1( f2o6, FFT_15PONIT_WNK3 ), Mpy_32_16_1( f2o7, FFT_15PONIT_WNK2 ) ); // Qx
354 0 : zIm[in0] = L_add( fi2, f2o2 );
355 0 : move32();
356 0 : f2o8 = L_add( f2o1, f2o3 );
357 0 : zIm[in24] = L_sub( f2o8, f2o5 );
358 0 : move32();
359 0 : zIm[in18] = L_add( f2o5, f2o8 );
360 0 : move32();
361 0 : f2o9 = L_sub( f2o3, f2o1 );
362 0 : zIm[in33] = L_sub( f2o9, f2o4 );
363 0 : move32();
364 0 : zIm[in9] = L_add( f2o4, f2o9 );
365 0 : move32();
366 :
367 0 : f2o14 = Mpy_32_16_1( L_sub( fi30, fi12 ), FFT_15PONIT_WNK1 ); // Qx
368 0 : f2o15 = L_add( fi30, fi12 );
369 0 : f3o1 = L_sub( fi3, Mpy_32_16_1( f2o15, FFT_15PONIT_WNK5 ) ); // Qx
370 0 : f3o4 = L_sub( fi16, fi17 );
371 0 : f3o5 = L_sub( f2i4, f2i5 );
372 0 : f3o2 = L_sub( Mpy_32_16_1( f3o4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o5, FFT_15PONIT_WNK3 ) ); // Qx
373 0 : f3o3 = L_add( Mpy_32_16_1( f3o5, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o4, FFT_15PONIT_WNK3 ) ); // Qx
374 0 : zRe[in2] = L_add( fi3, f2o15 );
375 0 : move32();
376 0 : f3o6 = L_add( f2o14, f3o1 );
377 0 : zRe[in17] = L_sub( f3o6, f3o3 );
378 0 : move32();
379 0 : zRe[in26] = L_add( f3o6, f3o3 );
380 0 : move32();
381 0 : f3o7 = L_sub( f3o1, f2o14 );
382 0 : zRe[in8] = L_sub( f3o7, f3o2 );
383 0 : move32();
384 0 : zRe[in32] = L_add( f3o7, f3o2 );
385 0 : move32();
386 :
387 0 : f3o8 = Mpy_32_16_1( L_sub( f2i6, fi18 ), FFT_15PONIT_WNK1 ); // Qx
388 0 : f3o9 = L_add( f2i6, fi18 );
389 0 : f3o10 = L_sub( fi6, Mpy_32_16_1( f3o9, FFT_15PONIT_WNK5 ) ); // Qx
390 0 : f3o13 = L_sub( fi10, fi11 );
391 0 : f3o14 = L_sub( fi28, fi29 );
392 0 : f3o11 = L_sub( Mpy_32_16_1( f3o13, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o14, FFT_15PONIT_WNK3 ) ); // Qx
393 0 : f3o12 = L_add( Mpy_32_16_1( f3o14, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o13, FFT_15PONIT_WNK3 ) ); // Qx
394 0 : zIm[in2] = L_add( fi6, f3o9 );
395 0 : move32();
396 0 : f3o15 = L_add( f3o8, f3o10 );
397 0 : zIm[in26] = L_sub( f3o15, f3o12 );
398 0 : move32();
399 0 : zIm[in17] = L_add( f3o12, f3o15 );
400 0 : move32();
401 0 : f4o1 = L_sub( f3o10, f3o8 );
402 0 : zIm[in8] = L_add( f3o11, f4o1 );
403 0 : move32();
404 0 : zIm[in32] = L_sub( f4o1, f3o11 );
405 0 : move32();
406 :
407 0 : f4o2 = Mpy_32_16_1( L_sub( f2i9, fi21 ), FFT_15PONIT_WNK1 ); // Qx
408 0 : f4o3 = L_add( f2i9, fi21 );
409 0 : f4o4 = L_sub( fi5, Mpy_32_16_1( f4o3, FFT_15PONIT_WNK5 ) ); // Qx
410 0 : f4o7 = L_sub( f2i10, f2i11 );
411 0 : f4o8 = L_sub( fi22, fi23 );
412 0 : f4o5 = L_add( Mpy_32_16_1( f4o8, FFT_15PONIT_WNK3 ), Mpy_32_16_1( f4o7, FFT_15PONIT_WNK2 ) ); // Qx
413 0 : f4o6 = L_sub( Mpy_32_16_1( f4o8, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o7, FFT_15PONIT_WNK3 ) ); // Qx
414 0 : zIm[in1] = L_add( fi5, f4o3 );
415 0 : move32();
416 0 : f4o9 = L_sub( f4o4, f4o2 );
417 0 : f4o10 = L_add( f4o2, f4o4 );
418 :
419 0 : zIm[in10] = L_add( f4o6, f4o9 );
420 0 : move32();
421 0 : zIm[in34] = L_sub( f4o9, f4o6 );
422 0 : move32();
423 0 : zIm[in25] = L_sub( f4o10, f4o5 );
424 0 : move32();
425 0 : zIm[in16] = L_add( f4o5, f4o10 );
426 0 : move32();
427 :
428 0 : f4o11 = Mpy_32_16_1( L_sub( f2i12, fi24 ), FFT_15PONIT_WNK1 ); // Qx
429 0 : f4o12 = L_add( f2i12, fi24 );
430 0 : f4o13 = L_sub( fi4, Mpy_32_16_1( f4o12, FFT_15PONIT_WNK5 ) ); // Qx
431 0 : f4o16 = L_sub( f2i7, f2i8 );
432 0 : f4o17 = L_sub( fi19, fi20 );
433 0 : f4o14 = L_add( Mpy_32_16_1( f4o16, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o17, FFT_15PONIT_WNK3 ) ); // Qx
434 0 : f4o15 = L_sub( Mpy_32_16_1( f4o17, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o16, FFT_15PONIT_WNK3 ) ); // Qx
435 0 : zRe[in1] = L_add( fi4, f4o12 );
436 0 : move32();
437 0 : f4o18 = L_sub( f4o13, f4o11 );
438 0 : f4o19 = L_add( f4o11, f4o13 );
439 :
440 0 : zRe[in10] = L_sub( f4o18, f4o15 );
441 0 : move32();
442 0 : zRe[in34] = L_add( f4o18, f4o15 );
443 0 : move32();
444 0 : zRe[in16] = L_sub( f4o19, f4o14 );
445 0 : move32();
446 0 : zRe[in25] = L_add( f4o19, f4o14 );
447 0 : move32();
448 :
449 0 : return;
450 : }
451 :
452 : /*-----------------------------------------------------------------*
453 : * fft15_shift8()
454 : * 15-point FFT with 8-point circular shift
455 : *-----------------------------------------------------------------*/
456 :
457 0 : static void fft15_shift8(
458 : Word16 n1, /* i : length of data */
459 : Word32 *zRe, /* i/o: real part of input and output data Qx */
460 : Word32 *zIm, /* i/o: imaginary part of input and output data Qx */
461 : const Word16 *Idx /* i : pointer of the address table Q0 */
462 : )
463 : {
464 : Word16 in0, in8, in16, in24, in32, in1, in9, in17, in25, in33, in2, in10, in18, in26, in34;
465 : Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15;
466 : Word32 fi16, fi17, fi18, fi19, fi20, fi21, fi22, fi23, fi24, fi25, fi26, fi27, fi28, fi29, fi30;
467 : Word32 f2i1, f2i2, f2i3, f2i4, f2i5, f2i6, f2i7, f2i8, f2i9, f2i10, f2i11, f2i12;
468 : Word32 f2i13, f2i14, f2i15, f3i1, f3i2, f3i3, f3i4, f3i5, f3i6, f3i7, f3i8, f3i9;
469 : Word32 f3i10, f3i11, f3i12, f3i13, f3i14, f3i15, f4i1, f4i2, f4i3, f4i4, f4i5, f4i6, f4i7, f4i8, f4i9;
470 : Word32 f4i10, f4i11, f4i12, f4i13, f4i14, f4i15, fo1, fo2, fo3, fo4, fo5, fo6;
471 : Word32 fo7, fo8, fo9, fo10, fo11, fo12, fo13, fo14, fo15, f2o1, f2o2, f2o3, f2o4;
472 : Word32 f2o5, f2o6, f2o7, f2o8, f2o9, f2o10, f2o11, f2o12, f2o13, f2o14, f2o15;
473 : Word32 f3o1, f3o2, f3o3, f3o4, f3o5, f3o6, f3o7, f3o8, f3o9, f3o10, f3o11, f3o12;
474 : Word32 f3o13, f3o14, f3o15, f4o1, f4o2, f4o3, f4o4, f4o5, f4o6, f4o7, f4o8, f4o9;
475 : Word32 f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f5o1, f5o2, f5o3, f5o4, f5o5, f5o6, f5o7;
476 : Word32 f5o8, f5o9, f5o10, f5o11, f5o12, f5o13, f5o14, f5o15, f5o16, f5o17, f5o18, f5o19, f5o21, f5o22;
477 :
478 0 : in0 = Idx[0];
479 0 : move16();
480 0 : in8 = Idx[n1];
481 0 : move16();
482 0 : in16 = Idx[n1 * 2];
483 0 : move16();
484 0 : in24 = Idx[( n1 * 3 )];
485 0 : move16();
486 0 : in32 = Idx[n1 * 4];
487 0 : move16();
488 0 : in1 = Idx[( n1 * 5 )];
489 0 : move16();
490 0 : in9 = Idx[n1 * 6];
491 0 : move16();
492 0 : in17 = Idx[( n1 * 7 )];
493 0 : move16();
494 0 : in25 = Idx[n1 * 8];
495 0 : move16();
496 0 : in33 = Idx[( n1 * 9 )];
497 0 : move16();
498 0 : in2 = Idx[n1 * 10];
499 0 : move16();
500 0 : in10 = Idx[( n1 * 11 )];
501 0 : move16();
502 0 : in18 = Idx[n1 * 12];
503 0 : move16();
504 0 : in26 = Idx[( n1 * 13 )];
505 0 : move16();
506 0 : in34 = Idx[n1 * 14];
507 0 : move16();
508 :
509 0 : f2i13 = zRe[in0]; // Qx
510 0 : f2i14 = zIm[in0]; // Qx
511 0 : f3i6 = zRe[in1]; // Qx
512 0 : f3i7 = zRe[in2]; // Qx
513 0 : f3i8 = zIm[in1]; // Qx
514 0 : f3i9 = zIm[in2]; // Qx
515 :
516 0 : f2i15 = L_add( f3i6, f3i7 );
517 0 : f3i1 = Mpy_32_16_1( L_sub( f3i7, f3i6 ), FFT_15PONIT_WNK4 ); // Qx
518 0 : f3i2 = Mpy_32_16_1( L_sub( f3i8, f3i9 ), FFT_15PONIT_WNK4 ); // Qx
519 0 : f3i3 = L_add( f3i8, f3i9 );
520 :
521 0 : fi1 = L_add( f2i13, f2i15 );
522 0 : fi2 = L_add( f2i14, f3i3 );
523 0 : f3i4 = L_sub( f2i13, L_shr( f2i15, 1 ) );
524 0 : fi3 = L_sub( f3i4, f3i2 );
525 0 : fi4 = L_add( f3i4, f3i2 );
526 0 : f3i5 = L_sub( f2i14, L_shr( f3i3, 1 ) );
527 0 : fi5 = L_add( f3i1, f3i5 );
528 0 : fi6 = L_sub( f3i5, f3i1 );
529 :
530 0 : f3i10 = zRe[in9];
531 0 : move32();
532 0 : f4i11 = zRe[in10];
533 0 : move32();
534 0 : f4i12 = zRe[in8];
535 0 : move32();
536 0 : f3i14 = zIm[in9];
537 0 : move32();
538 0 : f4i13 = zIm[in10];
539 0 : move32();
540 0 : f4i14 = zIm[in8];
541 0 : move32();
542 0 : f4i3 = zRe[in33];
543 0 : move32();
544 0 : f4i15 = zRe[in34];
545 0 : move32();
546 0 : fo1 = zRe[in32];
547 0 : move32();
548 0 : f4i7 = zIm[in33];
549 0 : move32();
550 0 : fo2 = zIm[in34];
551 0 : move32();
552 0 : fo3 = zIm[in32];
553 0 : move32();
554 :
555 :
556 0 : f3i11 = L_add( f4i11, f4i12 );
557 0 : f3i12 = L_sub( f3i10, L_shr( f3i11, 1 ) );
558 0 : f3i13 = Mpy_32_16_1( L_sub( f4i12, f4i11 ), FFT_15PONIT_WNK4 ); // Qx
559 0 : f3i15 = L_add( f4i13, f4i14 );
560 0 : f4i1 = Mpy_32_16_1( L_sub( f4i13, f4i14 ), FFT_15PONIT_WNK4 ); // Qx
561 0 : f4i2 = L_sub( f3i14, L_shr( f3i15, 1 ) );
562 0 : f4i4 = L_add( f4i15, fo1 );
563 0 : f4i5 = L_sub( f4i3, L_shr( f4i4, 1 ) );
564 0 : f4i6 = Mpy_32_16_1( L_sub( fo1, f4i15 ), FFT_15PONIT_WNK4 ); // Qx
565 0 : f4i8 = L_add( fo2, fo3 );
566 0 : f4i9 = Mpy_32_16_1( L_sub( fo2, fo3 ), FFT_15PONIT_WNK4 ); // Qx
567 0 : f4i10 = L_sub( f4i7, L_shr( f4i8, 1 ) );
568 :
569 0 : fi7 = L_add( f3i10, f3i11 );
570 0 : fi8 = L_add( f4i3, f4i4 );
571 0 : fi9 = L_add( fi7, fi8 );
572 0 : fi10 = L_sub( f3i12, f4i1 );
573 0 : fi11 = L_sub( f4i5, f4i9 );
574 0 : fi12 = L_add( fi10, fi11 );
575 0 : fi13 = L_add( f3i14, f3i15 );
576 0 : fi14 = L_add( f4i7, f4i8 );
577 0 : fi15 = L_add( fi13, fi14 );
578 0 : fi16 = L_sub( f4i2, f3i13 );
579 0 : fi17 = L_sub( f4i10, f4i6 );
580 0 : fi18 = L_add( fi16, fi17 );
581 0 : fi19 = L_add( f3i13, f4i2 );
582 0 : fi20 = L_add( f4i6, f4i10 );
583 0 : fi21 = L_add( fi19, fi20 );
584 0 : fi22 = L_add( f3i12, f4i1 );
585 0 : fi23 = L_add( f4i5, f4i9 );
586 0 : fi24 = L_add( fi22, fi23 );
587 :
588 0 : fo4 = zRe[in24];
589 0 : move32();
590 0 : f2o5 = zRe[in25];
591 0 : move32();
592 0 : f2o6 = zRe[in26];
593 0 : move32();
594 0 : fo8 = zIm[in24];
595 0 : move32();
596 0 : f2o7 = zIm[in25];
597 0 : move32();
598 0 : f2o8 = zIm[in26];
599 0 : move32();
600 0 : fo12 = zRe[in18];
601 0 : move32();
602 0 : f2o9 = zRe[in16];
603 0 : move32();
604 0 : f2o10 = zRe[in17];
605 0 : move32();
606 0 : f2o1 = zIm[in18];
607 0 : move32();
608 0 : f2o11 = zIm[in16];
609 0 : move32();
610 0 : f2o12 = zIm[in17];
611 0 : move32();
612 :
613 :
614 0 : fo5 = L_add( f2o5, f2o6 );
615 0 : fo6 = L_sub( fo4, L_shr( fo5, 1 ) );
616 0 : fo7 = Mpy_32_16_1( L_sub( f2o6, f2o5 ), FFT_15PONIT_WNK4 ); // Qx
617 0 : fo9 = L_add( f2o7, f2o8 );
618 0 : fo10 = Mpy_32_16_1( L_sub( f2o7, f2o8 ), FFT_15PONIT_WNK4 ); // Qx
619 0 : fo11 = L_sub( fo8, L_shr( fo9, 1 ) );
620 0 : fo13 = L_add( f2o9, f2o10 );
621 0 : fo14 = L_sub( fo12, L_shr( fo13, 1 ) );
622 0 : fo15 = Mpy_32_16_1( L_sub( f2o10, f2o9 ), FFT_15PONIT_WNK4 ); // Qx
623 0 : f2o2 = L_add( f2o11, f2o12 );
624 0 : f2o3 = Mpy_32_16_1( L_sub( f2o11, f2o12 ), FFT_15PONIT_WNK4 ); // Qx
625 0 : f2o4 = L_sub( f2o1, L_shr( f2o2, 1 ) );
626 :
627 0 : fi25 = L_add( fo4, fo5 );
628 0 : fi26 = L_add( fo12, fo13 );
629 0 : fi27 = L_add( fi25, fi26 );
630 0 : fi28 = L_sub( fo6, fo10 );
631 0 : fi29 = L_sub( fo14, f2o3 );
632 0 : fi30 = L_add( fi28, fi29 );
633 0 : f2i1 = L_add( fo8, fo9 );
634 0 : f2i2 = L_add( f2o1, f2o2 );
635 0 : f2i3 = L_add( f2i1, f2i2 );
636 0 : f2i4 = L_sub( fo11, fo7 );
637 0 : f2i5 = L_sub( f2o4, fo15 );
638 0 : f2i6 = L_add( f2i4, f2i5 );
639 0 : f2i7 = L_add( fo7, fo11 );
640 0 : f2i8 = L_add( fo15, f2o4 );
641 0 : f2i9 = L_add( f2i7, f2i8 );
642 0 : f2i10 = L_add( fo6, fo10 );
643 0 : f2i11 = L_add( fo14, f2o3 );
644 0 : f2i12 = L_add( f2i10, f2i11 );
645 :
646 0 : f2o13 = Mpy_32_16_1( L_sub( fi27, fi9 ), FFT_15PONIT_WNK1 ); // Qx
647 0 : f2o14 = L_add( fi27, fi9 );
648 0 : f2o15 = L_sub( fi1, Mpy_32_16_1( f2o14, FFT_15PONIT_WNK5 ) ); // Qx
649 0 : f3o3 = L_sub( fi13, fi14 );
650 0 : f3o4 = L_sub( f2i1, f2i2 );
651 0 : f3o1 = L_sub( Mpy_32_16_1( f3o3, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o4, FFT_15PONIT_WNK3 ) ); // Qx
652 0 : f3o2 = L_add( Mpy_32_16_1( f3o4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o3, FFT_15PONIT_WNK3 ) ); // Qx
653 0 : zRe[in0] = L_add( fi1, f2o14 );
654 0 : move32();
655 0 : f3o5 = L_add( f2o13, f2o15 );
656 0 : zRe[in24] = L_sub( f3o5, f3o2 );
657 0 : move32();
658 0 : zRe[in18] = L_add( f3o5, f3o2 );
659 0 : move32();
660 0 : f3o6 = L_sub( f2o15, f2o13 );
661 0 : zRe[in33] = L_sub( f3o6, f3o1 );
662 0 : move32();
663 0 : zRe[in9] = L_add( f3o6, f3o1 );
664 0 : move32();
665 :
666 0 : f3o7 = Mpy_32_16_1( L_sub( f2i3, fi15 ), FFT_15PONIT_WNK1 ); // Qx
667 0 : f3o8 = L_add( f2i3, fi15 );
668 0 : f3o9 = L_sub( fi2, Mpy_32_16_1( f3o8, FFT_15PONIT_WNK5 ) ); // Qx
669 0 : f3o12 = L_sub( fi7, fi8 );
670 0 : f3o13 = L_sub( fi25, fi26 );
671 0 : f3o10 = L_sub( Mpy_32_16_1( f3o12, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o13, FFT_15PONIT_WNK3 ) ); // Qx
672 0 : f3o11 = L_add( Mpy_32_16_1( f3o13, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o12, FFT_15PONIT_WNK3 ) ); // Qx
673 0 : zIm[in0] = L_add( fi2, f3o8 );
674 0 : move32();
675 0 : f3o14 = L_add( f3o7, f3o9 );
676 0 : zIm[in18] = L_sub( f3o14, f3o11 );
677 0 : move32();
678 0 : zIm[in24] = L_add( f3o11, f3o14 );
679 0 : move32();
680 0 : f3o15 = L_sub( f3o9, f3o7 );
681 0 : zIm[in9] = L_sub( f3o15, f3o10 );
682 0 : move32();
683 0 : zIm[in33] = L_add( f3o10, f3o15 );
684 0 : move32();
685 :
686 0 : f4o1 = Mpy_32_16_1( L_sub( fi30, fi12 ), FFT_15PONIT_WNK1 ); // Qx
687 0 : f4o2 = L_add( fi30, fi12 );
688 0 : f4o3 = L_sub( fi3, Mpy_32_16_1( f4o2, FFT_15PONIT_WNK5 ) ); // Qx
689 0 : f4o6 = L_sub( fi16, fi17 );
690 0 : f4o7 = L_sub( f2i4, f2i5 );
691 0 : f4o4 = L_sub( Mpy_32_16_1( f4o6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o7, FFT_15PONIT_WNK3 ) ); // Qx
692 0 : f4o5 = L_add( Mpy_32_16_1( f4o7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o6, FFT_15PONIT_WNK3 ) ); // Qx
693 0 : zRe[in2] = L_add( fi3, f4o2 );
694 0 : move32();
695 0 : f4o8 = L_add( f4o1, f4o3 );
696 0 : zRe[in26] = L_sub( f4o8, f4o5 );
697 0 : move32();
698 0 : zRe[in17] = L_add( f4o8, f4o5 );
699 0 : move32();
700 0 : f4o9 = L_sub( f4o3, f4o1 );
701 0 : zRe[in32] = L_sub( f4o9, f4o4 );
702 0 : move32();
703 0 : zRe[in8] = L_add( f4o9, f4o4 );
704 0 : move32();
705 :
706 0 : f4o10 = Mpy_32_16_1( L_sub( f2i6, fi18 ), FFT_15PONIT_WNK1 ); // Qx
707 0 : f4o11 = L_add( f2i6, fi18 );
708 0 : f4o12 = L_sub( fi6, Mpy_32_16_1( f4o11, FFT_15PONIT_WNK5 ) ); // Qx
709 0 : f4o15 = L_sub( fi10, fi11 );
710 0 : f5o1 = L_sub( fi28, fi29 );
711 0 : f4o13 = L_sub( Mpy_32_16_1( f4o15, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o1, FFT_15PONIT_WNK3 ) ); // Qx
712 0 : f4o14 = L_add( Mpy_32_16_1( f5o1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o15, FFT_15PONIT_WNK3 ) ); // Qx
713 0 : zIm[in2] = L_add( fi6, f4o11 );
714 0 : move32();
715 0 : f5o2 = L_add( f4o10, f4o12 );
716 0 : zIm[in17] = L_sub( f5o2, f4o14 );
717 0 : move32();
718 0 : zIm[in26] = L_add( f4o14, f5o2 );
719 0 : move32();
720 0 : f5o3 = L_sub( f4o12, f4o10 );
721 0 : zIm[in32] = L_add( f4o13, f5o3 );
722 0 : move32();
723 0 : zIm[in8] = L_sub( f5o3, f4o13 );
724 0 : move32();
725 :
726 0 : f5o4 = Mpy_32_16_1( L_sub( f2i9, fi21 ), FFT_15PONIT_WNK1 ); // Qx
727 0 : f5o5 = L_add( f2i9, fi21 );
728 0 : f5o6 = L_sub( fi5, Mpy_32_16_1( f5o5, FFT_15PONIT_WNK5 ) ); // Qx
729 0 : f5o9 = L_sub( f2i10, f2i11 );
730 0 : f5o10 = L_sub( fi22, fi23 );
731 0 : f5o7 = L_add( Mpy_32_16_1( f5o9, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o10, FFT_15PONIT_WNK3 ) ); // Qx
732 0 : f5o8 = L_sub( Mpy_32_16_1( f5o10, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o9, FFT_15PONIT_WNK3 ) ); // Qx
733 0 : zIm[in1] = L_add( fi5, f5o5 );
734 0 : move32();
735 0 : f5o11 = L_sub( f5o6, f5o4 );
736 0 : f5o12 = L_add( f5o4, f5o6 );
737 0 : zIm[in34] = L_add( f5o8, f5o11 );
738 0 : move32();
739 0 : zIm[in10] = L_sub( f5o11, f5o8 );
740 0 : move32();
741 :
742 0 : zIm[in16] = L_sub( f5o12, f5o7 );
743 0 : move32();
744 0 : zIm[in25] = L_add( f5o7, f5o12 );
745 0 : move32();
746 :
747 0 : f5o13 = Mpy_32_16_1( L_sub( f2i12, fi24 ), FFT_15PONIT_WNK1 ); // Qx
748 0 : f5o14 = L_add( f2i12, fi24 );
749 0 : f5o15 = L_sub( fi4, Mpy_32_16_1( f5o14, FFT_15PONIT_WNK5 ) ); // Qx
750 0 : f5o18 = L_sub( f2i7, f2i8 );
751 0 : f5o19 = L_sub( fi19, fi20 );
752 0 : f5o16 = L_add( Mpy_32_16_1( f5o18, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o19, FFT_15PONIT_WNK3 ) ); // Qx
753 0 : f5o17 = L_sub( Mpy_32_16_1( f5o19, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o18, FFT_15PONIT_WNK3 ) ); // Qx
754 0 : zRe[in1] = L_add( fi4, f5o14 );
755 0 : move32();
756 0 : f5o21 = L_sub( f5o15, f5o13 );
757 0 : f5o22 = L_add( f5o13, f5o15 );
758 :
759 0 : zRe[in34] = L_sub( f5o21, f5o17 );
760 0 : move32();
761 0 : zRe[in10] = L_add( f5o21, f5o17 );
762 0 : move32();
763 0 : zRe[in25] = L_sub( f5o22, f5o16 );
764 0 : move32();
765 0 : zRe[in16] = L_add( f5o22, f5o16 );
766 0 : move32();
767 :
768 0 : return;
769 : }
770 :
771 : /*-----------------------------------------------------------------*
772 : * fft5_shift1()
773 : * 5-point FFT with 1-point circular shift
774 : *-----------------------------------------------------------------*/
775 :
776 58240 : static void fft5_shift1(
777 : Word16 n1, /* i : length of data Q0 */
778 : Word32 *zRe, /* i/o: real part of input and output data Qx */
779 : Word32 *zIm, /* i/o: imaginary part of input and output data Qx */
780 : const Word16 *Idx /* i : pointer of the address table Q0 */
781 : )
782 : {
783 : Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
784 : Word32 fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
785 : Word16 in1, in2, in3, in4, in5;
786 :
787 58240 : in1 = Idx[0];
788 58240 : move16();
789 58240 : in2 = Idx[n1];
790 58240 : move16();
791 58240 : in3 = Idx[n1 * 2];
792 58240 : move16();
793 58240 : in4 = Idx[( n1 * 3 )];
794 58240 : move16();
795 58240 : in5 = Idx[n1 * 4];
796 58240 : move16();
797 :
798 58240 : fi1 = zRe[in1]; // Qx
799 58240 : move32();
800 58240 : fi2 = zIm[in1]; // Qx
801 58240 : move32();
802 58240 : fo3 = zRe[in2]; // Qx
803 58240 : move32();
804 58240 : fo4 = zRe[in5]; // Qx
805 58240 : move32();
806 58240 : fo6 = zRe[in3]; // Qx
807 58240 : move32();
808 58240 : fo7 = zRe[in4]; // Qx
809 58240 : move32();
810 :
811 58240 : fo5 = L_add( fo3, fo4 );
812 58240 : fo8 = L_add( fo6, fo7 );
813 58240 : fi3 = L_add( fo5, fo8 );
814 58240 : fi4 = L_sub( fo6, fo7 );
815 58240 : fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
816 58240 : fi6 = L_sub( fo3, fo4 );
817 :
818 58240 : fo3 = zIm[in2];
819 58240 : move32();
820 58240 : fo4 = zIm[in5];
821 58240 : move32();
822 58240 : fo6 = zIm[in3];
823 58240 : move32();
824 58240 : fo7 = zIm[in4];
825 58240 : move32();
826 :
827 58240 : fo5 = L_add( fo3, fo4 );
828 58240 : fo8 = L_add( fo6, fo7 );
829 58240 : fi7 = L_sub( fo3, fo4 );
830 58240 : fi8 = L_add( fo5, fo8 );
831 58240 : fo1 = L_sub( fo6, fo7 );
832 58240 : fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
833 :
834 58240 : zRe[in1] = L_add( fi1, fi3 );
835 58240 : move32();
836 58240 : zIm[in1] = L_add( fi2, fi8 );
837 58240 : move32();
838 :
839 58240 : fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
840 58240 : fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
841 58240 : fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
842 58240 : fo5 = L_add( fi5, fo7 );
843 58240 : fo6 = L_sub( fo7, fi5 );
844 :
845 58240 : zRe[in2] = L_add( fo5, fo3 );
846 58240 : move32();
847 58240 : zRe[in3] = L_sub( fo6, fo4 );
848 58240 : move32();
849 58240 : zRe[in4] = L_add( fo6, fo4 );
850 58240 : move32();
851 58240 : zRe[in5] = L_sub( fo5, fo3 );
852 58240 : move32();
853 :
854 58240 : fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
855 58240 : fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
856 58240 : fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
857 58240 : fo5 = L_add( fo2, fo7 );
858 58240 : fo6 = L_sub( fo7, fo2 );
859 :
860 58240 : zIm[in2] = L_sub( fo5, fo3 );
861 58240 : move32();
862 58240 : zIm[in3] = L_add( fo4, fo6 );
863 58240 : move32();
864 58240 : zIm[in4] = L_sub( fo6, fo4 );
865 58240 : move32();
866 58240 : zIm[in5] = L_add( fo3, fo5 );
867 58240 : move32();
868 :
869 58240 : return;
870 : }
871 :
872 : /*-----------------------------------------------------------------*
873 : * fft5_shift4()
874 : * 5-point FFT with 4-point circular shift
875 : *-----------------------------------------------------------------*/
876 :
877 4796288 : static void fft5_shift4(
878 : Word16 n1, /* i : length of data Q0 */
879 : Word32 *zRe, /* i/o: real part of input and output data Qx */
880 : Word32 *zIm, /* i/o: imaginary part of input and output data Qx */
881 : const Word16 *Idx /* i : pointer of the address table Q0 */
882 : )
883 : {
884 : Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
885 : Word32 fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
886 : Word16 in1, in2, in3, in4, in5;
887 :
888 4796288 : in1 = Idx[0];
889 4796288 : move16();
890 4796288 : in2 = Idx[n1];
891 4796288 : move16();
892 4796288 : in3 = Idx[n1 * 2];
893 4796288 : move16();
894 4796288 : in4 = Idx[( n1 * 3 )];
895 4796288 : move16();
896 4796288 : in5 = Idx[n1 * 4];
897 4796288 : move16();
898 :
899 4796288 : fi1 = zRe[in1]; // Qx
900 4796288 : move32();
901 4796288 : fi2 = zIm[in1]; // Qx
902 4796288 : move32();
903 4796288 : fo3 = zRe[in2]; // Qx
904 4796288 : move32();
905 4796288 : fo4 = zRe[in5]; // Qx
906 4796288 : move32();
907 4796288 : fo6 = zRe[in3]; // Qx
908 4796288 : move32();
909 4796288 : fo7 = zRe[in4]; // Qx
910 4796288 : move32();
911 :
912 4796288 : fo5 = L_add( fo3, fo4 );
913 4796288 : fo8 = L_add( fo6, fo7 );
914 4796288 : fi3 = L_add( fo5, fo8 );
915 4796288 : fi4 = L_sub( fo6, fo7 );
916 4796288 : fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
917 4796288 : fi6 = L_sub( fo3, fo4 );
918 :
919 4796288 : fo3 = zIm[in2];
920 4796288 : move32();
921 4796288 : fo4 = zIm[in5];
922 4796288 : move32();
923 4796288 : fo6 = zIm[in3];
924 4796288 : move32();
925 4796288 : fo7 = zIm[in4];
926 4796288 : move32();
927 :
928 4796288 : fo5 = L_add( fo3, fo4 );
929 4796288 : fo8 = L_add( fo6, fo7 );
930 4796288 : fi7 = L_sub( fo3, fo4 );
931 4796288 : fi8 = L_add( fo5, fo8 );
932 4796288 : fo1 = L_sub( fo6, fo7 );
933 4796288 : fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
934 :
935 4796288 : zRe[in1] = L_add( fi1, fi3 );
936 4796288 : move32();
937 4796288 : zIm[in1] = L_add( fi2, fi8 );
938 4796288 : move32();
939 :
940 4796288 : fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
941 4796288 : fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
942 4796288 : fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
943 4796288 : fo5 = L_add( fi5, fo7 );
944 4796288 : fo6 = L_sub( fo7, fi5 );
945 :
946 4796288 : zRe[in2] = L_sub( fo5, fo3 );
947 4796288 : move32();
948 4796288 : zRe[in4] = L_sub( fo6, fo4 );
949 4796288 : move32();
950 4796288 : zRe[in3] = L_add( fo6, fo4 );
951 4796288 : move32();
952 4796288 : zRe[in5] = L_add( fo5, fo3 );
953 4796288 : move32();
954 :
955 4796288 : fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
956 4796288 : fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
957 4796288 : fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
958 4796288 : fo5 = L_add( fo2, fo7 );
959 4796288 : fo6 = L_sub( fo7, fo2 );
960 :
961 4796288 : zIm[in3] = L_sub( fo6, fo4 );
962 4796288 : move32();
963 4796288 : zIm[in2] = L_add( fo3, fo5 );
964 4796288 : move32();
965 4796288 : zIm[in4] = L_add( fo4, fo6 );
966 4796288 : move32();
967 4796288 : zIm[in5] = L_sub( fo5, fo3 );
968 4796288 : move32();
969 :
970 4796288 : return;
971 : }
972 :
973 : /*-----------------------------------------------------------------*
974 : * fft5_32()
975 : * 5-point FFT called for 32 times
976 : *-----------------------------------------------------------------*/
977 :
978 41536 : static void fft5_32(
979 : Word32 *zRe, /* i/o: real part of input and output data Qx */
980 : Word32 *zIm, /* i/o: imaginary part of input and output data Qx */
981 : const Word16 *Idx /* i : pointer of the address table Q0 */
982 : )
983 : {
984 : Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
985 : Word32 fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
986 : Word16 in1, in2, in3, in4, in5;
987 :
988 41536 : in1 = Idx[0];
989 41536 : move16();
990 41536 : in2 = Idx[32];
991 41536 : move16();
992 41536 : in3 = Idx[64];
993 41536 : move16();
994 41536 : in4 = Idx[96];
995 41536 : move16();
996 41536 : in5 = Idx[128];
997 41536 : move16();
998 :
999 41536 : fi1 = zRe[in1]; // Qx
1000 41536 : move32();
1001 41536 : fi2 = zIm[in1]; // Qx
1002 41536 : move32();
1003 41536 : fo3 = zRe[in2]; // Qx
1004 41536 : move32();
1005 41536 : fo4 = zRe[in5]; // Qx
1006 41536 : move32();
1007 41536 : fo6 = zRe[in3]; // Qx
1008 41536 : move32();
1009 41536 : fo7 = zRe[in4]; // Qx
1010 41536 : move32();
1011 :
1012 41536 : fo5 = L_add( fo3, fo4 );
1013 41536 : fo8 = L_add( fo6, fo7 );
1014 41536 : fi3 = L_add( fo5, fo8 );
1015 41536 : fi4 = L_sub( fo6, fo7 );
1016 41536 : fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
1017 41536 : fi6 = L_sub( fo3, fo4 );
1018 :
1019 41536 : fo3 = zIm[in2];
1020 41536 : move32();
1021 41536 : fo4 = zIm[in5];
1022 41536 : move32();
1023 41536 : fo6 = zIm[in3];
1024 41536 : move32();
1025 41536 : fo7 = zIm[in4];
1026 41536 : move32();
1027 :
1028 41536 : fo5 = L_add( fo3, fo4 );
1029 41536 : fo8 = L_add( fo6, fo7 );
1030 41536 : fi7 = L_sub( fo3, fo4 );
1031 41536 : fi8 = L_add( fo5, fo8 );
1032 41536 : fo1 = L_sub( fo6, fo7 );
1033 41536 : fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
1034 :
1035 41536 : zRe[in1] = L_add( fi1, fi3 );
1036 41536 : move32();
1037 41536 : zIm[in1] = L_add( fi2, fi8 );
1038 41536 : move32();
1039 :
1040 41536 : fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
1041 41536 : fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
1042 41536 : fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
1043 41536 : fo5 = L_add( fi5, fo7 );
1044 41536 : fo6 = L_sub( fo7, fi5 );
1045 :
1046 41536 : zRe[in2] = L_add( fo6, fo4 );
1047 41536 : move32();
1048 41536 : zRe[in3] = L_add( fo5, fo3 );
1049 41536 : move32();
1050 41536 : zRe[in4] = L_sub( fo5, fo3 );
1051 41536 : move32();
1052 41536 : zRe[in5] = L_sub( fo6, fo4 );
1053 41536 : move32();
1054 :
1055 41536 : fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
1056 41536 : fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
1057 41536 : fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
1058 41536 : fo5 = L_add( fo2, fo7 );
1059 41536 : fo6 = L_sub( fo7, fo2 );
1060 :
1061 41536 : zIm[in2] = L_sub( fo6, fo4 );
1062 41536 : move32();
1063 41536 : zIm[in3] = L_sub( fo5, fo3 );
1064 41536 : move32();
1065 41536 : zIm[in4] = L_add( fo3, fo5 );
1066 41536 : move32();
1067 41536 : zIm[in5] = L_add( fo4, fo6 );
1068 41536 : move32();
1069 :
1070 41536 : return;
1071 : }
1072 :
1073 : /*-----------------------------------------------------------------*
1074 : * fft64()
1075 : * 64-point FFT
1076 : *-----------------------------------------------------------------*/
1077 :
1078 374710 : static void fft64(
1079 : Word32 *x, /* i/o: real part of input and output data Qx */
1080 : Word32 *y, /* i/o: imaginary part of input and output data Qx */
1081 : const Word16 *Idx /* i : pointer of the address table Q0 */
1082 : )
1083 : {
1084 : Word16 i, id, jd;
1085 : Word32 z[128];
1086 24356150 : FOR( i = 0; i < 64; i++ )
1087 : {
1088 23981440 : id = Idx[i];
1089 23981440 : move16();
1090 23981440 : z[2 * i] = x[id]; // Qx
1091 23981440 : move32();
1092 23981440 : z[( ( i << 1 ) + 1 )] = y[id]; // Qx
1093 23981440 : move32();
1094 : }
1095 :
1096 374710 : cdftForw( 128, z, Ip_fft64, w_fft64_fx );
1097 :
1098 24356150 : FOR( i = 0; i < 64; i++ )
1099 : {
1100 23981440 : jd = Odx_fft64[i];
1101 23981440 : move16();
1102 23981440 : id = Idx[jd];
1103 23981440 : move16();
1104 23981440 : x[id] = z[2 * i]; // Qx
1105 23981440 : move32();
1106 23981440 : y[id] = z[( ( i << 1 ) + 1 )]; // Qx
1107 23981440 : move32();
1108 : }
1109 :
1110 374710 : return;
1111 : }
1112 :
1113 :
1114 : /*-----------------------------------------------------------------*
1115 : * fft32_15()
1116 : * 32-point FFT called for 15 times
1117 : *-----------------------------------------------------------------*/
1118 :
1119 0 : static void fft32_15(
1120 : Word32 *x, /* i/o: real part of input and output data Qx */
1121 : Word32 *y, /* i/o: imaginary part of input and output data Qx */
1122 : const Word16 *Idx /* i : pointer of the address table Q0 */
1123 : )
1124 : {
1125 : Word16 i, id, jd;
1126 : Word32 z[64];
1127 :
1128 0 : FOR( i = 0; i < 32; i++ )
1129 : {
1130 0 : id = Idx[i];
1131 0 : move16();
1132 0 : z[2 * i] = x[id]; // Qx
1133 0 : move32();
1134 0 : z[( ( i << 1 ) + 1 )] = y[id]; // Qx
1135 0 : move32();
1136 : }
1137 :
1138 0 : cdftForw( 64, z, Ip_fft32, w_fft32_fx );
1139 :
1140 0 : FOR( i = 0; i < 32; i++ )
1141 : {
1142 0 : jd = Odx_fft32_15[i];
1143 0 : move16();
1144 0 : id = Idx[jd];
1145 0 : move16();
1146 0 : x[id] = z[2 * i]; // Qx
1147 0 : move32();
1148 0 : y[id] = z[( ( i << 1 ) + 1 )]; // Qx
1149 0 : move32();
1150 : }
1151 :
1152 0 : return;
1153 : }
1154 :
1155 : /*-----------------------------------------------------------------*
1156 : * fft32_5()
1157 : * 32-point FFT called for 5 times
1158 : *-----------------------------------------------------------------*/
1159 :
1160 6490 : static void fft32_5(
1161 : Word32 *x, /* i/o: real part of input and output data Qx */
1162 : Word32 *y, /* i/o: imaginary part of input and output data Qx */
1163 : const Word16 *Idx /* i : pointer of the address table Q0 */
1164 : )
1165 : {
1166 : Word16 i, id, jd;
1167 : Word32 z[64];
1168 :
1169 214170 : FOR( i = 0; i < 32; i++ )
1170 : {
1171 207680 : id = Idx[i];
1172 207680 : move16();
1173 207680 : z[2 * i] = x[id]; // Qx
1174 207680 : move32();
1175 207680 : z[( ( i << 1 ) + 1 )] = y[id]; // Qx
1176 207680 : move32();
1177 : }
1178 :
1179 6490 : cdftForw( 64, z, Ip_fft32, w_fft32_fx );
1180 :
1181 214170 : FOR( i = 0; i < 32; i++ )
1182 : {
1183 207680 : jd = Odx_fft32_5[i];
1184 207680 : move16();
1185 207680 : id = Idx[jd];
1186 207680 : move16();
1187 207680 : x[id] = z[2 * i]; // Qx
1188 207680 : move32();
1189 207680 : y[id] = z[( ( i << 1 ) + 1 )]; // Qx
1190 207680 : move32();
1191 : }
1192 :
1193 6490 : return;
1194 : }
1195 :
1196 : /*-----------------------------------------------------------------*
1197 : * fft16_ivas()
1198 : * 16-point FFT
1199 : *-----------------------------------------------------------------*/
1200 :
1201 18200 : static void fft16_ivas(
1202 : Word32 *x, /* i/o: real part of input and output data Qx */
1203 : Word32 *y, /* i/o: imaginary part of input and output data Qx */
1204 : const Word16 *Idx /* i : pointer of the address table Q0 */
1205 : )
1206 : {
1207 : Word16 i, id, jd;
1208 : Word32 z[32];
1209 :
1210 309400 : FOR( i = 0; i < 16; i++ )
1211 : {
1212 291200 : id = Idx[i];
1213 291200 : move16();
1214 291200 : z[2 * i] = x[id]; // Qx
1215 291200 : move32();
1216 291200 : z[( ( i << 1 ) + 1 )] = y[id]; // Qx
1217 291200 : move32();
1218 : }
1219 :
1220 18200 : cdftForw( 32, z, Ip_fft16, w_fft16_fx );
1221 :
1222 309400 : FOR( i = 0; i < 16; i++ )
1223 : {
1224 291200 : jd = Odx_fft16[i];
1225 291200 : move16();
1226 291200 : id = Idx[jd];
1227 291200 : move16();
1228 291200 : x[id] = z[2 * i]; // Qx
1229 291200 : move32();
1230 291200 : y[id] = z[( ( i << 1 ) + 1 )]; // Qx
1231 291200 : move32();
1232 : }
1233 :
1234 18200 : return;
1235 : }
1236 :
1237 : /*-----------------------------------------------------------------*
1238 : * fft8()
1239 : * 8-point FFT
1240 : *-----------------------------------------------------------------*/
1241 :
1242 0 : static void fft8(
1243 : Word32 *x, /* i/o: real part of input and output data Qx */
1244 : Word32 *y, /* i/o: imaginary part of input and output data Qx */
1245 : const Word16 *Idx /* i : pointer of the address table Q0 */
1246 : )
1247 : {
1248 : Word16 i, id;
1249 : Word32 z[16];
1250 :
1251 0 : FOR( i = 0; i < 8; i++ )
1252 : {
1253 0 : id = Idx[i];
1254 0 : move16();
1255 0 : z[2 * i] = x[id]; // Qx
1256 0 : move32();
1257 0 : z[( ( i << 1 ) + 1 )] = y[id]; // Qx
1258 0 : move32();
1259 : }
1260 :
1261 0 : cdftForw( 16, z, Ip_fft8, w_fft8_fx );
1262 :
1263 0 : FOR( i = 0; i < 8; i++ )
1264 : {
1265 0 : id = Idx[i];
1266 0 : move16();
1267 0 : x[id] = z[2 * i]; // Qx
1268 0 : move32();
1269 0 : y[id] = z[( ( i << 1 ) + 1 )]; // Qx
1270 0 : move32();
1271 : }
1272 :
1273 0 : return;
1274 : }
1275 :
1276 : /*-----------------------------------------------------------------*
1277 : * fft8_5()
1278 : * 8-point FFT with shift 5
1279 : *-----------------------------------------------------------------*/
1280 :
1281 0 : static void fft8_5(
1282 : Word32 *x, /* i/o: real part of input and output data Qx */
1283 : Word32 *y, /* i/o: imaginary part of input and output data Qx */
1284 : const Word16 *Idx /* i : pointer of the address table Q0 */
1285 : )
1286 : {
1287 : Word16 i, id, jd;
1288 : Word32 z[16];
1289 :
1290 0 : FOR( i = 0; i < 8; i++ )
1291 : {
1292 0 : id = Idx[i];
1293 0 : move16();
1294 0 : z[2 * i] = x[id];
1295 0 : move32();
1296 0 : z[( ( i << 1 ) + 1 )] = y[id]; // Qx
1297 0 : move32();
1298 : }
1299 :
1300 0 : cdftForw( 16, z, Ip_fft8, w_fft8_fx );
1301 :
1302 0 : FOR( i = 0; i < 8; i++ )
1303 : {
1304 0 : jd = Odx_fft8_5[i];
1305 0 : move16();
1306 0 : id = Idx[jd];
1307 0 : move16();
1308 0 : x[id] = z[2 * i]; // Qx
1309 0 : move32();
1310 0 : y[id] = z[( ( i << 1 ) + 1 )]; // Qx
1311 0 : move32();
1312 : }
1313 0 : return;
1314 : }
1315 :
1316 : /*-----------------------------------------------------------------*
1317 : * fft5_8()
1318 : * 5-point FFT with shift 2
1319 : *-----------------------------------------------------------------*/
1320 :
1321 0 : static void fft5_8(
1322 : Word16 n1, /* i : length of data Q0 */
1323 : Word32 *zRe, /* i/o: real part of input and output data Qx */
1324 : Word32 *zIm, /* i/o: imaginary part of input and output data Qx */
1325 : const Word16 *Idx /* i : pointer of the address table Q0 */
1326 : )
1327 : {
1328 : Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
1329 : Word32 fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
1330 : Word16 in1, in2, in3, in4, in5;
1331 :
1332 0 : in1 = Idx[0];
1333 0 : move16();
1334 0 : in2 = Idx[n1];
1335 0 : move16();
1336 0 : in3 = Idx[n1 * 2];
1337 0 : move16();
1338 0 : in4 = Idx[( n1 * 3 )];
1339 0 : move16();
1340 0 : in5 = Idx[n1 * 4];
1341 0 : move16();
1342 :
1343 0 : fi1 = zRe[in1]; // Qx
1344 0 : move32();
1345 0 : fi2 = zIm[in1]; // Qx
1346 0 : move32();
1347 0 : fo3 = zRe[in2]; // Qx
1348 0 : move32();
1349 0 : fo4 = zRe[in5]; // Qx
1350 0 : move32();
1351 0 : fo6 = zRe[in3]; // Qx
1352 0 : move32();
1353 0 : fo7 = zRe[in4]; // Qx
1354 0 : move32();
1355 :
1356 0 : fo5 = L_add( fo3, fo4 );
1357 0 : fo8 = L_add( fo6, fo7 );
1358 0 : fi3 = L_add( fo5, fo8 );
1359 0 : fi4 = L_sub( fo6, fo7 );
1360 0 : fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
1361 0 : fi6 = L_sub( fo3, fo4 );
1362 :
1363 0 : fo3 = zIm[in2];
1364 0 : move32();
1365 0 : fo4 = zIm[in5];
1366 0 : move32();
1367 0 : fo6 = zIm[in3];
1368 0 : move32();
1369 0 : fo7 = zIm[in4];
1370 0 : move32();
1371 :
1372 0 : fo5 = L_add( fo3, fo4 );
1373 0 : fo8 = L_add( fo6, fo7 );
1374 0 : fi7 = L_sub( fo3, fo4 );
1375 0 : fi8 = L_add( fo5, fo8 );
1376 0 : fo1 = L_sub( fo6, fo7 );
1377 0 : fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
1378 :
1379 0 : zRe[in1] = L_add( fi1, fi3 );
1380 0 : move32();
1381 0 : zIm[in1] = L_add( fi2, fi8 );
1382 0 : move32();
1383 :
1384 0 : fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
1385 0 : fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
1386 0 : fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
1387 0 : fo5 = L_add( fi5, fo7 );
1388 0 : fo6 = L_sub( fo7, fi5 );
1389 :
1390 0 : zRe[in2] = L_sub( fo6, fo4 );
1391 0 : move32();
1392 0 : zRe[in3] = L_sub( fo5, fo3 );
1393 0 : move32();
1394 0 : zRe[in5] = L_add( fo6, fo4 );
1395 0 : move32();
1396 0 : zRe[in4] = L_add( fo5, fo3 );
1397 0 : move32();
1398 :
1399 0 : fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
1400 0 : fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
1401 0 : fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
1402 0 : fo5 = L_add( fo2, fo7 );
1403 0 : fo6 = L_sub( fo7, fo2 );
1404 :
1405 0 : zIm[in2] = L_add( fo4, fo6 );
1406 0 : move32();
1407 0 : zIm[in3] = L_add( fo3, fo5 );
1408 0 : move32();
1409 0 : zIm[in4] = L_sub( fo5, fo3 );
1410 0 : move32();
1411 0 : zIm[in5] = L_sub( fo6, fo4 );
1412 0 : move32();
1413 :
1414 0 : return;
1415 : }
1416 :
1417 : /*-----------------------------------------------------------------*
1418 : * fft4_5()
1419 : * 8-point FFT with shift 1
1420 : *-----------------------------------------------------------------*/
1421 :
1422 0 : static void fft4_5(
1423 : Word32 *x, /* i/o: real part of input and output data Qx */
1424 : Word32 *y, /* i/o: imaginary part of input and output data Qx */
1425 : const Word16 *Idx /* i : pointer of the address table Q0 */
1426 : )
1427 : {
1428 : Word16 i, id, jd;
1429 : Word32 z[8];
1430 :
1431 0 : FOR( i = 0; i < 4; i++ )
1432 : {
1433 0 : id = Idx[i];
1434 0 : move16();
1435 0 : z[2 * i] = x[id]; // Qx
1436 0 : move32();
1437 0 : z[( ( i << 1 ) + 1 )] = y[id]; // Qx
1438 0 : move32();
1439 : }
1440 :
1441 0 : cdftForw( 8, z, Ip_fft4, w_fft4_fx );
1442 :
1443 0 : FOR( i = 0; i < 4; i++ )
1444 : {
1445 0 : jd = Odx_fft4_5[i];
1446 0 : move16();
1447 0 : id = Idx[jd];
1448 0 : move16();
1449 0 : x[id] = z[2 * i]; // Qx
1450 0 : move32();
1451 0 : y[id] = z[( ( i << 1 ) + 1 )]; // Qx
1452 0 : move32();
1453 : }
1454 0 : return;
1455 : }
1456 :
1457 : /*-----------------------------------------------------------------*
1458 : * fft5_4()
1459 : * 5-point FFT with shift 4
1460 : *-----------------------------------------------------------------*/
1461 :
1462 0 : static void fft5_4(
1463 : Word16 n1, // Q0
1464 : Word32 *zRe, // Qx
1465 : Word32 *zIm, // Qx
1466 : const Word16 *Idx // Q0
1467 : )
1468 : {
1469 : Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
1470 : Word32 fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
1471 : Word16 in1, in2, in3, in4, in5;
1472 :
1473 0 : in1 = Idx[0];
1474 0 : move16();
1475 0 : in2 = Idx[n1];
1476 0 : move16();
1477 0 : in3 = Idx[n1 * 2];
1478 0 : move16();
1479 0 : in4 = Idx[( n1 * 3 )];
1480 0 : move16();
1481 0 : in5 = Idx[n1 * 4];
1482 0 : move16();
1483 :
1484 0 : fi1 = zRe[in1]; // Qx
1485 0 : move32();
1486 0 : fi2 = zIm[in1]; // Qx
1487 0 : move32();
1488 0 : fo3 = zRe[in2]; // Qx
1489 0 : move32();
1490 0 : fo4 = zRe[in5]; // Qx
1491 0 : move32();
1492 0 : fo6 = zRe[in3]; // Qx
1493 0 : move32();
1494 0 : fo7 = zRe[in4]; // Qx
1495 0 : move32();
1496 :
1497 0 : fo5 = L_add( fo3, fo4 );
1498 0 : fo8 = L_add( fo6, fo7 );
1499 0 : fi3 = L_add( fo5, fo8 );
1500 0 : fi4 = L_sub( fo6, fo7 );
1501 0 : fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
1502 0 : fi6 = L_sub( fo3, fo4 );
1503 :
1504 0 : fo3 = zIm[in2];
1505 0 : move32();
1506 0 : fo4 = zIm[in5];
1507 0 : move32();
1508 0 : fo6 = zIm[in3];
1509 0 : move32();
1510 0 : fo7 = zIm[in4];
1511 0 : move32();
1512 :
1513 0 : fo5 = L_add( fo3, fo4 );
1514 0 : fo8 = L_add( fo6, fo7 );
1515 0 : fi7 = L_sub( fo3, fo4 );
1516 0 : fi8 = L_add( fo5, fo8 );
1517 0 : fo1 = L_sub( fo6, fo7 );
1518 0 : fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
1519 :
1520 0 : zRe[in1] = L_add( fi1, fi3 );
1521 0 : move32();
1522 0 : zIm[in1] = L_add( fi2, fi8 );
1523 0 : move32();
1524 :
1525 0 : fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
1526 0 : fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
1527 0 : fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
1528 0 : fo5 = L_add( fi5, fo7 );
1529 0 : fo6 = L_sub( fo7, fi5 );
1530 :
1531 0 : zRe[in2] = L_sub( fo5, fo3 );
1532 0 : move32();
1533 0 : zRe[in4] = L_sub( fo6, fo4 );
1534 0 : move32();
1535 0 : zRe[in3] = L_add( fo6, fo4 );
1536 0 : move32();
1537 0 : zRe[in5] = L_add( fo5, fo3 );
1538 0 : move32();
1539 :
1540 0 : fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
1541 0 : fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
1542 0 : fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
1543 0 : fo5 = L_add( fo2, fo7 );
1544 0 : fo6 = L_sub( fo7, fo2 );
1545 :
1546 0 : zIm[in2] = L_add( fo3, fo5 );
1547 0 : move32();
1548 0 : zIm[in3] = L_sub( fo6, fo4 );
1549 0 : move32();
1550 0 : zIm[in4] = L_add( fo4, fo6 );
1551 0 : move32();
1552 0 : zIm[in5] = L_sub( fo5, fo3 );
1553 0 : move32();
1554 0 : return;
1555 : }
1556 :
1557 :
1558 : /*-----------------------------------------------------------------*
1559 : * DoRTFT80_fx()
1560 : * a low complexity 2-dimensional DFT of 80 points
1561 : *-----------------------------------------------------------------*/
1562 :
1563 3640 : void DoRTFT80_fx(
1564 : Word32 *x, /* i/o: real part of input and output data Qx */
1565 : Word32 *y /* i/o: imaginary part of input and output data Qx */
1566 : )
1567 : {
1568 : Word16 j;
1569 :
1570 : /* Applying 16-point FFT for 5 times based on the address table Idx_dortft80 */
1571 21840 : FOR( j = 0; j < 5; j++ )
1572 : {
1573 18200 : fft16_ivas( x, y, Idx_dortft80 + shl( j, 4 ) );
1574 : }
1575 :
1576 : /* Applying 5-point FFT for 16 times based on the address table Idx_dortft80 */
1577 61880 : FOR( j = 0; j < 16; j++ )
1578 : {
1579 58240 : fft5_shift1( 16, x, y, Idx_dortft80 + j );
1580 : }
1581 :
1582 3640 : return;
1583 : }
1584 :
1585 : /*-----------------------------------------------------------------*
1586 : * DoRTFT120_fx()
1587 : * a low complexity 2-dimensional DFT of 120 points
1588 : *-----------------------------------------------------------------*/
1589 :
1590 0 : void DoRTFT120_fx(
1591 : Word32 *x, /* i/o: real part of input and output data Qx */
1592 : Word32 *y /* i/o: imaginary part of input and output data Qx */
1593 : )
1594 : {
1595 : Word16 j;
1596 :
1597 : /* Applying 8-point FFT for 15 times based on the address table Idx_dortft120 */
1598 0 : FOR( j = 0; j < 15; j++ )
1599 : {
1600 0 : fft8( x, y, Idx_dortft120 + shl( j, 3 ) );
1601 : }
1602 :
1603 : /* Applying 15-point FFT for 8 times based on the address table Idx_dortft120 */
1604 0 : FOR( j = 0; j < 8; j++ )
1605 : {
1606 0 : fft15_shift2( 8, x, y, Idx_dortft120 + j );
1607 : }
1608 :
1609 0 : return;
1610 : }
1611 :
1612 : /*-----------------------------------------------------------------*
1613 : * DoRTFT160_fx()
1614 : * a low complexity 2-dimensional DFT of 160 points
1615 : *-----------------------------------------------------------------*/
1616 :
1617 1298 : void DoRTFT160_fx(
1618 : Word32 x[], /* i/o: real part of input and output data Qx */
1619 : Word32 y[] /* i/o: imaginary part of input and output data Qx */
1620 : )
1621 : {
1622 : Word16 j;
1623 :
1624 : /* Applying 32-point FFT for 5 times based on the address table Idx_dortft160 */
1625 7788 : FOR( j = 0; j < 5; j++ )
1626 : {
1627 6490 : fft32_5( x, y, Idx_dortft160 + shl( j, 5 ) );
1628 : }
1629 :
1630 : /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */
1631 42834 : FOR( j = 0; j < 32; j++ )
1632 : {
1633 41536 : fft5_32( x, y, Idx_dortft160 + j );
1634 : }
1635 :
1636 1298 : return;
1637 : }
1638 :
1639 : /*-----------------------------------------------------------------*
1640 : * DoRTFT320_fx()
1641 : * a low complexity 2-dimensional DFT of 320 points
1642 : *-----------------------------------------------------------------*/
1643 :
1644 74942 : void DoRTFT320_fx(
1645 : Word32 *x, /* i/o: real part of input and output data Qx */
1646 : Word32 *y /* i/o: imaginary part of input and output data Qx */
1647 : )
1648 : {
1649 : Word16 j;
1650 :
1651 : /* Applying 64-point FFT for 5 times based on the address table Idx_dortft160 */
1652 449652 : FOR( j = 0; j < 5; j++ )
1653 : {
1654 374710 : fft64( x, y, Idx_dortft320 + shl( j, 6 ) );
1655 : }
1656 :
1657 : /* Applying 5-point FFT for 64 times based on the address table Idx_dortft160 */
1658 4871230 : FOR( j = 0; j < 64; j++ )
1659 : {
1660 4796288 : fft5_shift4( 64, x, y, Idx_dortft320 + j );
1661 : }
1662 :
1663 74942 : return;
1664 : }
1665 :
1666 : /*-----------------------------------------------------------------*
1667 : * DoRTFT480_fx()
1668 : * a low complexity 2-dimensional DFT of 480 points
1669 : *-----------------------------------------------------------------*/
1670 :
1671 0 : void DoRTFT480_fx(
1672 : Word32 *x, /* i/o: real part of input and output data Qx */
1673 : Word32 *y /* i/o: imaginary part of input and output data Qx */
1674 : )
1675 : {
1676 : Word16 j;
1677 :
1678 : /* Applying 32-point FFT for 15 times based on the address table Idx_dortft160 */
1679 0 : FOR( j = 0; j < 15; j++ )
1680 : {
1681 0 : fft32_15( x, y, Idx_dortft480 + shl( j, 5 ) );
1682 : }
1683 :
1684 : /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */
1685 0 : FOR( j = 0; j < 32; j++ )
1686 : {
1687 0 : fft15_shift8( 32, x, y, Idx_dortft480 + j );
1688 : }
1689 :
1690 0 : return;
1691 : }
1692 :
1693 : /*-----------------------------------------------------------------*
1694 : * DoRTFT40_fx()
1695 : * a low complexity 2-dimensional DFT of 40 points
1696 : *-----------------------------------------------------------------*/
1697 :
1698 0 : void DoRTFT40_fx(
1699 : Word32 *x, /* i/o: real part of input and output data Qx */
1700 : Word32 *y /* i/o: imaginary part of input and output data Qx */
1701 : )
1702 : {
1703 : Word16 j;
1704 : /* Applying 8-point FFT for 5 times based on the address table Idx_dortft40 */
1705 0 : FOR( j = 0; j < 5; j++ )
1706 : {
1707 0 : fft8_5( x, y, Idx_dortft40 + shl( j, 3 ) );
1708 : }
1709 :
1710 : /* Applying 5-point FFT for 8 times based on the address table Idx_dortft40 */
1711 0 : FOR( j = 0; j < 8; j++ )
1712 : {
1713 0 : fft5_8( 8, x, y, Idx_dortft40 + j );
1714 : }
1715 :
1716 0 : return;
1717 : }
1718 :
1719 : /*-----------------------------------------------------------------*
1720 : * DoRTFT20()
1721 : * a low complexity 2-dimensional DFT of 20 points
1722 : *-----------------------------------------------------------------*/
1723 :
1724 0 : void DoRTFT20_fx(
1725 : Word32 *x, /* i/o: real part of input and output data Qx */
1726 : Word32 *y /* i/o: imaginary part of input and output data Qx */
1727 : )
1728 : {
1729 : Word16 j;
1730 :
1731 : /* Applying 4-point FFT for 5 times based on the address table Idx_dortft20 */
1732 0 : FOR( j = 0; j < 5; j++ )
1733 : {
1734 0 : fft4_5( x, y, Idx_dortft20 + shl( j, 2 ) );
1735 : }
1736 :
1737 : /* Applying 5-point FFT for 4 times based on the address table Idx_dortft20 */
1738 0 : FOR( j = 0; j < 4; j++ )
1739 : {
1740 0 : fft5_4( 4, x, y, Idx_dortft20 + j );
1741 : }
1742 :
1743 0 : return;
1744 : }
1745 :
1746 : /*-----------------------------------------------------------------*
1747 : * DoRTFT128_fx()
1748 : * FFT with 128 points
1749 : *-----------------------------------------------------------------*/
1750 :
1751 0 : void DoRTFT128_fx(
1752 : Word32 *x, /* i/o: real part of input and output data Qx */
1753 : Word32 *y /* i/o: imaginary part of input and output data Qx */
1754 : )
1755 : {
1756 :
1757 : Word16 i;
1758 : Word32 z[256];
1759 :
1760 0 : FOR( i = 0; i < 128; i++ )
1761 : {
1762 0 : z[2 * i] = x[i];
1763 0 : move32();
1764 0 : z[( ( i << 1 ) + 1 )] = y[i];
1765 0 : move32();
1766 : }
1767 :
1768 0 : cdftForw( 256, z, Ip_fft128, w_fft128_fx );
1769 :
1770 0 : x[0] = z[0];
1771 0 : move32();
1772 0 : y[0] = z[1];
1773 0 : move32();
1774 0 : FOR( i = 1; i < 128; i++ )
1775 : {
1776 0 : x[128 - i] = z[2 * i];
1777 0 : move32();
1778 0 : y[128 - i] = z[( ( i << 1 ) + 1 )];
1779 0 : move32();
1780 : }
1781 :
1782 0 : return;
1783 : }
1784 :
1785 : /*-----------------------------------------------------------------*
1786 : * cdftForw()
1787 : * Main fuction of Complex Discrete Fourier Transform
1788 : *-----------------------------------------------------------------*/
1789 :
1790 1106196 : static void cdftForw(
1791 : Word16 n, /* i : data length of real and imag Q0 */
1792 : Word32 *a, /* i/o: input/output data Qx */
1793 : const Word16 *ip, /* i : work area for bit reversal Qx */
1794 : const Word16 *w /* i : cos/sin table Q15 */
1795 : )
1796 : {
1797 : /* bit reversal */
1798 1106196 : bitrv2_SR( n, ip + 2, a );
1799 :
1800 : /* Do FFT */
1801 1106196 : cftfsub( n, a, w );
1802 1106196 : }
1803 :
1804 : /*-----------------------------------------------------------------*
1805 : * bitrv2_SR()
1806 : * Bit reversal
1807 : *-----------------------------------------------------------------*/
1808 :
1809 1106196 : static void bitrv2_SR(
1810 : Word16 n, /* i : data length of real and imag Q0 */
1811 : const Word16 *ip, /* i/o: work area for bit reversal Q0 */
1812 : Word32 *a /* i/o: input/output data Qx */
1813 : )
1814 : {
1815 : Word16 j, j1, k, k1, m, m2;
1816 : Word16 l;
1817 : Word32 xr, xi, yr, yi;
1818 :
1819 1106196 : IF( EQ_16( n, 64 ) )
1820 : {
1821 6490 : m = 4;
1822 6490 : move16();
1823 6490 : l = -1;
1824 6490 : move16();
1825 : }
1826 1099706 : ELSE IF( EQ_16( n, 256 ) )
1827 : {
1828 0 : m = 8;
1829 0 : move16();
1830 0 : l = -1;
1831 0 : move16();
1832 : }
1833 1099706 : ELSE IF( EQ_16( n, 16 ) )
1834 : {
1835 0 : m = 2;
1836 0 : move16();
1837 0 : l = -1;
1838 0 : move16();
1839 : }
1840 : ELSE
1841 : {
1842 1099706 : l = n;
1843 1099706 : move16();
1844 1099706 : m = 1;
1845 1099706 : move16();
1846 :
1847 4682586 : WHILE( ( m << 3 ) < l )
1848 : {
1849 3582880 : l = shr( l, 1 );
1850 3582880 : m = shl( m, 1 );
1851 : }
1852 1099706 : l = sub( l, shl( m, 3 ) );
1853 : }
1854 :
1855 1106196 : m2 = shl( m, 1 );
1856 :
1857 1106196 : IF( l == 0 )
1858 : {
1859 2035466 : FOR( k = 0; k < m; k++ )
1860 : {
1861 4230964 : FOR( j = 0; j < k; j++ )
1862 : {
1863 2600332 : j1 = add( shl( j, 1 ), ip[k] );
1864 2600332 : k1 = add( shl( k, 1 ), ip[j] );
1865 2600332 : xr = a[j1]; // Qx
1866 2600332 : move32();
1867 2600332 : xi = a[j1 + 1]; // Qx
1868 2600332 : move32();
1869 2600332 : yr = a[k1]; // Qx
1870 2600332 : move32();
1871 2600332 : yi = a[k1 + 1]; // Qx
1872 2600332 : move32();
1873 2600332 : a[j1] = yr; // Qx
1874 2600332 : move32();
1875 2600332 : a[j1 + 1] = yi; // Qx
1876 2600332 : move32();
1877 2600332 : a[k1] = xr; // Qx
1878 2600332 : move32();
1879 2600332 : a[k1 + 1] = xi; // Qx
1880 2600332 : move32();
1881 2600332 : j1 = add( j1, m2 );
1882 2600332 : k1 = add( k1, 2 * m2 );
1883 2600332 : xr = a[j1];
1884 2600332 : move32();
1885 2600332 : xi = a[j1 + 1];
1886 2600332 : move32();
1887 2600332 : yr = a[k1];
1888 2600332 : move32();
1889 2600332 : yi = a[k1 + 1];
1890 2600332 : move32();
1891 2600332 : a[j1] = yr;
1892 2600332 : move32();
1893 2600332 : a[j1 + 1] = yi;
1894 2600332 : move32();
1895 2600332 : a[k1] = xr;
1896 2600332 : move32();
1897 2600332 : a[k1 + 1] = xi;
1898 2600332 : move32();
1899 2600332 : j1 = add( j1, m2 );
1900 2600332 : k1 = sub( k1, m2 );
1901 2600332 : xr = a[j1];
1902 2600332 : move32();
1903 2600332 : xi = a[j1 + 1];
1904 2600332 : move32();
1905 2600332 : yr = a[k1];
1906 2600332 : move32();
1907 2600332 : yi = a[k1 + 1];
1908 2600332 : move32();
1909 2600332 : a[j1] = yr;
1910 2600332 : move32();
1911 2600332 : a[j1 + 1] = yi;
1912 2600332 : move32();
1913 2600332 : a[k1] = xr;
1914 2600332 : move32();
1915 2600332 : a[k1 + 1] = xi;
1916 2600332 : move32();
1917 2600332 : j1 = add( j1, m2 );
1918 2600332 : k1 = add( k1, shl( m2, 1 ) );
1919 2600332 : xr = a[j1];
1920 2600332 : move32();
1921 2600332 : xi = a[j1 + 1];
1922 2600332 : move32();
1923 2600332 : yr = a[k1];
1924 2600332 : move32();
1925 2600332 : yi = a[k1 + 1];
1926 2600332 : move32();
1927 2600332 : a[j1] = yr;
1928 2600332 : move32();
1929 2600332 : a[j1 + 1] = yi;
1930 2600332 : move32();
1931 2600332 : a[k1] = xr;
1932 2600332 : move32();
1933 2600332 : a[k1 + 1] = xi;
1934 2600332 : move32();
1935 : }
1936 :
1937 1630632 : j1 = add( shl( k, 1 ), add( m2, ip[k] ) );
1938 1630632 : k1 = add( j1, m2 );
1939 1630632 : xr = a[j1];
1940 1630632 : move32();
1941 1630632 : xi = a[j1 + 1];
1942 1630632 : move32();
1943 1630632 : yr = a[k1];
1944 1630632 : move32();
1945 1630632 : yi = a[k1 + 1];
1946 1630632 : move32();
1947 1630632 : a[j1] = yr;
1948 1630632 : move32();
1949 1630632 : a[j1 + 1] = yi;
1950 1630632 : move32();
1951 1630632 : a[k1] = xr;
1952 1630632 : move32();
1953 1630632 : a[k1 + 1] = xi;
1954 1630632 : move32();
1955 : }
1956 : }
1957 : ELSE
1958 : {
1959 11143912 : FOR( k = 1; k < m; k++ )
1960 : {
1961 93866130 : FOR( j = 0; j < k; j++ )
1962 : {
1963 83423580 : j1 = add( shl( j, 1 ), ip[k] );
1964 83423580 : k1 = add( shl( k, 1 ), ip[j] );
1965 83423580 : xr = a[j1];
1966 83423580 : move32();
1967 83423580 : xi = a[j1 + 1];
1968 83423580 : move32();
1969 83423580 : yr = a[k1];
1970 83423580 : move32();
1971 83423580 : yi = a[k1 + 1];
1972 83423580 : move32();
1973 83423580 : a[j1] = yr;
1974 83423580 : move32();
1975 83423580 : a[j1 + 1] = yi;
1976 83423580 : move32();
1977 83423580 : a[k1] = xr;
1978 83423580 : move32();
1979 83423580 : a[k1 + 1] = xi;
1980 83423580 : move32();
1981 83423580 : j1 = add( j1, m2 );
1982 83423580 : k1 = add( k1, m2 );
1983 83423580 : xr = a[j1];
1984 83423580 : move32();
1985 83423580 : xi = a[j1 + 1];
1986 83423580 : move32();
1987 83423580 : yr = a[k1];
1988 83423580 : move32();
1989 83423580 : yi = a[k1 + 1];
1990 83423580 : move32();
1991 83423580 : a[j1] = yr;
1992 83423580 : move32();
1993 83423580 : a[j1 + 1] = yi;
1994 83423580 : move32();
1995 83423580 : a[k1] = xr;
1996 83423580 : move32();
1997 83423580 : a[k1 + 1] = xi;
1998 83423580 : move32();
1999 : }
2000 : }
2001 : }
2002 :
2003 1106196 : return;
2004 : }
2005 :
2006 : /*-----------------------------------------------------------------*
2007 : * cftfsub()
2008 : * Complex Discrete Fourier Transform
2009 : *-----------------------------------------------------------------*/
2010 :
2011 1106196 : static void cftfsub(
2012 : Word16 n, /* i : data length of real and imag Q0 */
2013 : Word32 *a, /* i/o: input/output data Qx */
2014 : const Word16 *w /* i : cos/sin table Q15 */
2015 : )
2016 : {
2017 : Word16 j, j1, j2, j3, l;
2018 : Word32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
2019 :
2020 1106196 : l = 2;
2021 1106196 : move16();
2022 :
2023 1106196 : IF( GT_16( n, 8 ) )
2024 : {
2025 1106196 : cft1st( n, a, w );
2026 :
2027 1106196 : l = 8;
2028 1106196 : move16();
2029 :
2030 3595860 : WHILE( ( ( l << 2 ) < n ) )
2031 : {
2032 2489664 : cftmdl( n, l, a, w );
2033 2489664 : l = shl( l, 2 );
2034 : }
2035 : }
2036 :
2037 1106196 : IF( EQ_16( shl( l, 2 ), n ) )
2038 : {
2039 7236130 : FOR( j = 0; j < l; j += 2 )
2040 : {
2041 6831296 : j1 = add( j, l );
2042 6831296 : j2 = add( j1, l );
2043 6831296 : j3 = add( j2, l );
2044 6831296 : x0r = L_add( a[j], a[j1] ); // Qx
2045 6831296 : x0i = L_add( a[j + 1], a[j1 + 1] ); // Qx
2046 6831296 : x1r = L_sub( a[j], a[j1] ); // Qx
2047 6831296 : x1i = L_sub( a[j + 1], a[j1 + 1] ); // Qx
2048 6831296 : x2r = L_add( a[j2], a[j3] ); // Qx
2049 6831296 : x2i = L_add( a[j2 + 1], a[j3 + 1] ); // Qx
2050 6831296 : x3r = L_sub( a[j2], a[j3] ); // Qx
2051 6831296 : x3i = L_sub( a[j2 + 1], a[j3 + 1] ); // Qx
2052 6831296 : a[j] = L_add( x0r, x2r );
2053 6831296 : move32();
2054 6831296 : a[j + 1] = L_add( x0i, x2i );
2055 6831296 : move32();
2056 6831296 : a[j2] = L_sub( x0r, x2r );
2057 6831296 : move32();
2058 6831296 : a[j2 + 1] = L_sub( x0i, x2i );
2059 6831296 : move32();
2060 6831296 : a[j1] = L_sub( x1r, x3i );
2061 6831296 : move32();
2062 6831296 : a[j1 + 1] = L_add( x1i, x3r );
2063 6831296 : move32();
2064 6831296 : a[j3] = L_add( x1r, x3i );
2065 6831296 : move32();
2066 6831296 : a[j3 + 1] = L_sub( x1i, x3r );
2067 6831296 : move32();
2068 : }
2069 : }
2070 : ELSE
2071 : {
2072 178692434 : FOR( j = 0; j < l; j += 2 )
2073 : {
2074 177991072 : j1 = add( j, l );
2075 177991072 : x0r = L_sub( a[j], a[j1] );
2076 177991072 : x0i = L_sub( a[j + 1], a[j1 + 1] );
2077 177991072 : a[j] = L_add( a[j], a[j1] );
2078 177991072 : move32();
2079 177991072 : a[j + 1] = L_add( a[j + 1], a[j1 + 1] );
2080 177991072 : move32();
2081 177991072 : a[j1] = x0r;
2082 177991072 : move32();
2083 177991072 : a[j1 + 1] = x0i;
2084 177991072 : move32();
2085 : }
2086 : }
2087 :
2088 1106196 : return;
2089 : }
2090 :
2091 : /*-----------------------------------------------------------------*
2092 : * cft1st()
2093 : * Subfunction of Complex Discrete Fourier Transform
2094 : *-----------------------------------------------------------------*/
2095 :
2096 1106196 : static void cft1st(
2097 : Word16 n, /* i : data length of real and imag Q0 */
2098 : Word32 *a, /* i/o: input/output data Qx */
2099 : const Word16 *w /* i : cos/sin table Q15 */
2100 : )
2101 : {
2102 : Word16 j, k1, k2;
2103 : Word16 wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, wtmp;
2104 : Word32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
2105 :
2106 1106196 : x0r = L_add( a[0], a[2] ); // Qx
2107 1106196 : x0i = L_add( a[1], a[3] ); // Qx
2108 1106196 : x1r = L_sub( a[0], a[2] ); // Qx
2109 1106196 : x1i = L_sub( a[1], a[3] ); // Qx
2110 1106196 : x2r = L_add( a[4], a[6] ); // Qx
2111 1106196 : x2i = L_add( a[5], a[7] ); // Qx
2112 1106196 : x3r = L_sub( a[4], a[6] ); // Qx
2113 1106196 : x3i = L_sub( a[5], a[7] ); // Qx
2114 1106196 : a[0] = L_add( x0r, x2r );
2115 1106196 : move32();
2116 1106196 : a[1] = L_add( x0i, x2i );
2117 1106196 : move32();
2118 1106196 : a[4] = L_sub( x0r, x2r );
2119 1106196 : move32();
2120 1106196 : a[5] = L_sub( x0i, x2i );
2121 1106196 : move32();
2122 1106196 : a[2] = L_sub( x1r, x3i );
2123 1106196 : move32();
2124 1106196 : a[3] = L_add( x1i, x3r );
2125 1106196 : move32();
2126 1106196 : a[6] = L_add( x1r, x3i );
2127 1106196 : move32();
2128 1106196 : a[7] = L_sub( x1i, x3r );
2129 1106196 : move32();
2130 1106196 : wk1r = w[2];
2131 1106196 : x0r = L_add( a[8], a[10] );
2132 1106196 : x0i = L_add( a[9], a[11] );
2133 1106196 : x1r = L_sub( a[8], a[10] );
2134 1106196 : x1i = L_sub( a[9], a[11] );
2135 1106196 : x2r = L_add( a[12], a[14] );
2136 1106196 : x2i = L_add( a[13], a[15] );
2137 1106196 : x3r = L_sub( a[12], a[14] );
2138 1106196 : x3i = L_sub( a[13], a[15] );
2139 1106196 : a[8] = L_add( x0r, x2r );
2140 1106196 : move32();
2141 1106196 : a[9] = L_add( x0i, x2i );
2142 1106196 : move32();
2143 1106196 : a[12] = L_sub( x2i, x0i );
2144 1106196 : move32();
2145 1106196 : a[13] = L_sub( x0r, x2r );
2146 1106196 : move32();
2147 1106196 : x0r = L_sub( x1r, x3i );
2148 1106196 : x0i = L_add( x1i, x3r );
2149 1106196 : a[10] = Mpy_32_16_1( L_sub( x0r, x0i ), wk1r );
2150 1106196 : move32();
2151 1106196 : a[11] = Mpy_32_16_1( L_add( x0r, x0i ), wk1r );
2152 1106196 : move32();
2153 1106196 : x0r = L_add( x3i, x1r );
2154 1106196 : x0i = L_sub( x3r, x1i );
2155 1106196 : a[14] = Mpy_32_16_1( L_sub( x0i, x0r ), wk1r );
2156 1106196 : move32();
2157 1106196 : a[15] = Mpy_32_16_1( L_add( x0i, x0r ), wk1r );
2158 1106196 : move32();
2159 1106196 : k1 = 0;
2160 1106196 : move16();
2161 :
2162 47913416 : FOR( j = 16; j < n; j += 16 )
2163 : {
2164 46807220 : k1 = add( k1, 2 );
2165 46807220 : k2 = shl( k1, 1 );
2166 46807220 : wk2r = w[k1];
2167 46807220 : move16();
2168 46807220 : wk2i = w[k1 + 1];
2169 46807220 : move16();
2170 46807220 : wk1r = w[k2];
2171 46807220 : move16();
2172 46807220 : wk1i = w[k2 + 1];
2173 46807220 : move16();
2174 46807220 : wtmp = mult_r( wk2i, wk1i );
2175 46807220 : wk3r = sub( wk1r, wtmp );
2176 46807220 : wk3r = sub( wk3r, wtmp );
2177 46807220 : wtmp = mult_r( wk2i, wk1r );
2178 46807220 : wk3i = sub( wtmp, wk1i );
2179 46807220 : wk3i = add( wtmp, wk3i );
2180 46807220 : x0r = L_add( a[j], a[j + 2] );
2181 46807220 : x0i = L_add( a[j + 1], a[j + 3] );
2182 46807220 : x1r = L_sub( a[j], a[j + 2] );
2183 46807220 : x1i = L_sub( a[j + 1], a[j + 3] );
2184 46807220 : x2r = L_add( a[j + 4], a[j + 6] );
2185 46807220 : x2i = L_add( a[j + 5], a[j + 7] );
2186 46807220 : x3r = L_sub( a[j + 4], a[j + 6] );
2187 46807220 : x3i = L_sub( a[j + 5], a[j + 7] );
2188 46807220 : a[j] = L_add( x0r, x2r );
2189 46807220 : move32();
2190 46807220 : a[j + 1] = L_add( x0i, x2i );
2191 46807220 : move32();
2192 46807220 : x0r = L_sub( x0r, x2r );
2193 46807220 : x0i = L_sub( x0i, x2i );
2194 46807220 : a[j + 4] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) );
2195 46807220 : move32();
2196 46807220 : a[j + 5] = L_add( Mpy_32_16_1( x0i, wk2r ), Mpy_32_16_1( x0r, wk2i ) );
2197 46807220 : move32();
2198 46807220 : x0r = L_sub( x1r, x3i );
2199 46807220 : x0i = L_add( x1i, x3r );
2200 46807220 : a[j + 2] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) );
2201 46807220 : move32();
2202 46807220 : a[j + 3] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) );
2203 46807220 : move32();
2204 46807220 : x0r = L_add( x1r, x3i );
2205 46807220 : x0i = L_sub( x1i, x3r );
2206 46807220 : a[j + 6] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) );
2207 46807220 : move32();
2208 46807220 : a[j + 7] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) );
2209 46807220 : move32();
2210 46807220 : wk1r = w[k2 + 2];
2211 46807220 : move16();
2212 46807220 : wk1i = w[k2 + 3];
2213 46807220 : move16();
2214 46807220 : wtmp = mult_r( wk2r, wk1i );
2215 46807220 : wk3r = sub( wk1r, wtmp );
2216 46807220 : wk3r = sub( wk3r, wtmp );
2217 46807220 : wtmp = mult_r( wk2r, wk1r );
2218 46807220 : wk3i = sub( wtmp, wk1i );
2219 46807220 : wk3i = add( wtmp, wk3i );
2220 46807220 : x0r = L_add( a[j + 8], a[j + 10] );
2221 46807220 : x0i = L_add( a[j + 9], a[j + 11] );
2222 46807220 : x1r = L_sub( a[j + 8], a[j + 10] );
2223 46807220 : x1i = L_sub( a[j + 9], a[j + 11] );
2224 46807220 : x2r = L_add( a[j + 12], a[j + 14] );
2225 46807220 : x2i = L_add( a[j + 13], a[j + 15] );
2226 46807220 : x3r = L_sub( a[j + 12], a[j + 14] );
2227 46807220 : x3i = L_sub( a[j + 13], a[j + 15] );
2228 46807220 : a[j + 8] = L_add( x0r, x2r );
2229 46807220 : move32();
2230 46807220 : a[j + 9] = L_add( x0i, x2i );
2231 46807220 : move32();
2232 46807220 : x0r = L_sub( x0r, x2r );
2233 46807220 : x0i = L_sub( x0i, x2i );
2234 46807220 : a[j + 12] = L_negate( L_add( Mpy_32_16_1( x0r, wk2i ), Mpy_32_16_1( x0i, wk2r ) ) );
2235 46807220 : move32();
2236 46807220 : a[j + 13] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) );
2237 46807220 : move32();
2238 46807220 : x0r = L_sub( x1r, x3i );
2239 46807220 : x0i = L_add( x1i, x3r );
2240 46807220 : a[j + 10] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) );
2241 46807220 : move32();
2242 46807220 : a[j + 11] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) );
2243 46807220 : x0r = L_add( x1r, x3i );
2244 46807220 : x0i = L_sub( x1i, x3r );
2245 46807220 : a[j + 14] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) );
2246 46807220 : move32();
2247 46807220 : a[j + 15] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) );
2248 46807220 : move32();
2249 : }
2250 :
2251 1106196 : return;
2252 : }
2253 :
2254 : /*-----------------------------------------------------------------*
2255 : * cftmdl()
2256 : * Subfunction of Complex Discrete Fourier Transform
2257 : *-----------------------------------------------------------------*/
2258 :
2259 2489664 : static void cftmdl(
2260 : Word16 n, /* i : data length of real and imag Q0 */
2261 : Word16 l, /* i : initial shift for processing Q0 */
2262 : Word32 *a, /* i/o: input/output data Qx */
2263 : const Word16 *w /* i : cos/sin table Q15 */
2264 : )
2265 : {
2266 : Word16 j, j1, j2, j3, k, k1, k2, m, m2;
2267 : Word16 wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, wtmp;
2268 : Word32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
2269 :
2270 2489664 : m = shl( l, 2 );
2271 62622192 : FOR( j = 0; j < l; j += 2 )
2272 : {
2273 60132528 : j1 = add( j, l );
2274 60132528 : j2 = add( j1, l );
2275 60132528 : j3 = add( j2, l );
2276 60132528 : x0r = L_add( a[j], a[j1] ); // Qx
2277 60132528 : x0i = L_add( a[j + 1], a[j1 + 1] ); // Qx
2278 60132528 : x1r = L_sub( a[j], a[j1] ); // Qx
2279 60132528 : x1i = L_sub( a[j + 1], a[j1 + 1] ); // Qx
2280 60132528 : x2r = L_add( a[j2], a[j3] ); // Qx
2281 60132528 : x2i = L_add( a[j2 + 1], a[j3 + 1] ); // Qx
2282 60132528 : x3r = L_sub( a[j2], a[j3] ); // Qx
2283 60132528 : x3i = L_sub( a[j2 + 1], a[j3 + 1] ); // Qx
2284 60132528 : a[j] = L_add( x0r, x2r );
2285 60132528 : move32();
2286 60132528 : a[j + 1] = L_add( x0i, x2i );
2287 60132528 : move32();
2288 60132528 : a[j2] = L_sub( x0r, x2r );
2289 60132528 : move32();
2290 60132528 : a[j2 + 1] = L_sub( x0i, x2i );
2291 60132528 : move32();
2292 60132528 : a[j1] = L_sub( x1r, x3i );
2293 60132528 : move32();
2294 60132528 : a[j1 + 1] = L_add( x1i, x3r );
2295 60132528 : move32();
2296 60132528 : a[j3] = L_add( x1r, x3i );
2297 60132528 : move32();
2298 60132528 : a[j3 + 1] = L_sub( x1i, x3r );
2299 60132528 : move32();
2300 : }
2301 :
2302 2489664 : wk1r = w[2];
2303 2489664 : move16();
2304 62622192 : FOR( j = m; j < l + m; j += 2 )
2305 : {
2306 60132528 : j1 = add( j, l );
2307 60132528 : j2 = add( j1, l );
2308 60132528 : j3 = add( j2, l );
2309 60132528 : x0r = L_add( a[j], a[j1] );
2310 60132528 : x0i = L_add( a[j + 1], a[j1 + 1] );
2311 60132528 : x1r = L_sub( a[j], a[j1] );
2312 60132528 : x1i = L_sub( a[j + 1], a[j1 + 1] );
2313 60132528 : x2r = L_add( a[j2], a[j3] );
2314 60132528 : x2i = L_add( a[j2 + 1], a[j3 + 1] );
2315 60132528 : x3r = L_sub( a[j2], a[j3] );
2316 60132528 : x3i = L_sub( a[j2 + 1], a[j3 + 1] );
2317 60132528 : a[j] = L_add( x0r, x2r );
2318 60132528 : move32();
2319 60132528 : a[j + 1] = L_add( x0i, x2i );
2320 60132528 : move32();
2321 60132528 : a[j2] = L_sub( x2i, x0i );
2322 60132528 : move32();
2323 60132528 : a[j2 + 1] = L_sub( x0r, x2r );
2324 60132528 : move32();
2325 60132528 : x0r = L_sub( x1r, x3i );
2326 60132528 : x0i = L_add( x1i, x3r );
2327 60132528 : a[j1] = Mpy_32_16_1( L_sub( x0r, x0i ), wk1r );
2328 60132528 : move32();
2329 60132528 : a[j1 + 1] = Mpy_32_16_1( L_add( x0r, x0i ), wk1r );
2330 60132528 : move32();
2331 60132528 : x0r = L_add( x3i, x1r );
2332 60132528 : x0i = L_sub( x3r, x1i );
2333 60132528 : a[j3] = Mpy_32_16_1( L_sub( x0i, x0r ), wk1r );
2334 60132528 : move32();
2335 60132528 : a[j3 + 1] = Mpy_32_16_1( L_add( x0i, x0r ), wk1r );
2336 60132528 : move32();
2337 : }
2338 :
2339 2489664 : k1 = 0;
2340 2489664 : move16();
2341 2489664 : m2 = shl( m, 1 );
2342 15467462 : FOR( k = m2; k < n; k += m2 )
2343 : {
2344 12977798 : k1 = add( k1, 2 );
2345 12977798 : k2 = shl( k1, 1 );
2346 12977798 : wk2r = w[k1];
2347 12977798 : move16();
2348 12977798 : wk2i = w[k1 + 1];
2349 12977798 : move16();
2350 12977798 : wk1r = w[k2];
2351 12977798 : move16();
2352 12977798 : wk1i = w[k2 + 1];
2353 12977798 : move16();
2354 12977798 : wtmp = mult_r( wk2i, wk1i );
2355 12977798 : wk3r = sub( wk1r, wtmp );
2356 12977798 : wk3r = sub( wk3r, wtmp );
2357 12977798 : wtmp = mult_r( wk2i, wk1r );
2358 12977798 : wk3i = sub( wtmp, wk1i );
2359 12977798 : wk3i = add( wtmp, wk3i );
2360 90047470 : FOR( j = k; j < l + k; j += 2 )
2361 : {
2362 77069672 : j1 = add( j, l );
2363 77069672 : j2 = add( j1, l );
2364 77069672 : j3 = add( j2, l );
2365 77069672 : x0r = L_add( a[j], a[j1] );
2366 77069672 : x0i = L_add( a[j + 1], a[j1 + 1] );
2367 77069672 : x1r = L_sub( a[j], a[j1] );
2368 77069672 : x1i = L_sub( a[j + 1], a[j1 + 1] );
2369 77069672 : x2r = L_add( a[j2], a[j3] );
2370 77069672 : x2i = L_add( a[j2 + 1], a[j3 + 1] );
2371 77069672 : x3r = L_sub( a[j2], a[j3] );
2372 77069672 : x3i = L_sub( a[j2 + 1], a[j3 + 1] );
2373 77069672 : a[j] = L_add( x0r, x2r );
2374 77069672 : move32();
2375 77069672 : a[j + 1] = L_add( x0i, x2i );
2376 77069672 : move32();
2377 77069672 : x0r = L_sub( x0r, x2r );
2378 77069672 : x0i = L_sub( x0i, x2i );
2379 77069672 : a[j2] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) ); // Qx
2380 77069672 : move32();
2381 77069672 : a[j2 + 1] = L_add( Mpy_32_16_1( x0i, wk2r ), Mpy_32_16_1( x0r, wk2i ) ); // Qx
2382 77069672 : move32();
2383 77069672 : x0r = L_sub( x1r, x3i );
2384 77069672 : x0i = L_add( x1i, x3r );
2385 77069672 : a[j1] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) ); // Qx
2386 77069672 : move32();
2387 77069672 : a[j1 + 1] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) ); // Qx
2388 77069672 : move32();
2389 77069672 : x0r = L_add( x1r, x3i );
2390 77069672 : x0i = L_sub( x1i, x3r );
2391 77069672 : a[j3] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) ); // Qx
2392 77069672 : move32();
2393 77069672 : a[j3 + 1] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) ); // Qx
2394 77069672 : move32();
2395 : }
2396 :
2397 12977798 : wk1r = w[k2 + 2];
2398 12977798 : move16();
2399 12977798 : wk1i = w[k2 + 3];
2400 12977798 : move16();
2401 12977798 : wtmp = mult_r( wk2r, wk1i );
2402 12977798 : wk3r = sub( wk1r, wtmp );
2403 12977798 : wk3r = sub( wk3r, wtmp );
2404 12977798 : wtmp = mult_r( wk2r, wk1r );
2405 12977798 : wk3i = sub( wtmp, wk1i );
2406 12977798 : wk3i = add( wtmp, wk3i );
2407 90047470 : FOR( j = k + m; j < l + ( k + m ); j += 2 )
2408 : {
2409 77069672 : j1 = add( j, l );
2410 77069672 : j2 = add( j1, l );
2411 77069672 : j3 = add( j2, l );
2412 77069672 : x0r = L_add( a[j], a[j1] );
2413 77069672 : x0i = L_add( a[j + 1], a[j1 + 1] );
2414 77069672 : x1r = L_sub( a[j], a[j1] );
2415 77069672 : x1i = L_sub( a[j + 1], a[j1 + 1] );
2416 77069672 : x2r = L_add( a[j2], a[j3] );
2417 77069672 : x2i = L_add( a[j2 + 1], a[j3 + 1] );
2418 77069672 : x3r = L_sub( a[j2], a[j3] );
2419 77069672 : x3i = L_sub( a[j2 + 1], a[j3 + 1] );
2420 77069672 : a[j] = L_add( x0r, x2r );
2421 77069672 : move32();
2422 77069672 : a[j + 1] = L_add( x0i, x2i );
2423 77069672 : move32();
2424 77069672 : x0r = L_sub( x0r, x2r );
2425 77069672 : x0i = L_sub( x0i, x2i );
2426 77069672 : a[j2] = L_negate( L_add( Mpy_32_16_1( x0r, wk2i ), Mpy_32_16_1( x0i, wk2r ) ) ); // Qx
2427 77069672 : move32();
2428 77069672 : a[j2 + 1] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) ); // Qx
2429 77069672 : move32();
2430 77069672 : x0r = L_sub( x1r, x3i );
2431 77069672 : x0i = L_add( x1i, x3r );
2432 77069672 : a[j1] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) ); // Qx
2433 77069672 : move32();
2434 77069672 : a[j1 + 1] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) ); // Qx
2435 77069672 : move32();
2436 77069672 : x0r = L_add( x1r, x3i );
2437 77069672 : x0i = L_sub( x1i, x3r );
2438 77069672 : a[j3] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) ); // Qx
2439 77069672 : move32();
2440 77069672 : a[j3 + 1] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) ); // Qx
2441 77069672 : move32();
2442 : }
2443 : }
2444 :
2445 2489664 : return;
2446 : }
2447 :
2448 0 : static void cftbsub(
2449 : Word16 n, // Q0
2450 : Word32 *a, // Qx
2451 : const Word16 *w /* i : cos/sin table Q15 */
2452 : )
2453 : {
2454 : Word16 j, j1, j2, j3, l;
2455 : Word32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
2456 :
2457 0 : l = 2;
2458 0 : move16();
2459 0 : IF( GT_16( n, 8 ) )
2460 : {
2461 0 : cft1st( n, a, w );
2462 0 : l = 8;
2463 0 : move16();
2464 :
2465 0 : WHILE( ( ( l << 2 ) < n ) )
2466 : {
2467 0 : cftmdl( n, l, a, w );
2468 0 : l = shl( l, 2 );
2469 : }
2470 : }
2471 :
2472 0 : IF( EQ_16( shl( l, 2 ), n ) )
2473 : {
2474 0 : FOR( j = 0; j < l; j += 2 )
2475 : {
2476 0 : j1 = add( j, l );
2477 0 : j2 = add( j1, l );
2478 0 : j3 = add( j2, l );
2479 0 : x0r = L_add( a[j], a[j1] ); // Qx
2480 0 : x0i = L_negate( L_add( a[j + 1], a[j1 + 1] ) ); // Qx
2481 0 : x1r = L_sub( a[j], a[j1] ); // Qx
2482 0 : x1i = L_sub( a[j1 + 1], a[j + 1] ); // Qx
2483 0 : x2r = L_add( a[j2], a[j3] ); // Qx
2484 0 : x2i = L_add( a[j2 + 1], a[j3 + 1] ); // Qx
2485 0 : x3r = L_sub( a[j2], a[j3] ); // Qx
2486 0 : x3i = L_sub( a[j2 + 1], a[j3 + 1] ); // Qx
2487 0 : a[j] = L_add( x0r, x2r );
2488 0 : move32();
2489 0 : a[j + 1] = L_sub( x0i, x2i );
2490 0 : move32();
2491 0 : a[j2] = L_sub( x0r, x2r );
2492 0 : move32();
2493 0 : a[j2 + 1] = L_add( x0i, x2i );
2494 0 : move32();
2495 0 : a[j1] = L_sub( x1r, x3i );
2496 0 : move32();
2497 0 : a[j1 + 1] = L_sub( x1i, x3r );
2498 0 : move32();
2499 0 : a[j3] = L_add( x1r, x3i );
2500 0 : move32();
2501 0 : a[j3 + 1] = L_add( x1i, x3r );
2502 0 : move32();
2503 : }
2504 : }
2505 : ELSE
2506 : {
2507 0 : FOR( j = 0; j < l; j += 2 )
2508 : {
2509 0 : j1 = add( j, l );
2510 0 : x0r = L_sub( a[j], a[j1] );
2511 0 : x0i = L_sub( a[j1 + 1], a[j + 1] );
2512 0 : a[j] = L_add( a[j], a[j1] );
2513 0 : move32();
2514 0 : a[j + 1] = L_negate( L_add( a[j + 1], a[j1 + 1] ) );
2515 0 : move32();
2516 0 : a[j1] = x0r;
2517 0 : move32();
2518 0 : a[j1 + 1] = x0i;
2519 0 : move32();
2520 : }
2521 : }
2522 :
2523 0 : return;
2524 : }
2525 :
2526 0 : static void rftfsub(
2527 : Word16 n, // Q0
2528 : Word32 *a, // Qx
2529 : Word16 nc, // Q0
2530 : const Word16 *c // Q15
2531 : )
2532 : {
2533 : Word16 j, k, kk, ks, m;
2534 : Word16 wkr, wki;
2535 : Word32 xr, xi, yr, yi;
2536 :
2537 0 : m = shr( n, 1 );
2538 0 : ks = idiv1616( shl( nc, 1 ), m );
2539 0 : kk = 0;
2540 0 : move16();
2541 0 : FOR( j = 2; j < m; j += 2 )
2542 : {
2543 0 : k = sub( n, j );
2544 0 : kk = add( kk, ks );
2545 0 : wkr = sub( extract_l( 0x4000 ) /*0.5.Q15*/, c[( nc - kk )] );
2546 0 : wki = c[kk]; // Q15
2547 0 : move16();
2548 0 : xr = L_sub( a[j], a[k] );
2549 0 : xi = L_add( a[j + 1], a[k + 1] );
2550 0 : yr = L_sub( Mpy_32_16_1( xr, wkr ), Mpy_32_16_1( xi, wki ) );
2551 0 : yi = L_add( Mpy_32_16_1( xi, wkr ), Mpy_32_16_1( xr, wki ) );
2552 0 : a[j] = L_sub( a[j], yr );
2553 0 : move32();
2554 0 : a[j + 1] = L_sub( a[j + 1], yi );
2555 0 : move32();
2556 0 : a[k] = L_add( a[k], yr );
2557 0 : move32();
2558 0 : a[k + 1] = L_sub( a[k + 1], yi );
2559 0 : move32();
2560 : }
2561 :
2562 0 : return;
2563 : }
2564 :
2565 :
2566 0 : static void rftbsub(
2567 : Word16 n, // Q0
2568 : Word32 *a, // Qx
2569 : Word16 nc, // Q0
2570 : const Word16 *c // Q15
2571 : )
2572 : {
2573 : Word16 j, k, kk, ks, m;
2574 : Word16 wkr, wki;
2575 : Word32 xr, xi, yr, yi;
2576 0 : a[1] = L_negate( a[1] );
2577 0 : move32();
2578 0 : m = shr( n, 1 );
2579 0 : ks = idiv1616( shl( nc, 1 ), m );
2580 0 : kk = 0;
2581 0 : move16();
2582 0 : FOR( j = 2; j < m; j += 2 )
2583 : {
2584 0 : k = sub( n, j );
2585 0 : kk = add( kk, ks );
2586 0 : wkr = sub( extract_l( 0x4000 ) /*0.5.Q15*/, c[( nc - kk )] );
2587 0 : wki = c[kk]; // Q15
2588 0 : xr = L_sub( a[j], a[k] );
2589 0 : xi = L_add( a[j + 1], a[k + 1] );
2590 0 : yr = L_add( Mpy_32_16_1( xr, wkr ), Mpy_32_16_1( xi, wki ) ); // Qx
2591 0 : yi = L_sub( Mpy_32_16_1( xi, wkr ), Mpy_32_16_1( xr, wki ) ); // Qx
2592 0 : a[j] = L_sub( a[j], yr );
2593 0 : move32();
2594 0 : a[j + 1] = L_sub( yi, a[j + 1] );
2595 0 : move32();
2596 0 : a[k] = L_add( a[k], yr );
2597 0 : move32();
2598 0 : a[k + 1] = L_sub( yi, a[k + 1] );
2599 0 : move32();
2600 : }
2601 0 : a[m + 1] = L_negate( a[m + 1] );
2602 :
2603 0 : return;
2604 : }
2605 :
2606 :
2607 0 : static void dctsub(
2608 : Word16 n, // Q0
2609 : Word32 *a, // Qx
2610 : Word16 nc, // Q0
2611 : const Word16 *c // Q15
2612 : )
2613 : {
2614 : Word16 j, k, kk, ks, m;
2615 : Word16 wkr, wki;
2616 : Word32 xr;
2617 :
2618 0 : m = shr( n, 1 );
2619 0 : ks = idiv1616( nc, n );
2620 0 : kk = 0;
2621 0 : move16();
2622 0 : FOR( j = 1; j < m; j++ )
2623 : {
2624 0 : k = sub( n, j );
2625 0 : kk = add( kk, ks );
2626 0 : wkr = sub( c[kk], c[( nc - kk )] ); // Q15
2627 0 : wki = add( c[kk], c[( nc - kk )] ); // Q15
2628 0 : xr = L_sub( Mpy_32_16_1( a[j], wki ), Mpy_32_16_1( a[k], wkr ) ); // Qx
2629 0 : a[j] = L_add( Mpy_32_16_1( a[j], wkr ), Mpy_32_16_1( a[k], wki ) ); // Qx
2630 0 : move32();
2631 0 : a[k] = xr;
2632 0 : move32();
2633 : }
2634 0 : a[m] = Mpy_32_16_1( a[m], c[0] ); // Qx
2635 0 : move32();
2636 :
2637 0 : return;
2638 : }
2639 :
2640 : /*-----------------------------------------------------------------*
2641 : * edct2_fx_ivas()
2642 : *
2643 : * Transformation of the signal to DCT domain
2644 : * OR Inverse EDCT-II for short frames
2645 : *-----------------------------------------------------------------*/
2646 :
2647 0 : void edct2_fx_ivas(
2648 : const Word16 n, // Q0
2649 : const Word16 isgn,
2650 : Word32 *in, // Qx
2651 : Word32 *a, // Qx
2652 : const Word16 *ip,
2653 : const Word16 *w // Q15
2654 : )
2655 : {
2656 : Word16 j, nw, nc;
2657 : Word32 xr;
2658 :
2659 0 : Copy32( in, a, n );
2660 :
2661 0 : nw = ip[0];
2662 0 : move16();
2663 0 : IF( GT_16( n, shl( nw, 2 ) ) )
2664 : {
2665 0 : nw = shr( n, 2 );
2666 : }
2667 :
2668 0 : nc = ip[1];
2669 0 : move16();
2670 0 : if ( GT_16( n, nc ) )
2671 : {
2672 0 : nc = n;
2673 0 : move16();
2674 : }
2675 0 : IF( isgn < 0 )
2676 : {
2677 0 : xr = a[n - 1];
2678 0 : move16();
2679 0 : FOR( j = n - 2; j >= 2; j -= 2 )
2680 : {
2681 0 : a[j + 1] = L_sub( a[j], a[j - 1] );
2682 0 : move32();
2683 0 : a[j] = L_add( a[j], a[j - 1] );
2684 0 : move32();
2685 : }
2686 0 : a[1] = L_sub( a[0], xr );
2687 0 : move32();
2688 0 : a[0] = L_add( a[0], xr );
2689 0 : move32();
2690 :
2691 0 : IF( GT_16( n, 4 ) )
2692 : {
2693 0 : rftbsub( n, a, nc, w + nw );
2694 0 : bitrv2_SR( n, ip + 2, a );
2695 0 : cftbsub( n, a, w );
2696 : }
2697 0 : ELSE IF( EQ_16( n, 4 ) )
2698 : {
2699 0 : cftfsub( n, a, w );
2700 : }
2701 : }
2702 :
2703 0 : IF( isgn >= 0 )
2704 : {
2705 0 : a[0] = L_shr( a[0], 1 );
2706 0 : move32();
2707 : }
2708 :
2709 0 : dctsub( n, a, nc, w + nw );
2710 :
2711 0 : IF( isgn >= 0 )
2712 : {
2713 0 : IF( GT_16( n, 4 ) )
2714 : {
2715 0 : bitrv2_SR( n, ip + 2, a );
2716 0 : cftfsub( n, a, w );
2717 0 : rftfsub( n, a, nc, w + nw );
2718 : }
2719 0 : ELSE IF( EQ_16( n, 4 ) )
2720 : {
2721 0 : cftfsub( n, a, w );
2722 : }
2723 0 : xr = L_sub( a[0], a[1] );
2724 0 : a[0] = L_add( a[0], a[1] );
2725 0 : move32();
2726 0 : FOR( j = 2; j < n; j += 2 )
2727 : {
2728 0 : a[j - 1] = L_sub( a[j], a[j + 1] );
2729 0 : move32();
2730 0 : a[j] = L_add( a[j], a[j + 1] );
2731 0 : move32();
2732 : }
2733 0 : a[n - 1] = xr;
2734 0 : move32();
2735 :
2736 0 : FOR( j = 0; j < n; j++ )
2737 : {
2738 0 : a[j] = L_shr( a[j], 5 );
2739 0 : move32();
2740 : }
2741 : }
2742 0 : }
2743 :
2744 706796 : void DoRTFTn_fx_ivas(
2745 : Word32 *x, /* i/o: real part of input and output data Qx */
2746 : Word32 *y, /* i/o: imaginary part of input and output data Qx */
2747 : const Word16 n /* i : size of the FFT up to 1024 Q0*/
2748 : )
2749 : {
2750 :
2751 : Word16 i;
2752 : Word32 z[2048];
2753 :
2754 359533804 : FOR( i = 0; i < n; i++ )
2755 : {
2756 358827008 : z[2 * i] = x[i]; // Qx
2757 358827008 : move32();
2758 358827008 : z[( ( i << 1 ) + 1 )] = y[i]; // Qx
2759 358827008 : move32();
2760 : }
2761 :
2762 706796 : SWITCH( n )
2763 : {
2764 0 : case ( 16 ):
2765 0 : cdftForw( 2 * n, z, Ip_fft16, w_fft16_fx );
2766 0 : BREAK;
2767 0 : case ( 32 ):
2768 0 : cdftForw( 2 * n, z, Ip_fft32, w_fft32_fx );
2769 0 : BREAK;
2770 0 : case ( 64 ):
2771 0 : cdftForw( 2 * n, z, Ip_fft64, w_fft64_fx );
2772 0 : BREAK;
2773 0 : case ( 128 ):
2774 0 : cdftForw( 2 * n, z, Ip_fft128, w_fft128_fx );
2775 0 : BREAK;
2776 11924 : case ( 256 ):
2777 11924 : cdftForw( 2 * n, z, Ip_fft256, w_fft256_fx );
2778 11924 : BREAK;
2779 694872 : case ( 512 ):
2780 694872 : cdftForw( 2 * n, z, Ip_fft512, w_fft512_fx );
2781 694872 : BREAK;
2782 0 : default:
2783 0 : assert( 0 );
2784 : }
2785 :
2786 706796 : x[0] = z[0]; // Qx
2787 706796 : move32();
2788 706796 : y[0] = z[1]; // Qx
2789 706796 : move32();
2790 358827008 : FOR( i = 1; i < n; i++ )
2791 : {
2792 358120212 : x[( n - i )] = z[2 * i];
2793 358120212 : move32();
2794 358120212 : y[( n - i )] = z[( ( i << 1 ) + 1 )];
2795 358120212 : move32();
2796 : }
2797 :
2798 706796 : return;
2799 : }
2800 :
2801 0 : void fft3_fx_ivas(
2802 : const Word32 X[], // Qx
2803 : Word32 Y[], // Qx
2804 : const Word16 n // Q0
2805 : )
2806 : {
2807 : Word32 Z[PH_ECU_SPEC_SIZE];
2808 : Word32 *Z0, *Z1, *Z2;
2809 : Word32 *z0, *z1, *z2;
2810 : const Word32 *x;
2811 0 : const Word16 *t_sin = sincos_t_rad3_fx; // Q15
2812 : Word16 m, step, order;
2813 : Word16 i, j;
2814 : Word16 c1_ind, s1_ind, c2_ind, s2_ind;
2815 : Word16 c1_step, s1_step, c2_step, s2_step;
2816 : Word32 *RY, *IY, *RZ0, *IZ0, *RZ1, *IZ1, *RZ2, *IZ2;
2817 :
2818 : /* Determine the order of the transform, the length of decimated */
2819 : /* transforms m, and the step for the sine and cosine tables. */
2820 0 : SWITCH( n )
2821 : {
2822 0 : case 1536:
2823 0 : order = 9;
2824 0 : move16();
2825 0 : m = 512;
2826 0 : move16();
2827 0 : step = 1;
2828 0 : move16();
2829 0 : BREAK;
2830 0 : case 384:
2831 0 : order = 7;
2832 0 : move16();
2833 0 : m = 128;
2834 0 : move16();
2835 0 : step = 4;
2836 0 : move16();
2837 0 : BREAK;
2838 0 : default:
2839 0 : order = 9;
2840 0 : move16();
2841 0 : m = 512;
2842 0 : move16();
2843 0 : step = 1;
2844 0 : move16();
2845 : }
2846 :
2847 : /* Compose decimated sequences X[3i], X[3i+1],X[3i+2] */
2848 : /* compute their FFT of length m. */
2849 0 : Z0 = &Z[0];
2850 0 : z0 = &Z0[0];
2851 0 : Z1 = &Z0[m];
2852 0 : z1 = &Z1[0]; /* Z1 = &Z[ m]; */
2853 0 : Z2 = &Z1[m];
2854 0 : z2 = &Z2[0]; /* Z2 = &Z[2m]; */
2855 0 : x = &X[0];
2856 0 : FOR( i = 0; i < n / 3; i++ )
2857 : {
2858 0 : *z0++ = *x++; /* Z0[i] = X[3i]; */
2859 0 : move32();
2860 0 : *z1++ = *x++; /* Z1[i] = X[3i+1]; */
2861 0 : move32();
2862 0 : *z2++ = *x++; /* Z2[i] = X[3i+2]; */
2863 0 : move32();
2864 : }
2865 :
2866 0 : fft_rel_fx32( &Z0[0], m, order );
2867 0 : fft_rel_fx32( &Z1[0], m, order );
2868 0 : fft_rel_fx32( &Z2[0], m, order );
2869 :
2870 : /* Butterflies of order 3. */
2871 : /* pointer initialization */
2872 0 : RY = &Y[0]; // Qx
2873 0 : IY = &Y[n]; // Qx
2874 0 : RZ0 = &Z0[0];
2875 0 : IZ0 = &Z0[m];
2876 0 : RZ1 = &Z1[0];
2877 0 : IZ1 = &Z1[m];
2878 0 : RZ2 = &Z2[0];
2879 0 : IZ2 = &Z2[m];
2880 :
2881 0 : c1_step = negate( step );
2882 0 : s1_step = step;
2883 0 : move16();
2884 0 : c2_step = negate( shl( step, 1 ) );
2885 0 : s2_step = shl( step, 1 );
2886 0 : c1_ind = add( T_SIN_PI_2, c1_step );
2887 0 : s1_ind = s1_step;
2888 0 : move16();
2889 0 : c2_ind = add( T_SIN_PI_2, c2_step );
2890 0 : s2_ind = s2_step;
2891 0 : move16();
2892 :
2893 : /* special case: i = 0 */
2894 0 : RY[0] = L_add( RZ0[0], L_add( RZ1[0], RZ2[0] ) );
2895 0 : move32();
2896 :
2897 : /* first 3/12 */
2898 0 : FOR( i = 1; i < ( 3 * ( m >> 3 ) ); ( i++, c1_ind = ( c1_ind + c1_step ), s1_ind = ( s1_ind + s1_step ), c2_ind = ( c2_ind + c2_step ), s2_ind = ( s2_ind + s2_step ) ) )
2899 : {
2900 0 : RY[i] = L_add( RZ0[i], L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
2901 0 : L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
2902 0 : L_add( Mpy_32_16_1( RZ2[i], t_sin[c2_ind] ),
2903 0 : Mpy_32_16_1( IZ2[-i], t_sin[s2_ind] ) ) ) ) ); // Qx
2904 0 : move32();
2905 0 : IY[-i] = L_sub( IZ0[-i], L_add( L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
2906 0 : Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ) ),
2907 0 : L_sub( Mpy_32_16_1( RZ2[i], t_sin[s2_ind] ),
2908 0 : Mpy_32_16_1( IZ2[-i], t_sin[c2_ind] ) ) ) ); // Qx
2909 0 : move32();
2910 : }
2911 :
2912 : /* next 1/12 */
2913 0 : FOR( ; i < 4 * m / 8; ( i++, c1_ind = ( c1_ind + c1_step ), s1_ind = ( s1_ind + s1_step ), c2_ind = ( c2_ind - c2_step ), s2_ind = ( s2_ind - s2_step ) ) )
2914 : {
2915 0 : RY[i] = L_add( RZ0[i], L_sub( L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
2916 0 : Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ) ),
2917 0 : L_sub( Mpy_32_16_1( RZ2[i], t_sin[c2_ind] ),
2918 0 : Mpy_32_16_1( IZ2[-i], t_sin[s2_ind] ) ) ) ); // Qx
2919 0 : move32();
2920 0 : IY[-i] = L_sub( IZ0[-i], L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
2921 0 : L_sub( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ),
2922 0 : L_add( Mpy_32_16_1( RZ2[i], t_sin[s2_ind] ),
2923 0 : Mpy_32_16_1( IZ2[-i], t_sin[c2_ind] ) ) ) ) ); // Qx
2924 0 : move32();
2925 : }
2926 :
2927 : /* special case: i = m/2 i.e. 1/3 */
2928 0 : RY[i] = L_add( RZ0[i],
2929 0 : L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
2930 0 : Mpy_32_16_1( RZ2[i], t_sin[c2_ind] ) ) ); // Qx
2931 0 : move32();
2932 0 : IY[-i] = L_negate( L_add( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
2933 0 : Mpy_32_16_1( RZ2[i], t_sin[s2_ind] ) ) ); // Qx
2934 0 : move32();
2935 0 : i = add( i, 1 );
2936 :
2937 0 : c1_ind = add( c1_ind, c1_step );
2938 0 : s1_ind = add( s1_ind, s1_step );
2939 0 : c2_ind = sub( c2_ind, c2_step );
2940 0 : s2_ind = sub( s2_ind, s2_step );
2941 :
2942 : /* next 2/12 */
2943 0 : FOR( j = i - 2; i < 6 * m / 8; ( i++, j--, c1_ind = ( c1_ind + c1_step ), s1_ind = ( s1_ind + s1_step ), c2_ind = ( c2_ind - c2_step ), s2_ind = ( s2_ind - s2_step ) ) )
2944 : {
2945 0 : RY[i] = L_add( RZ0[j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
2946 0 : L_add( Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ),
2947 0 : L_add( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ),
2948 0 : Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ) ); // Qx
2949 0 : move32();
2950 :
2951 0 : IY[-i] = L_negate( L_add( IZ0[-j], L_add( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ),
2952 0 : L_add( Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ),
2953 0 : L_sub( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ),
2954 0 : Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ) ) ); // Qx
2955 0 : move32();
2956 : }
2957 :
2958 : /*--------------------------half--------------------------*/
2959 : /* next 2/12 */
2960 0 : FOR( ; i < 8 * m / 8; ( i++, j--, c1_ind = ( c1_ind - c1_step ), s1_ind = ( s1_ind - s1_step ), c2_ind = ( c2_ind + c2_step ), s2_ind = ( s2_ind + s2_step ) ) )
2961 : {
2962 0 : RY[i] = L_sub( RZ0[j], L_add( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
2963 0 : L_add( Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ),
2964 0 : L_sub( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ),
2965 0 : Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ) ); // Qx
2966 0 : move32();
2967 0 : IY[-i] = L_negate( L_add( IZ0[-j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ),
2968 0 : L_add( Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ),
2969 0 : L_add( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ),
2970 0 : Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ) ) ); // Qx
2971 0 : move32();
2972 : }
2973 :
2974 : /* special case: i = m, i.e 2/3 */
2975 0 : RY[i] = L_sub( RZ0[j], L_add( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
2976 0 : Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ) ) ); // Qx
2977 0 : move32();
2978 0 : IY[-i] = L_sub( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ),
2979 0 : Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ) ); // Qx
2980 0 : move32();
2981 0 : i = add( i, 1 );
2982 0 : c1_ind = sub( c1_ind, c1_step ), s1_ind = sub( s1_ind, s1_step ), c2_ind = add( c2_ind, c2_step ), s2_ind = add( s2_ind, s2_step );
2983 :
2984 : /* next 1/12 */
2985 0 : FOR( j = 1; i < ( 9 * ( m >> 3 ) ); ( i++, j++, c1_ind = ( c1_ind - c1_step ), s1_ind = ( s1_ind - s1_step ), c2_ind = ( c2_ind + c2_step ), s2_ind = ( s2_ind + s2_step ) ) )
2986 : {
2987 0 : RY[i] = L_sub( RZ0[j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
2988 0 : L_sub( Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ),
2989 0 : L_add( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ),
2990 0 : Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ) ); // Qx
2991 0 : move32();
2992 0 : IY[-i] = L_sub( IZ0[-j], L_add( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ),
2993 0 : L_sub( Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ),
2994 0 : L_sub( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ),
2995 0 : Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ) ); // Qx
2996 0 : move32();
2997 : }
2998 :
2999 : /* last 3/12 */
3000 0 : FOR( ; i < 12 * m / 8; ( i++, j++, c1_ind = ( c1_ind - c1_step ), s1_ind = ( s1_ind - s1_step ), c2_ind = ( c2_ind - c2_step ), s2_ind = ( s2_ind - s2_step ) ) )
3001 : {
3002 0 : RY[i] = L_sub( RZ0[j], L_sub( L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
3003 0 : Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ) ),
3004 0 : L_sub( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ),
3005 0 : Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ); // Qx
3006 0 : move32();
3007 0 : IY[-i] = L_sub( IZ0[-j], L_sub( L_add( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ),
3008 0 : Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ) ),
3009 0 : L_add( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ),
3010 0 : Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ); // Qx
3011 0 : move32();
3012 : }
3013 :
3014 : /* special case: i = 3*m/2 */
3015 0 : RY[i] = L_sub( RZ0[j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
3016 0 : Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ) ) ); // Qx
3017 0 : move32();
3018 :
3019 0 : return;
3020 : }
3021 :
3022 0 : void ifft3_fx_ivas(
3023 : const Word32 Z[], // Qx
3024 : Word32 X[],
3025 : const Word16 n )
3026 : {
3027 : Word32 Y[PH_ECU_SPEC_SIZE];
3028 0 : const Word16 *t_sin = sincos_t_rad3_fx; // Q15
3029 : Word16 m, step, step2, order;
3030 : Word16 i;
3031 : Word16 c0_ind, s0_ind, c1_ind, s1_ind, c2_ind, s2_ind;
3032 : Word16 scale;
3033 : const Word32 *RZ0, *IZ0, *RZ1, *IZ1, *RZ2, *IZ2;
3034 : Word32 *RY0, *IY0, *RY1, *IY1, *RY2, *IY2, *y0, *y1, *y2;
3035 :
3036 : /* Determine the order of the transform, the length of decimated */
3037 : /* transforms m, and the step for the sine and cosine tables. */
3038 0 : SWITCH( n )
3039 : {
3040 0 : case 1536:
3041 0 : order = 9;
3042 0 : move16();
3043 0 : m = 512;
3044 0 : move16();
3045 0 : step = 1;
3046 0 : move16();
3047 0 : BREAK;
3048 0 : case 384:
3049 0 : order = 7;
3050 0 : move16();
3051 0 : m = 128;
3052 0 : move16();
3053 0 : step = 4;
3054 0 : move16();
3055 0 : BREAK;
3056 0 : default:
3057 0 : order = 9;
3058 0 : move16();
3059 0 : m = 512;
3060 0 : move16();
3061 0 : step = 1;
3062 0 : move16();
3063 : }
3064 :
3065 : /* pointer initialization */
3066 0 : RY0 = &Y[0];
3067 0 : IY0 = &RY0[m];
3068 0 : RY1 = &RY0[m];
3069 0 : IY1 = &RY1[m];
3070 0 : RY2 = &RY1[m];
3071 0 : IY2 = &RY2[m];
3072 :
3073 0 : RZ0 = &Z[0]; // Qx
3074 0 : RZ1 = RZ0 + m;
3075 0 : RZ2 = RZ0 + sub( shr( n, 1 ), shr( m, 1 ) );
3076 0 : IZ0 = &Z[n];
3077 0 : IZ1 = IZ0 - m;
3078 0 : IZ2 = IZ0 - sub( shr( n, 1 ), shr( m, 1 ) );
3079 :
3080 : /* Inverse butterflies of order 3. */
3081 :
3082 : /* Construction of Y0 */
3083 0 : RY0[0] = L_add( RZ0[0], L_add( RZ1[0], RZ2[0] ) );
3084 0 : move32();
3085 0 : FOR( i = 1; i < m / 2; i++ )
3086 : {
3087 0 : RY0[i] = L_add( RZ0[i], L_add( RZ1[i], RZ2[-i] ) );
3088 0 : move32();
3089 0 : IY0[-i] = L_add( IZ0[-i], L_sub( IZ1[-i], IZ2[i] ) );
3090 0 : move32();
3091 : }
3092 :
3093 : /* m/2 */
3094 0 : RY0[i] = L_add( RZ0[i], L_add( RZ1[i], RZ2[-i] ) );
3095 0 : move32();
3096 :
3097 : /* Construction of Y1 */
3098 0 : c0_ind = T_SIN_PI_2;
3099 0 : s0_ind = 0;
3100 0 : c1_ind = T_SIN_PI_2 * 1 / 3;
3101 0 : s1_ind = T_SIN_PI_2 * 2 / 3;
3102 0 : c2_ind = T_SIN_PI_2 * 1 / 3;
3103 0 : s2_ind = T_SIN_PI_2 * 2 / 3;
3104 :
3105 0 : RY1[0] = L_sub( Mpy_32_16_1( RZ0[0], t_sin[c0_ind] ),
3106 0 : L_add( Mpy_32_16_1( RZ1[0], t_sin[c1_ind] ),
3107 0 : L_add( Mpy_32_16_1( RZ2[0], t_sin[c2_ind] ),
3108 0 : L_add( Mpy_32_16_1( IZ1[0], t_sin[s1_ind] ),
3109 0 : Mpy_32_16_1( IZ2[0], t_sin[s2_ind] ) ) ) ) ); // Qx
3110 0 : move32();
3111 :
3112 0 : c0_ind = sub( c0_ind, step );
3113 0 : s0_ind = add( s0_ind, step );
3114 0 : c1_ind = add( c1_ind, step );
3115 0 : s1_ind = sub( s1_ind, step );
3116 0 : c2_ind = sub( c2_ind, step );
3117 0 : s2_ind = add( s2_ind, step );
3118 0 : FOR( i = 1; i < m / 4; ( i++, c0_ind = ( c0_ind - step ), s0_ind = ( s0_ind + step ), c1_ind = ( c1_ind + step ), s1_ind = ( s1_ind - step ), c2_ind = ( c2_ind - step ), s2_ind = ( s2_ind + step ) ) )
3119 : {
3120 0 : RY1[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
3121 0 : L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
3122 0 : L_add( Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ),
3123 0 : L_add( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ),
3124 0 : L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
3125 0 : Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ) ); // Qx
3126 0 : move32();
3127 0 : IY1[-i] = L_add( L_sub( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ),
3128 0 : Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ) ),
3129 0 : L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ),
3130 0 : L_add( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ),
3131 0 : L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
3132 0 : Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ); // Qx
3133 0 : move32();
3134 : }
3135 :
3136 0 : FOR( ; i < m / 2; ( i++, c0_ind = ( c0_ind - step ), s0_ind = ( s0_ind + step ), c1_ind = ( c1_ind + step ), s1_ind = ( s1_ind - step ), c2_ind = ( c2_ind + step ), s2_ind = ( s2_ind - step ) ) )
3137 : {
3138 0 : RY1[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
3139 0 : L_add( L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
3140 0 : Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ) ),
3141 0 : L_add( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ),
3142 0 : L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
3143 0 : Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); // Qx
3144 0 : move32();
3145 0 : IY1[-i] = L_sub( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ),
3146 0 : L_sub( L_add( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ),
3147 0 : Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ) ),
3148 0 : L_add( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ),
3149 0 : L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
3150 0 : Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ); // Qx
3151 0 : move32();
3152 : }
3153 :
3154 : /* m/2 */
3155 0 : RY1[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
3156 0 : L_add( L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
3157 0 : Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ) ),
3158 0 : L_add( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ),
3159 0 : L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
3160 0 : Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); // Qx
3161 0 : move32();
3162 :
3163 : /* Construction of Y2 */
3164 0 : c0_ind = T_SIN_PI_2;
3165 0 : move16();
3166 0 : s0_ind = 0;
3167 0 : move16();
3168 0 : c1_ind = T_SIN_PI_2 * 1 / 3;
3169 0 : move16();
3170 0 : s1_ind = T_SIN_PI_2 * 2 / 3;
3171 0 : move16();
3172 0 : c2_ind = T_SIN_PI_2 * 1 / 3;
3173 0 : move16();
3174 0 : s2_ind = T_SIN_PI_2 * 2 / 3;
3175 0 : move16();
3176 0 : step2 = shl( step, 1 );
3177 0 : RY2[0] = L_sub( Mpy_32_16_1( RZ0[0], t_sin[c0_ind] ),
3178 0 : L_sub( L_add( Mpy_32_16_1( RZ1[0], t_sin[c1_ind] ),
3179 0 : Mpy_32_16_1( RZ2[0], t_sin[c2_ind] ) ),
3180 0 : L_add( Mpy_32_16_1( IZ1[0], t_sin[s1_ind] ),
3181 0 : Mpy_32_16_1( IZ2[0], t_sin[s2_ind] ) ) ) ); // Qx
3182 0 : move32();
3183 :
3184 0 : c0_ind = sub( c0_ind, step2 );
3185 0 : s0_ind = add( s0_ind, step2 );
3186 0 : c1_ind = sub( c1_ind, step2 );
3187 0 : s1_ind = add( s1_ind, step2 );
3188 0 : c2_ind = add( c2_ind, step2 );
3189 0 : s2_ind = sub( s2_ind, step2 );
3190 0 : FOR( i = 1; i < m / 8; ( i++, c0_ind = ( c0_ind - step2 ), s0_ind = ( s0_ind + step2 ), c1_ind = ( c1_ind - step2 ), s1_ind = ( s1_ind + step2 ), c2_ind = ( c2_ind + step2 ), s2_ind = ( s2_ind - step2 ) ) )
3191 : {
3192 0 : RY2[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
3193 0 : L_add( L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
3194 0 : Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ) ),
3195 0 : L_sub( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ),
3196 0 : L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
3197 0 : Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); // Qx
3198 0 : move32();
3199 0 : IY2[-i] = L_add( L_sub( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ),
3200 0 : Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ) ),
3201 0 : L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ),
3202 0 : L_sub( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ),
3203 0 : L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
3204 0 : Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ); // Qx
3205 0 : move32();
3206 : }
3207 :
3208 0 : FOR( ; i < m / 4; ( i++, c0_ind = ( c0_ind - step2 ), s0_ind = ( s0_ind + step2 ), c1_ind = ( c1_ind + step2 ), s1_ind = ( s1_ind - step2 ), c2_ind = ( c2_ind + step2 ), s2_ind = ( s2_ind - step2 ) ) )
3209 : {
3210 0 : RY2[i] = L_add( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
3211 0 : L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
3212 0 : L_sub( L_add( Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ),
3213 0 : Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ),
3214 0 : L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
3215 0 : Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); // Qx
3216 0 : move32();
3217 0 : IY2[-i] = L_add( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ),
3218 0 : L_add( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ),
3219 0 : L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ),
3220 0 : L_sub( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ),
3221 0 : L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
3222 0 : Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ) ); // Qx
3223 0 : move32();
3224 : }
3225 :
3226 0 : FOR( ; i < ( 3 * ( m >> 3 ) ); ( i++, c0_ind = ( c0_ind - step2 ), s0_ind = ( s0_ind + step2 ), c1_ind = ( c1_ind + step2 ), s1_ind = ( s1_ind - step2 ), c2_ind = ( c2_ind - step2 ), s2_ind = ( s2_ind + step2 ) ) )
3227 : {
3228 0 : RY2[i] = L_sub( L_add( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
3229 0 : Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ) ),
3230 0 : L_sub( L_add( Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ),
3231 0 : Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ),
3232 0 : L_sub( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
3233 0 : Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ); // Qx
3234 0 : move32();
3235 0 : IY2[-i] = L_sub( L_add( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ),
3236 0 : L_add( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ),
3237 0 : L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ),
3238 0 : Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ) ) ) ),
3239 0 : L_add( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
3240 0 : Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ); // Qx
3241 0 : move32();
3242 : }
3243 :
3244 0 : FOR( ; i < m / 2; ( i++, c0_ind = ( c0_ind + step2 ), s0_ind = ( s0_ind - step2 ), c1_ind = ( c1_ind + step2 ), s1_ind = ( s1_ind - step2 ), c2_ind = ( c2_ind - step2 ), s2_ind = ( s2_ind + step2 ) ) )
3245 : {
3246 0 : RY2[i] = L_sub( L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
3247 0 : Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ) ),
3248 0 : L_sub( L_add( Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ),
3249 0 : Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ),
3250 0 : L_sub( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
3251 0 : Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ); // Qx
3252 0 : move32();
3253 0 : IY2[-i] = L_add( L_sub( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ),
3254 0 : Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ) ),
3255 0 : L_sub( L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ),
3256 0 : Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ) ),
3257 0 : L_add( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
3258 0 : Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ); // Qx
3259 0 : move32();
3260 : }
3261 :
3262 : /* m/2 */
3263 0 : RY2[i] = L_sub( L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
3264 0 : Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ) ),
3265 0 : L_sub( L_add( Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ),
3266 0 : Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ),
3267 0 : L_sub( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
3268 0 : Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ); // Qx
3269 0 : move32();
3270 :
3271 : /* Compute the inverse FFT for all 3 blocks. */
3272 0 : ifft_rel_fx32( RY0, m, order );
3273 0 : ifft_rel_fx32( RY1, m, order );
3274 0 : ifft_rel_fx32( RY2, m, order );
3275 :
3276 0 : y0 = RY0;
3277 0 : y1 = RY1;
3278 0 : y2 = RY2;
3279 :
3280 : /* Interlacing and scaling, scale = 1/3 */
3281 0 : scale = extract_l( 0x2AAB /*(1/3).Q15*/ );
3282 0 : FOR( i = 0; i < n; )
3283 : {
3284 0 : X[i] = Mpy_32_16_1( ( *y0++ ), scale ); // Qx
3285 0 : move32();
3286 0 : i = add( i, 1 );
3287 0 : X[i] = Mpy_32_16_1( ( *y1++ ), scale ); // Qx
3288 0 : move32();
3289 0 : i = add( i, 1 );
3290 0 : X[i] = Mpy_32_16_1( ( *y2++ ), scale ); // Qx
3291 0 : move32();
3292 0 : i = add( i, 1 );
3293 : }
3294 :
3295 0 : return;
3296 : }
3297 :
3298 :
3299 44912 : static void rfft_post(
3300 : const Word16 *sine_table, // Q15
3301 : Word32 *buf, // hFdCngCom->fftBuffer_exp(Qx)
3302 : const Word16 len )
3303 : {
3304 : Word32 tmp1, tmp2, tmp3, tmp4;
3305 : Word16 s, c;
3306 44912 : Word16 i = 0;
3307 44912 : move16();
3308 :
3309 44912 : tmp1 = L_add( buf[0], buf[1] );
3310 44912 : buf[1] = L_sub( buf[0], buf[1] );
3311 44912 : move32();
3312 44912 : buf[0] = tmp1;
3313 44912 : move32();
3314 :
3315 7230832 : FOR( i = 1; i <= ( ( len + 2 ) >> 2 ); i++ )
3316 : {
3317 7185920 : s = sine_table[i]; /* sin(pi*i/(len/2)) Q15*/
3318 7185920 : move16();
3319 7185920 : c = sine_table[( i + ( len >> 2 ) )]; /* cos(pi*i/(len/2)) Q15*/
3320 7185920 : move16();
3321 :
3322 7185920 : tmp1 = L_sub( buf[2 * i], buf[( len - ( i << 1 ) )] );
3323 7185920 : tmp2 = L_add( buf[( ( i << 1 ) + 1 )], buf[( ( len - ( i << 1 ) ) + 1 )] );
3324 7185920 : tmp3 = L_sub( Mpy_32_16_1( tmp1, s ), Mpy_32_16_1( tmp2, c ) ); /* real part of j*W(k,N)*[T(k) - T'(N-k)] Qx*/
3325 7185920 : tmp4 = L_add( Mpy_32_16_1( tmp1, c ), Mpy_32_16_1( tmp2, s ) ); /* imag part of j*W(k,N)*[T(k) - T'(N-k)] Qx*/
3326 7185920 : tmp1 = L_add( buf[2 * i], buf[( len - ( i << 1 ) )] );
3327 7185920 : tmp2 = L_sub( buf[( ( i << 1 ) + 1 )], buf[( ( len - ( i << 1 ) ) + 1 )] );
3328 :
3329 7185920 : buf[2 * i] = L_shr( L_sub( tmp1, tmp3 ), 1 );
3330 7185920 : move32();
3331 7185920 : buf[( ( i << 1 ) + 1 )] = L_shr( L_sub( tmp2, tmp4 ), 1 );
3332 7185920 : move32();
3333 7185920 : buf[( len - ( i << 1 ) )] = L_shr( L_add( tmp1, tmp3 ), 1 );
3334 7185920 : move32();
3335 7185920 : buf[( ( len - ( i << 1 ) ) + 1 )] = L_negate( L_shr( L_add( tmp2, tmp4 ), 1 ) );
3336 7185920 : move32();
3337 : }
3338 44912 : }
3339 :
3340 30030 : static void rfft_pre(
3341 : const Word16 *sine_table, // Q15
3342 : Word32 *buf, // hFdCngCom->fftBuffer_exp (Qx)
3343 : const Word16 len // Q0
3344 : )
3345 : {
3346 30030 : const Word16 scale = ( div_s( 1, len ) ); // Q15
3347 : Word32 tmp1, tmp2, tmp3, tmp4;
3348 : Word16 s, c;
3349 30030 : Word16 i = 0;
3350 :
3351 30030 : tmp1 = L_add( buf[0], buf[1] ); // Qx
3352 30030 : buf[1] = Mpy_32_16_1( L_sub( buf[0], buf[1] ), scale ); // Qx
3353 30030 : move32();
3354 30030 : buf[0] = Mpy_32_16_1( tmp1, scale ); // Qx
3355 30030 : move32();
3356 :
3357 4834830 : FOR( i = 1; i <= ( ( len + 2 ) >> 2 ); i++ )
3358 : {
3359 4804800 : s = sine_table[i]; /* sin(pi*i/(len/2)) Q15*/
3360 4804800 : move16();
3361 4804800 : c = sine_table[( i + ( len >> 2 ) )]; /* cos(pi*i/(len/2)) Q15*/
3362 4804800 : move16();
3363 :
3364 4804800 : tmp1 = L_sub( buf[2 * i], buf[( len - ( i << 1 ) )] ); // Qx
3365 4804800 : tmp2 = L_add( buf[( ( i << 1 ) + 1 )], buf[( ( len - ( i << 1 ) ) + 1 )] ); // Qx
3366 4804800 : tmp3 = L_add( Mpy_32_16_1( tmp1, s ), Mpy_32_16_1( tmp2, c ) ); /* real part of j*W(k,N)*[T(k) - T'(N-k)] Qx*/
3367 4804800 : tmp4 = L_sub( Mpy_32_16_1( tmp2, s ), Mpy_32_16_1( tmp1, c ) ); /* imag part of j*W(k,N)*[T(k) - T'(N-k)] Qx*/
3368 4804800 : tmp1 = L_add( buf[2 * i], buf[( len - ( i << 1 ) )] ); // Qx
3369 4804800 : tmp2 = L_sub( buf[( ( i << 1 ) + 1 )], buf[( ( len - ( i << 1 ) ) + 1 )] ); // Qx
3370 :
3371 4804800 : buf[2 * i] = Mpy_32_16_1( L_add( tmp1, tmp3 ), scale ); // Qx
3372 4804800 : move32();
3373 4804800 : buf[( ( i << 1 ) + 1 )] = L_negate( Mpy_32_16_1( L_add( tmp2, tmp4 ), scale ) ); // Qx
3374 4804800 : move32();
3375 4804800 : buf[( len - ( i << 1 ) )] = Mpy_32_16_1( L_sub( tmp1, tmp3 ), scale ); // Qx
3376 4804800 : move32();
3377 4804800 : buf[( ( len - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_sub( tmp2, tmp4 ), scale ); // Qx
3378 4804800 : move32();
3379 : }
3380 :
3381 30030 : return;
3382 : }
3383 :
3384 151422 : Word16 RFFTN_fx(
3385 : Word32 *data, // hFdCngCom->fftBuffer_exp (Qx)
3386 : const Word16 *sine_table, // Q15
3387 : const Word16 len, // Q0
3388 : const Word16 sign )
3389 : {
3390 151422 : assert( len <= 640 && len > 0 );
3391 :
3392 151422 : IF( EQ_16( len, 640 ) )
3393 : {
3394 : Word32 x[320], y[320];
3395 : Word16 i;
3396 :
3397 74942 : IF( NE_16( sign, -1 ) )
3398 : {
3399 30030 : rfft_pre( sine_table, data, len );
3400 : }
3401 :
3402 24056382 : FOR( i = 0; i < 320; i++ )
3403 : {
3404 23981440 : x[i] = data[2 * i];
3405 23981440 : move32();
3406 23981440 : y[i] = data[( ( i << 1 ) + 1 )];
3407 23981440 : move32();
3408 : }
3409 74942 : DoRTFT320_fx( x, y );
3410 24056382 : FOR( i = 0; i < 320; i++ )
3411 : {
3412 23981440 : data[2 * i] = x[i];
3413 23981440 : move32();
3414 23981440 : data[( ( i << 1 ) + 1 )] = y[i];
3415 23981440 : move32();
3416 : }
3417 :
3418 74942 : IF( EQ_16( sign, -1 ) )
3419 : {
3420 44912 : rfft_post( sine_table, data, len );
3421 : }
3422 : }
3423 : ELSE
3424 : {
3425 76480 : IF( EQ_16( len, 512 ) )
3426 : {
3427 : Word16 i;
3428 76480 : const Word16 log2 = 9;
3429 76480 : move16();
3430 : Word32 reordered_data[512];
3431 :
3432 76480 : IF( EQ_16( sign, -1 ) )
3433 : {
3434 43049 : fft_rel_fx32( data, len, log2 );
3435 43049 : reordered_data[0] = data[0];
3436 43049 : move32();
3437 43049 : reordered_data[1] = data[len / 2];
3438 43049 : move32();
3439 11020544 : FOR( i = 1; i < len / 2; i++ )
3440 : {
3441 10977495 : reordered_data[2 * i] = data[i];
3442 10977495 : move32();
3443 10977495 : reordered_data[( ( i << 1 ) + 1 )] = data[( len - i )];
3444 10977495 : move32();
3445 : }
3446 : }
3447 : ELSE
3448 : {
3449 33431 : reordered_data[0] = data[0];
3450 33431 : move32();
3451 33431 : reordered_data[len / 2] = data[1];
3452 33431 : move32();
3453 8558336 : FOR( i = 1; i < len / 2; i++ )
3454 : {
3455 8524905 : reordered_data[i] = data[2 * i];
3456 8524905 : move32();
3457 8524905 : reordered_data[( len - i )] = data[( ( i << 1 ) + 1 )];
3458 8524905 : move32();
3459 : }
3460 33431 : ifft_rel_fx32( reordered_data, len, log2 );
3461 : }
3462 76480 : Copy32( reordered_data, data, len );
3463 : }
3464 : ELSE
3465 : {
3466 0 : assert( !"Not supported FFT length!" );
3467 : }
3468 : }
3469 :
3470 151422 : return 0;
3471 : }
3472 :
3473 17608320 : static void butterfly(
3474 : const Word32 a, // Qx
3475 : const Word32 b, // Qx
3476 : Word32 *aPlusb, // Qx
3477 : Word32 *aMinusb // Qx
3478 : )
3479 : {
3480 17608320 : *aPlusb = L_add( a, b );
3481 17608320 : move32();
3482 17608320 : *aMinusb = L_sub( a, b );
3483 17608320 : move32();
3484 :
3485 17608320 : return;
3486 : }
3487 :
3488 11738880 : static void fft2(
3489 : Word32 *pInOut // Qx
3490 : )
3491 : {
3492 : /* FFT MATRIX:
3493 : 1.0000 1.0000
3494 : 1.0000 -1.0000
3495 : */
3496 : Word32 re1, im1;
3497 : Word32 re2, im2;
3498 :
3499 11738880 : re1 = pInOut[0];
3500 11738880 : move32();
3501 11738880 : im1 = pInOut[1];
3502 11738880 : move32();
3503 11738880 : re2 = pInOut[2];
3504 11738880 : move32();
3505 11738880 : im2 = pInOut[3];
3506 11738880 : move32();
3507 11738880 : pInOut[0] = L_add( re1, re2 );
3508 11738880 : move32();
3509 11738880 : pInOut[1] = L_add( im1, im2 );
3510 11738880 : move32();
3511 :
3512 11738880 : pInOut[2] = L_sub( re1, re2 );
3513 11738880 : move32();
3514 11738880 : pInOut[3] = L_sub( im1, im2 );
3515 11738880 : move32();
3516 :
3517 11738880 : return;
3518 : }
3519 :
3520 : static const Word16 C31 = 0x4000; /*0.5f in Q15 cos(PI/3); sin(2*PI/3) */
3521 : static const Word16 C32 = 0x6ED9; /*0.866025403784439f in Q15 cos(PI/3); sin(2*PI/3) */
3522 :
3523 7825920 : static void fft3_2( Word32 *pInOut /*Qx*/ )
3524 : {
3525 : Word32 re1, im1;
3526 : Word32 re2, im2;
3527 : Word32 re3, im3;
3528 :
3529 : Word32 tmp1, tmp2;
3530 : Word32 tmp3, tmp4;
3531 :
3532 7825920 : re1 = pInOut[0]; // Qx
3533 7825920 : move32();
3534 7825920 : im1 = pInOut[1]; // Qx
3535 7825920 : move32();
3536 7825920 : re2 = pInOut[2]; // Qx
3537 7825920 : move32();
3538 7825920 : im2 = pInOut[3]; // Qx
3539 7825920 : move32();
3540 7825920 : re3 = pInOut[4]; // Qx
3541 7825920 : move32();
3542 7825920 : im3 = pInOut[5]; // Qx
3543 7825920 : move32();
3544 :
3545 : /* FFT MATRIX:
3546 : 1.0000 1.0000 1.0000
3547 : C31 C32
3548 : 1.0000 -0.5000 - 0.8660i -0.5000 + 0.8660i
3549 : 1.0000 -0.5000 + 0.8660i -0.5000 - 0.8660i
3550 : */
3551 7825920 : tmp1 = L_add( re2, re3 );
3552 7825920 : tmp3 = L_add( im2, im3 );
3553 7825920 : tmp2 = L_sub( re2, re3 );
3554 7825920 : tmp4 = L_sub( im2, im3 );
3555 7825920 : pInOut[0] = L_add( re1, tmp1 );
3556 7825920 : move32();
3557 7825920 : pInOut[1] = L_add( im1, tmp3 );
3558 7825920 : move32();
3559 7825920 : pInOut[2] = L_sub( re1, L_sub( Mpy_32_16_1( tmp1, C31 ), Mpy_32_16_1( tmp4, C32 ) ) ); // Qx
3560 7825920 : move32();
3561 7825920 : pInOut[4] = L_sub( re1, L_add( Mpy_32_16_1( tmp1, C31 ), Mpy_32_16_1( tmp4, C32 ) ) ); // Qx
3562 7825920 : move32();
3563 :
3564 7825920 : pInOut[3] = L_sub( im1, L_add( Mpy_32_16_1( tmp2, C32 ), Mpy_32_16_1( tmp3, C31 ) ) ); // Qx
3565 7825920 : move32();
3566 7825920 : pInOut[5] = L_add( im1, L_sub( Mpy_32_16_1( tmp2, C32 ), Mpy_32_16_1( tmp3, C31 ) ) ); // Qx
3567 7825920 : move32();
3568 7825920 : }
3569 :
3570 :
3571 0 : static void fft4(
3572 : Word32 *pInOut /*Qx*/ )
3573 : {
3574 : Word32 re1, im1;
3575 : Word32 re2, im2;
3576 : Word32 re3, im3;
3577 : Word32 re4, im4;
3578 :
3579 : Word32 tmp1, tmp2;
3580 : Word32 tmp3, tmp4;
3581 : Word32 tmp5, tmp6;
3582 : Word32 tmp7, tmp8;
3583 :
3584 0 : re1 = pInOut[0];
3585 0 : move32();
3586 0 : im1 = pInOut[1];
3587 0 : move32();
3588 0 : re2 = pInOut[2];
3589 0 : move32();
3590 0 : im2 = pInOut[3];
3591 0 : move32();
3592 0 : re3 = pInOut[4];
3593 0 : move32();
3594 0 : im3 = pInOut[5];
3595 0 : move32();
3596 0 : re4 = pInOut[6];
3597 0 : move32();
3598 0 : im4 = pInOut[7];
3599 0 : move32();
3600 :
3601 : /*
3602 : 1.0000 1.0000 1.0000 1.0000
3603 : 1.0000 -1.0000i -1.0000 1.0000i
3604 : 1.0000 -1.0000 1.0000 -1.0000
3605 : 1.0000 1.0000i -1.0000 -1.0000i
3606 : */
3607 0 : tmp1 = L_add( re1, re3 );
3608 0 : tmp3 = L_add( re2, re4 );
3609 0 : tmp5 = L_add( im1, im3 );
3610 0 : tmp7 = L_add( im2, im4 );
3611 0 : pInOut[0] = L_add( tmp1, tmp3 );
3612 0 : move32();
3613 0 : pInOut[4] = L_sub( tmp1, tmp3 );
3614 0 : move32();
3615 :
3616 0 : pInOut[1] = L_add( tmp5, tmp7 );
3617 0 : move32();
3618 0 : pInOut[5] = L_sub( tmp5, tmp7 );
3619 0 : move32();
3620 0 : tmp2 = L_sub( re1, re3 );
3621 0 : tmp4 = L_sub( re2, re4 );
3622 0 : tmp6 = L_sub( im1, im3 );
3623 0 : tmp8 = L_sub( im2, im4 );
3624 0 : pInOut[2] = L_add( tmp2, tmp8 );
3625 0 : move32();
3626 0 : pInOut[6] = L_sub( tmp2, tmp8 );
3627 0 : move32();
3628 :
3629 0 : pInOut[3] = L_sub( tmp6, tmp4 );
3630 0 : move32();
3631 0 : pInOut[7] = L_add( tmp4, tmp6 );
3632 0 : move32();
3633 :
3634 0 : return;
3635 : }
3636 :
3637 : static const Word16 C51 = 0x278D; /* 0.309016994374947f cos(2*PI/5); Q15*/
3638 : static const Word16 C52 = 0x79bc; /* 0.951056516295154f sin(2*PI/5); Q15*/
3639 : static const Word16 C53 = 0x678D; /* 0.809016994374947f cos( PI/5); Q15*/
3640 : static const Word16 C54 = 0x4B3D; /* 0.587785252292473f sin( PI/5); Q15*/
3641 :
3642 4695552 : static void fft5(
3643 : cmplx *pInOut /*Qx*/ )
3644 : {
3645 : cmplx x[5];
3646 : cmplx t[4];
3647 :
3648 4695552 : x[0] = pInOut[0];
3649 4695552 : move32();
3650 4695552 : x[1] = pInOut[1];
3651 4695552 : move32();
3652 4695552 : x[2] = pInOut[2];
3653 4695552 : move32();
3654 4695552 : x[3] = pInOut[3];
3655 4695552 : move32();
3656 4695552 : x[4] = pInOut[4];
3657 4695552 : move32();
3658 :
3659 : /*
3660 : 1.0000 1.0000 1.0000 1.0000 1.0000
3661 : C51 C52 C53 C54
3662 : 1.0000 0.3090 - 0.9511i -0.8090 - 0.5878i -0.8090 + 0.5878i 0.3090 + 0.9511i
3663 : 1.0000 -0.8090 - 0.5878i 0.3090 + 0.9511i 0.3090 - 0.9511i -0.8090 + 0.5878i
3664 : 1.0000 -0.8090 + 0.5878i 0.3090 - 0.9511i 0.3090 + 0.9511i -0.8090 - 0.5878i
3665 : 1.0000 0.3090 + 0.9511i -0.8090 + 0.5878i -0.8090 - 0.5878i 0.3090 - 0.9511i
3666 : */
3667 4695552 : t[0] = CL_add( x[1], x[4] );
3668 4695552 : move32();
3669 4695552 : t[1] = CL_sub( x[1], x[4] );
3670 4695552 : move32();
3671 4695552 : t[2] = CL_add( x[2], x[3] );
3672 4695552 : move32();
3673 4695552 : t[3] = CL_sub( x[2], x[3] );
3674 4695552 : move32();
3675 :
3676 :
3677 4695552 : pInOut[0] = CL_add( x[0], CL_add( t[0], t[2] ) );
3678 4695552 : move32();
3679 :
3680 4695552 : pInOut[1] = CL_add( CL_add( x[0], CL_sub( CL_scale( t[0], C51 ), CL_scale( t[2], C53 ) ) ), CL_add( CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C52 ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C54 ) ) ) ); // Qx
3681 4695552 : move32();
3682 4695552 : pInOut[4] = CL_add( x[0], CL_sub( CL_scale( t[0], C51 ), CL_add( CL_scale( t[2], C53 ), CL_add( CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C52 ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C54 ) ) ) ) ) ); // Qx
3683 4695552 : move32();
3684 4695552 : pInOut[2] = CL_add( CL_sub( x[0], CL_scale( t[0], C53 ) ), CL_add( CL_scale( t[2], C51 ), CL_sub( CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C54 ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C52 ) ) ) ) ); // Qx
3685 4695552 : move32();
3686 4695552 : pInOut[3] = CL_add( CL_sub( x[0], CL_scale( t[0], C53 ) ), CL_add( CL_sub( CL_scale( t[2], C51 ), CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C54 ) ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C52 ) ) ) ); // Qx
3687 4695552 : move32();
3688 :
3689 4695552 : return;
3690 : }
3691 :
3692 : static const Word16 C81 = 0x5a82; /* 0.707106781186548f cos(PI/4); Q15*/
3693 :
3694 2934720 : static void fft8_2(
3695 : Word32 *pInOut /*Qx*/ )
3696 : {
3697 : Word32 re0, im0, re4, im4;
3698 :
3699 : Word32 re1_7p, re1_7m;
3700 : Word32 im1_7p, im1_7m;
3701 : Word32 re2_6p, re2_6m;
3702 : Word32 im2_6p, im2_6m;
3703 : Word32 re3_5p, re3_5m;
3704 : Word32 im3_5p, im3_5m;
3705 :
3706 2934720 : re0 = pInOut[0];
3707 2934720 : move32();
3708 2934720 : im0 = pInOut[1];
3709 2934720 : move32();
3710 2934720 : re4 = pInOut[8];
3711 2934720 : move32();
3712 2934720 : im4 = pInOut[9];
3713 2934720 : move32();
3714 2934720 : butterfly( pInOut[1 * 2], pInOut[7 * 2], &re1_7p, &re1_7m );
3715 2934720 : butterfly( pInOut[1 * 2 + 1], pInOut[7 * 2 + 1], &im1_7p, &im1_7m );
3716 2934720 : butterfly( pInOut[2 * 2], pInOut[6 * 2], &re2_6p, &re2_6m );
3717 2934720 : butterfly( pInOut[2 * 2 + 1], pInOut[6 * 2 + 1], &im2_6p, &im2_6m );
3718 2934720 : butterfly( pInOut[3 * 2], pInOut[5 * 2], &re3_5p, &re3_5m );
3719 2934720 : butterfly( pInOut[3 * 2 + 1], pInOut[5 * 2 + 1], &im3_5p, &im3_5m );
3720 :
3721 : /*
3722 : 0: 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i
3723 : 1: 1 + 0i C81 - C81i 0 - 1i -C81 - C81i -1 - 0i -C81 + C81i - 0 + 1i C81 + C81i
3724 : 2: 1 + 0i 0 - 1i -1 - 0i - 0 + 1i 1 + 0i 0 - 1i - 1 - 0i - 0 + 1i
3725 : 3: 1 + 0i -C81 - C81i -0 + 1i C81 - C81i -1 - 0i C81 + C81i 0 - 1i -C81 + C81i
3726 : 4: 1 + 0i - 1 - 0i 1 + 0i - 1 - 0i 1 + 0i - 1 - 0i 1 + 0i - 1 - 0i
3727 : 5: 1 + 0i -C81 + C81i 0 - 1i C81 + C81i -1 - 0i C81 - C81i - 0 + 1i -C81 - C81i
3728 : 6: 1 + 0i - 0 + 1i -1 - 0i 0 - 1i 1 + 0i - 0 + 1i - 1 - 0i - 0 - 1i
3729 : 7: 1 + 0i C81 + C81i -0 + 1i -C81 + C81i -1 - 0i -C81 - C81i - 0 - 1i C81 - C81i
3730 : */
3731 2934720 : pInOut[0] = L_add( L_add( L_add( L_add( re0, re4 ), re1_7p ), re2_6p ), re3_5p );
3732 2934720 : move32();
3733 2934720 : pInOut[1] = L_add( L_add( L_add( L_add( im0, im4 ), im1_7p ), im2_6p ), im3_5p );
3734 2934720 : move32();
3735 :
3736 2934720 : pInOut[2] = L_add( L_add( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re1_7p, re3_5p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m );
3737 2934720 : move32();
3738 2934720 : pInOut[3] = L_sub( L_sub( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im1_7p, im3_5p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m );
3739 2934720 : move32();
3740 :
3741 2934720 : pInOut[4] = L_sub( L_add( L_add( L_sub( re0, re2_6p ), re4 ), im1_7m ), im3_5m );
3742 2934720 : move32();
3743 2934720 : pInOut[5] = L_add( L_sub( L_add( L_sub( im0, im2_6p ), im4 ), re1_7m ), re3_5m );
3744 2934720 : move32();
3745 :
3746 2934720 : pInOut[6] = L_sub( L_add( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re3_5p, re1_7p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m );
3747 2934720 : move32();
3748 2934720 : pInOut[7] = L_add( L_sub( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im3_5p, im1_7p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m );
3749 2934720 : move32();
3750 :
3751 2934720 : pInOut[8] = L_add( L_sub( L_add( L_sub( re0, re1_7p ), re2_6p ), re3_5p ), re4 );
3752 2934720 : move32();
3753 2934720 : pInOut[9] = L_add( L_sub( L_add( L_sub( im0, im1_7p ), im2_6p ), im3_5p ), im4 );
3754 2934720 : move32();
3755 :
3756 2934720 : pInOut[10] = L_add( L_sub( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re3_5p, re1_7p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m );
3757 2934720 : move32();
3758 2934720 : pInOut[11] = L_sub( L_add( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im3_5p, im1_7p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m );
3759 2934720 : move32();
3760 :
3761 2934720 : pInOut[12] = L_add( L_sub( L_add( L_sub( re0, re2_6p ), re4 ), im1_7m ), im3_5m );
3762 2934720 : move32();
3763 2934720 : pInOut[13] = L_sub( L_add( L_add( L_sub( im0, im2_6p ), im4 ), re1_7m ), re3_5m );
3764 2934720 : move32();
3765 :
3766 2934720 : pInOut[14] = L_sub( L_sub( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re1_7p, re3_5p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m );
3767 2934720 : move32();
3768 2934720 : pInOut[15] = L_add( L_add( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im1_7p, im3_5p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m );
3769 2934720 : move32();
3770 :
3771 2934720 : return;
3772 : }
3773 :
3774 2934720 : static void nextFFT(
3775 : Word32 *x, /*Qx*/
3776 : const Word16 length /*Qx*/ )
3777 : {
3778 : cmplx val[5];
3779 2934720 : SWITCH( length )
3780 : {
3781 0 : case 2:
3782 0 : fft2( x );
3783 0 : BREAK;
3784 0 : case 3:
3785 0 : fft3_2( x );
3786 0 : BREAK;
3787 0 : case 4:
3788 0 : fft4( x );
3789 0 : BREAK;
3790 0 : case 5:
3791 0 : FOR( Word16 i = 0; i < 5; i++ )
3792 : {
3793 0 : val[i].re = x[2 * i];
3794 0 : move32();
3795 0 : val[i].im = x[( ( i << 1 ) + 1 )];
3796 0 : move32();
3797 : }
3798 0 : fft5( val );
3799 0 : FOR( Word16 i = 0; i < 5; i++ )
3800 : {
3801 0 : x[2 * i] = val[i].re;
3802 0 : move32();
3803 0 : x[( ( i << 1 ) + 1 )] = val[i].im;
3804 0 : move32();
3805 : }
3806 0 : BREAK;
3807 2934720 : case 8:
3808 2934720 : fft8_2( x );
3809 2934720 : BREAK;
3810 0 : default:
3811 0 : assert( !"length not supported" );
3812 : BREAK;
3813 : }
3814 :
3815 2934720 : return;
3816 : }
3817 :
3818 : static const Word16 CTFFTfactors[] = { 9, 8, 7, 5, 4, 3, 2, 0 };
3819 :
3820 1467360 : static __inline Word16 findFactor(
3821 : const Word16 length )
3822 : {
3823 1467360 : Word16 i = 0;
3824 1467360 : move16();
3825 1467360 : Word16 factor = 0;
3826 1467360 : move16();
3827 :
3828 2934720 : WHILE( CTFFTfactors[i] != 0 )
3829 : {
3830 2934720 : IF( ( length % CTFFTfactors[i] ) == 0 )
3831 : {
3832 1467360 : factor = CTFFTfactors[i];
3833 1467360 : move16();
3834 1467360 : BREAK;
3835 : }
3836 1467360 : i += 1;
3837 : }
3838 1467360 : return factor;
3839 : }
3840 :
3841 1467360 : static __inline void twiddle(
3842 : Word32 *x, // Qx
3843 : const Word16 length,
3844 : const Word16 n1,
3845 : const Word16 n2 )
3846 : {
3847 : Word16 i, ii;
3848 1467360 : const Word16 *ptr_sin = &sin_twiddle_table_25_5_5[0]; // Q15
3849 1467360 : const Word16 *ptr_cos = &cos_twiddle_table_25_5_5[0]; // Q15
3850 :
3851 1467360 : test();
3852 1467360 : test();
3853 1467360 : test();
3854 1467360 : test();
3855 1467360 : IF( EQ_16( length, 16 ) && EQ_16( n1, 8 ) && EQ_16( n2, 2 ) )
3856 : {
3857 1467360 : ptr_sin = &sin_twiddle_table_16_8_2[0]; // Q15
3858 1467360 : ptr_cos = &cos_twiddle_table_16_8_2[0]; // Q15
3859 : }
3860 0 : ELSE IF( NE_16( length, 25 ) || NE_16( n1, 5 ) || NE_16( n2, 5 ) )
3861 : {
3862 0 : assert( 0 );
3863 : }
3864 :
3865 11738880 : FOR( i = 1; i < n1; i++ )
3866 : {
3867 20543040 : FOR( ii = 1; ii < n2; ii++ )
3868 : {
3869 : Word32 xRe, xIm;
3870 10271520 : xRe = x[( ( ( ( i * n2 ) + ii ) ) << 1 )]; // Qx
3871 10271520 : xIm = x[( ( ( ( ( i * n2 ) + ii ) ) << 1 ) + 1 )]; // Qx
3872 10271520 : x[( ( ( ( i * n2 ) + ii ) ) << 1 )] = L_sub( Mpy_32_16_1( xRe, ptr_cos[( ( i * n2 ) + ii )] ), Mpy_32_16_1( xIm, ptr_sin[( ( i * n2 ) + ii )] ) ); // Qx
3873 10271520 : move32();
3874 10271520 : x[( ( ( ( ( i * n2 ) + ii ) ) << 1 ) + 1 )] = L_add( Mpy_32_16_1( xRe, ptr_sin[( ( i * n2 ) + ii )] ), Mpy_32_16_1( xIm, ptr_cos[( ( i * n2 ) + ii )] ) ); // Qx
3875 10271520 : move32();
3876 : }
3877 : }
3878 1467360 : return;
3879 : }
3880 :
3881 25727712 : static void cooleyTukeyFFT(
3882 : Word32 *x, // Qx
3883 : const Word16 length,
3884 : Word32 *scratch // Qx
3885 : )
3886 : {
3887 : Word16 factor;
3888 : Word16 i, ii;
3889 : Word16 n1, n2;
3890 25727712 : Word16 cnt = 0;
3891 25727712 : move16();
3892 : Word32 *src, *dest;
3893 : cmplx val[5];
3894 :
3895 25727712 : SWITCH( length )
3896 : {
3897 0 : case 1:
3898 0 : BREAK;
3899 11738880 : case 2:
3900 11738880 : fft2( x );
3901 11738880 : BREAK;
3902 7825920 : case 3:
3903 7825920 : fft3_2( x );
3904 7825920 : BREAK;
3905 0 : case 4:
3906 0 : fft4( x );
3907 0 : BREAK;
3908 4695552 : case 5:
3909 28173312 : FOR( i = 0; i < 5; i++ )
3910 : {
3911 23477760 : val[i].re = x[2 * i]; // Qx
3912 23477760 : move32();
3913 23477760 : val[i].im = x[( ( i << 1 ) + 1 )]; // Qx
3914 23477760 : move32();
3915 : }
3916 4695552 : fft5( val );
3917 28173312 : FOR( i = 0; i < 5; i++ )
3918 : {
3919 23477760 : x[2 * i] = val[i].re;
3920 23477760 : move32();
3921 23477760 : x[( ( i << 1 ) + 1 )] = val[i].im;
3922 23477760 : move32();
3923 : }
3924 4695552 : BREAK;
3925 0 : case 8:
3926 0 : fft8_2( x );
3927 0 : BREAK;
3928 1467360 : default:
3929 : {
3930 1467360 : factor = findFactor( length );
3931 :
3932 1467360 : IF( ( factor > 0 ) && GT_16( idiv1616( length, factor ), 1 ) )
3933 : {
3934 1467360 : n1 = factor;
3935 1467360 : move16();
3936 1467360 : n2 = idiv1616( length, factor );
3937 :
3938 : /* DATA Resorting for stage1 */
3939 1467360 : dest = scratch; // Qx
3940 13206240 : FOR( i = 0; i < 2 * n1; i += 2 )
3941 : {
3942 11738880 : src = x + i;
3943 35216640 : FOR( ii = 0; ii < n2; ii++ )
3944 : {
3945 : /* *dest++ = x[2*(i+ii*n1)]; */
3946 : /* *dest++ = x[2*(i+ii*n1)+1]; */
3947 23477760 : *dest++ = *src;
3948 23477760 : move32();
3949 23477760 : *dest++ = *( src + 1 );
3950 23477760 : move32();
3951 23477760 : src += 2 * n1;
3952 : }
3953 : }
3954 1467360 : src = scratch; // Qx
3955 1467360 : dest = x;
3956 24945120 : FOR( i = 0; i < length; i++ )
3957 : {
3958 23477760 : *dest++ = *src++;
3959 23477760 : move32();
3960 23477760 : *dest++ = *src++;
3961 23477760 : move32();
3962 : }
3963 : /* perform n1 ffts of length n2 */
3964 13206240 : FOR( i = 0; i < n1; i++ )
3965 : {
3966 11738880 : cooleyTukeyFFT( x + shl( i_mult( i, n2 ), 1 ), n2, scratch + shl( i_mult( i, n2 ), 1 ) );
3967 : }
3968 : /*data twiddeling */
3969 1467360 : twiddle( x, length, n1, n2 );
3970 : /* DATA Resorting for stage2 */
3971 1467360 : cnt = 0;
3972 1467360 : move16();
3973 4402080 : FOR( i = 0; i < n2; i++ )
3974 : {
3975 26412480 : FOR( ii = 0; ii < n1; ii++ )
3976 : {
3977 23477760 : scratch[2 * cnt] = x[( ( i + ( ii * n2 ) ) << 1 )];
3978 23477760 : move32();
3979 23477760 : scratch[( ( cnt << 1 ) + 1 )] = x[( ( ( i + ( ii * n2 ) ) << 1 ) + 1 )];
3980 23477760 : move32();
3981 23477760 : cnt = add( cnt, 1 );
3982 : }
3983 : }
3984 : /* perform n2 ffts of length n1 */
3985 4402080 : FOR( i = 0; i < n2; i++ )
3986 : {
3987 2934720 : nextFFT( scratch + shl( i_mult( i, n1 ), 1 ), n1 );
3988 : }
3989 1467360 : cnt = 0;
3990 1467360 : move16();
3991 13206240 : FOR( i = 0; i < n1; i++ )
3992 : {
3993 35216640 : FOR( ii = 0; ii < n2; ii++ )
3994 : {
3995 23477760 : x[2 * cnt] = scratch[( ( i + ( ii * n1 ) ) << 1 )];
3996 23477760 : move32();
3997 23477760 : x[( ( cnt << 1 ) + 1 )] = scratch[( ( ( i + ( ii * n1 ) ) << 1 ) + 1 )];
3998 23477760 : move32();
3999 23477760 : cnt = add( cnt, 1 );
4000 : }
4001 : }
4002 : }
4003 : ELSE
4004 : {
4005 0 : assert( !"length not supported" );
4006 : }
4007 : }
4008 : }
4009 :
4010 25727712 : return;
4011 : }
4012 :
4013 9488928 : static void pfaDFT(
4014 : Word32 *x, // Qx
4015 : const Word16 length, // Q0
4016 : Word32 *scratch1, // Qx
4017 : const Word16 numFactors,
4018 : const Word16 *factor )
4019 : {
4020 : Word16 i, ii;
4021 : Word16 cnt;
4022 :
4023 9488928 : IF( GT_16( numFactors, 1 ) )
4024 : {
4025 1663008 : Word32 *tmp = scratch1;
4026 1663008 : Word16 n1_inv = 1, n2_inv = 1;
4027 1663008 : move16();
4028 1663008 : move16();
4029 1663008 : Word16 n2 = factor[0 /*idx*/];
4030 1663008 : move16();
4031 1663008 : Word16 n1 = idiv1616( length, n2 );
4032 : Word16 idx, incr;
4033 :
4034 4597728 : WHILE( ( ( n1_inv * n1 ) % n2 ) != 1 )
4035 : {
4036 2934720 : n1_inv = add( n1_inv, 1 );
4037 : }
4038 3228192 : WHILE( ( ( n2_inv * n2 ) % n1 ) != 1 )
4039 : {
4040 1565184 : n2_inv = add( n2_inv, 1 );
4041 : }
4042 1663008 : idx = 0;
4043 1663008 : move16();
4044 1663008 : incr = ( n1 * n1_inv );
4045 1663008 : move16();
4046 1663008 : cnt = 0;
4047 1663008 : move16();
4048 7825920 : FOR( i = 0; i < n1; i++ )
4049 : {
4050 46955520 : FOR( ii = 0; ii < n2 - 1; ii++ )
4051 : {
4052 40792608 : tmp[cnt] = x[2 * idx];
4053 40792608 : move32();
4054 40792608 : cnt = add( cnt, 1 );
4055 40792608 : tmp[cnt] = x[( ( idx << 1 ) + 1 )]; // Qx
4056 40792608 : move32();
4057 40792608 : cnt = add( cnt, 1 );
4058 :
4059 40792608 : idx = add( idx, incr );
4060 :
4061 40792608 : IF( GT_16( idx, length ) )
4062 : {
4063 26803776 : idx = sub( idx, length );
4064 : }
4065 : }
4066 6162912 : tmp[cnt] = x[2 * idx]; // Qx
4067 6162912 : move32();
4068 6162912 : cnt = add( cnt, 1 );
4069 6162912 : tmp[cnt] = x[( ( idx << 1 ) + 1 )]; // Qx
4070 6162912 : move32();
4071 6162912 : cnt = add( cnt, 1 );
4072 6162912 : idx = add( idx, 1 );
4073 : }
4074 7825920 : FOR( cnt = 0; cnt < length; cnt += n2 )
4075 : {
4076 6162912 : cooleyTukeyFFT( tmp + 2 * cnt, n2, x + 2 * cnt );
4077 : }
4078 7825920 : FOR( cnt = 0; cnt < n1; cnt++ )
4079 : {
4080 53118432 : FOR( i = 0; i < n2; i++ )
4081 : {
4082 46955520 : x[( ( cnt + ( i * n1 ) ) << 1 )] = tmp[( ( ( cnt * n2 ) + i ) << 1 )];
4083 46955520 : move32();
4084 46955520 : x[( ( ( cnt + ( i * n1 ) ) << 1 ) + 1 )] = tmp[( ( ( ( cnt * n2 ) + i ) << 1 ) + 1 )];
4085 46955520 : move32();
4086 : }
4087 : }
4088 11054112 : FOR( cnt = 0; cnt < length; cnt += n1 )
4089 : {
4090 9391104 : pfaDFT( x + 2 * cnt, n1, tmp, sub( numFactors, 1 ), &factor[1] );
4091 : }
4092 1663008 : idx = 0;
4093 1663008 : move16();
4094 1663008 : cnt = 0;
4095 1663008 : move16();
4096 11054112 : FOR( i = 0; i < n2; i++ )
4097 : {
4098 9391104 : idx = i_mult( i, n1 );
4099 56346624 : FOR( ii = 0; ii < n1; ii++ )
4100 : {
4101 46955520 : tmp[2 * idx] = x[cnt];
4102 46955520 : move32();
4103 46955520 : cnt = add( cnt, 1 );
4104 46955520 : tmp[( ( idx << 1 ) + 1 )] = x[cnt];
4105 46955520 : move32();
4106 46955520 : cnt = add( cnt, 1 );
4107 46955520 : idx = add( idx, n2 );
4108 :
4109 46955520 : IF( GT_16( idx, length ) )
4110 : {
4111 7728096 : idx = sub( idx, length );
4112 : }
4113 : }
4114 : }
4115 48618528 : FOR( cnt = 0; cnt < length; cnt++ )
4116 : {
4117 46955520 : x[2 * cnt] = tmp[2 * cnt];
4118 46955520 : move32();
4119 46955520 : x[( ( cnt << 1 ) + 1 )] = tmp[( ( cnt << 1 ) + 1 )];
4120 46955520 : move32();
4121 : }
4122 : }
4123 : ELSE
4124 : {
4125 7825920 : cooleyTukeyFFT( x, length, scratch1 );
4126 : }
4127 :
4128 9488928 : return;
4129 : }
4130 :
4131 97824 : static void fftf_interleave(
4132 : Word32 *re, // Qx
4133 : Word32 *im, // Qx
4134 : Word32 *out, // Qx
4135 : const Word16 len // Q0
4136 : )
4137 : {
4138 97824 : Word16 i = 0;
4139 97824 : move16();
4140 :
4141 23575584 : FOR( i = 0; i < len; i++ )
4142 : {
4143 23477760 : *out++ = *re++;
4144 23477760 : move32();
4145 23477760 : *out++ = *im++;
4146 23477760 : move32();
4147 : }
4148 :
4149 97824 : return;
4150 : }
4151 :
4152 97824 : static void fftf_deinterleave(
4153 : Word32 *in, // Qx
4154 : Word32 *re, // Qx
4155 : Word32 *im, // Qx
4156 : const Word16 len // Q0
4157 : )
4158 : {
4159 97824 : Word16 i = 0;
4160 97824 : move16();
4161 :
4162 23575584 : FOR( i = 0; i < len; i++ )
4163 : {
4164 23477760 : *re++ = *in++;
4165 23477760 : move32();
4166 23477760 : *im++ = *in++;
4167 23477760 : move32();
4168 : }
4169 :
4170 97824 : return;
4171 : }
4172 :
4173 0 : static void DoRTFT600(
4174 : Word32 *x, /* i/o: real part of input and output data Qx*/
4175 : Word32 *y /* i/o: imaginary part of input and output data Qx*/
4176 : )
4177 : {
4178 : Word32 scratch[1200], cmplx[1200];
4179 0 : Word16 factors[3] = { 25, 8, 3 };
4180 0 : move16();
4181 0 : move16();
4182 0 : move16();
4183 :
4184 0 : fftf_interleave( x, y, cmplx, 600 );
4185 0 : pfaDFT( cmplx, 600, scratch, 3, factors );
4186 0 : fftf_deinterleave( cmplx, x, y, 600 );
4187 :
4188 0 : return;
4189 : }
4190 :
4191 0 : static void DoRTFT400(
4192 : Word32 *x, /* i/o: real part of input and output data Qx */
4193 : Word32 *y /* i/o: imaginary part of input and output data Qx */
4194 : )
4195 : {
4196 : Word32 scratch[800], cmplx[800];
4197 0 : Word16 factors[2] = { 25, 16 };
4198 0 : move16();
4199 0 : move16();
4200 :
4201 0 : fftf_interleave( x, y, cmplx, 400 );
4202 0 : pfaDFT( cmplx, 400, scratch, 2, factors );
4203 0 : fftf_deinterleave( cmplx, x, y, 400 );
4204 :
4205 :
4206 0 : return;
4207 : }
4208 :
4209 97824 : static void DoRTFT240(
4210 : Word32 *x, /* i/o: real part of input and output data Qx */
4211 : Word32 *y /* i/o: imaginary part of input and output data Qx */
4212 : )
4213 : {
4214 : Word32 scratch[480], cmplx[480];
4215 97824 : Word16 factors[3] = { 16, 5, 3 };
4216 97824 : move16();
4217 97824 : move16();
4218 97824 : move16();
4219 :
4220 97824 : fftf_interleave( x, y, cmplx, 240 );
4221 97824 : pfaDFT( cmplx, 240, scratch, 3, factors );
4222 97824 : fftf_deinterleave( cmplx, x, y, 240 );
4223 :
4224 97824 : return;
4225 : }
4226 :
4227 0 : static void DoRTFT200(
4228 : Word32 *x, /* i/o: real part of input and output data Qx */
4229 : Word32 *y /* i/o: imaginary part of input and output data Qx */
4230 : )
4231 : {
4232 : Word32 scratch[400], cmplx[400];
4233 0 : Word16 factors[2] = { 25, 8 };
4234 0 : move16();
4235 0 : move16();
4236 :
4237 0 : fftf_interleave( x, y, cmplx, 200 );
4238 0 : pfaDFT( cmplx, 200, scratch, 2, factors );
4239 0 : fftf_deinterleave( cmplx, x, y, 200 );
4240 :
4241 0 : return;
4242 : }
4243 :
4244 0 : static void DoRTFT100(
4245 : Word32 *x, /* i/o: real part of input and output data Qx */
4246 : Word32 *y /* i/o: imaginary part of input and output data Qx */
4247 : )
4248 : {
4249 : Word32 scratch[200], cmplx[200];
4250 0 : Word16 factors[2] = { 25, 4 };
4251 0 : move16();
4252 0 : move16();
4253 :
4254 0 : fftf_interleave( x, y, cmplx, 100 );
4255 0 : pfaDFT( cmplx, 100, scratch, 2, factors );
4256 0 : fftf_deinterleave( cmplx, x, y, 100 );
4257 :
4258 0 : return;
4259 : }
4260 :
4261 :
4262 102762 : void DoFFT_fx(
4263 : Word32 *re2, // Qx
4264 : Word32 *im2, // Qx
4265 : const Word16 length // Q0
4266 : )
4267 : {
4268 102762 : SWITCH( length )
4269 : {
4270 0 : case 600:
4271 0 : DoRTFT600( re2, im2 );
4272 0 : BREAK;
4273 0 : case 480:
4274 0 : DoRTFT480_fx( re2, im2 );
4275 0 : BREAK;
4276 0 : case 400:
4277 0 : DoRTFT400( re2, im2 );
4278 0 : BREAK;
4279 0 : case 320:
4280 0 : DoRTFT320_fx( re2, im2 );
4281 0 : BREAK;
4282 0 : case 256:
4283 0 : DoRTFTn_fx_ivas( re2, im2, 256 );
4284 0 : BREAK;
4285 97824 : case 240:
4286 97824 : DoRTFT240( re2, im2 );
4287 97824 : BREAK;
4288 0 : case 200:
4289 0 : DoRTFT200( re2, im2 );
4290 0 : BREAK;
4291 1298 : case 160:
4292 1298 : DoRTFT160_fx( re2, im2 );
4293 1298 : BREAK;
4294 0 : case 128:
4295 0 : DoRTFT128_fx( re2, im2 );
4296 0 : BREAK;
4297 0 : case 120:
4298 0 : DoRTFT120_fx( re2, im2 );
4299 0 : BREAK;
4300 0 : case 100:
4301 0 : DoRTFT100( re2, im2 );
4302 0 : BREAK;
4303 3640 : case 80:
4304 3640 : DoRTFT80_fx( re2, im2 );
4305 3640 : BREAK;
4306 0 : case 64:
4307 0 : DoRTFTn_fx_ivas( re2, im2, 64 );
4308 0 : BREAK;
4309 0 : case 40:
4310 0 : DoRTFT40_fx( re2, im2 );
4311 0 : BREAK;
4312 0 : case 20:
4313 0 : DoRTFT20_fx( re2, im2 );
4314 0 : BREAK;
4315 0 : default:
4316 0 : assert( !"fft is not supported!" );
4317 : }
4318 :
4319 102762 : return;
4320 : }
4321 :
4322 : /*-----------------------------------------------------------------*
4323 : * Low-complexity implementation of FFT
4324 : *-----------------------------------------------------------------*/
4325 :
4326 0 : static void fft_len5(
4327 : cmplx *x // Qx
4328 : )
4329 : {
4330 : cmplx y1, y2, y3, y4;
4331 : cmplx t;
4332 :
4333 0 : y1 = CL_add( x[1], x[4] );
4334 0 : y4 = CL_sub( x[1], x[4] );
4335 0 : y3 = CL_add( x[2], x[3] );
4336 0 : y2 = CL_sub( x[2], x[3] );
4337 0 : t = CL_scale( CL_sub( y1, y3 ), FFT_C54 ); // Qx
4338 0 : y1 = CL_add( y1, y3 );
4339 0 : x[0] = CL_add( x[0], y1 );
4340 0 : move64();
4341 :
4342 0 : y1 = CL_add( x[0], CL_shl( CL_scale( y1, FFT_C55 ), 1 ) ); // Qx
4343 0 : y3 = CL_sub( y1, t );
4344 0 : y1 = CL_add( y1, t );
4345 0 : t = CL_scale( CL_add( y4, y2 ), FFT_C51 );
4346 :
4347 0 : y4 = CL_add( t, CL_shl( CL_scale( y4, FFT_C52 ), 1 ) ); // Qx
4348 0 : y2 = CL_add( t, CL_scale( y2, FFT_C53 ) ); // Qx
4349 :
4350 0 : x[1] = CL_msu_j( y1, y2 );
4351 0 : move64();
4352 0 : x[4] = CL_mac_j( y1, y2 );
4353 0 : move64();
4354 0 : x[2] = CL_mac_j( y3, y4 );
4355 0 : move64();
4356 0 : x[3] = CL_msu_j( y3, y4 );
4357 0 : move64();
4358 :
4359 0 : return;
4360 : }
4361 :
4362 0 : static void fft_len8(
4363 : cmplx *x // Qx
4364 : )
4365 : {
4366 : cmplx t[8], s[8];
4367 :
4368 0 : t[0] = CL_add( x[0], x[4] );
4369 0 : move64();
4370 0 : t[1] = CL_sub( x[0], x[4] );
4371 0 : move64();
4372 0 : t[2] = CL_add( x[1], x[5] );
4373 0 : move64();
4374 0 : t[3] = CL_sub( x[1], x[5] );
4375 0 : move64();
4376 0 : t[4] = CL_add( x[2], x[6] );
4377 0 : move64();
4378 0 : t[5] = CL_sub( x[2], x[6] );
4379 0 : move64();
4380 0 : t[6] = CL_add( x[3], x[7] );
4381 0 : move64();
4382 0 : t[7] = CL_sub( x[3], x[7] );
4383 0 : move64();
4384 :
4385 0 : s[0] = CL_add( t[0], t[4] );
4386 0 : move64();
4387 0 : s[2] = CL_sub( t[0], t[4] );
4388 0 : move64();
4389 0 : s[4] = CL_mac_j( t[1], t[5] );
4390 0 : move64();
4391 0 : s[5] = CL_msu_j( t[1], t[5] );
4392 0 : move64();
4393 0 : s[1] = CL_add( t[2], t[6] );
4394 0 : move64();
4395 0 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
4396 0 : move64();
4397 :
4398 0 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
4399 0 : move64();
4400 0 : t[1] = CL_sub( t[3], t[7] );
4401 0 : move64();
4402 :
4403 0 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 );
4404 0 : move64();
4405 0 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 );
4406 0 : move64();
4407 0 : s[7] = CL_conjugate( s[7] );
4408 0 : move64();
4409 :
4410 0 : x[0] = CL_add( s[0], s[1] );
4411 0 : move64();
4412 0 : x[4] = CL_sub( s[0], s[1] );
4413 0 : move64();
4414 0 : x[2] = CL_sub( s[2], s[3] );
4415 0 : move64();
4416 0 : x[6] = CL_add( s[2], s[3] );
4417 0 : move64();
4418 0 : x[3] = CL_add( s[4], s[7] );
4419 0 : move64();
4420 0 : x[7] = CL_sub( s[4], s[7] );
4421 0 : move64();
4422 0 : x[1] = CL_add( s[5], s[6] );
4423 0 : move64();
4424 0 : x[5] = CL_sub( s[5], s[6] );
4425 0 : move64();
4426 :
4427 0 : return;
4428 : }
4429 :
4430 2492896 : static void fft_len10(
4431 : cmplx *x // Qx
4432 : )
4433 : {
4434 : cmplx t;
4435 : cmplx s[4];
4436 : cmplx y[10];
4437 :
4438 2492896 : s[0] = CL_add( x[6], x[4] );
4439 2492896 : move64();
4440 2492896 : s[3] = CL_sub( x[6], x[4] );
4441 2492896 : move64();
4442 2492896 : s[2] = CL_add( x[2], x[8] );
4443 2492896 : move64();
4444 2492896 : s[1] = CL_sub( x[2], x[8] );
4445 2492896 : move64();
4446 2492896 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
4447 2492896 : s[0] = CL_add( s[0], s[2] );
4448 2492896 : move64();
4449 2492896 : y[0] = CL_add( x[0], s[0] );
4450 2492896 : move64();
4451 2492896 : s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
4452 2492896 : move64();
4453 2492896 : s[2] = CL_sub( s[0], t );
4454 2492896 : move64();
4455 2492896 : s[0] = CL_add( s[0], t );
4456 2492896 : move64();
4457 2492896 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
4458 2492896 : move64();
4459 2492896 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
4460 2492896 : move64();
4461 2492896 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
4462 2492896 : move64();
4463 :
4464 2492896 : y[2] = CL_msu_j( s[0], s[1] );
4465 2492896 : move64();
4466 2492896 : y[8] = CL_mac_j( s[0], s[1] );
4467 2492896 : move64();
4468 2492896 : y[4] = CL_mac_j( s[2], s[3] );
4469 2492896 : move64();
4470 2492896 : y[6] = CL_msu_j( s[2], s[3] );
4471 2492896 : move64();
4472 :
4473 2492896 : s[0] = CL_add( x[1], x[9] );
4474 2492896 : move64();
4475 2492896 : s[3] = CL_sub( x[1], x[9] );
4476 2492896 : move64();
4477 2492896 : s[2] = CL_add( x[7], x[3] );
4478 2492896 : move64();
4479 2492896 : s[1] = CL_sub( x[7], x[3] );
4480 2492896 : move64();
4481 2492896 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
4482 2492896 : s[0] = CL_add( s[0], s[2] );
4483 2492896 : move64();
4484 2492896 : y[1] = CL_add( x[5], s[0] );
4485 2492896 : move64();
4486 2492896 : s[0] = CL_add( y[1], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
4487 2492896 : move64();
4488 2492896 : s[2] = CL_sub( s[0], t );
4489 2492896 : move64();
4490 2492896 : s[0] = CL_add( s[0], t );
4491 2492896 : move64();
4492 2492896 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
4493 2492896 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
4494 2492896 : move64();
4495 2492896 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
4496 2492896 : move64();
4497 :
4498 2492896 : y[3] = CL_msu_j( s[0], s[1] );
4499 2492896 : move64();
4500 2492896 : y[9] = CL_mac_j( s[0], s[1] );
4501 2492896 : move64();
4502 2492896 : move64();
4503 2492896 : y[5] = CL_mac_j( s[2], s[3] );
4504 2492896 : move64();
4505 2492896 : y[7] = CL_msu_j( s[2], s[3] );
4506 2492896 : move64();
4507 :
4508 :
4509 2492896 : x[0] = CL_add( y[0], y[1] );
4510 2492896 : move64();
4511 2492896 : x[5] = CL_sub( y[0], y[1] );
4512 2492896 : move64();
4513 :
4514 2492896 : x[2] = CL_add( y[2], y[3] );
4515 2492896 : move64();
4516 2492896 : x[7] = CL_sub( y[2], y[3] );
4517 2492896 : move64();
4518 :
4519 2492896 : x[4] = CL_add( y[4], y[5] );
4520 2492896 : move64();
4521 2492896 : x[9] = CL_sub( y[4], y[5] );
4522 2492896 : move64();
4523 :
4524 2492896 : x[6] = CL_add( y[6], y[7] );
4525 2492896 : move64();
4526 2492896 : x[1] = CL_sub( y[6], y[7] );
4527 2492896 : move64();
4528 :
4529 2492896 : x[8] = CL_add( y[8], y[9] );
4530 2492896 : move64();
4531 2492896 : x[3] = CL_sub( y[8], y[9] );
4532 2492896 : move64();
4533 :
4534 2492896 : return;
4535 : }
4536 :
4537 3716272 : static void fft_len15(
4538 : cmplx *x // Qx
4539 : )
4540 : {
4541 : cmplx t;
4542 : cmplx s[5];
4543 : cmplx y[15];
4544 :
4545 3716272 : s[0] = CL_add( x[3], x[12] );
4546 3716272 : move64();
4547 3716272 : s[3] = CL_sub( x[3], x[12] );
4548 3716272 : move64();
4549 3716272 : s[2] = CL_add( x[6], x[9] );
4550 3716272 : move64();
4551 3716272 : s[1] = CL_sub( x[6], x[9] );
4552 3716272 : move64();
4553 3716272 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
4554 3716272 : s[0] = CL_add( s[0], s[2] );
4555 3716272 : move64();
4556 3716272 : y[0] = CL_add( x[0], s[0] );
4557 3716272 : move64();
4558 3716272 : s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
4559 3716272 : move64();
4560 3716272 : s[2] = CL_sub( s[0], t );
4561 3716272 : move64();
4562 3716272 : s[0] = CL_add( s[0], t );
4563 3716272 : move64();
4564 3716272 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
4565 3716272 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
4566 3716272 : move64();
4567 3716272 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
4568 3716272 : move64();
4569 :
4570 3716272 : y[1] = CL_msu_j( s[0], s[1] );
4571 3716272 : move64();
4572 3716272 : y[4] = CL_mac_j( s[0], s[1] );
4573 3716272 : move64();
4574 3716272 : y[2] = CL_mac_j( s[2], s[3] );
4575 3716272 : move64();
4576 3716272 : y[3] = CL_msu_j( s[2], s[3] );
4577 3716272 : move64();
4578 :
4579 3716272 : s[0] = CL_add( x[8], x[2] );
4580 3716272 : move64();
4581 3716272 : s[3] = CL_sub( x[8], x[2] );
4582 3716272 : move64();
4583 3716272 : s[2] = CL_add( x[11], x[14] );
4584 3716272 : move64();
4585 3716272 : s[1] = CL_sub( x[11], x[14] );
4586 3716272 : move64();
4587 3716272 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
4588 3716272 : s[0] = CL_add( s[0], s[2] );
4589 3716272 : move64();
4590 3716272 : y[5] = CL_add( x[5], s[0] );
4591 3716272 : move64();
4592 3716272 : s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
4593 3716272 : move64();
4594 3716272 : s[2] = CL_sub( s[0], t );
4595 3716272 : move64();
4596 3716272 : s[0] = CL_add( s[0], t );
4597 3716272 : move64();
4598 3716272 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
4599 3716272 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
4600 3716272 : move64();
4601 3716272 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
4602 3716272 : move64();
4603 :
4604 3716272 : y[6] = CL_msu_j( s[0], s[1] );
4605 3716272 : move64();
4606 3716272 : y[9] = CL_mac_j( s[0], s[1] );
4607 3716272 : move64();
4608 3716272 : y[7] = CL_mac_j( s[2], s[3] );
4609 3716272 : move64();
4610 3716272 : y[8] = CL_msu_j( s[2], s[3] );
4611 3716272 : move64();
4612 :
4613 3716272 : s[0] = CL_add( x[13], x[7] );
4614 3716272 : move64();
4615 3716272 : s[3] = CL_sub( x[13], x[7] );
4616 3716272 : move64();
4617 3716272 : s[2] = CL_add( x[1], x[4] );
4618 3716272 : move64();
4619 3716272 : s[1] = CL_sub( x[1], x[4] );
4620 3716272 : move64();
4621 3716272 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
4622 3716272 : s[0] = CL_add( s[0], s[2] );
4623 3716272 : move64();
4624 3716272 : y[10] = CL_add( x[10], s[0] );
4625 3716272 : move64();
4626 3716272 : s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
4627 3716272 : move64();
4628 3716272 : s[2] = CL_sub( s[0], t );
4629 3716272 : move64();
4630 3716272 : s[0] = CL_add( s[0], t );
4631 3716272 : move64();
4632 3716272 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
4633 3716272 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
4634 3716272 : move64();
4635 3716272 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
4636 3716272 : move64();
4637 :
4638 3716272 : y[11] = CL_msu_j( s[0], s[1] );
4639 3716272 : move64();
4640 3716272 : y[14] = CL_mac_j( s[0], s[1] );
4641 3716272 : move64();
4642 3716272 : y[12] = CL_mac_j( s[2], s[3] );
4643 3716272 : move64();
4644 3716272 : y[13] = CL_msu_j( s[2], s[3] );
4645 3716272 : move64();
4646 :
4647 3716272 : s[0] = CL_add( y[5], y[10] );
4648 3716272 : move64();
4649 3716272 : s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
4650 3716272 : move64();
4651 3716272 : x[0] = CL_add( y[0], s[0] );
4652 3716272 : move64();
4653 3716272 : s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
4654 3716272 : move64();
4655 :
4656 3716272 : x[10] = CL_mac_j( s[0], s[1] );
4657 3716272 : move64();
4658 3716272 : x[5] = CL_msu_j( s[0], s[1] );
4659 3716272 : move64();
4660 :
4661 3716272 : s[0] = CL_add( y[6], y[11] );
4662 3716272 : move64();
4663 3716272 : s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
4664 3716272 : move64();
4665 3716272 : x[6] = CL_add( y[1], s[0] );
4666 3716272 : move64();
4667 3716272 : s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
4668 3716272 : move64();
4669 :
4670 3716272 : x[1] = CL_mac_j( s[0], s[1] );
4671 3716272 : move64();
4672 3716272 : x[11] = CL_msu_j( s[0], s[1] );
4673 3716272 : move64();
4674 :
4675 3716272 : s[0] = CL_add( y[7], y[12] );
4676 3716272 : move64();
4677 3716272 : s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
4678 3716272 : move64();
4679 3716272 : x[12] = CL_add( y[2], s[0] );
4680 3716272 : move64();
4681 3716272 : s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
4682 3716272 : move64();
4683 :
4684 3716272 : x[7] = CL_mac_j( s[0], s[1] );
4685 3716272 : move64();
4686 3716272 : x[2] = CL_msu_j( s[0], s[1] );
4687 3716272 : move64();
4688 :
4689 3716272 : s[0] = CL_add( y[8], y[13] );
4690 3716272 : move64();
4691 3716272 : s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
4692 3716272 : move64();
4693 3716272 : x[3] = CL_add( y[3], s[0] );
4694 3716272 : move64();
4695 3716272 : s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
4696 3716272 : move64();
4697 :
4698 3716272 : x[13] = CL_mac_j( s[0], s[1] );
4699 3716272 : move64();
4700 3716272 : x[8] = CL_msu_j( s[0], s[1] );
4701 3716272 : move64();
4702 :
4703 3716272 : s[0] = CL_add( y[9], y[14] );
4704 3716272 : move64();
4705 3716272 : s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
4706 3716272 : move64();
4707 3716272 : x[9] = CL_add( y[4], s[0] );
4708 3716272 : move64();
4709 3716272 : s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
4710 3716272 : move64();
4711 :
4712 3716272 : x[4] = CL_mac_j( s[0], s[1] );
4713 3716272 : move64();
4714 3716272 : x[14] = CL_msu_j( s[0], s[1] );
4715 3716272 : move64();
4716 :
4717 3716272 : return;
4718 : }
4719 :
4720 60828086 : static void fft_len16(
4721 : cmplx *x // Qx
4722 : )
4723 : {
4724 : cmplx s[4];
4725 : cmplx t[4];
4726 : cmplx y[16];
4727 :
4728 60828086 : s[0] = x[0]; // Qx
4729 60828086 : move64();
4730 60828086 : s[1] = x[4]; // Qx
4731 60828086 : move64();
4732 60828086 : s[2] = x[8]; // Qx
4733 60828086 : move64();
4734 60828086 : s[3] = x[12]; // Qx
4735 60828086 : move64();
4736 :
4737 60828086 : t[0] = CL_add( s[0], s[2] );
4738 60828086 : move64();
4739 60828086 : t[1] = CL_sub( s[0], s[2] );
4740 60828086 : move64();
4741 60828086 : t[2] = CL_add( s[1], s[3] );
4742 60828086 : move64();
4743 60828086 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
4744 60828086 : move64();
4745 :
4746 60828086 : y[0] = CL_add( t[0], t[2] );
4747 60828086 : move64();
4748 60828086 : y[1] = CL_sub( t[1], t[3] );
4749 60828086 : move64();
4750 60828086 : y[2] = CL_sub( t[0], t[2] );
4751 60828086 : move64();
4752 60828086 : y[3] = CL_add( t[1], t[3] );
4753 60828086 : move64();
4754 :
4755 60828086 : s[0] = x[1]; // Qx
4756 60828086 : move64();
4757 60828086 : s[1] = x[5]; // Qx
4758 60828086 : move64();
4759 60828086 : s[2] = x[9]; // Qx
4760 60828086 : move64();
4761 60828086 : s[3] = x[13]; // Qx
4762 60828086 : move64();
4763 :
4764 60828086 : t[0] = CL_add( s[0], s[2] );
4765 60828086 : move64();
4766 60828086 : t[1] = CL_sub( s[0], s[2] );
4767 60828086 : move64();
4768 60828086 : t[2] = CL_add( s[1], s[3] );
4769 60828086 : move64();
4770 60828086 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
4771 60828086 : move64();
4772 :
4773 60828086 : y[4] = CL_add( t[0], t[2] );
4774 60828086 : move64();
4775 60828086 : y[5] = CL_sub( t[1], t[3] );
4776 60828086 : move64();
4777 60828086 : y[6] = CL_sub( t[0], t[2] );
4778 60828086 : move64();
4779 60828086 : y[7] = CL_add( t[1], t[3] );
4780 60828086 : move64();
4781 :
4782 60828086 : s[0] = x[2]; // Qx
4783 60828086 : move64();
4784 60828086 : s[1] = x[6]; // Qx
4785 60828086 : move64();
4786 60828086 : s[2] = x[10]; // Qx
4787 60828086 : move64();
4788 60828086 : s[3] = x[14]; // Qx
4789 60828086 : move64();
4790 :
4791 60828086 : t[0] = CL_add( s[0], s[2] );
4792 60828086 : move64();
4793 60828086 : t[1] = CL_sub( s[0], s[2] );
4794 60828086 : move64();
4795 60828086 : t[2] = CL_add( s[1], s[3] );
4796 60828086 : move64();
4797 60828086 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
4798 60828086 : move64();
4799 :
4800 60828086 : y[8] = CL_add( t[0], t[2] );
4801 60828086 : move64();
4802 60828086 : y[9] = CL_sub( t[1], t[3] );
4803 60828086 : move64();
4804 60828086 : y[10] = CL_swap_real_imag( CL_sub( t[0], t[2] ) );
4805 60828086 : move64();
4806 60828086 : y[10] = CL_conjugate( y[10] );
4807 60828086 : move64();
4808 60828086 : y[11] = CL_add( t[1], t[3] );
4809 60828086 : move64();
4810 :
4811 60828086 : s[0] = x[3]; // Qx
4812 60828086 : move64();
4813 60828086 : s[1] = x[7]; // Qx
4814 60828086 : move64();
4815 60828086 : s[2] = x[11]; // Qx
4816 60828086 : move64();
4817 60828086 : s[3] = x[15]; // Qx
4818 60828086 : move64();
4819 :
4820 60828086 : t[0] = CL_add( s[0], s[2] );
4821 60828086 : move64();
4822 60828086 : t[1] = CL_sub( s[0], s[2] );
4823 60828086 : move64();
4824 60828086 : t[2] = CL_add( s[1], s[3] );
4825 60828086 : move64();
4826 60828086 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
4827 60828086 : move64();
4828 :
4829 60828086 : y[12] = CL_add( t[0], t[2] );
4830 60828086 : move64();
4831 60828086 : y[13] = CL_sub( t[1], t[3] );
4832 60828086 : move64();
4833 60828086 : y[14] = CL_sub( t[0], t[2] );
4834 60828086 : move64();
4835 60828086 : y[15] = CL_add( t[1], t[3] );
4836 60828086 : move64();
4837 :
4838 60828086 : s[0] = CL_scale( y[11], FFT_C162 ); // Qx
4839 60828086 : move64();
4840 60828086 : y[11] = CL_mac_j( s[0], s[0] );
4841 60828086 : move64();
4842 :
4843 60828086 : s[0] = CL_scale( y[14], FFT_C162 ); // Qx
4844 60828086 : move64();
4845 60828086 : y[14] = CL_mac_j( s[0], s[0] );
4846 60828086 : move64();
4847 :
4848 60828086 : s[0] = CL_scale( y[6], FFT_C161 ); // Qx
4849 60828086 : move64();
4850 60828086 : y[6] = CL_mac_j( s[0], s[0] );
4851 60828086 : move64();
4852 60828086 : y[6] = CL_swap_real_imag( y[6] );
4853 60828086 : move64();
4854 60828086 : y[6] = CL_conjugate( y[6] );
4855 60828086 : move64();
4856 :
4857 60828086 : s[0] = CL_scale( y[9], FFT_C161 ); // Qx
4858 60828086 : move64();
4859 60828086 : y[9] = CL_mac_j( s[0], s[0] );
4860 60828086 : move64();
4861 60828086 : y[9] = CL_swap_real_imag( y[9] );
4862 60828086 : move64();
4863 60828086 : y[9] = CL_conjugate( y[9] );
4864 60828086 : move64();
4865 :
4866 60828086 : s[0] = CL_scale( y[5], FFT_C163 ); // Qx
4867 60828086 : move64();
4868 60828086 : s[1] = CL_scale( y[5], FFT_C166 ); // Qx
4869 60828086 : move64();
4870 60828086 : y[5] = CL_mac_j( s[0], s[1] );
4871 60828086 : move64();
4872 :
4873 60828086 : s[0] = CL_scale( y[7], FFT_C165 ); // Qx
4874 60828086 : move64();
4875 60828086 : s[1] = CL_scale( y[7], FFT_C164 ); // Qx
4876 60828086 : move64();
4877 60828086 : y[7] = CL_mac_j( s[0], s[1] );
4878 60828086 : move64();
4879 :
4880 60828086 : s[0] = CL_scale( y[13], FFT_C165 ); // Qx
4881 60828086 : move64();
4882 60828086 : s[1] = CL_scale( y[13], FFT_C164 ); // Qx
4883 60828086 : move64();
4884 60828086 : y[13] = CL_mac_j( s[0], s[1] );
4885 60828086 : move64();
4886 :
4887 60828086 : s[0] = CL_scale( y[15], FFT_C164 ); // Qx
4888 60828086 : move64();
4889 60828086 : s[1] = CL_scale( y[15], FFT_C165 ); // Qx
4890 60828086 : move64();
4891 60828086 : y[15] = CL_mac_j( s[0], s[1] );
4892 60828086 : move64();
4893 :
4894 60828086 : t[0] = CL_add( y[0], y[8] );
4895 60828086 : move64();
4896 60828086 : t[1] = CL_sub( y[0], y[8] );
4897 60828086 : move64();
4898 60828086 : t[2] = CL_add( y[4], y[12] );
4899 60828086 : move64();
4900 60828086 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[4] ), CL_conjugate( y[12] ) ) );
4901 60828086 : move64();
4902 :
4903 60828086 : x[0] = CL_add( t[0], t[2] );
4904 60828086 : move64();
4905 60828086 : x[4] = CL_sub( t[1], t[3] );
4906 60828086 : move64();
4907 60828086 : x[8] = CL_sub( t[0], t[2] );
4908 60828086 : move64();
4909 60828086 : x[12] = CL_add( t[1], t[3] );
4910 60828086 : move64();
4911 :
4912 60828086 : t[0] = CL_add( y[1], y[9] );
4913 60828086 : move64();
4914 60828086 : t[1] = CL_sub( y[1], y[9] );
4915 60828086 : move64();
4916 60828086 : t[2] = CL_add( y[5], y[13] );
4917 60828086 : move64();
4918 60828086 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[5] ), CL_conjugate( y[13] ) ) );
4919 60828086 : move64();
4920 :
4921 60828086 : x[1] = CL_add( t[0], t[2] );
4922 60828086 : move64();
4923 60828086 : x[5] = CL_sub( t[1], t[3] );
4924 60828086 : move64();
4925 60828086 : x[9] = CL_sub( t[0], t[2] );
4926 60828086 : move64();
4927 60828086 : x[13] = CL_add( t[1], t[3] );
4928 60828086 : move64();
4929 :
4930 60828086 : t[0] = CL_add( y[2], y[10] );
4931 60828086 : move64();
4932 60828086 : t[1] = CL_sub( y[2], y[10] );
4933 60828086 : move64();
4934 60828086 : t[2] = CL_add( y[6], y[14] );
4935 60828086 : move64();
4936 60828086 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[6] ), CL_conjugate( y[14] ) ) );
4937 60828086 : move64();
4938 :
4939 60828086 : x[2] = CL_add( t[0], t[2] );
4940 60828086 : move64();
4941 60828086 : x[6] = CL_sub( t[1], t[3] );
4942 60828086 : move64();
4943 60828086 : x[10] = CL_sub( t[0], t[2] );
4944 60828086 : move64();
4945 60828086 : x[14] = CL_add( t[1], t[3] );
4946 60828086 : move64();
4947 :
4948 60828086 : t[0] = CL_add( y[3], y[11] );
4949 60828086 : move64();
4950 60828086 : t[1] = CL_sub( y[3], y[11] );
4951 60828086 : move64();
4952 60828086 : t[2] = CL_add( y[7], y[15] );
4953 60828086 : move64();
4954 60828086 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[7] ), CL_conjugate( y[15] ) ) );
4955 60828086 : move64();
4956 :
4957 60828086 : x[3] = CL_add( t[0], t[2] );
4958 60828086 : move64();
4959 60828086 : x[7] = CL_sub( t[1], t[3] );
4960 60828086 : move64();
4961 60828086 : x[11] = CL_sub( t[0], t[2] );
4962 60828086 : move64();
4963 60828086 : x[15] = CL_add( t[1], t[3] );
4964 60828086 : move64();
4965 :
4966 60828086 : return;
4967 : }
4968 :
4969 48020792 : static void fft_len20_fx(
4970 : cmplx *x // Qx
4971 : )
4972 : {
4973 : cmplx s[4];
4974 : cmplx xx[5];
4975 : cmplx t;
4976 : cmplx tt[4];
4977 : cmplx y[20];
4978 :
4979 48020792 : xx[0] = x[0]; // Qx
4980 48020792 : move64();
4981 48020792 : xx[1] = x[16]; // Qx
4982 48020792 : move64();
4983 48020792 : xx[2] = x[12]; // Qx
4984 48020792 : move64();
4985 48020792 : xx[3] = x[8]; // Qx
4986 48020792 : move64();
4987 48020792 : xx[4] = x[4]; // Qx
4988 48020792 : move64();
4989 :
4990 48020792 : s[0] = CL_add( xx[1], xx[4] );
4991 48020792 : move64();
4992 48020792 : s[3] = CL_sub( xx[1], xx[4] );
4993 48020792 : move64();
4994 48020792 : s[2] = CL_add( xx[2], xx[3] );
4995 48020792 : move64();
4996 48020792 : s[1] = CL_sub( xx[2], xx[3] );
4997 48020792 : move64();
4998 48020792 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
4999 48020792 : s[0] = CL_add( s[0], s[2] );
5000 48020792 : move64();
5001 48020792 : y[0] = CL_add( xx[0], s[0] );
5002 48020792 : move64();
5003 48020792 : s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5004 48020792 : move64();
5005 48020792 : s[2] = CL_sub( s[0], t );
5006 48020792 : move64();
5007 48020792 : s[0] = CL_add( s[0], t );
5008 48020792 : move64();
5009 48020792 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5010 48020792 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5011 48020792 : move64();
5012 48020792 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
5013 48020792 : move64();
5014 :
5015 48020792 : y[4] = CL_msu_j( s[0], s[1] );
5016 48020792 : move64();
5017 48020792 : y[16] = CL_mac_j( s[0], s[1] );
5018 48020792 : move64();
5019 48020792 : y[8] = CL_mac_j( s[2], s[3] );
5020 48020792 : move64();
5021 48020792 : y[12] = CL_msu_j( s[2], s[3] );
5022 48020792 : move64();
5023 :
5024 48020792 : xx[0] = x[5];
5025 48020792 : move64();
5026 48020792 : xx[1] = x[1];
5027 48020792 : move64();
5028 48020792 : xx[2] = x[17];
5029 48020792 : move64();
5030 48020792 : xx[3] = x[13];
5031 48020792 : move64();
5032 48020792 : xx[4] = x[9];
5033 48020792 : move64();
5034 :
5035 48020792 : s[0] = CL_add( xx[1], xx[4] );
5036 48020792 : move64();
5037 48020792 : s[3] = CL_sub( xx[1], xx[4] );
5038 48020792 : move64();
5039 48020792 : s[2] = CL_add( xx[2], xx[3] );
5040 48020792 : move64();
5041 48020792 : s[1] = CL_sub( xx[2], xx[3] );
5042 48020792 : move64();
5043 48020792 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
5044 48020792 : s[0] = CL_add( s[0], s[2] );
5045 48020792 : move64();
5046 48020792 : y[1] = CL_add( xx[0], s[0] );
5047 48020792 : move64();
5048 48020792 : s[0] = CL_add( y[1], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5049 48020792 : move64();
5050 48020792 : s[2] = CL_sub( s[0], t );
5051 48020792 : move64();
5052 48020792 : s[0] = CL_add( s[0], t );
5053 48020792 : move64();
5054 48020792 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5055 48020792 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5056 48020792 : move64();
5057 48020792 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
5058 48020792 : move64();
5059 :
5060 48020792 : y[5] = CL_msu_j( s[0], s[1] );
5061 48020792 : move64();
5062 48020792 : y[17] = CL_mac_j( s[0], s[1] );
5063 48020792 : move64();
5064 48020792 : y[9] = CL_mac_j( s[2], s[3] );
5065 48020792 : move64();
5066 48020792 : y[13] = CL_msu_j( s[2], s[3] );
5067 48020792 : move64();
5068 :
5069 48020792 : xx[0] = x[10];
5070 48020792 : move64();
5071 48020792 : xx[1] = x[6];
5072 48020792 : move64();
5073 48020792 : xx[2] = x[2];
5074 48020792 : move64();
5075 48020792 : xx[3] = x[18];
5076 48020792 : move64();
5077 48020792 : xx[4] = x[14];
5078 48020792 : move64();
5079 :
5080 48020792 : s[0] = CL_add( xx[1], xx[4] );
5081 48020792 : move64();
5082 48020792 : s[3] = CL_sub( xx[1], xx[4] );
5083 48020792 : move64();
5084 48020792 : s[2] = CL_add( xx[2], xx[3] );
5085 48020792 : move64();
5086 48020792 : s[1] = CL_sub( xx[2], xx[3] );
5087 48020792 : move64();
5088 48020792 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
5089 48020792 : s[0] = CL_add( s[0], s[2] );
5090 48020792 : move64();
5091 48020792 : y[2] = CL_add( xx[0], s[0] );
5092 48020792 : move64();
5093 48020792 : s[0] = CL_add( y[2], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5094 48020792 : move64();
5095 48020792 : s[2] = CL_sub( s[0], t );
5096 48020792 : move64();
5097 48020792 : s[0] = CL_add( s[0], t );
5098 48020792 : move64();
5099 48020792 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5100 48020792 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5101 48020792 : move64();
5102 48020792 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
5103 48020792 : move64();
5104 :
5105 48020792 : y[6] = CL_msu_j( s[0], s[1] );
5106 48020792 : move64();
5107 48020792 : y[18] = CL_mac_j( s[0], s[1] );
5108 48020792 : move64();
5109 48020792 : y[10] = CL_mac_j( s[2], s[3] );
5110 48020792 : move64();
5111 48020792 : y[14] = CL_msu_j( s[2], s[3] );
5112 48020792 : move64();
5113 :
5114 48020792 : xx[0] = x[15];
5115 48020792 : move64();
5116 48020792 : xx[1] = x[11];
5117 48020792 : move64();
5118 48020792 : xx[2] = x[7];
5119 48020792 : move64();
5120 48020792 : xx[3] = x[3];
5121 48020792 : move64();
5122 48020792 : xx[4] = x[19];
5123 48020792 : move64();
5124 :
5125 48020792 : s[0] = CL_add( xx[1], xx[4] );
5126 48020792 : move64();
5127 48020792 : s[3] = CL_sub( xx[1], xx[4] );
5128 48020792 : move64();
5129 48020792 : s[2] = CL_add( xx[2], xx[3] );
5130 48020792 : move64();
5131 48020792 : s[1] = CL_sub( xx[2], xx[3] );
5132 48020792 : move64();
5133 48020792 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
5134 48020792 : s[0] = CL_add( s[0], s[2] );
5135 48020792 : move64();
5136 48020792 : y[3] = CL_add( xx[0], s[0] );
5137 48020792 : move64();
5138 48020792 : s[0] = CL_add( y[3], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5139 48020792 : move64();
5140 48020792 : s[2] = CL_sub( s[0], t );
5141 48020792 : move64();
5142 48020792 : s[0] = CL_add( s[0], t );
5143 48020792 : move64();
5144 48020792 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5145 48020792 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5146 48020792 : move64();
5147 48020792 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
5148 48020792 : move64();
5149 :
5150 48020792 : y[7] = CL_msu_j( s[0], s[1] );
5151 48020792 : move64();
5152 48020792 : y[19] = CL_mac_j( s[0], s[1] );
5153 48020792 : move64();
5154 48020792 : y[11] = CL_mac_j( s[2], s[3] );
5155 48020792 : move64();
5156 48020792 : y[15] = CL_msu_j( s[2], s[3] );
5157 48020792 : move64();
5158 :
5159 48020792 : tt[0] = CL_add( y[0], y[2] );
5160 48020792 : move64();
5161 48020792 : tt[1] = CL_sub( y[0], y[2] );
5162 48020792 : move64();
5163 48020792 : tt[2] = CL_add( y[1], y[3] );
5164 48020792 : move64();
5165 48020792 : tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[1], y[3] ) ) );
5166 48020792 : move64();
5167 :
5168 48020792 : x[0] = CL_add( tt[0], tt[2] );
5169 48020792 : move64();
5170 48020792 : x[5] = CL_sub( tt[1], tt[3] );
5171 48020792 : move64();
5172 48020792 : x[10] = CL_sub( tt[0], tt[2] );
5173 48020792 : move64();
5174 48020792 : x[15] = CL_add( tt[1], tt[3] );
5175 48020792 : move64();
5176 :
5177 48020792 : tt[0] = CL_add( y[4], y[6] );
5178 48020792 : move64();
5179 48020792 : tt[1] = CL_sub( y[4], y[6] );
5180 48020792 : move64();
5181 48020792 : tt[2] = CL_add( y[5], y[7] );
5182 48020792 : move64();
5183 48020792 : tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[5], y[7] ) ) );
5184 48020792 : move64();
5185 :
5186 48020792 : x[4] = CL_add( tt[0], tt[2] );
5187 48020792 : move64();
5188 48020792 : x[9] = CL_sub( tt[1], tt[3] );
5189 48020792 : move64();
5190 48020792 : x[14] = CL_sub( tt[0], tt[2] );
5191 48020792 : move64();
5192 48020792 : x[19] = CL_add( tt[1], tt[3] );
5193 48020792 : move64();
5194 :
5195 48020792 : tt[0] = CL_add( y[8], y[10] );
5196 48020792 : move64();
5197 48020792 : tt[1] = CL_sub( y[8], y[10] );
5198 48020792 : move64();
5199 48020792 : tt[2] = CL_add( y[9], y[11] );
5200 48020792 : move64();
5201 48020792 : tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[9], y[11] ) ) );
5202 48020792 : move64();
5203 :
5204 48020792 : x[8] = CL_add( tt[0], tt[2] );
5205 48020792 : move64();
5206 48020792 : x[13] = CL_sub( tt[1], tt[3] );
5207 48020792 : move64();
5208 48020792 : x[18] = CL_sub( tt[0], tt[2] );
5209 48020792 : move64();
5210 48020792 : x[3] = CL_add( tt[1], tt[3] );
5211 48020792 : move64();
5212 :
5213 48020792 : tt[0] = CL_add( y[12], y[14] );
5214 48020792 : move64();
5215 48020792 : tt[1] = CL_sub( y[12], y[14] );
5216 48020792 : move64();
5217 48020792 : tt[2] = CL_add( y[13], y[15] );
5218 48020792 : move64();
5219 48020792 : tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[13], y[15] ) ) );
5220 48020792 : move64();
5221 :
5222 48020792 : x[12] = CL_add( tt[0], tt[2] );
5223 48020792 : move64();
5224 48020792 : x[17] = CL_sub( tt[1], tt[3] );
5225 48020792 : move64();
5226 48020792 : x[2] = CL_sub( tt[0], tt[2] );
5227 48020792 : move64();
5228 48020792 : x[7] = CL_add( tt[1], tt[3] );
5229 48020792 : move64();
5230 :
5231 48020792 : tt[0] = CL_add( y[16], y[18] );
5232 48020792 : move64();
5233 48020792 : tt[1] = CL_sub( y[16], y[18] );
5234 48020792 : move64();
5235 48020792 : tt[2] = CL_add( y[17], y[19] );
5236 48020792 : move64();
5237 48020792 : tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[17], y[19] ) ) );
5238 48020792 : move64();
5239 :
5240 48020792 : x[16] = CL_add( tt[0], tt[2] );
5241 48020792 : move64();
5242 48020792 : x[1] = CL_sub( tt[1], tt[3] );
5243 48020792 : move64();
5244 48020792 : x[6] = CL_sub( tt[0], tt[2] );
5245 48020792 : move64();
5246 48020792 : x[11] = CL_add( tt[1], tt[3] );
5247 48020792 : move64();
5248 :
5249 48020792 : return;
5250 : }
5251 :
5252 108158768 : static void fft_len30(
5253 : cmplx *x // Qx
5254 : )
5255 : {
5256 : cmplx t;
5257 : cmplx s[4];
5258 : cmplx xx[15];
5259 : cmplx y[15];
5260 : cmplx z[30];
5261 : cmplx *l, *h;
5262 :
5263 108158768 : l = &x[0];
5264 108158768 : h = &x[15];
5265 :
5266 108158768 : xx[0] = x[0];
5267 108158768 : move64();
5268 108158768 : xx[1] = x[18];
5269 108158768 : move64();
5270 108158768 : xx[2] = x[6];
5271 108158768 : move64();
5272 108158768 : xx[3] = x[24];
5273 108158768 : move64();
5274 108158768 : xx[4] = x[12];
5275 108158768 : move64();
5276 :
5277 108158768 : xx[5] = x[20];
5278 108158768 : move64();
5279 108158768 : xx[6] = x[8];
5280 108158768 : move64();
5281 108158768 : xx[7] = x[26];
5282 108158768 : move64();
5283 108158768 : xx[8] = x[14];
5284 108158768 : move64();
5285 108158768 : xx[9] = x[2];
5286 108158768 : move64();
5287 :
5288 108158768 : xx[10] = x[10];
5289 108158768 : move64();
5290 108158768 : xx[11] = x[28];
5291 108158768 : move64();
5292 108158768 : xx[12] = x[16];
5293 108158768 : move64();
5294 108158768 : xx[13] = x[4];
5295 108158768 : move64();
5296 108158768 : xx[14] = x[22];
5297 108158768 : move64();
5298 :
5299 108158768 : s[0] = CL_add( xx[1], xx[4] );
5300 108158768 : move64();
5301 108158768 : s[3] = CL_sub( xx[1], xx[4] );
5302 108158768 : move64();
5303 108158768 : s[2] = CL_add( xx[2], xx[3] );
5304 108158768 : move64();
5305 108158768 : s[1] = CL_sub( xx[2], xx[3] );
5306 108158768 : move64();
5307 108158768 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
5308 108158768 : s[0] = CL_add( s[0], s[2] );
5309 108158768 : move64();
5310 108158768 : y[0] = CL_add( xx[0], s[0] );
5311 108158768 : s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5312 108158768 : move64();
5313 108158768 : s[2] = CL_sub( s[0], t );
5314 108158768 : move64();
5315 108158768 : s[0] = CL_add( s[0], t );
5316 108158768 : move64();
5317 108158768 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5318 108158768 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5319 108158768 : move64();
5320 108158768 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
5321 108158768 : move64();
5322 :
5323 108158768 : y[1] = CL_msu_j( s[0], s[1] );
5324 108158768 : move64();
5325 108158768 : y[4] = CL_mac_j( s[0], s[1] );
5326 108158768 : move64();
5327 108158768 : y[2] = CL_mac_j( s[2], s[3] );
5328 108158768 : move64();
5329 108158768 : y[3] = CL_msu_j( s[2], s[3] );
5330 108158768 : move64();
5331 :
5332 108158768 : s[0] = CL_add( xx[6], xx[9] );
5333 108158768 : move64();
5334 108158768 : s[3] = CL_sub( xx[6], xx[9] );
5335 108158768 : move64();
5336 108158768 : s[2] = CL_add( xx[7], xx[8] );
5337 108158768 : move64();
5338 108158768 : s[1] = CL_sub( xx[7], xx[8] );
5339 108158768 : move64();
5340 108158768 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
5341 108158768 : s[0] = CL_add( s[0], s[2] );
5342 108158768 : move64();
5343 108158768 : y[5] = CL_add( xx[5], s[0] );
5344 108158768 : move64();
5345 108158768 : s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5346 108158768 : move64();
5347 108158768 : s[2] = CL_sub( s[0], t );
5348 108158768 : move64();
5349 108158768 : s[0] = CL_add( s[0], t );
5350 108158768 : move64();
5351 108158768 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5352 108158768 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5353 108158768 : move64();
5354 108158768 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
5355 108158768 : move64();
5356 :
5357 108158768 : y[6] = CL_msu_j( s[0], s[1] );
5358 108158768 : move64();
5359 108158768 : y[9] = CL_mac_j( s[0], s[1] );
5360 108158768 : move64();
5361 108158768 : y[7] = CL_mac_j( s[2], s[3] );
5362 108158768 : move64();
5363 108158768 : y[8] = CL_msu_j( s[2], s[3] );
5364 108158768 : move64();
5365 :
5366 108158768 : s[0] = CL_add( xx[11], xx[14] );
5367 108158768 : move64();
5368 108158768 : s[3] = CL_sub( xx[11], xx[14] );
5369 108158768 : move64();
5370 108158768 : s[2] = CL_add( xx[12], xx[13] );
5371 108158768 : move64();
5372 108158768 : s[1] = CL_sub( xx[12], xx[13] );
5373 108158768 : move64();
5374 108158768 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
5375 108158768 : s[0] = CL_add( s[0], s[2] );
5376 108158768 : move64();
5377 108158768 : y[10] = CL_add( xx[10], s[0] );
5378 108158768 : move64();
5379 108158768 : s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5380 108158768 : s[2] = CL_sub( s[0], t );
5381 108158768 : move64();
5382 108158768 : s[0] = CL_add( s[0], t );
5383 108158768 : move64();
5384 108158768 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5385 108158768 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5386 108158768 : move64();
5387 108158768 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
5388 108158768 : move64();
5389 :
5390 108158768 : y[11] = CL_msu_j( s[0], s[1] );
5391 108158768 : move64();
5392 108158768 : y[14] = CL_mac_j( s[0], s[1] );
5393 108158768 : move64();
5394 108158768 : y[12] = CL_mac_j( s[2], s[3] );
5395 108158768 : move64();
5396 108158768 : y[13] = CL_msu_j( s[2], s[3] );
5397 108158768 : move64();
5398 :
5399 108158768 : s[0] = CL_add( y[5], y[10] );
5400 108158768 : move64();
5401 108158768 : s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
5402 108158768 : move64();
5403 108158768 : z[0] = CL_add( y[0], s[0] );
5404 108158768 : move64();
5405 108158768 : s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
5406 108158768 : move64();
5407 :
5408 108158768 : z[10] = CL_mac_j( s[0], s[1] );
5409 108158768 : move64();
5410 108158768 : z[5] = CL_msu_j( s[0], s[1] );
5411 108158768 : move64();
5412 :
5413 108158768 : s[0] = CL_add( y[6], y[11] );
5414 108158768 : move64();
5415 108158768 : s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
5416 108158768 : move64();
5417 108158768 : z[6] = CL_add( y[1], s[0] );
5418 108158768 : move64();
5419 108158768 : s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
5420 108158768 : move64();
5421 :
5422 108158768 : z[1] = CL_mac_j( s[0], s[1] );
5423 108158768 : move64();
5424 108158768 : z[11] = CL_msu_j( s[0], s[1] );
5425 108158768 : move64();
5426 :
5427 108158768 : s[0] = CL_add( y[7], y[12] );
5428 108158768 : move64();
5429 108158768 : s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
5430 108158768 : move64();
5431 108158768 : z[12] = CL_add( y[2], s[0] );
5432 108158768 : move64();
5433 108158768 : s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
5434 108158768 : move64();
5435 :
5436 108158768 : z[7] = CL_mac_j( s[0], s[1] );
5437 108158768 : move64();
5438 108158768 : z[2] = CL_msu_j( s[0], s[1] );
5439 108158768 : move64();
5440 :
5441 108158768 : s[0] = CL_add( y[8], y[13] );
5442 108158768 : move64();
5443 108158768 : s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
5444 108158768 : move64();
5445 108158768 : z[3] = CL_add( y[3], s[0] );
5446 108158768 : move64();
5447 108158768 : s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
5448 108158768 : move64();
5449 :
5450 108158768 : z[13] = CL_mac_j( s[0], s[1] );
5451 108158768 : move64();
5452 108158768 : z[8] = CL_msu_j( s[0], s[1] );
5453 108158768 : move64();
5454 :
5455 108158768 : s[0] = CL_add( y[9], y[14] );
5456 108158768 : move64();
5457 108158768 : s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
5458 108158768 : move64();
5459 108158768 : z[9] = CL_add( y[4], s[0] );
5460 108158768 : move64();
5461 108158768 : s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
5462 108158768 : move64();
5463 :
5464 108158768 : z[4] = CL_mac_j( s[0], s[1] );
5465 108158768 : move64();
5466 108158768 : z[14] = CL_msu_j( s[0], s[1] );
5467 108158768 : move64();
5468 :
5469 108158768 : xx[0] = x[15];
5470 108158768 : move64();
5471 108158768 : xx[1] = x[3];
5472 108158768 : move64();
5473 108158768 : xx[2] = x[21];
5474 108158768 : move64();
5475 108158768 : xx[3] = x[9];
5476 108158768 : move64();
5477 108158768 : xx[4] = x[27];
5478 108158768 : move64();
5479 :
5480 108158768 : xx[5] = x[5];
5481 108158768 : move64();
5482 108158768 : xx[6] = x[23];
5483 108158768 : move64();
5484 108158768 : xx[7] = x[11];
5485 108158768 : move64();
5486 108158768 : xx[8] = x[29];
5487 108158768 : move64();
5488 108158768 : xx[9] = x[17];
5489 108158768 : move64();
5490 :
5491 108158768 : xx[10] = x[25];
5492 108158768 : move64();
5493 108158768 : xx[11] = x[13];
5494 108158768 : move64();
5495 108158768 : xx[12] = x[1];
5496 108158768 : move64();
5497 108158768 : xx[13] = x[19];
5498 108158768 : move64();
5499 108158768 : xx[14] = x[7];
5500 108158768 : move64();
5501 :
5502 108158768 : s[0] = CL_add( xx[1], xx[4] );
5503 108158768 : move64();
5504 108158768 : s[3] = CL_sub( xx[1], xx[4] );
5505 108158768 : move64();
5506 108158768 : s[2] = CL_add( xx[2], xx[3] );
5507 108158768 : move64();
5508 108158768 : s[1] = CL_sub( xx[2], xx[3] );
5509 108158768 : move64();
5510 108158768 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
5511 108158768 : s[0] = CL_add( s[0], s[2] );
5512 108158768 : move64();
5513 108158768 : y[0] = CL_add( xx[0], s[0] );
5514 108158768 : move64();
5515 108158768 : s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5516 108158768 : move64();
5517 108158768 : s[2] = CL_sub( s[0], t );
5518 108158768 : move64();
5519 108158768 : s[0] = CL_add( s[0], t );
5520 108158768 : move64();
5521 108158768 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
5522 108158768 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5523 108158768 : move64();
5524 108158768 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
5525 108158768 : move64();
5526 :
5527 108158768 : y[1] = CL_msu_j( s[0], s[1] );
5528 108158768 : move64();
5529 108158768 : y[4] = CL_mac_j( s[0], s[1] );
5530 108158768 : move64();
5531 108158768 : y[2] = CL_mac_j( s[2], s[3] );
5532 108158768 : move64();
5533 108158768 : y[3] = CL_msu_j( s[2], s[3] );
5534 108158768 : move64();
5535 :
5536 108158768 : s[0] = CL_add( xx[6], xx[9] );
5537 108158768 : move64();
5538 108158768 : s[3] = CL_sub( xx[6], xx[9] );
5539 108158768 : move64();
5540 108158768 : s[2] = CL_add( xx[7], xx[8] );
5541 108158768 : move64();
5542 108158768 : s[1] = CL_sub( xx[7], xx[8] );
5543 108158768 : move64();
5544 108158768 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
5545 108158768 : s[0] = CL_add( s[0], s[2] );
5546 108158768 : move64();
5547 108158768 : y[5] = CL_add( xx[5], s[0] );
5548 108158768 : move64();
5549 108158768 : s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5550 108158768 : move64();
5551 108158768 : s[2] = CL_sub( s[0], t );
5552 108158768 : move64();
5553 108158768 : s[0] = CL_add( s[0], t );
5554 108158768 : move64();
5555 108158768 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
5556 108158768 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5557 108158768 : move64();
5558 108158768 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
5559 108158768 : move64();
5560 :
5561 108158768 : y[6] = CL_msu_j( s[0], s[1] );
5562 108158768 : move64();
5563 108158768 : y[9] = CL_mac_j( s[0], s[1] );
5564 108158768 : move64();
5565 108158768 : y[7] = CL_mac_j( s[2], s[3] );
5566 108158768 : move64();
5567 108158768 : y[8] = CL_msu_j( s[2], s[3] );
5568 108158768 : move64();
5569 :
5570 108158768 : s[0] = CL_add( xx[11], xx[14] );
5571 108158768 : move64();
5572 108158768 : s[3] = CL_sub( xx[11], xx[14] );
5573 108158768 : move64();
5574 108158768 : s[2] = CL_add( xx[12], xx[13] );
5575 108158768 : move64();
5576 108158768 : s[1] = CL_sub( xx[12], xx[13] );
5577 108158768 : move64();
5578 108158768 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
5579 108158768 : s[0] = CL_add( s[0], s[2] );
5580 108158768 : move64();
5581 108158768 : y[10] = CL_add( xx[10], s[0] );
5582 108158768 : move64();
5583 108158768 : s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5584 108158768 : move64();
5585 108158768 : s[2] = CL_sub( s[0], t );
5586 108158768 : move64();
5587 108158768 : s[0] = CL_add( s[0], t );
5588 108158768 : move64();
5589 108158768 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
5590 108158768 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5591 108158768 : move64();
5592 108158768 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
5593 108158768 : move64();
5594 :
5595 108158768 : y[11] = CL_msu_j( s[0], s[1] );
5596 108158768 : move64();
5597 108158768 : y[14] = CL_mac_j( s[0], s[1] );
5598 108158768 : move64();
5599 108158768 : y[12] = CL_mac_j( s[2], s[3] );
5600 108158768 : move64();
5601 108158768 : y[13] = CL_msu_j( s[2], s[3] );
5602 108158768 : move64();
5603 :
5604 108158768 : s[0] = CL_add( y[5], y[10] );
5605 108158768 : move64();
5606 108158768 : s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
5607 108158768 : move64();
5608 108158768 : z[15] = CL_add( y[0], s[0] );
5609 108158768 : move64();
5610 108158768 : s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
5611 108158768 : move64();
5612 :
5613 108158768 : z[25] = CL_mac_j( s[0], s[1] );
5614 108158768 : move64();
5615 108158768 : z[20] = CL_msu_j( s[0], s[1] );
5616 108158768 : move64();
5617 :
5618 108158768 : s[0] = CL_add( y[6], y[11] );
5619 108158768 : move64();
5620 108158768 : s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
5621 108158768 : move64();
5622 108158768 : z[21] = CL_add( y[1], s[0] );
5623 108158768 : move64();
5624 108158768 : s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
5625 108158768 : move64();
5626 :
5627 108158768 : z[16] = CL_mac_j( s[0], s[1] );
5628 108158768 : move64();
5629 108158768 : z[26] = CL_msu_j( s[0], s[1] );
5630 108158768 : move64();
5631 :
5632 108158768 : s[0] = CL_add( y[7], y[12] );
5633 108158768 : move64();
5634 108158768 : s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
5635 108158768 : move64();
5636 108158768 : z[27] = CL_add( y[2], s[0] );
5637 108158768 : move64();
5638 108158768 : s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
5639 108158768 : move64();
5640 :
5641 108158768 : z[22] = CL_mac_j( s[0], s[1] );
5642 108158768 : move64();
5643 108158768 : z[17] = CL_msu_j( s[0], s[1] );
5644 108158768 : move64();
5645 :
5646 108158768 : s[0] = CL_add( y[8], y[13] );
5647 108158768 : move64();
5648 108158768 : s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
5649 108158768 : move64();
5650 108158768 : z[18] = CL_add( y[3], s[0] );
5651 108158768 : move64();
5652 108158768 : s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
5653 108158768 : move64();
5654 :
5655 108158768 : z[28] = CL_mac_j( s[0], s[1] );
5656 108158768 : move64();
5657 108158768 : z[23] = CL_msu_j( s[0], s[1] );
5658 108158768 : move64();
5659 :
5660 108158768 : s[0] = CL_add( y[9], y[14] );
5661 108158768 : move64();
5662 108158768 : s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
5663 108158768 : move64();
5664 108158768 : z[24] = CL_add( y[4], s[0] );
5665 108158768 : move64();
5666 108158768 : s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
5667 108158768 : move64();
5668 :
5669 108158768 : z[19] = CL_mac_j( s[0], s[1] );
5670 108158768 : move64();
5671 108158768 : z[29] = CL_msu_j( s[0], s[1] );
5672 108158768 : move64();
5673 :
5674 108158768 : s[0] = z[0];
5675 108158768 : move64();
5676 108158768 : s[1] = z[15];
5677 108158768 : move64();
5678 108158768 : *l = CL_add( s[0], s[1] );
5679 108158768 : move64();
5680 108158768 : *h = CL_sub( s[0], s[1] );
5681 108158768 : move64();
5682 108158768 : l += 1, h += 1;
5683 :
5684 108158768 : s[0] = z[8];
5685 108158768 : move64();
5686 108158768 : s[1] = z[23];
5687 108158768 : move64();
5688 108158768 : *h = CL_add( s[0], s[1] );
5689 108158768 : move64();
5690 108158768 : *l = CL_sub( s[0], s[1] );
5691 108158768 : move64();
5692 108158768 : l += 1, h += 1;
5693 :
5694 108158768 : s[0] = z[1];
5695 108158768 : move64();
5696 108158768 : s[1] = z[16];
5697 108158768 : move64();
5698 108158768 : *l = CL_add( s[0], s[1] );
5699 108158768 : move64();
5700 108158768 : *h = CL_sub( s[0], s[1] );
5701 108158768 : move64();
5702 108158768 : l += 1, h += 1;
5703 :
5704 108158768 : s[0] = z[9];
5705 108158768 : move64();
5706 108158768 : s[1] = z[24];
5707 108158768 : move64();
5708 108158768 : *h = CL_add( s[0], s[1] );
5709 108158768 : move64();
5710 108158768 : *l = CL_sub( s[0], s[1] );
5711 108158768 : move64();
5712 108158768 : l += 1, h += 1;
5713 :
5714 108158768 : s[0] = z[2];
5715 108158768 : move64();
5716 108158768 : s[1] = z[17];
5717 108158768 : move64();
5718 108158768 : *l = CL_add( s[0], s[1] );
5719 108158768 : move64();
5720 108158768 : *h = CL_sub( s[0], s[1] );
5721 108158768 : move64();
5722 108158768 : l += 1, h += 1;
5723 :
5724 108158768 : s[0] = z[10];
5725 108158768 : move64();
5726 108158768 : s[1] = z[25];
5727 108158768 : move64();
5728 108158768 : *h = CL_add( s[0], s[1] );
5729 108158768 : move64();
5730 108158768 : *l = CL_sub( s[0], s[1] );
5731 108158768 : move64();
5732 108158768 : l += 1, h += 1;
5733 :
5734 108158768 : s[0] = z[3];
5735 108158768 : move64();
5736 108158768 : s[1] = z[18];
5737 108158768 : move64();
5738 108158768 : *l = CL_add( s[0], s[1] );
5739 108158768 : move64();
5740 108158768 : *h = CL_sub( s[0], s[1] );
5741 108158768 : move64();
5742 108158768 : l += 1, h += 1;
5743 :
5744 108158768 : s[0] = z[11];
5745 108158768 : move64();
5746 108158768 : s[1] = z[26];
5747 108158768 : move64();
5748 108158768 : *h = CL_add( s[0], s[1] );
5749 108158768 : move64();
5750 108158768 : *l = CL_sub( s[0], s[1] );
5751 108158768 : move64();
5752 108158768 : l += 1, h += 1;
5753 :
5754 108158768 : s[0] = z[4];
5755 108158768 : move64();
5756 108158768 : s[1] = z[19];
5757 108158768 : move64();
5758 108158768 : *l = CL_add( s[0], s[1] );
5759 108158768 : move64();
5760 108158768 : *h = CL_sub( s[0], s[1] );
5761 108158768 : move64();
5762 108158768 : l += 1, h += 1;
5763 :
5764 108158768 : s[0] = z[12];
5765 108158768 : move64();
5766 108158768 : s[1] = z[27];
5767 108158768 : move64();
5768 108158768 : *h = CL_add( s[0], s[1] );
5769 108158768 : move64();
5770 108158768 : *l = CL_sub( s[0], s[1] );
5771 108158768 : move64();
5772 108158768 : l += 1, h += 1;
5773 :
5774 108158768 : s[0] = z[5];
5775 108158768 : move64();
5776 108158768 : s[1] = z[20];
5777 108158768 : move64();
5778 108158768 : *l = CL_add( s[0], s[1] );
5779 108158768 : move64();
5780 108158768 : *h = CL_sub( s[0], s[1] );
5781 108158768 : move64();
5782 108158768 : l += 1, h += 1;
5783 :
5784 108158768 : s[0] = z[13];
5785 108158768 : move64();
5786 108158768 : s[1] = z[28];
5787 108158768 : move64();
5788 108158768 : *h = CL_add( s[0], s[1] );
5789 108158768 : move64();
5790 108158768 : *l = CL_sub( s[0], s[1] );
5791 108158768 : move64();
5792 108158768 : l += 1, h += 1;
5793 :
5794 108158768 : s[0] = z[6];
5795 108158768 : move64();
5796 108158768 : s[1] = z[21];
5797 108158768 : move64();
5798 108158768 : *l = CL_add( s[0], s[1] );
5799 108158768 : move64();
5800 108158768 : *h = CL_sub( s[0], s[1] );
5801 108158768 : move64();
5802 108158768 : l += 1, h += 1;
5803 :
5804 108158768 : s[0] = z[14];
5805 108158768 : move64();
5806 108158768 : s[1] = z[29];
5807 108158768 : move64();
5808 108158768 : *h = CL_add( s[0], s[1] );
5809 108158768 : move64();
5810 108158768 : *l = CL_sub( s[0], s[1] );
5811 108158768 : move64();
5812 108158768 : l += 1, h += 1;
5813 :
5814 108158768 : s[0] = z[7];
5815 108158768 : move64();
5816 108158768 : s[1] = z[22];
5817 108158768 : move64();
5818 108158768 : *l = CL_add( s[0], s[1] );
5819 108158768 : move64();
5820 108158768 : *h = CL_sub( s[0], s[1] );
5821 108158768 : move64();
5822 108158768 : l += 1, h += 1;
5823 :
5824 108158768 : return;
5825 : }
5826 :
5827 27389706 : static void fft_len32(
5828 : cmplx *x // Qx
5829 : )
5830 : {
5831 : cmplx t[8], s[8], xx[8];
5832 : cmplx y[32];
5833 : cmplx ab;
5834 :
5835 27389706 : xx[0] = x[0];
5836 27389706 : move64();
5837 27389706 : xx[1] = x[4];
5838 27389706 : move64();
5839 27389706 : xx[2] = x[8];
5840 27389706 : move64();
5841 27389706 : xx[3] = x[12];
5842 27389706 : move64();
5843 27389706 : xx[4] = x[16];
5844 27389706 : move64();
5845 27389706 : xx[5] = x[20];
5846 27389706 : move64();
5847 27389706 : xx[6] = x[24];
5848 27389706 : move64();
5849 27389706 : xx[7] = x[28];
5850 27389706 : move64();
5851 :
5852 27389706 : t[0] = CL_add( xx[0], xx[4] );
5853 27389706 : move64();
5854 27389706 : t[1] = CL_sub( xx[0], xx[4] );
5855 27389706 : move64();
5856 27389706 : t[2] = CL_add( xx[1], xx[5] );
5857 27389706 : move64();
5858 27389706 : t[3] = CL_sub( xx[1], xx[5] );
5859 27389706 : move64();
5860 27389706 : t[4] = CL_add( xx[2], xx[6] );
5861 27389706 : move64();
5862 27389706 : t[5] = CL_sub( xx[2], xx[6] );
5863 27389706 : move64();
5864 27389706 : t[6] = CL_add( xx[3], xx[7] );
5865 27389706 : move64();
5866 27389706 : t[7] = CL_sub( xx[3], xx[7] );
5867 27389706 : move64();
5868 :
5869 27389706 : s[0] = CL_add( t[0], t[4] );
5870 27389706 : move64();
5871 27389706 : s[2] = CL_sub( t[0], t[4] );
5872 27389706 : move64();
5873 27389706 : s[4] = CL_mac_j( t[1], t[5] );
5874 27389706 : move64();
5875 27389706 : s[5] = CL_msu_j( t[1], t[5] );
5876 27389706 : move64();
5877 27389706 : s[1] = CL_add( t[2], t[6] );
5878 27389706 : move64();
5879 27389706 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
5880 27389706 : move64();
5881 27389706 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
5882 27389706 : move64();
5883 27389706 : t[1] = CL_sub( t[3], t[7] );
5884 27389706 : move64();
5885 :
5886 : {
5887 27389706 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
5888 27389706 : move64();
5889 27389706 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
5890 27389706 : move64();
5891 27389706 : s[7] = CL_conjugate( s[7] );
5892 27389706 : move64();
5893 : };
5894 :
5895 27389706 : y[0] = CL_add( s[0], s[1] );
5896 27389706 : move64();
5897 27389706 : y[4] = CL_sub( s[0], s[1] );
5898 27389706 : move64();
5899 27389706 : y[2] = CL_sub( s[2], s[3] );
5900 27389706 : move64();
5901 27389706 : y[6] = CL_add( s[2], s[3] );
5902 27389706 : move64();
5903 27389706 : y[3] = CL_add( s[4], s[7] );
5904 27389706 : move64();
5905 27389706 : y[7] = CL_sub( s[4], s[7] );
5906 27389706 : move64();
5907 27389706 : y[1] = CL_add( s[5], s[6] );
5908 27389706 : move64();
5909 27389706 : y[5] = CL_sub( s[5], s[6] );
5910 27389706 : move64();
5911 :
5912 27389706 : xx[0] = x[1];
5913 27389706 : move64();
5914 27389706 : xx[1] = x[5];
5915 27389706 : move64();
5916 27389706 : xx[2] = x[9];
5917 27389706 : move64();
5918 27389706 : xx[3] = x[13];
5919 27389706 : move64();
5920 27389706 : xx[4] = x[17];
5921 27389706 : move64();
5922 27389706 : xx[5] = x[21];
5923 27389706 : move64();
5924 27389706 : xx[6] = x[25];
5925 27389706 : move64();
5926 27389706 : xx[7] = x[29];
5927 27389706 : move64();
5928 :
5929 27389706 : t[0] = CL_add( xx[0], xx[4] );
5930 27389706 : move64();
5931 27389706 : t[1] = CL_sub( xx[0], xx[4] );
5932 27389706 : move64();
5933 27389706 : t[2] = CL_add( xx[1], xx[5] );
5934 27389706 : move64();
5935 27389706 : t[3] = CL_sub( xx[1], xx[5] );
5936 27389706 : move64();
5937 27389706 : t[4] = CL_add( xx[2], xx[6] );
5938 27389706 : move64();
5939 27389706 : t[5] = CL_sub( xx[2], xx[6] );
5940 27389706 : move64();
5941 27389706 : t[6] = CL_add( xx[3], xx[7] );
5942 27389706 : move64();
5943 27389706 : t[7] = CL_sub( xx[3], xx[7] );
5944 27389706 : move64();
5945 :
5946 27389706 : s[0] = CL_add( t[0], t[4] );
5947 27389706 : move64();
5948 27389706 : s[2] = CL_sub( t[0], t[4] );
5949 27389706 : move64();
5950 27389706 : s[4] = CL_mac_j( t[1], t[5] );
5951 27389706 : move64();
5952 27389706 : s[5] = CL_msu_j( t[1], t[5] );
5953 27389706 : move64();
5954 27389706 : s[1] = CL_add( t[2], t[6] );
5955 27389706 : move64();
5956 27389706 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
5957 27389706 : move64();
5958 27389706 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
5959 27389706 : move64();
5960 27389706 : t[1] = CL_sub( t[3], t[7] );
5961 27389706 : move64();
5962 :
5963 : {
5964 27389706 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 );
5965 27389706 : move64();
5966 27389706 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 );
5967 27389706 : move64();
5968 27389706 : s[7] = CL_conjugate( s[7] );
5969 27389706 : move64();
5970 : };
5971 :
5972 27389706 : y[8] = CL_add( s[0], s[1] );
5973 27389706 : move64();
5974 27389706 : y[12] = CL_sub( s[0], s[1] );
5975 27389706 : move64();
5976 27389706 : y[10] = CL_sub( s[2], s[3] );
5977 27389706 : move64();
5978 27389706 : y[14] = CL_add( s[2], s[3] );
5979 27389706 : move64();
5980 27389706 : y[11] = CL_add( s[4], s[7] );
5981 27389706 : move64();
5982 27389706 : y[15] = CL_sub( s[4], s[7] );
5983 27389706 : move64();
5984 27389706 : y[9] = CL_add( s[5], s[6] );
5985 27389706 : move64();
5986 27389706 : y[13] = CL_sub( s[5], s[6] );
5987 27389706 : move64();
5988 :
5989 27389706 : xx[0] = x[2];
5990 27389706 : move64();
5991 27389706 : xx[1] = x[6];
5992 27389706 : move64();
5993 27389706 : xx[2] = x[10];
5994 27389706 : move64();
5995 27389706 : xx[3] = x[14];
5996 27389706 : move64();
5997 27389706 : xx[4] = x[18];
5998 27389706 : move64();
5999 27389706 : xx[5] = x[22];
6000 27389706 : move64();
6001 27389706 : xx[6] = x[26];
6002 27389706 : move64();
6003 27389706 : xx[7] = x[30];
6004 27389706 : move64();
6005 :
6006 27389706 : t[0] = CL_add( xx[0], xx[4] );
6007 27389706 : move64();
6008 27389706 : t[1] = CL_sub( xx[0], xx[4] );
6009 27389706 : move64();
6010 27389706 : t[2] = CL_add( xx[1], xx[5] );
6011 27389706 : move64();
6012 27389706 : t[3] = CL_sub( xx[1], xx[5] );
6013 27389706 : move64();
6014 27389706 : t[4] = CL_add( xx[2], xx[6] );
6015 27389706 : move64();
6016 27389706 : t[5] = CL_sub( xx[2], xx[6] );
6017 27389706 : move64();
6018 27389706 : t[6] = CL_add( xx[3], xx[7] );
6019 27389706 : move64();
6020 27389706 : t[7] = CL_sub( xx[3], xx[7] );
6021 27389706 : move64();
6022 :
6023 27389706 : s[0] = CL_add( t[0], t[4] );
6024 27389706 : move64();
6025 27389706 : s[2] = CL_sub( t[0], t[4] );
6026 27389706 : move64();
6027 27389706 : s[4] = CL_mac_j( t[1], t[5] );
6028 27389706 : move64();
6029 27389706 : s[5] = CL_msu_j( t[1], t[5] );
6030 27389706 : move64();
6031 27389706 : s[1] = CL_add( t[2], t[6] );
6032 27389706 : move64();
6033 27389706 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
6034 27389706 : move64();
6035 27389706 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
6036 27389706 : move64();
6037 27389706 : t[1] = CL_sub( t[3], t[7] );
6038 27389706 : move64();
6039 :
6040 : {
6041 27389706 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
6042 27389706 : move64();
6043 27389706 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
6044 27389706 : move64();
6045 27389706 : s[7] = CL_conjugate( s[7] );
6046 27389706 : move64();
6047 : };
6048 :
6049 27389706 : y[16] = CL_add( s[0], s[1] );
6050 27389706 : move64();
6051 27389706 : y[20] = CL_sub( s[0], s[1] );
6052 27389706 : move64();
6053 27389706 : y[18] = CL_sub( s[2], s[3] );
6054 27389706 : move64();
6055 27389706 : y[22] = CL_add( s[2], s[3] );
6056 27389706 : move64();
6057 27389706 : y[19] = CL_add( s[4], s[7] );
6058 27389706 : move64();
6059 27389706 : y[23] = CL_sub( s[4], s[7] );
6060 27389706 : move64();
6061 27389706 : y[17] = CL_add( s[5], s[6] );
6062 27389706 : move64();
6063 27389706 : y[21] = CL_sub( s[5], s[6] );
6064 27389706 : move64();
6065 :
6066 27389706 : xx[0] = x[3];
6067 27389706 : move64();
6068 27389706 : xx[1] = x[7];
6069 27389706 : move64();
6070 27389706 : xx[2] = x[11];
6071 27389706 : move64();
6072 27389706 : xx[3] = x[15];
6073 27389706 : move64();
6074 27389706 : xx[4] = x[19];
6075 27389706 : move64();
6076 27389706 : xx[5] = x[23];
6077 27389706 : move64();
6078 27389706 : xx[6] = x[27];
6079 27389706 : move64();
6080 27389706 : xx[7] = x[31];
6081 27389706 : move64();
6082 :
6083 27389706 : t[0] = CL_add( xx[0], xx[4] );
6084 27389706 : move64();
6085 27389706 : t[1] = CL_sub( xx[0], xx[4] );
6086 27389706 : move64();
6087 27389706 : t[2] = CL_add( xx[1], xx[5] );
6088 27389706 : move64();
6089 27389706 : t[3] = CL_sub( xx[1], xx[5] );
6090 27389706 : move64();
6091 27389706 : t[4] = CL_add( xx[2], xx[6] );
6092 27389706 : move64();
6093 27389706 : t[5] = CL_sub( xx[2], xx[6] );
6094 27389706 : move64();
6095 27389706 : t[6] = CL_add( xx[3], xx[7] );
6096 27389706 : move64();
6097 27389706 : t[7] = CL_sub( xx[3], xx[7] );
6098 27389706 : move64();
6099 :
6100 27389706 : s[0] = CL_add( t[0], t[4] );
6101 27389706 : move64();
6102 27389706 : s[2] = CL_sub( t[0], t[4] );
6103 27389706 : move64();
6104 27389706 : s[4] = CL_mac_j( t[1], t[5] );
6105 27389706 : move64();
6106 27389706 : s[5] = CL_msu_j( t[1], t[5] );
6107 27389706 : move64();
6108 27389706 : s[1] = CL_add( t[2], t[6] );
6109 27389706 : move64();
6110 27389706 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
6111 27389706 : move64();
6112 27389706 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
6113 27389706 : move64();
6114 27389706 : t[1] = CL_sub( t[3], t[7] );
6115 27389706 : move64();
6116 :
6117 : {
6118 27389706 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
6119 27389706 : move64();
6120 27389706 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
6121 27389706 : move64();
6122 27389706 : s[7] = CL_conjugate( s[7] );
6123 27389706 : move64();
6124 : };
6125 :
6126 27389706 : y[24] = CL_add( s[0], s[1] );
6127 27389706 : move64();
6128 27389706 : y[28] = CL_sub( s[0], s[1] );
6129 27389706 : move64();
6130 27389706 : y[26] = CL_sub( s[2], s[3] );
6131 27389706 : move64();
6132 27389706 : y[30] = CL_add( s[2], s[3] );
6133 27389706 : move64();
6134 27389706 : y[27] = CL_add( s[4], s[7] );
6135 27389706 : move64();
6136 27389706 : y[31] = CL_sub( s[4], s[7] );
6137 27389706 : move64();
6138 27389706 : y[25] = CL_add( s[5], s[6] );
6139 27389706 : move64();
6140 27389706 : y[29] = CL_sub( s[5], s[6] );
6141 27389706 : move64();
6142 :
6143 : {
6144 27389706 : ab = y[9];
6145 27389706 : move64();
6146 27389706 : y[9] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[0] ), CL_scale( ab, FFT_RotVector_32_fx[1] ) ); // Qx
6147 27389706 : move64();
6148 : };
6149 : {
6150 27389706 : ab = y[10];
6151 27389706 : move64();
6152 27389706 : y[10] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[2] ), CL_scale( ab, FFT_RotVector_32_fx[3] ) ); // Qx
6153 27389706 : move64();
6154 : };
6155 : {
6156 27389706 : ab = y[11];
6157 27389706 : move64();
6158 27389706 : y[11] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[4] ), CL_scale( ab, FFT_RotVector_32_fx[5] ) ); // Qx
6159 27389706 : move64();
6160 : };
6161 : {
6162 27389706 : ab = y[12];
6163 27389706 : move64();
6164 27389706 : y[12] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[6] ), CL_scale( ab, FFT_RotVector_32_fx[7] ) ); // Qx
6165 27389706 : move64();
6166 : };
6167 : {
6168 27389706 : ab = y[13];
6169 27389706 : move64();
6170 27389706 : y[13] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[8] ), CL_scale( ab, FFT_RotVector_32_fx[9] ) ); // Qx
6171 27389706 : move64();
6172 : };
6173 : {
6174 27389706 : ab = y[14];
6175 27389706 : move64();
6176 27389706 : y[14] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[10] ), CL_scale( ab, FFT_RotVector_32_fx[11] ) ); // Qx
6177 27389706 : move64();
6178 : };
6179 : {
6180 27389706 : ab = y[15];
6181 27389706 : move64();
6182 27389706 : y[15] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[12] ), CL_scale( ab, FFT_RotVector_32_fx[13] ) ); // Qx
6183 27389706 : move64();
6184 : };
6185 : {
6186 27389706 : ab = y[17];
6187 27389706 : move64();
6188 27389706 : y[17] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[14] ), CL_scale( ab, FFT_RotVector_32_fx[15] ) );
6189 27389706 : move64();
6190 : };
6191 : {
6192 27389706 : ab = y[18];
6193 27389706 : move64();
6194 27389706 : y[18] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[16] ), CL_scale( ab, FFT_RotVector_32_fx[17] ) );
6195 27389706 : move64();
6196 : };
6197 : {
6198 27389706 : ab = y[19];
6199 27389706 : move64();
6200 27389706 : y[19] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[18] ), CL_scale( ab, FFT_RotVector_32_fx[19] ) );
6201 27389706 : move64();
6202 : };
6203 : {
6204 27389706 : ab = y[21];
6205 27389706 : move64();
6206 27389706 : y[21] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[20] ), CL_scale( ab, FFT_RotVector_32_fx[21] ) );
6207 27389706 : move64();
6208 : };
6209 : {
6210 27389706 : ab = y[22];
6211 27389706 : move64();
6212 27389706 : y[22] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[22] ), CL_scale( ab, FFT_RotVector_32_fx[23] ) );
6213 27389706 : move64();
6214 : };
6215 : {
6216 27389706 : ab = y[23];
6217 27389706 : move64();
6218 27389706 : y[23] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[24] ), CL_scale( ab, FFT_RotVector_32_fx[25] ) );
6219 27389706 : move64();
6220 : };
6221 : {
6222 27389706 : ab = y[25];
6223 27389706 : move64();
6224 27389706 : y[25] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[26] ), CL_scale( ab, FFT_RotVector_32_fx[27] ) );
6225 27389706 : move64();
6226 : };
6227 : {
6228 27389706 : ab = y[26];
6229 27389706 : move64();
6230 27389706 : y[26] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[28] ), CL_scale( ab, FFT_RotVector_32_fx[29] ) );
6231 27389706 : move64();
6232 : };
6233 : {
6234 27389706 : ab = y[27];
6235 27389706 : move64();
6236 27389706 : y[27] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[30] ), CL_scale( ab, FFT_RotVector_32_fx[31] ) );
6237 27389706 : move64();
6238 : };
6239 : {
6240 27389706 : ab = y[28];
6241 27389706 : move64();
6242 27389706 : y[28] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[32] ), CL_scale( ab, FFT_RotVector_32_fx[33] ) );
6243 27389706 : move64();
6244 : };
6245 : {
6246 27389706 : ab = y[29];
6247 27389706 : move64();
6248 27389706 : y[29] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[34] ), CL_scale( ab, FFT_RotVector_32_fx[35] ) );
6249 27389706 : move64();
6250 : };
6251 : {
6252 27389706 : ab = y[30];
6253 27389706 : move64();
6254 27389706 : y[30] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[36] ), CL_scale( ab, FFT_RotVector_32_fx[37] ) );
6255 27389706 : move64();
6256 : };
6257 : {
6258 27389706 : ab = y[31];
6259 27389706 : move64();
6260 27389706 : y[31] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[38] ), CL_scale( ab, FFT_RotVector_32_fx[39] ) );
6261 27389706 : move64();
6262 : };
6263 :
6264 27389706 : t[0] = CL_add( y[0], y[16] );
6265 27389706 : move64();
6266 27389706 : t[1] = CL_sub( y[0], y[16] );
6267 27389706 : move64();
6268 27389706 : t[2] = CL_add( y[8], y[24] );
6269 27389706 : move64();
6270 27389706 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[8] ), CL_conjugate( y[24] ) ) );
6271 27389706 : move64();
6272 :
6273 27389706 : x[0] = CL_add( t[0], t[2] );
6274 27389706 : move64();
6275 27389706 : x[8] = CL_sub( t[1], t[3] );
6276 27389706 : move64();
6277 27389706 : x[16] = CL_sub( t[0], t[2] );
6278 27389706 : move64();
6279 27389706 : x[24] = CL_add( t[1], t[3] );
6280 27389706 : move64();
6281 :
6282 27389706 : t[0] = CL_add( y[1], y[17] );
6283 27389706 : move64();
6284 27389706 : t[1] = CL_sub( y[1], y[17] );
6285 27389706 : move64();
6286 27389706 : t[2] = CL_add( y[9], y[25] );
6287 27389706 : move64();
6288 27389706 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[9] ), CL_conjugate( y[25] ) ) );
6289 27389706 : move64();
6290 :
6291 27389706 : x[1] = CL_add( t[0], t[2] );
6292 27389706 : move64();
6293 27389706 : x[9] = CL_sub( t[1], t[3] );
6294 27389706 : move64();
6295 27389706 : x[17] = CL_sub( t[0], t[2] );
6296 27389706 : move64();
6297 27389706 : x[25] = CL_add( t[1], t[3] );
6298 27389706 : move64();
6299 :
6300 27389706 : t[0] = CL_add( y[2], y[18] );
6301 27389706 : move64();
6302 27389706 : t[1] = CL_sub( y[2], y[18] );
6303 27389706 : move64();
6304 27389706 : t[2] = CL_add( y[10], y[26] );
6305 27389706 : move64();
6306 27389706 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[10] ), CL_conjugate( y[26] ) ) );
6307 27389706 : move64();
6308 :
6309 27389706 : x[2] = CL_add( t[0], t[2] );
6310 27389706 : move64();
6311 27389706 : x[10] = CL_sub( t[1], t[3] );
6312 27389706 : move64();
6313 27389706 : x[18] = CL_sub( t[0], t[2] );
6314 27389706 : move64();
6315 27389706 : x[26] = CL_add( t[1], t[3] );
6316 27389706 : move64();
6317 :
6318 27389706 : t[0] = CL_add( y[3], y[19] );
6319 27389706 : move64();
6320 27389706 : t[1] = CL_sub( y[3], y[19] );
6321 27389706 : move64();
6322 27389706 : t[2] = CL_add( y[11], y[27] );
6323 27389706 : move64();
6324 27389706 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[11] ), CL_conjugate( y[27] ) ) );
6325 27389706 : move64();
6326 :
6327 27389706 : x[3] = CL_add( t[0], t[2] );
6328 27389706 : move64();
6329 27389706 : x[11] = CL_sub( t[1], t[3] );
6330 27389706 : move64();
6331 27389706 : x[19] = CL_sub( t[0], t[2] );
6332 27389706 : move64();
6333 27389706 : x[27] = CL_add( t[1], t[3] );
6334 27389706 : move64();
6335 :
6336 27389706 : t[0] = CL_msu_j( y[4], y[20] );
6337 27389706 : move64();
6338 27389706 : t[1] = CL_mac_j( y[4], y[20] );
6339 27389706 : move64();
6340 27389706 : t[2] = CL_add( y[12], y[28] );
6341 27389706 : move64();
6342 27389706 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[12] ), CL_conjugate( y[28] ) ) );
6343 27389706 : move64();
6344 :
6345 27389706 : x[4] = CL_add( t[0], t[2] );
6346 27389706 : move64();
6347 27389706 : x[12] = CL_sub( t[1], t[3] );
6348 27389706 : move64();
6349 27389706 : x[20] = CL_sub( t[0], t[2] );
6350 27389706 : move64();
6351 27389706 : x[28] = CL_add( t[1], t[3] );
6352 27389706 : move64();
6353 :
6354 27389706 : t[0] = CL_add( y[5], y[21] );
6355 27389706 : move64();
6356 27389706 : t[1] = CL_sub( y[5], y[21] );
6357 27389706 : move64();
6358 27389706 : t[2] = CL_add( y[13], y[29] );
6359 27389706 : move64();
6360 27389706 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[13] ), CL_conjugate( y[29] ) ) );
6361 27389706 : move64();
6362 :
6363 27389706 : x[5] = CL_add( t[0], t[2] );
6364 27389706 : move64();
6365 27389706 : x[13] = CL_sub( t[1], t[3] );
6366 27389706 : move64();
6367 27389706 : x[21] = CL_sub( t[0], t[2] );
6368 27389706 : move64();
6369 27389706 : x[29] = CL_add( t[1], t[3] );
6370 27389706 : move64();
6371 :
6372 27389706 : t[0] = CL_add( y[6], y[22] );
6373 27389706 : move64();
6374 27389706 : t[1] = CL_sub( y[6], y[22] );
6375 27389706 : move64();
6376 27389706 : t[2] = CL_add( y[14], y[30] );
6377 27389706 : move64();
6378 27389706 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[14] ), CL_conjugate( y[30] ) ) );
6379 27389706 : move64();
6380 :
6381 27389706 : x[6] = CL_add( t[0], t[2] );
6382 27389706 : move64();
6383 27389706 : x[14] = CL_sub( t[1], t[3] );
6384 27389706 : move64();
6385 27389706 : x[22] = CL_sub( t[0], t[2] );
6386 27389706 : move64();
6387 27389706 : x[30] = CL_add( t[1], t[3] );
6388 27389706 : move64();
6389 :
6390 27389706 : t[0] = CL_add( y[7], y[23] );
6391 27389706 : move64();
6392 27389706 : t[1] = CL_sub( y[7], y[23] );
6393 27389706 : move64();
6394 27389706 : t[2] = CL_add( y[15], y[31] );
6395 27389706 : move64();
6396 27389706 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[15] ), CL_conjugate( y[31] ) ) );
6397 27389706 : move64();
6398 :
6399 27389706 : x[7] = CL_add( t[0], t[2] );
6400 27389706 : move64();
6401 27389706 : x[15] = CL_sub( t[1], t[3] );
6402 27389706 : move64();
6403 27389706 : x[23] = CL_sub( t[0], t[2] );
6404 27389706 : move64();
6405 27389706 : x[31] = CL_add( t[1], t[3] );
6406 27389706 : move64();
6407 :
6408 27389706 : return;
6409 : }
6410 :
6411 15369565 : static void fft_lenN(
6412 : cmplx *x, // Qx
6413 : const Word16 *W, // Q15
6414 : const Word16 len,
6415 : const Word16 dim1,
6416 : const Word16 dim2,
6417 : const Word16 sc,
6418 : const Word16 Woff )
6419 : {
6420 : Word16 i, j;
6421 : cmplx xx[L_FRAME_MAX];
6422 :
6423 181374885 : FOR( i = 0; i < dim2; i++ )
6424 : {
6425 4546818008 : FOR( j = 0; j < dim1; j++ )
6426 : {
6427 4380812688 : xx[( ( i * dim1 ) + j )].re = x[( i + ( j * dim2 ) )].re; // Qx
6428 4380812688 : move64();
6429 4380812688 : xx[( ( i * dim1 ) + j )].im = x[( i + ( j * dim2 ) )].im; // Qx
6430 4380812688 : move64();
6431 : }
6432 : }
6433 :
6434 15369565 : SWITCH( dim1 )
6435 : {
6436 0 : case 5:
6437 0 : FOR( i = 0; i < dim2; i++ )
6438 : {
6439 0 : fft_len5( &xx[( i * dim1 )] );
6440 : }
6441 0 : BREAK;
6442 :
6443 0 : case 8:
6444 0 : FOR( i = 0; i < dim2; i++ )
6445 : {
6446 0 : fft_len8( &xx[( i * dim1 )] );
6447 : }
6448 0 : BREAK;
6449 :
6450 311612 : case 10:
6451 2804508 : FOR( i = 0; i < dim2; i++ )
6452 : {
6453 2492896 : fft_len10( &xx[( i * dim1 )] );
6454 : }
6455 311612 : BREAK;
6456 :
6457 464534 : case 15:
6458 4180806 : FOR( i = 0; i < dim2; i++ )
6459 : {
6460 3716272 : fft_len15( &xx[( i * dim1 )] );
6461 : }
6462 464534 : BREAK;
6463 :
6464 162267 : case 16:
6465 1460403 : FOR( i = 0; i < dim2; i++ )
6466 : {
6467 1298136 : fft_len16( &xx[( i * dim1 )] );
6468 : }
6469 162267 : BREAK;
6470 :
6471 3333669 : case 20:
6472 51354461 : FOR( i = 0; i < dim2; i++ )
6473 : {
6474 48020792 : fft_len20_fx( &xx[( i * dim1 )] );
6475 : }
6476 3333669 : BREAK;
6477 :
6478 10807676 : case 30:
6479 118966444 : FOR( i = 0; i < dim2; i++ )
6480 : {
6481 108158768 : fft_len30( &xx[( i * dim1 )] );
6482 : }
6483 10807676 : BREAK;
6484 :
6485 289807 : case 32:
6486 2608263 : FOR( i = 0; i < dim2; i++ )
6487 : {
6488 2318456 : fft_len32( &xx[( i * dim1 )] );
6489 : }
6490 289807 : BREAK;
6491 : }
6492 :
6493 15369565 : SWITCH( dim2 )
6494 : {
6495 :
6496 12002885 : case 8:
6497 : {
6498 : cmplx t[8];
6499 : cmplx s[8];
6500 : cmplx y[8];
6501 :
6502 12002885 : y[1] = xx[1 * dim1];
6503 12002885 : move64();
6504 12002885 : y[2] = xx[2 * dim1];
6505 12002885 : move64();
6506 12002885 : y[3] = xx[3 * dim1];
6507 12002885 : move64();
6508 12002885 : y[4] = xx[4 * dim1];
6509 12002885 : move64();
6510 12002885 : y[5] = xx[5 * dim1];
6511 12002885 : move64();
6512 12002885 : y[6] = xx[6 * dim1];
6513 12002885 : move64();
6514 12002885 : y[7] = xx[7 * dim1];
6515 12002885 : move64();
6516 :
6517 12002885 : test();
6518 12002885 : test();
6519 12002885 : IF( EQ_16( dim1, 8 ) || EQ_16( dim1, 16 ) || EQ_16( dim1, 32 ) )
6520 : {
6521 12322170 : FOR( i = 0; i < dim1; i++ )
6522 : {
6523 : {
6524 11870096 : y[0] = xx[i];
6525 11870096 : move64();
6526 : };
6527 11870096 : IF( i > 0 )
6528 : {
6529 : {
6530 11418022 : y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) - Woff )] ),
6531 11418022 : CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6532 11418022 : move64();
6533 : };
6534 : {
6535 11418022 : y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) - Woff )] ),
6536 11418022 : CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6537 11418022 : move64();
6538 : };
6539 : {
6540 11418022 : y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) - Woff )] ),
6541 11418022 : CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6542 11418022 : move64();
6543 : };
6544 : {
6545 11418022 : y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) - Woff )] ),
6546 11418022 : CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6547 11418022 : move64();
6548 : };
6549 : {
6550 11418022 : y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) - Woff )] ),
6551 11418022 : CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6552 11418022 : move64();
6553 : };
6554 : {
6555 11418022 : y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) - Woff )] ),
6556 11418022 : CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6557 11418022 : move64();
6558 : };
6559 : {
6560 11418022 : y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) - Woff )] ),
6561 11418022 : CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6562 11418022 : move64();
6563 : };
6564 : }
6565 :
6566 11870096 : t[0] = CL_add( y[0], y[4] );
6567 11870096 : move64();
6568 11870096 : t[1] = CL_sub( y[0], y[4] );
6569 11870096 : move64();
6570 11870096 : t[2] = CL_add( y[1], y[5] );
6571 11870096 : move64();
6572 11870096 : t[3] = CL_sub( y[1], y[5] );
6573 11870096 : move64();
6574 11870096 : t[4] = CL_add( y[2], y[6] );
6575 11870096 : move64();
6576 11870096 : t[5] = CL_sub( y[2], y[6] );
6577 11870096 : move64();
6578 11870096 : t[6] = CL_add( y[3], y[7] );
6579 11870096 : move64();
6580 11870096 : t[7] = CL_sub( y[3], y[7] );
6581 11870096 : move64();
6582 :
6583 11870096 : s[0] = CL_add( t[0], t[4] );
6584 11870096 : move64();
6585 11870096 : s[2] = CL_sub( t[0], t[4] );
6586 11870096 : move64();
6587 11870096 : s[4] = CL_mac_j( t[1], t[5] );
6588 11870096 : move64();
6589 11870096 : s[5] = CL_msu_j( t[1], t[5] );
6590 11870096 : move64();
6591 11870096 : s[1] = CL_add( t[2], t[6] );
6592 11870096 : move64();
6593 11870096 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
6594 11870096 : move64();
6595 :
6596 11870096 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
6597 11870096 : move64();
6598 11870096 : t[1] = CL_sub( t[3], t[7] );
6599 11870096 : move64();
6600 :
6601 11870096 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
6602 11870096 : move64();
6603 11870096 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
6604 11870096 : move64();
6605 11870096 : s[7] = CL_conjugate( s[7] );
6606 11870096 : move64();
6607 :
6608 11870096 : x[i] = CL_add( s[0], s[1] );
6609 11870096 : move64();
6610 11870096 : x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] );
6611 11870096 : move64();
6612 11870096 : x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] );
6613 11870096 : move64();
6614 11870096 : x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] );
6615 11870096 : move64();
6616 11870096 : x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] );
6617 11870096 : move64();
6618 11870096 : x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] );
6619 11870096 : move64();
6620 11870096 : x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] );
6621 11870096 : move64();
6622 11870096 : x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] );
6623 11870096 : move64();
6624 : }
6625 : }
6626 : ELSE
6627 : {
6628 327937401 : FOR( i = 0; i < dim1; i++ )
6629 : {
6630 : {
6631 316386590 : y[0] = xx[i];
6632 316386590 : move64();
6633 : };
6634 316386590 : IF( i > 0 )
6635 : {
6636 : {
6637 304835779 : y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) - Woff )] ),
6638 304835779 : CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6639 304835779 : move64();
6640 : };
6641 : {
6642 304835779 : y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) - Woff )] ),
6643 304835779 : CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6644 304835779 : move64();
6645 : };
6646 : {
6647 304835779 : y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) - Woff )] ),
6648 304835779 : CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6649 304835779 : move64();
6650 : };
6651 : {
6652 304835779 : y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) - Woff )] ),
6653 304835779 : CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6654 304835779 : move64();
6655 : };
6656 : {
6657 304835779 : y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) - Woff )] ),
6658 304835779 : CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6659 304835779 : move64();
6660 : };
6661 : {
6662 304835779 : y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) - Woff )] ),
6663 304835779 : CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6664 304835779 : move64();
6665 : };
6666 : {
6667 304835779 : y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) - Woff )] ),
6668 304835779 : CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6669 304835779 : move64();
6670 : };
6671 : }
6672 :
6673 316386590 : t[0] = CL_add( y[0], y[4] );
6674 316386590 : move64();
6675 316386590 : t[1] = CL_sub( y[0], y[4] );
6676 316386590 : move64();
6677 316386590 : t[2] = CL_add( y[1], y[5] );
6678 316386590 : move64();
6679 316386590 : t[3] = CL_sub( y[1], y[5] );
6680 316386590 : move64();
6681 316386590 : t[4] = CL_add( y[2], y[6] );
6682 316386590 : move64();
6683 316386590 : t[5] = CL_sub( y[2], y[6] );
6684 316386590 : move64();
6685 316386590 : t[6] = CL_add( y[3], y[7] );
6686 316386590 : move64();
6687 316386590 : t[7] = CL_sub( y[3], y[7] );
6688 316386590 : move64();
6689 :
6690 316386590 : s[0] = CL_add( t[0], t[4] );
6691 316386590 : move64();
6692 316386590 : s[2] = CL_sub( t[0], t[4] );
6693 316386590 : move64();
6694 316386590 : s[4] = CL_mac_j( t[1], t[5] );
6695 316386590 : move64();
6696 316386590 : s[5] = CL_msu_j( t[1], t[5] );
6697 316386590 : move64();
6698 316386590 : s[1] = CL_add( t[2], t[6] );
6699 316386590 : move64();
6700 316386590 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
6701 316386590 : move64();
6702 :
6703 316386590 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
6704 316386590 : move64();
6705 316386590 : t[1] = CL_sub( t[3], t[7] );
6706 316386590 : move64();
6707 :
6708 316386590 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
6709 316386590 : move64();
6710 316386590 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
6711 316386590 : move64();
6712 316386590 : s[7] = CL_conjugate( s[7] );
6713 316386590 : move64();
6714 :
6715 316386590 : x[i] = CL_add( s[0], s[1] );
6716 316386590 : move64();
6717 316386590 : x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] );
6718 316386590 : move64();
6719 316386590 : x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] );
6720 316386590 : move64();
6721 316386590 : x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] );
6722 316386590 : move64();
6723 316386590 : x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] );
6724 316386590 : move64();
6725 316386590 : x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] );
6726 316386590 : move64();
6727 316386590 : x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] );
6728 316386590 : move64();
6729 316386590 : x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] );
6730 316386590 : move64();
6731 : }
6732 : }
6733 12002885 : BREAK;
6734 : }
6735 :
6736 0 : case 10:
6737 : {
6738 : cmplx y[10];
6739 0 : FOR( j = 0; j < dim2; j++ )
6740 : {
6741 : {
6742 0 : y[j] = xx[0 + ( j * dim1 )]; /*y[j] = xx[0 + j * dim1];*/
6743 0 : move64();
6744 : };
6745 : }
6746 0 : fft_len10( &y[0] );
6747 0 : FOR( j = 0; j < dim2; j++ )
6748 : {
6749 0 : x[0 + ( j * dim1 )] = y[j];
6750 0 : move64();
6751 : }
6752 :
6753 0 : FOR( i = 1; i < dim1; i++ )
6754 : {
6755 : {
6756 0 : y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1];
6757 0 : move64();
6758 : }
6759 :
6760 0 : FOR( j = 1; j < dim2; j++ )
6761 : {
6762 : {
6763 0 : y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) - Woff )] ),
6764 0 : CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6765 0 : move64();
6766 : }
6767 : }
6768 0 : fft_len10( &y[0] );
6769 0 : FOR( j = 0; j < dim2; j++ )
6770 : {
6771 0 : x[( i + ( j * dim1 ) )] = y[j];
6772 0 : move64();
6773 : }
6774 : }
6775 0 : BREAK;
6776 : }
6777 :
6778 2359470 : case 16:
6779 : {
6780 : cmplx y[16];
6781 40110990 : FOR( j = 0; j < dim2; j++ )
6782 : {
6783 : {
6784 37751520 : y[j] = xx[0 + ( j * dim1 )];
6785 37751520 : move64();
6786 : };
6787 : }
6788 :
6789 2359470 : fft_len16( &y[0] );
6790 40110990 : FOR( j = 0; j < dim2; j++ )
6791 : {
6792 37751520 : x[0 + ( j * dim1 )] = y[j];
6793 37751520 : move64();
6794 : }
6795 :
6796 59529950 : FOR( i = 1; i < dim1; i++ )
6797 : {
6798 : {
6799 57170480 : y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1];
6800 57170480 : move64();
6801 : }
6802 :
6803 914727680 : FOR( j = 1; j < dim2; j++ )
6804 : {
6805 : {
6806 857557200 : y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) - Woff )] ),
6807 857557200 : CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6808 857557200 : move64();
6809 : }
6810 : }
6811 57170480 : fft_len16( &y[0] );
6812 971898160 : FOR( j = 0; j < dim2; j++ )
6813 : {
6814 914727680 : x[( i + ( j * dim1 ) )] = y[j];
6815 914727680 : move64();
6816 : }
6817 : }
6818 2359470 : BREAK;
6819 : }
6820 :
6821 0 : case 20:
6822 : {
6823 : cmplx y[20];
6824 0 : FOR( j = 0; j < dim2; j++ )
6825 : {
6826 : {
6827 0 : y[j] = xx[0 + ( j * dim1 )];
6828 0 : move64();
6829 : };
6830 : }
6831 0 : fft_len20_fx( &y[0] );
6832 0 : FOR( j = 0; j < dim2; j++ )
6833 : {
6834 0 : x[0 + ( j * dim1 )] = y[j];
6835 0 : move64();
6836 : }
6837 :
6838 0 : FOR( i = 1; i < dim1; i++ )
6839 : {
6840 : {
6841 0 : y[( 0 + 0 )] = xx[( i + ( 0 + 0 ) * dim1 )];
6842 0 : move64();
6843 : }
6844 : {
6845 0 : y[( 0 + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( len + ( sc * i ) ) + 0 * dim1 - Woff )] ),
6846 0 : CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + 0 * dim1 + 1 ) - Woff )] ) ); // Qx
6847 0 : move64();
6848 : }
6849 :
6850 0 : FOR( j = 2; j < dim2; j = j + 2 )
6851 : {
6852 : {
6853 0 : y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( j * dim1 ) ) - Woff )] ),
6854 0 : CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6855 0 : move64();
6856 : }
6857 : {
6858 0 : y[( j + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) - Woff )] ),
6859 0 : CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6860 0 : move64();
6861 : }
6862 : }
6863 0 : fft_len20_fx( &y[0] );
6864 0 : FOR( j = 0; j < dim2; j++ )
6865 : {
6866 0 : x[i + j * dim1] = y[j];
6867 0 : move64();
6868 : }
6869 : }
6870 0 : BREAK;
6871 : }
6872 :
6873 1007210 : case 32:
6874 : {
6875 : cmplx y[32];
6876 33237930 : FOR( j = 0; j < dim2; j++ )
6877 : {
6878 : {
6879 32230720 : y[j] = xx[0 + j * dim1];
6880 32230720 : move64();
6881 : };
6882 : }
6883 1007210 : fft_len32( &y[0] );
6884 33237930 : FOR( j = 0; j < dim2; j++ )
6885 : {
6886 32230720 : x[0 + j * dim1] = y[j];
6887 32230720 : move64();
6888 : }
6889 :
6890 25071250 : FOR( i = 1; i < dim1; i++ )
6891 : {
6892 : {
6893 24064040 : y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1];
6894 24064040 : move64();
6895 : }
6896 : {
6897 24064040 : y[( 0 + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( len + ( sc * i ) ) + 0 * dim1 - Woff )] ),
6898 24064040 : CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + 0 * dim1 + 1 ) - Woff )] ) ); // Qx
6899 24064040 : move64();
6900 : }
6901 :
6902 385024640 : FOR( j = 2; j < dim2; j = j + 2 )
6903 : {
6904 : {
6905 360960600 : y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( j * dim1 ) ) - Woff )] ),
6906 360960600 : CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6907 360960600 : move64();
6908 : }
6909 : {
6910 360960600 : y[( j + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) - Woff )] ),
6911 360960600 : CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6912 360960600 : move64();
6913 : }
6914 : }
6915 24064040 : fft_len32( &y[0] );
6916 794113320 : FOR( j = 0; j < dim2; j++ )
6917 : {
6918 770049280 : x[( i + ( j * dim1 ) )] = y[j];
6919 770049280 : move64();
6920 : }
6921 : }
6922 1007210 : BREAK;
6923 : }
6924 : }
6925 15369565 : return;
6926 : }
6927 :
6928 : /*-----------------------------------------------------------------*
6929 : * fft_fx()
6930 : *
6931 : * Complex-value FFT
6932 : *-----------------------------------------------------------------*/
6933 :
6934 15369565 : void fft_fx(
6935 : Word32 *re, /* i/o: real part Qx */
6936 : Word32 *im, /* i/o: imag part Qx */
6937 : const Word16 length, /* i : length of fft */
6938 : const Word16 s /* i : sign */
6939 : )
6940 : {
6941 : cmplx x[960];
6942 :
6943 4396182253 : FOR( Word16 j = 0; j < length; j++ )
6944 : {
6945 4380812688 : x[j].re = re[( s * j )];
6946 4380812688 : move32();
6947 4380812688 : x[j].im = im[( s * j )];
6948 4380812688 : move32();
6949 : }
6950 :
6951 15369565 : SWITCH( length )
6952 : {
6953 0 : case 20:
6954 0 : fft_len20_fx( x );
6955 0 : BREAK;
6956 0 : case 40:
6957 0 : fft_lenN( x, FFT_RotVector_640_fx, 640, 5, 8, 8, 40 );
6958 0 : BREAK;
6959 0 : case 64:
6960 0 : fft_lenN( x, FFT_RotVector_256_fx, 256, 8, 8, 8, 64 );
6961 0 : BREAK;
6962 311612 : case 80:
6963 311612 : fft_lenN( x, FFT_RotVector_640_fx, 640, 10, 8, 4, 40 );
6964 311612 : BREAK;
6965 0 : case 100:
6966 0 : fft_lenN( x, FFT_RotVector_400_fx, 400, 10, 10, 4, 40 );
6967 0 : BREAK;
6968 464534 : case 120:
6969 464534 : fft_lenN( x, FFT_RotVector_960_fx, 960, 15, 8, 4, 60 );
6970 464534 : BREAK;
6971 162267 : case 128:
6972 162267 : fft_lenN( x, FFT_RotVector_256_fx, 256, 16, 8, 4, 64 );
6973 162267 : BREAK;
6974 1693749 : case 160:
6975 1693749 : fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 8, 2, 40 );
6976 1693749 : BREAK;
6977 0 : case 200:
6978 0 : fft_lenN( x, FFT_RotVector_400_fx, 400, 20, 10, 2, 40 );
6979 0 : BREAK;
6980 9080916 : case 240:
6981 9080916 : fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 8, 2, 60 );
6982 9080916 : BREAK;
6983 289807 : case 256:
6984 289807 : fft_lenN( x, FFT_RotVector_256_fx, 256, 32, 8, 2, 64 );
6985 289807 : BREAK;
6986 1125415 : case 320:
6987 1125415 : fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 16, 2, 40 );
6988 1125415 : BREAK;
6989 0 : case 400:
6990 0 : fft_lenN( x, FFT_RotVector_400_fx, 400, 20, 20, 2, 40 );
6991 0 : BREAK;
6992 1234055 : case 480:
6993 1234055 : fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 16, 2, 60 );
6994 1234055 : BREAK;
6995 0 : case 600:
6996 0 : fft_lenN( x, FFT_RotVector_600_fx, 600, 30, 20, 2, 60 );
6997 0 : BREAK;
6998 514505 : case 640:
6999 514505 : fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 32, 2, 40 );
7000 514505 : BREAK;
7001 492705 : case 960:
7002 492705 : fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 32, 2, 60 );
7003 492705 : BREAK;
7004 0 : default:
7005 0 : assert( !"fft length is not supported!" );
7006 : }
7007 :
7008 4396182253 : FOR( Word16 j = 0; j < length; j++ )
7009 : {
7010 4380812688 : re[( s * j )] = x[j].re;
7011 4380812688 : move32();
7012 4380812688 : im[( s * j )] = x[j].im;
7013 4380812688 : move32();
7014 : }
7015 :
7016 15369565 : return;
7017 : }
7018 :
7019 900430 : void rfft_fx(
7020 : Word32 *x, /* i/o: values Qx */
7021 : const Word16 *w, /* i : window Q15 */
7022 : const Word16 length, /* i : length of fft */
7023 : const Word16 isign /* i : sign */
7024 : )
7025 : {
7026 : Word16 i, sizeOfFft2, sizeOfFft4;
7027 : Word32 tmp, t1, t2, t3, t4;
7028 : Word16 s1, s2;
7029 :
7030 900430 : sizeOfFft2 = shr( length, 1 );
7031 900430 : sizeOfFft4 = shr( length, 2 );
7032 900430 : SWITCH( sizeOfFft2 )
7033 : {
7034 34598 : case 80:
7035 34598 : s1 = 409; //(1/sizeOfFft2).Q15
7036 34598 : move16();
7037 34598 : s2 = -409;
7038 34598 : move16();
7039 34598 : BREAK;
7040 68341 : case 128:
7041 68341 : s1 = 256; //(1/sizeOfFft2).Q15
7042 68341 : move16();
7043 68341 : s2 = -256;
7044 68341 : move16();
7045 68341 : BREAK;
7046 164124 : case 160:
7047 164124 : s1 = 204; //(1/sizeOfFft2).Q15
7048 164124 : move16();
7049 164124 : s2 = -204;
7050 164124 : move16();
7051 164124 : BREAK;
7052 214 : case 240:
7053 214 : s1 = 136; //(1/sizeOfFft2).Q15
7054 214 : move16();
7055 214 : s2 = -136;
7056 214 : move16();
7057 214 : BREAK;
7058 59659 : case 256:
7059 59659 : s1 = 128; //(1/sizeOfFft2).Q15
7060 59659 : move16();
7061 59659 : s2 = -128;
7062 59659 : move16();
7063 59659 : BREAK;
7064 237052 : case 320:
7065 237052 : s1 = 102; //(1/sizeOfFft2).Q15
7066 237052 : move16();
7067 237052 : s2 = -102;
7068 237052 : move16();
7069 237052 : BREAK;
7070 97674 : case 480:
7071 97674 : s1 = 68; //(1/sizeOfFft2).Q15
7072 97674 : move16();
7073 97674 : s2 = -68;
7074 97674 : move16();
7075 97674 : BREAK;
7076 168644 : case 640:
7077 168644 : s1 = 51; //(1/sizeOfFft2).Q15
7078 168644 : move16();
7079 168644 : s2 = -51;
7080 168644 : move16();
7081 168644 : BREAK;
7082 70124 : case 960:
7083 70124 : s1 = 34; //(1/sizeOfFft2).Q15
7084 70124 : move16();
7085 70124 : s2 = -34;
7086 70124 : move16();
7087 70124 : BREAK;
7088 0 : default:
7089 0 : s1 = -1;
7090 0 : move16();
7091 0 : s2 = -1;
7092 0 : move16();
7093 0 : printf( "Configuration not supported" );
7094 0 : assert( 0 );
7095 : }
7096 :
7097 900430 : SWITCH( isign )
7098 : {
7099 :
7100 398485 : case -1:
7101 :
7102 398485 : fft_fx( x, x + 1, sizeOfFft2, 2 );
7103 : // Qx
7104 398485 : tmp = L_add( x[0], x[1] );
7105 398485 : x[1] = L_sub( x[0], x[1] ); // Qx
7106 398485 : move32();
7107 398485 : x[0] = tmp;
7108 398485 : move32();
7109 :
7110 74303669 : FOR( i = 1; i <= sizeOfFft4; i++ )
7111 : {
7112 73905184 : t1 = L_sub( x[2 * i], x[( length - ( i << 1 ) )] ); // Qx
7113 73905184 : t2 = L_add( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] ); // Qx
7114 73905184 : t3 = L_sub( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[i + sizeOfFft4] ) ); // Qx
7115 73905184 : t4 = L_add( Mpy_32_16_1( t1, w[i + sizeOfFft4] ), Mpy_32_16_1( t2, w[i] ) ); // Qx
7116 73905184 : t1 = L_add( x[2 * i], x[( length - ( i << 1 ) )] );
7117 73905184 : t2 = L_sub( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
7118 :
7119 73905184 : x[2 * i] = Mpy_32_16_1( L_sub( t1, t3 ), 16384 /*0.5.Q15*/ );
7120 73905184 : move32();
7121 73905184 : x[( ( i << 1 ) + 1 )] = Mpy_32_16_1( L_sub( t2, t4 ), 16384 /*0.5.Q15*/ );
7122 73905184 : move32();
7123 73905184 : x[( length - ( i << 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 /*0.5.Q15*/ );
7124 73905184 : move32();
7125 73905184 : x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_add( t2, t4 ), -16384 /*0.5.Q15*/ );
7126 73905184 : move32();
7127 : }
7128 :
7129 398485 : BREAK;
7130 :
7131 501945 : case +1:
7132 :
7133 501945 : tmp = Mpy_32_16_1( L_add( x[0], x[1] ), 16384 /*0.5.Q15*/ );
7134 501945 : x[1] = Mpy_32_16_1( L_sub( x[1], x[0] ), 16384 /*0.5.Q15*/ );
7135 501945 : move32();
7136 501945 : x[0] = tmp;
7137 501945 : move32();
7138 :
7139 102142137 : FOR( i = 1; i <= sizeOfFft4; i++ )
7140 : {
7141 101640192 : t1 = L_sub( x[2 * i], x[( length - ( i << 1 ) )] );
7142 101640192 : t2 = L_add( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
7143 101640192 : t3 = L_add( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[( i + sizeOfFft4 )] ) );
7144 101640192 : t4 = L_sub( Mpy_32_16_1( t2, w[i] ), Mpy_32_16_1( t1, w[( i + sizeOfFft4 )] ) );
7145 101640192 : t1 = L_add( x[2 * i], x[( length - ( i << 1 ) )] );
7146 101640192 : t2 = L_sub( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
7147 :
7148 101640192 : x[2 * i] = Mpy_32_16_1( L_sub( t1, t3 ), 16384 /*0.5.Q15*/ ); // Qx
7149 101640192 : move32();
7150 101640192 : x[( ( i << 1 ) + 1 )] = Mpy_32_16_1( L_sub( t4, t2 ), 16384 /*0.5.Q15*/ ); // Qx
7151 101640192 : move32();
7152 101640192 : x[( length - ( i << 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 /*0.5.Q15*/ ); // Qx
7153 101640192 : move32();
7154 101640192 : x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_add( t2, t4 ), 16384 /*0.5.Q15*/ ); // Qx
7155 101640192 : move32();
7156 : }
7157 :
7158 501945 : fft_fx( x, x + 1, sizeOfFft2, 2 );
7159 :
7160 203782329 : FOR( i = 0; i < length; i += 2 )
7161 : {
7162 203280384 : x[i] = Mpy_32_16_1( x[i], s1 ); // Qx
7163 203280384 : move32();
7164 203280384 : x[i + 1] = Mpy_32_16_1( x[i + 1], s2 ); // Qx
7165 203280384 : move32();
7166 : }
7167 :
7168 501945 : BREAK;
7169 : }
7170 :
7171 900430 : return;
7172 : }
7173 :
7174 :
7175 : #define WMC_TOOL_SKIP
7176 :
7177 : #define SHC( x ) ( (Word16) x )
7178 : #define FFTC( x ) WORD322WORD16( (Word32) x )
7179 :
7180 : #define C81_FX ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1) */
7181 : #define C82_FX ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) */
7182 :
7183 : #define cplxMpy4_8_0( re, im, a, b, c, d ) \
7184 : re = L_shr( L_sub( Mpy_32_16_1( a, c ), Mpy_32_16_1( b, d ) ), 1 ); \
7185 : im = L_shr( L_add( Mpy_32_16_1( a, d ), Mpy_32_16_1( b, c ) ), 1 );
7186 :
7187 : #define cplxMpy4_8_1( re, im, a, b ) \
7188 : re = L_shr( a, 1 ); \
7189 : im = L_shr( b, 1 );
7190 :
7191 :
7192 : /**
7193 : * \brief Twiddle factors are unscaled
7194 : */
7195 : /*-----------------------------------------------------------------*
7196 : * BASOP_fft8()
7197 : *
7198 : * Function performs a complex 8-point FFT
7199 : * The FFT is performed inplace. The result of the FFT
7200 : * is scaled by SCALEFACTOR8 bits.
7201 : *
7202 : * WOPS with 32x16 bit multiplications: 108 cycles
7203 : *-----------------------------------------------------------------*/
7204 :
7205 4673448 : static void BASOP_fft8(
7206 : Word32 *re,
7207 : Word32 *im,
7208 : Word16 s )
7209 : {
7210 : Word32 x00, x01, x02, x03, x04, x05, x06, x07;
7211 : Word32 x08, x09, x10, x11, x12, x13, x14, x15;
7212 : Word32 t00, t01, t02, t03, t04, t05, t06, t07;
7213 : Word32 t08, t09, t10, t11, t12, t13, t14, t15;
7214 : Word32 s00, s01, s02, s03, s04, s05, s06, s07;
7215 : Word32 s08, s09, s10, s11, s12, s13, s14, s15;
7216 :
7217 :
7218 : /* Pre-additions */
7219 :
7220 4673448 : x00 = L_shr( re[s * 0], SCALEFACTOR8 );
7221 4673448 : x01 = L_shr( im[s * 0], SCALEFACTOR8 );
7222 4673448 : x02 = L_shr( re[s * 1], SCALEFACTOR8 );
7223 4673448 : x03 = L_shr( im[s * 1], SCALEFACTOR8 );
7224 4673448 : x04 = L_shr( re[s * 2], SCALEFACTOR8 );
7225 4673448 : x05 = L_shr( im[s * 2], SCALEFACTOR8 );
7226 4673448 : x06 = L_shr( re[s * 3], SCALEFACTOR8 );
7227 4673448 : x07 = L_shr( im[s * 3], SCALEFACTOR8 );
7228 4673448 : x08 = L_shr( re[s * 4], SCALEFACTOR8 );
7229 4673448 : x09 = L_shr( im[s * 4], SCALEFACTOR8 );
7230 4673448 : x10 = L_shr( re[s * 5], SCALEFACTOR8 );
7231 4673448 : x11 = L_shr( im[s * 5], SCALEFACTOR8 );
7232 4673448 : x12 = L_shr( re[s * 6], SCALEFACTOR8 );
7233 4673448 : x13 = L_shr( im[s * 6], SCALEFACTOR8 );
7234 4673448 : x14 = L_shr( re[s * 7], SCALEFACTOR8 );
7235 4673448 : x15 = L_shr( im[s * 7], SCALEFACTOR8 );
7236 :
7237 4673448 : t00 = L_add( x00, x08 );
7238 4673448 : t02 = L_sub( x00, x08 );
7239 4673448 : t01 = L_add( x01, x09 );
7240 4673448 : t03 = L_sub( x01, x09 );
7241 4673448 : t04 = L_add( x02, x10 );
7242 4673448 : t06 = L_sub( x02, x10 );
7243 4673448 : t05 = L_add( x03, x11 );
7244 4673448 : t07 = L_sub( x03, x11 );
7245 4673448 : t08 = L_add( x04, x12 );
7246 4673448 : t10 = L_sub( x04, x12 );
7247 4673448 : t09 = L_add( x05, x13 );
7248 4673448 : t11 = L_sub( x05, x13 );
7249 4673448 : t12 = L_add( x06, x14 );
7250 4673448 : t14 = L_sub( x06, x14 );
7251 4673448 : t13 = L_add( x07, x15 );
7252 4673448 : t15 = L_sub( x07, x15 );
7253 :
7254 : /* Pre-additions and core multiplications */
7255 :
7256 4673448 : s00 = L_add( t00, t08 );
7257 4673448 : s04 = L_sub( t00, t08 );
7258 4673448 : s01 = L_add( t01, t09 );
7259 4673448 : s05 = L_sub( t01, t09 );
7260 4673448 : s08 = L_sub( t02, t11 );
7261 4673448 : s10 = L_add( t02, t11 );
7262 4673448 : s09 = L_add( t03, t10 );
7263 4673448 : s11 = L_sub( t03, t10 );
7264 4673448 : s02 = L_add( t04, t12 );
7265 4673448 : s07 = L_sub( t04, t12 );
7266 4673448 : s03 = L_add( t05, t13 );
7267 4673448 : s06 = L_sub( t13, t05 );
7268 :
7269 4673448 : t01 = L_add( t06, t14 );
7270 4673448 : t02 = L_sub( t06, t14 );
7271 4673448 : t00 = L_add( t07, t15 );
7272 4673448 : t03 = L_sub( t07, t15 );
7273 :
7274 4673448 : s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX );
7275 4673448 : s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX );
7276 4673448 : s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX );
7277 4673448 : s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX );
7278 :
7279 : /* Post-additions */
7280 :
7281 4673448 : re[s * 0] = L_add( s00, s02 );
7282 4673448 : move32();
7283 4673448 : re[s * 4] = L_sub( s00, s02 );
7284 4673448 : move32();
7285 4673448 : im[s * 0] = L_add( s01, s03 );
7286 4673448 : move32();
7287 4673448 : im[s * 4] = L_sub( s01, s03 );
7288 4673448 : move32();
7289 4673448 : re[s * 2] = L_sub( s04, s06 );
7290 4673448 : move32();
7291 4673448 : re[s * 6] = L_add( s04, s06 );
7292 4673448 : move32();
7293 4673448 : im[s * 2] = L_sub( s05, s07 );
7294 4673448 : move32();
7295 4673448 : im[s * 6] = L_add( s05, s07 );
7296 4673448 : move32();
7297 4673448 : re[i_mult( s, 3 )] = L_add( s08, s14 );
7298 4673448 : move32();
7299 4673448 : re[i_mult( s, 7 )] = L_sub( s08, s14 );
7300 4673448 : move32();
7301 4673448 : im[i_mult( s, 3 )] = L_add( s09, s15 );
7302 4673448 : move32();
7303 4673448 : im[i_mult( s, 7 )] = L_sub( s09, s15 );
7304 4673448 : move32();
7305 4673448 : re[s * 1] = L_add( s10, s12 );
7306 4673448 : move32();
7307 4673448 : re[i_mult( s, 5 )] = L_sub( s10, s12 );
7308 4673448 : move32();
7309 4673448 : im[s * 1] = L_add( s11, s13 );
7310 4673448 : move32();
7311 4673448 : im[i_mult( s, 5 )] = L_sub( s11, s13 );
7312 4673448 : move32();
7313 :
7314 4673448 : return;
7315 : }
7316 :
7317 :
7318 : /*-----------------------------------------------------------------*
7319 : * fftN2()
7320 : *
7321 : * Combined FFT
7322 : *-----------------------------------------------------------------*/
7323 :
7324 584181 : static void BASOP_fftN2(
7325 : Word32 *re, /* i/o: real part */
7326 : Word32 *im, /* i/o: imag part */
7327 : const Word16 *W, /* i : rotation factor */
7328 : Word16 dim1, /* i : length of fft1 */
7329 : Word16 dim2, /* i : length of fft2 */
7330 : Word16 sx, /* i : stride real and imag part */
7331 : Word16 sc, /* i : stride phase rotation coefficients */
7332 : Word32 *x, /* tmp: 32-bit workbuffer */
7333 : Word16 Woff /* i : offset for addressing the rotation vector table */
7334 : )
7335 : {
7336 : Word16 i, j;
7337 : Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15;
7338 : Word32 t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15;
7339 : Word32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15;
7340 :
7341 5257629 : FOR( i = 0; i < dim2; i++ )
7342 : {
7343 42061032 : FOR( j = 0; j < dim1; j++ )
7344 : {
7345 37387584 : x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2];
7346 37387584 : move32();
7347 37387584 : x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2];
7348 37387584 : move32();
7349 : }
7350 : }
7351 :
7352 : /* dim1 == 8 */
7353 5257629 : FOR( i = 0; i < dim2; i++ )
7354 : {
7355 4673448 : BASOP_fft8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
7356 : }
7357 :
7358 : /* dim2 == 8 */
7359 5257629 : FOR( i = 0; i < dim1; i++ )
7360 : {
7361 4673448 : cplxMpy4_8_1( x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1] );
7362 :
7363 4673448 : IF( i == 0 )
7364 : {
7365 584181 : cplxMpy4_8_1( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )] );
7366 584181 : cplxMpy4_8_1( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )] );
7367 584181 : cplxMpy4_8_1( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )] );
7368 584181 : cplxMpy4_8_1( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )] );
7369 584181 : cplxMpy4_8_1( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )] );
7370 584181 : cplxMpy4_8_1( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )] );
7371 584181 : cplxMpy4_8_1( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )] );
7372 : }
7373 : ELSE
7374 : {
7375 4089267 : cplxMpy4_8_0( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), 1 ), Woff )] );
7376 4089267 : cplxMpy4_8_0( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), 1 ), Woff )] );
7377 4089267 : cplxMpy4_8_0( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), 1 ), Woff )] );
7378 4089267 : cplxMpy4_8_0( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), 1 ), Woff )] );
7379 4089267 : cplxMpy4_8_0( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), 1 ), Woff )] );
7380 4089267 : cplxMpy4_8_0( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), 1 ), Woff )] );
7381 4089267 : cplxMpy4_8_0( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), 1 ), Woff )] );
7382 : }
7383 4673448 : t00 = L_shr( L_add( x00, x08 ), SCALEFACTORN2 - 1 );
7384 4673448 : t02 = L_shr( L_sub( x00, x08 ), SCALEFACTORN2 - 1 );
7385 4673448 : t01 = L_shr( L_add( x01, x09 ), SCALEFACTORN2 - 1 );
7386 4673448 : t03 = L_shr( L_sub( x01, x09 ), SCALEFACTORN2 - 1 );
7387 4673448 : t04 = L_shr( L_add( x02, x10 ), SCALEFACTORN2 - 1 );
7388 4673448 : t06 = L_sub( x02, x10 );
7389 4673448 : t05 = L_shr( L_add( x03, x11 ), SCALEFACTORN2 - 1 );
7390 4673448 : t07 = L_sub( x03, x11 );
7391 4673448 : t08 = L_shr( L_add( x04, x12 ), SCALEFACTORN2 - 1 );
7392 4673448 : t10 = L_shr( L_sub( x04, x12 ), SCALEFACTORN2 - 1 );
7393 4673448 : t09 = L_shr( L_add( x05, x13 ), SCALEFACTORN2 - 1 );
7394 4673448 : t11 = L_shr( L_sub( x05, x13 ), SCALEFACTORN2 - 1 );
7395 4673448 : t12 = L_shr( L_add( x06, x14 ), SCALEFACTORN2 - 1 );
7396 4673448 : t14 = L_sub( x06, x14 );
7397 4673448 : t13 = L_shr( L_add( x07, x15 ), SCALEFACTORN2 - 1 );
7398 4673448 : t15 = L_sub( x07, x15 );
7399 :
7400 4673448 : s00 = L_add( t00, t08 );
7401 4673448 : s04 = L_sub( t00, t08 );
7402 4673448 : s01 = L_add( t01, t09 );
7403 4673448 : s05 = L_sub( t01, t09 );
7404 4673448 : s08 = L_sub( t02, t11 );
7405 4673448 : s10 = L_add( t02, t11 );
7406 4673448 : s09 = L_add( t03, t10 );
7407 4673448 : s11 = L_sub( t03, t10 );
7408 4673448 : s02 = L_add( t04, t12 );
7409 4673448 : s07 = L_sub( t04, t12 );
7410 4673448 : s03 = L_add( t05, t13 );
7411 4673448 : s06 = L_sub( t13, t05 );
7412 :
7413 4673448 : t01 = L_shr( L_add( t06, t14 ), SCALEFACTORN2 - 1 );
7414 4673448 : t02 = L_shr( L_sub( t06, t14 ), SCALEFACTORN2 - 1 );
7415 4673448 : t00 = L_shr( L_add( t07, t15 ), SCALEFACTORN2 - 1 );
7416 4673448 : t03 = L_shr( L_sub( t07, t15 ), SCALEFACTORN2 - 1 );
7417 :
7418 4673448 : s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX );
7419 4673448 : s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX );
7420 4673448 : s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX );
7421 4673448 : s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX );
7422 :
7423 4673448 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s00, s02 );
7424 4673448 : move32();
7425 4673448 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s01, s03 );
7426 4673448 : move32();
7427 4673448 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s10, s12 );
7428 4673448 : move32();
7429 4673448 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s11, s13 );
7430 4673448 : move32();
7431 4673448 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s04, s06 );
7432 4673448 : move32();
7433 4673448 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s05, s07 );
7434 4673448 : move32();
7435 4673448 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s08, s14 );
7436 4673448 : move32();
7437 4673448 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s09, s15 );
7438 4673448 : move32();
7439 4673448 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s00, s02 );
7440 4673448 : move32();
7441 4673448 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s01, s03 );
7442 4673448 : move32();
7443 4673448 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s10, s12 );
7444 4673448 : move32();
7445 4673448 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s11, s13 );
7446 4673448 : move32();
7447 4673448 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s04, s06 );
7448 4673448 : move32();
7449 4673448 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s05, s07 );
7450 4673448 : move32();
7451 4673448 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s08, s14 );
7452 4673448 : move32();
7453 4673448 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s09, s15 );
7454 4673448 : move32();
7455 : }
7456 :
7457 584181 : return;
7458 : }
7459 :
7460 :
7461 : /*-----------------------------------------------------------------*
7462 : * BASOP_cfft_ivas()
7463 : *
7464 : * Complex valued FFT
7465 : *-----------------------------------------------------------------*/
7466 :
7467 584181 : void BASOP_cfft_ivas(
7468 : Word32 *re, /* i/o: real part */
7469 : Word32 *im, /* i/o: imag part */
7470 : Word16 s, /* i : stride real and imag part */
7471 : Word16 *scale /* i : scalefactor */
7472 : )
7473 : {
7474 : Word32 x[2 * 64];
7475 :
7476 : /* FFT for len = FDNS_NPTS */
7477 584181 : BASOP_fftN2( re, im, RotVector_256, 8, 8, s, 8, x, 64 );
7478 584181 : s = add( *scale, SCALEFACTOR64 );
7479 :
7480 584181 : *scale = s;
7481 584181 : move16();
7482 :
7483 584181 : return;
7484 : }
7485 :
7486 : #undef WMC_TOOL_SKIP
|