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 12096 : 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 12096 : in1 = Idx[0];
989 12096 : move16();
990 12096 : in2 = Idx[32];
991 12096 : move16();
992 12096 : in3 = Idx[64];
993 12096 : move16();
994 12096 : in4 = Idx[96];
995 12096 : move16();
996 12096 : in5 = Idx[128];
997 12096 : move16();
998 :
999 12096 : fi1 = zRe[in1]; // Qx
1000 12096 : move32();
1001 12096 : fi2 = zIm[in1]; // Qx
1002 12096 : move32();
1003 12096 : fo3 = zRe[in2]; // Qx
1004 12096 : move32();
1005 12096 : fo4 = zRe[in5]; // Qx
1006 12096 : move32();
1007 12096 : fo6 = zRe[in3]; // Qx
1008 12096 : move32();
1009 12096 : fo7 = zRe[in4]; // Qx
1010 12096 : move32();
1011 :
1012 12096 : fo5 = L_add( fo3, fo4 );
1013 12096 : fo8 = L_add( fo6, fo7 );
1014 12096 : fi3 = L_add( fo5, fo8 );
1015 12096 : fi4 = L_sub( fo6, fo7 );
1016 12096 : fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
1017 12096 : fi6 = L_sub( fo3, fo4 );
1018 :
1019 12096 : fo3 = zIm[in2];
1020 12096 : move32();
1021 12096 : fo4 = zIm[in5];
1022 12096 : move32();
1023 12096 : fo6 = zIm[in3];
1024 12096 : move32();
1025 12096 : fo7 = zIm[in4];
1026 12096 : move32();
1027 :
1028 12096 : fo5 = L_add( fo3, fo4 );
1029 12096 : fo8 = L_add( fo6, fo7 );
1030 12096 : fi7 = L_sub( fo3, fo4 );
1031 12096 : fi8 = L_add( fo5, fo8 );
1032 12096 : fo1 = L_sub( fo6, fo7 );
1033 12096 : fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
1034 :
1035 12096 : zRe[in1] = L_add( fi1, fi3 );
1036 12096 : move32();
1037 12096 : zIm[in1] = L_add( fi2, fi8 );
1038 12096 : move32();
1039 :
1040 12096 : fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
1041 12096 : fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
1042 12096 : fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
1043 12096 : fo5 = L_add( fi5, fo7 );
1044 12096 : fo6 = L_sub( fo7, fi5 );
1045 :
1046 12096 : zRe[in2] = L_add( fo6, fo4 );
1047 12096 : move32();
1048 12096 : zRe[in3] = L_add( fo5, fo3 );
1049 12096 : move32();
1050 12096 : zRe[in4] = L_sub( fo5, fo3 );
1051 12096 : move32();
1052 12096 : zRe[in5] = L_sub( fo6, fo4 );
1053 12096 : move32();
1054 :
1055 12096 : fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
1056 12096 : fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
1057 12096 : fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
1058 12096 : fo5 = L_add( fo2, fo7 );
1059 12096 : fo6 = L_sub( fo7, fo2 );
1060 :
1061 12096 : zIm[in2] = L_sub( fo6, fo4 );
1062 12096 : move32();
1063 12096 : zIm[in3] = L_sub( fo5, fo3 );
1064 12096 : move32();
1065 12096 : zIm[in4] = L_add( fo3, fo5 );
1066 12096 : move32();
1067 12096 : zIm[in5] = L_add( fo4, fo6 );
1068 12096 : move32();
1069 :
1070 12096 : 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 1890 : 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 62370 : FOR( i = 0; i < 32; i++ )
1170 : {
1171 60480 : id = Idx[i];
1172 60480 : move16();
1173 60480 : z[2 * i] = x[id]; // Qx
1174 60480 : move32();
1175 60480 : z[( ( i << 1 ) + 1 )] = y[id]; // Qx
1176 60480 : move32();
1177 : }
1178 :
1179 1890 : cdftForw( 64, z, Ip_fft32, w_fft32_fx );
1180 :
1181 62370 : FOR( i = 0; i < 32; i++ )
1182 : {
1183 60480 : jd = Odx_fft32_5[i];
1184 60480 : move16();
1185 60480 : id = Idx[jd];
1186 60480 : move16();
1187 60480 : x[id] = z[2 * i]; // Qx
1188 60480 : move32();
1189 60480 : y[id] = z[( ( i << 1 ) + 1 )]; // Qx
1190 60480 : move32();
1191 : }
1192 :
1193 1890 : 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 378 : 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 2268 : FOR( j = 0; j < 5; j++ )
1626 : {
1627 1890 : 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 12474 : FOR( j = 0; j < 32; j++ )
1632 : {
1633 12096 : fft5_32( x, y, Idx_dortft160 + j );
1634 : }
1635 :
1636 378 : 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 1101596 : 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 1101596 : bitrv2_SR( n, ip + 2, a );
1799 :
1800 : /* Do FFT */
1801 1101596 : cftfsub( n, a, w );
1802 1101596 : }
1803 :
1804 : /*-----------------------------------------------------------------*
1805 : * bitrv2_SR()
1806 : * Bit reversal
1807 : *-----------------------------------------------------------------*/
1808 :
1809 1101596 : 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 1101596 : IF( EQ_16( n, 64 ) )
1820 : {
1821 1890 : m = 4;
1822 1890 : move16();
1823 1890 : l = -1;
1824 1890 : 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 1101596 : m2 = shl( m, 1 );
1856 :
1857 1101596 : 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 11125512 : FOR( k = 1; k < m; k++ )
1960 : {
1961 93824730 : FOR( j = 0; j < k; j++ )
1962 : {
1963 83395980 : j1 = add( shl( j, 1 ), ip[k] );
1964 83395980 : k1 = add( shl( k, 1 ), ip[j] );
1965 83395980 : xr = a[j1];
1966 83395980 : move32();
1967 83395980 : xi = a[j1 + 1];
1968 83395980 : move32();
1969 83395980 : yr = a[k1];
1970 83395980 : move32();
1971 83395980 : yi = a[k1 + 1];
1972 83395980 : move32();
1973 83395980 : a[j1] = yr;
1974 83395980 : move32();
1975 83395980 : a[j1 + 1] = yi;
1976 83395980 : move32();
1977 83395980 : a[k1] = xr;
1978 83395980 : move32();
1979 83395980 : a[k1 + 1] = xi;
1980 83395980 : move32();
1981 83395980 : j1 = add( j1, m2 );
1982 83395980 : k1 = add( k1, m2 );
1983 83395980 : xr = a[j1];
1984 83395980 : move32();
1985 83395980 : xi = a[j1 + 1];
1986 83395980 : move32();
1987 83395980 : yr = a[k1];
1988 83395980 : move32();
1989 83395980 : yi = a[k1 + 1];
1990 83395980 : move32();
1991 83395980 : a[j1] = yr;
1992 83395980 : move32();
1993 83395980 : a[j1 + 1] = yi;
1994 83395980 : move32();
1995 83395980 : a[k1] = xr;
1996 83395980 : move32();
1997 83395980 : a[k1 + 1] = xi;
1998 83395980 : move32();
1999 : }
2000 : }
2001 : }
2002 :
2003 1101596 : return;
2004 : }
2005 :
2006 : /*-----------------------------------------------------------------*
2007 : * cftfsub()
2008 : * Complex Discrete Fourier Transform
2009 : *-----------------------------------------------------------------*/
2010 :
2011 1101596 : 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 1101596 : l = 2;
2021 1101596 : move16();
2022 :
2023 1101596 : IF( GT_16( n, 8 ) )
2024 : {
2025 1101596 : cft1st( n, a, w );
2026 :
2027 1101596 : l = 8;
2028 1101596 : move16();
2029 :
2030 3586660 : WHILE( ( ( l << 2 ) < n ) )
2031 : {
2032 2485064 : cftmdl( n, l, a, w );
2033 2485064 : l = shl( l, 2 );
2034 : }
2035 : }
2036 :
2037 1101596 : 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 178614234 : FOR( j = 0; j < l; j += 2 )
2073 : {
2074 177917472 : j1 = add( j, l );
2075 177917472 : x0r = L_sub( a[j], a[j1] );
2076 177917472 : x0i = L_sub( a[j + 1], a[j1 + 1] );
2077 177917472 : a[j] = L_add( a[j], a[j1] );
2078 177917472 : move32();
2079 177917472 : a[j + 1] = L_add( a[j + 1], a[j1 + 1] );
2080 177917472 : move32();
2081 177917472 : a[j1] = x0r;
2082 177917472 : move32();
2083 177917472 : a[j1 + 1] = x0i;
2084 177917472 : move32();
2085 : }
2086 : }
2087 :
2088 1101596 : return;
2089 : }
2090 :
2091 : /*-----------------------------------------------------------------*
2092 : * cft1st()
2093 : * Subfunction of Complex Discrete Fourier Transform
2094 : *-----------------------------------------------------------------*/
2095 :
2096 1101596 : 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 1101596 : x0r = L_add( a[0], a[2] ); // Qx
2107 1101596 : x0i = L_add( a[1], a[3] ); // Qx
2108 1101596 : x1r = L_sub( a[0], a[2] ); // Qx
2109 1101596 : x1i = L_sub( a[1], a[3] ); // Qx
2110 1101596 : x2r = L_add( a[4], a[6] ); // Qx
2111 1101596 : x2i = L_add( a[5], a[7] ); // Qx
2112 1101596 : x3r = L_sub( a[4], a[6] ); // Qx
2113 1101596 : x3i = L_sub( a[5], a[7] ); // Qx
2114 1101596 : a[0] = L_add( x0r, x2r );
2115 1101596 : move32();
2116 1101596 : a[1] = L_add( x0i, x2i );
2117 1101596 : move32();
2118 1101596 : a[4] = L_sub( x0r, x2r );
2119 1101596 : move32();
2120 1101596 : a[5] = L_sub( x0i, x2i );
2121 1101596 : move32();
2122 1101596 : a[2] = L_sub( x1r, x3i );
2123 1101596 : move32();
2124 1101596 : a[3] = L_add( x1i, x3r );
2125 1101596 : move32();
2126 1101596 : a[6] = L_add( x1r, x3i );
2127 1101596 : move32();
2128 1101596 : a[7] = L_sub( x1i, x3r );
2129 1101596 : move32();
2130 1101596 : wk1r = w[2];
2131 1101596 : x0r = L_add( a[8], a[10] );
2132 1101596 : x0i = L_add( a[9], a[11] );
2133 1101596 : x1r = L_sub( a[8], a[10] );
2134 1101596 : x1i = L_sub( a[9], a[11] );
2135 1101596 : x2r = L_add( a[12], a[14] );
2136 1101596 : x2i = L_add( a[13], a[15] );
2137 1101596 : x3r = L_sub( a[12], a[14] );
2138 1101596 : x3i = L_sub( a[13], a[15] );
2139 1101596 : a[8] = L_add( x0r, x2r );
2140 1101596 : move32();
2141 1101596 : a[9] = L_add( x0i, x2i );
2142 1101596 : move32();
2143 1101596 : a[12] = L_sub( x2i, x0i );
2144 1101596 : move32();
2145 1101596 : a[13] = L_sub( x0r, x2r );
2146 1101596 : move32();
2147 1101596 : x0r = L_sub( x1r, x3i );
2148 1101596 : x0i = L_add( x1i, x3r );
2149 1101596 : a[10] = Mpy_32_16_1( L_sub( x0r, x0i ), wk1r );
2150 1101596 : move32();
2151 1101596 : a[11] = Mpy_32_16_1( L_add( x0r, x0i ), wk1r );
2152 1101596 : move32();
2153 1101596 : x0r = L_add( x3i, x1r );
2154 1101596 : x0i = L_sub( x3r, x1i );
2155 1101596 : a[14] = Mpy_32_16_1( L_sub( x0i, x0r ), wk1r );
2156 1101596 : move32();
2157 1101596 : a[15] = Mpy_32_16_1( L_add( x0i, x0r ), wk1r );
2158 1101596 : move32();
2159 1101596 : k1 = 0;
2160 1101596 : move16();
2161 :
2162 47895016 : FOR( j = 16; j < n; j += 16 )
2163 : {
2164 46793420 : k1 = add( k1, 2 );
2165 46793420 : k2 = shl( k1, 1 );
2166 46793420 : wk2r = w[k1];
2167 46793420 : move16();
2168 46793420 : wk2i = w[k1 + 1];
2169 46793420 : move16();
2170 46793420 : wk1r = w[k2];
2171 46793420 : move16();
2172 46793420 : wk1i = w[k2 + 1];
2173 46793420 : move16();
2174 46793420 : wtmp = mult_r( wk2i, wk1i );
2175 46793420 : wk3r = sub( wk1r, wtmp );
2176 46793420 : wk3r = sub( wk3r, wtmp );
2177 46793420 : wtmp = mult_r( wk2i, wk1r );
2178 46793420 : wk3i = sub( wtmp, wk1i );
2179 46793420 : wk3i = add( wtmp, wk3i );
2180 46793420 : x0r = L_add( a[j], a[j + 2] );
2181 46793420 : x0i = L_add( a[j + 1], a[j + 3] );
2182 46793420 : x1r = L_sub( a[j], a[j + 2] );
2183 46793420 : x1i = L_sub( a[j + 1], a[j + 3] );
2184 46793420 : x2r = L_add( a[j + 4], a[j + 6] );
2185 46793420 : x2i = L_add( a[j + 5], a[j + 7] );
2186 46793420 : x3r = L_sub( a[j + 4], a[j + 6] );
2187 46793420 : x3i = L_sub( a[j + 5], a[j + 7] );
2188 46793420 : a[j] = L_add( x0r, x2r );
2189 46793420 : move32();
2190 46793420 : a[j + 1] = L_add( x0i, x2i );
2191 46793420 : move32();
2192 46793420 : x0r = L_sub( x0r, x2r );
2193 46793420 : x0i = L_sub( x0i, x2i );
2194 46793420 : a[j + 4] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) );
2195 46793420 : move32();
2196 46793420 : a[j + 5] = L_add( Mpy_32_16_1( x0i, wk2r ), Mpy_32_16_1( x0r, wk2i ) );
2197 46793420 : move32();
2198 46793420 : x0r = L_sub( x1r, x3i );
2199 46793420 : x0i = L_add( x1i, x3r );
2200 46793420 : a[j + 2] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) );
2201 46793420 : move32();
2202 46793420 : a[j + 3] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) );
2203 46793420 : move32();
2204 46793420 : x0r = L_add( x1r, x3i );
2205 46793420 : x0i = L_sub( x1i, x3r );
2206 46793420 : a[j + 6] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) );
2207 46793420 : move32();
2208 46793420 : a[j + 7] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) );
2209 46793420 : move32();
2210 46793420 : wk1r = w[k2 + 2];
2211 46793420 : move16();
2212 46793420 : wk1i = w[k2 + 3];
2213 46793420 : move16();
2214 46793420 : wtmp = mult_r( wk2r, wk1i );
2215 46793420 : wk3r = sub( wk1r, wtmp );
2216 46793420 : wk3r = sub( wk3r, wtmp );
2217 46793420 : wtmp = mult_r( wk2r, wk1r );
2218 46793420 : wk3i = sub( wtmp, wk1i );
2219 46793420 : wk3i = add( wtmp, wk3i );
2220 46793420 : x0r = L_add( a[j + 8], a[j + 10] );
2221 46793420 : x0i = L_add( a[j + 9], a[j + 11] );
2222 46793420 : x1r = L_sub( a[j + 8], a[j + 10] );
2223 46793420 : x1i = L_sub( a[j + 9], a[j + 11] );
2224 46793420 : x2r = L_add( a[j + 12], a[j + 14] );
2225 46793420 : x2i = L_add( a[j + 13], a[j + 15] );
2226 46793420 : x3r = L_sub( a[j + 12], a[j + 14] );
2227 46793420 : x3i = L_sub( a[j + 13], a[j + 15] );
2228 46793420 : a[j + 8] = L_add( x0r, x2r );
2229 46793420 : move32();
2230 46793420 : a[j + 9] = L_add( x0i, x2i );
2231 46793420 : move32();
2232 46793420 : x0r = L_sub( x0r, x2r );
2233 46793420 : x0i = L_sub( x0i, x2i );
2234 46793420 : a[j + 12] = L_negate( L_add( Mpy_32_16_1( x0r, wk2i ), Mpy_32_16_1( x0i, wk2r ) ) );
2235 46793420 : move32();
2236 46793420 : a[j + 13] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) );
2237 46793420 : move32();
2238 46793420 : x0r = L_sub( x1r, x3i );
2239 46793420 : x0i = L_add( x1i, x3r );
2240 46793420 : a[j + 10] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) );
2241 46793420 : move32();
2242 46793420 : a[j + 11] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) );
2243 46793420 : x0r = L_add( x1r, x3i );
2244 46793420 : x0i = L_sub( x1i, x3r );
2245 46793420 : a[j + 14] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) );
2246 46793420 : move32();
2247 46793420 : a[j + 15] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) );
2248 46793420 : move32();
2249 : }
2250 :
2251 1101596 : return;
2252 : }
2253 :
2254 : /*-----------------------------------------------------------------*
2255 : * cftmdl()
2256 : * Subfunction of Complex Discrete Fourier Transform
2257 : *-----------------------------------------------------------------*/
2258 :
2259 2485064 : 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 2485064 : m = shl( l, 2 );
2271 62599192 : FOR( j = 0; j < l; j += 2 )
2272 : {
2273 60114128 : j1 = add( j, l );
2274 60114128 : j2 = add( j1, l );
2275 60114128 : j3 = add( j2, l );
2276 60114128 : x0r = L_add( a[j], a[j1] ); // Qx
2277 60114128 : x0i = L_add( a[j + 1], a[j1 + 1] ); // Qx
2278 60114128 : x1r = L_sub( a[j], a[j1] ); // Qx
2279 60114128 : x1i = L_sub( a[j + 1], a[j1 + 1] ); // Qx
2280 60114128 : x2r = L_add( a[j2], a[j3] ); // Qx
2281 60114128 : x2i = L_add( a[j2 + 1], a[j3 + 1] ); // Qx
2282 60114128 : x3r = L_sub( a[j2], a[j3] ); // Qx
2283 60114128 : x3i = L_sub( a[j2 + 1], a[j3 + 1] ); // Qx
2284 60114128 : a[j] = L_add( x0r, x2r );
2285 60114128 : move32();
2286 60114128 : a[j + 1] = L_add( x0i, x2i );
2287 60114128 : move32();
2288 60114128 : a[j2] = L_sub( x0r, x2r );
2289 60114128 : move32();
2290 60114128 : a[j2 + 1] = L_sub( x0i, x2i );
2291 60114128 : move32();
2292 60114128 : a[j1] = L_sub( x1r, x3i );
2293 60114128 : move32();
2294 60114128 : a[j1 + 1] = L_add( x1i, x3r );
2295 60114128 : move32();
2296 60114128 : a[j3] = L_add( x1r, x3i );
2297 60114128 : move32();
2298 60114128 : a[j3 + 1] = L_sub( x1i, x3r );
2299 60114128 : move32();
2300 : }
2301 :
2302 2485064 : wk1r = w[2];
2303 2485064 : move16();
2304 62599192 : FOR( j = m; j < l + m; j += 2 )
2305 : {
2306 60114128 : j1 = add( j, l );
2307 60114128 : j2 = add( j1, l );
2308 60114128 : j3 = add( j2, l );
2309 60114128 : x0r = L_add( a[j], a[j1] );
2310 60114128 : x0i = L_add( a[j + 1], a[j1 + 1] );
2311 60114128 : x1r = L_sub( a[j], a[j1] );
2312 60114128 : x1i = L_sub( a[j + 1], a[j1 + 1] );
2313 60114128 : x2r = L_add( a[j2], a[j3] );
2314 60114128 : x2i = L_add( a[j2 + 1], a[j3 + 1] );
2315 60114128 : x3r = L_sub( a[j2], a[j3] );
2316 60114128 : x3i = L_sub( a[j2 + 1], a[j3 + 1] );
2317 60114128 : a[j] = L_add( x0r, x2r );
2318 60114128 : move32();
2319 60114128 : a[j + 1] = L_add( x0i, x2i );
2320 60114128 : move32();
2321 60114128 : a[j2] = L_sub( x2i, x0i );
2322 60114128 : move32();
2323 60114128 : a[j2 + 1] = L_sub( x0r, x2r );
2324 60114128 : move32();
2325 60114128 : x0r = L_sub( x1r, x3i );
2326 60114128 : x0i = L_add( x1i, x3r );
2327 60114128 : a[j1] = Mpy_32_16_1( L_sub( x0r, x0i ), wk1r );
2328 60114128 : move32();
2329 60114128 : a[j1 + 1] = Mpy_32_16_1( L_add( x0r, x0i ), wk1r );
2330 60114128 : move32();
2331 60114128 : x0r = L_add( x3i, x1r );
2332 60114128 : x0i = L_sub( x3r, x1i );
2333 60114128 : a[j3] = Mpy_32_16_1( L_sub( x0i, x0r ), wk1r );
2334 60114128 : move32();
2335 60114128 : a[j3 + 1] = Mpy_32_16_1( L_add( x0i, x0r ), wk1r );
2336 60114128 : move32();
2337 : }
2338 :
2339 2485064 : k1 = 0;
2340 2485064 : move16();
2341 2485064 : m2 = shl( m, 1 );
2342 15462862 : 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 2485064 : 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 8262720 : static void butterfly(
3474 : const Word32 a, // Qx
3475 : const Word32 b, // Qx
3476 : Word32 *aPlusb, // Qx
3477 : Word32 *aMinusb // Qx
3478 : )
3479 : {
3480 8262720 : *aPlusb = L_add( a, b );
3481 8262720 : move32();
3482 8262720 : *aMinusb = L_sub( a, b );
3483 8262720 : move32();
3484 :
3485 8262720 : return;
3486 : }
3487 :
3488 5508480 : 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 5508480 : re1 = pInOut[0];
3500 5508480 : move32();
3501 5508480 : im1 = pInOut[1];
3502 5508480 : move32();
3503 5508480 : re2 = pInOut[2];
3504 5508480 : move32();
3505 5508480 : im2 = pInOut[3];
3506 5508480 : move32();
3507 5508480 : pInOut[0] = L_add( re1, re2 );
3508 5508480 : move32();
3509 5508480 : pInOut[1] = L_add( im1, im2 );
3510 5508480 : move32();
3511 :
3512 5508480 : pInOut[2] = L_sub( re1, re2 );
3513 5508480 : move32();
3514 5508480 : pInOut[3] = L_sub( im1, im2 );
3515 5508480 : move32();
3516 :
3517 5508480 : 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 3672320 : 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 3672320 : re1 = pInOut[0]; // Qx
3533 3672320 : move32();
3534 3672320 : im1 = pInOut[1]; // Qx
3535 3672320 : move32();
3536 3672320 : re2 = pInOut[2]; // Qx
3537 3672320 : move32();
3538 3672320 : im2 = pInOut[3]; // Qx
3539 3672320 : move32();
3540 3672320 : re3 = pInOut[4]; // Qx
3541 3672320 : move32();
3542 3672320 : im3 = pInOut[5]; // Qx
3543 3672320 : 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 3672320 : tmp1 = L_add( re2, re3 );
3552 3672320 : tmp3 = L_add( im2, im3 );
3553 3672320 : tmp2 = L_sub( re2, re3 );
3554 3672320 : tmp4 = L_sub( im2, im3 );
3555 3672320 : pInOut[0] = L_add( re1, tmp1 );
3556 3672320 : move32();
3557 3672320 : pInOut[1] = L_add( im1, tmp3 );
3558 3672320 : move32();
3559 3672320 : pInOut[2] = L_sub( re1, L_sub( Mpy_32_16_1( tmp1, C31 ), Mpy_32_16_1( tmp4, C32 ) ) ); // Qx
3560 3672320 : move32();
3561 3672320 : pInOut[4] = L_sub( re1, L_add( Mpy_32_16_1( tmp1, C31 ), Mpy_32_16_1( tmp4, C32 ) ) ); // Qx
3562 3672320 : move32();
3563 :
3564 3672320 : pInOut[3] = L_sub( im1, L_add( Mpy_32_16_1( tmp2, C32 ), Mpy_32_16_1( tmp3, C31 ) ) ); // Qx
3565 3672320 : move32();
3566 3672320 : pInOut[5] = L_add( im1, L_sub( Mpy_32_16_1( tmp2, C32 ), Mpy_32_16_1( tmp3, C31 ) ) ); // Qx
3567 3672320 : move32();
3568 3672320 : }
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 2203392 : static void fft5(
3643 : cmplx *pInOut /*Qx*/ )
3644 : {
3645 : cmplx x[5];
3646 : cmplx t[4];
3647 :
3648 2203392 : x[0] = pInOut[0];
3649 2203392 : move32();
3650 2203392 : x[1] = pInOut[1];
3651 2203392 : move32();
3652 2203392 : x[2] = pInOut[2];
3653 2203392 : move32();
3654 2203392 : x[3] = pInOut[3];
3655 2203392 : move32();
3656 2203392 : x[4] = pInOut[4];
3657 2203392 : 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 2203392 : t[0] = CL_add( x[1], x[4] );
3668 2203392 : move32();
3669 2203392 : t[1] = CL_sub( x[1], x[4] );
3670 2203392 : move32();
3671 2203392 : t[2] = CL_add( x[2], x[3] );
3672 2203392 : move32();
3673 2203392 : t[3] = CL_sub( x[2], x[3] );
3674 2203392 : move32();
3675 :
3676 :
3677 2203392 : pInOut[0] = CL_add( x[0], CL_add( t[0], t[2] ) );
3678 2203392 : move32();
3679 :
3680 2203392 : 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 2203392 : move32();
3682 2203392 : 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 2203392 : move32();
3684 2203392 : 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 2203392 : move32();
3686 2203392 : 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 2203392 : move32();
3688 :
3689 2203392 : return;
3690 : }
3691 :
3692 : static const Word16 C81 = 0x5a82; /* 0.707106781186548f cos(PI/4); Q15*/
3693 :
3694 1377120 : 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 1377120 : re0 = pInOut[0];
3707 1377120 : move32();
3708 1377120 : im0 = pInOut[1];
3709 1377120 : move32();
3710 1377120 : re4 = pInOut[8];
3711 1377120 : move32();
3712 1377120 : im4 = pInOut[9];
3713 1377120 : move32();
3714 1377120 : butterfly( pInOut[1 * 2], pInOut[7 * 2], &re1_7p, &re1_7m );
3715 1377120 : butterfly( pInOut[1 * 2 + 1], pInOut[7 * 2 + 1], &im1_7p, &im1_7m );
3716 1377120 : butterfly( pInOut[2 * 2], pInOut[6 * 2], &re2_6p, &re2_6m );
3717 1377120 : butterfly( pInOut[2 * 2 + 1], pInOut[6 * 2 + 1], &im2_6p, &im2_6m );
3718 1377120 : butterfly( pInOut[3 * 2], pInOut[5 * 2], &re3_5p, &re3_5m );
3719 1377120 : 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 1377120 : pInOut[0] = L_add( L_add( L_add( L_add( re0, re4 ), re1_7p ), re2_6p ), re3_5p );
3732 1377120 : move32();
3733 1377120 : pInOut[1] = L_add( L_add( L_add( L_add( im0, im4 ), im1_7p ), im2_6p ), im3_5p );
3734 1377120 : move32();
3735 :
3736 1377120 : 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 1377120 : move32();
3738 1377120 : 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 1377120 : move32();
3740 :
3741 1377120 : pInOut[4] = L_sub( L_add( L_add( L_sub( re0, re2_6p ), re4 ), im1_7m ), im3_5m );
3742 1377120 : move32();
3743 1377120 : pInOut[5] = L_add( L_sub( L_add( L_sub( im0, im2_6p ), im4 ), re1_7m ), re3_5m );
3744 1377120 : move32();
3745 :
3746 1377120 : 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 1377120 : move32();
3748 1377120 : 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 1377120 : move32();
3750 :
3751 1377120 : pInOut[8] = L_add( L_sub( L_add( L_sub( re0, re1_7p ), re2_6p ), re3_5p ), re4 );
3752 1377120 : move32();
3753 1377120 : pInOut[9] = L_add( L_sub( L_add( L_sub( im0, im1_7p ), im2_6p ), im3_5p ), im4 );
3754 1377120 : move32();
3755 :
3756 1377120 : 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 1377120 : move32();
3758 1377120 : 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 1377120 : move32();
3760 :
3761 1377120 : pInOut[12] = L_add( L_sub( L_add( L_sub( re0, re2_6p ), re4 ), im1_7m ), im3_5m );
3762 1377120 : move32();
3763 1377120 : pInOut[13] = L_sub( L_add( L_add( L_sub( im0, im2_6p ), im4 ), re1_7m ), re3_5m );
3764 1377120 : move32();
3765 :
3766 1377120 : 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 1377120 : move32();
3768 1377120 : 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 1377120 : move32();
3770 :
3771 1377120 : return;
3772 : }
3773 :
3774 1377120 : static void nextFFT(
3775 : Word32 *x, /*Qx*/
3776 : const Word16 length /*Qx*/ )
3777 : {
3778 : cmplx val[5];
3779 1377120 : 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 1377120 : case 8:
3808 1377120 : fft8_2( x );
3809 1377120 : BREAK;
3810 0 : default:
3811 0 : assert( !"length not supported" );
3812 : BREAK;
3813 : }
3814 :
3815 1377120 : return;
3816 : }
3817 :
3818 : static const Word16 CTFFTfactors[] = { 9, 8, 7, 5, 4, 3, 2, 0 };
3819 :
3820 688560 : static __inline Word16 findFactor(
3821 : const Word16 length )
3822 : {
3823 688560 : Word16 i = 0;
3824 688560 : move16();
3825 688560 : Word16 factor = 0;
3826 688560 : move16();
3827 :
3828 1377120 : WHILE( CTFFTfactors[i] != 0 )
3829 : {
3830 1377120 : IF( ( length % CTFFTfactors[i] ) == 0 )
3831 : {
3832 688560 : factor = CTFFTfactors[i];
3833 688560 : move16();
3834 688560 : BREAK;
3835 : }
3836 688560 : i += 1;
3837 : }
3838 688560 : return factor;
3839 : }
3840 :
3841 688560 : 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 688560 : const Word16 *ptr_sin = &sin_twiddle_table_25_5_5[0]; // Q15
3849 688560 : const Word16 *ptr_cos = &cos_twiddle_table_25_5_5[0]; // Q15
3850 :
3851 688560 : test();
3852 688560 : test();
3853 688560 : test();
3854 688560 : test();
3855 688560 : IF( EQ_16( length, 16 ) && EQ_16( n1, 8 ) && EQ_16( n2, 2 ) )
3856 : {
3857 688560 : ptr_sin = &sin_twiddle_table_16_8_2[0]; // Q15
3858 688560 : 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 5508480 : FOR( i = 1; i < n1; i++ )
3866 : {
3867 9639840 : FOR( ii = 1; ii < n2; ii++ )
3868 : {
3869 : Word32 xRe, xIm;
3870 4819920 : xRe = x[( ( ( ( i * n2 ) + ii ) ) << 1 )]; // Qx
3871 4819920 : xIm = x[( ( ( ( ( i * n2 ) + ii ) ) << 1 ) + 1 )]; // Qx
3872 4819920 : 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 4819920 : move32();
3874 4819920 : 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 4819920 : move32();
3876 : }
3877 : }
3878 688560 : return;
3879 : }
3880 :
3881 12072752 : 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 12072752 : Word16 cnt = 0;
3891 12072752 : move16();
3892 : Word32 *src, *dest;
3893 : cmplx val[5];
3894 :
3895 12072752 : SWITCH( length )
3896 : {
3897 0 : case 1:
3898 0 : BREAK;
3899 5508480 : case 2:
3900 5508480 : fft2( x );
3901 5508480 : BREAK;
3902 3672320 : case 3:
3903 3672320 : fft3_2( x );
3904 3672320 : BREAK;
3905 0 : case 4:
3906 0 : fft4( x );
3907 0 : BREAK;
3908 2203392 : case 5:
3909 13220352 : FOR( i = 0; i < 5; i++ )
3910 : {
3911 11016960 : val[i].re = x[2 * i]; // Qx
3912 11016960 : move32();
3913 11016960 : val[i].im = x[( ( i << 1 ) + 1 )]; // Qx
3914 11016960 : move32();
3915 : }
3916 2203392 : fft5( val );
3917 13220352 : FOR( i = 0; i < 5; i++ )
3918 : {
3919 11016960 : x[2 * i] = val[i].re;
3920 11016960 : move32();
3921 11016960 : x[( ( i << 1 ) + 1 )] = val[i].im;
3922 11016960 : move32();
3923 : }
3924 2203392 : BREAK;
3925 0 : case 8:
3926 0 : fft8_2( x );
3927 0 : BREAK;
3928 688560 : default:
3929 : {
3930 688560 : factor = findFactor( length );
3931 :
3932 688560 : IF( ( factor > 0 ) && GT_16( idiv1616( length, factor ), 1 ) )
3933 : {
3934 688560 : n1 = factor;
3935 688560 : move16();
3936 688560 : n2 = idiv1616( length, factor );
3937 :
3938 : /* DATA Resorting for stage1 */
3939 688560 : dest = scratch; // Qx
3940 6197040 : FOR( i = 0; i < 2 * n1; i += 2 )
3941 : {
3942 5508480 : src = x + i;
3943 16525440 : FOR( ii = 0; ii < n2; ii++ )
3944 : {
3945 : /* *dest++ = x[2*(i+ii*n1)]; */
3946 : /* *dest++ = x[2*(i+ii*n1)+1]; */
3947 11016960 : *dest++ = *src;
3948 11016960 : move32();
3949 11016960 : *dest++ = *( src + 1 );
3950 11016960 : move32();
3951 11016960 : src += 2 * n1;
3952 : }
3953 : }
3954 688560 : src = scratch; // Qx
3955 688560 : dest = x;
3956 11705520 : FOR( i = 0; i < length; i++ )
3957 : {
3958 11016960 : *dest++ = *src++;
3959 11016960 : move32();
3960 11016960 : *dest++ = *src++;
3961 11016960 : move32();
3962 : }
3963 : /* perform n1 ffts of length n2 */
3964 6197040 : FOR( i = 0; i < n1; i++ )
3965 : {
3966 5508480 : cooleyTukeyFFT( x + shl( i_mult( i, n2 ), 1 ), n2, scratch + shl( i_mult( i, n2 ), 1 ) );
3967 : }
3968 : /*data twiddeling */
3969 688560 : twiddle( x, length, n1, n2 );
3970 : /* DATA Resorting for stage2 */
3971 688560 : cnt = 0;
3972 688560 : move16();
3973 2065680 : FOR( i = 0; i < n2; i++ )
3974 : {
3975 12394080 : FOR( ii = 0; ii < n1; ii++ )
3976 : {
3977 11016960 : scratch[2 * cnt] = x[( ( i + ( ii * n2 ) ) << 1 )];
3978 11016960 : move32();
3979 11016960 : scratch[( ( cnt << 1 ) + 1 )] = x[( ( ( i + ( ii * n2 ) ) << 1 ) + 1 )];
3980 11016960 : move32();
3981 11016960 : cnt = add( cnt, 1 );
3982 : }
3983 : }
3984 : /* perform n2 ffts of length n1 */
3985 2065680 : FOR( i = 0; i < n2; i++ )
3986 : {
3987 1377120 : nextFFT( scratch + shl( i_mult( i, n1 ), 1 ), n1 );
3988 : }
3989 688560 : cnt = 0;
3990 688560 : move16();
3991 6197040 : FOR( i = 0; i < n1; i++ )
3992 : {
3993 16525440 : FOR( ii = 0; ii < n2; ii++ )
3994 : {
3995 11016960 : x[2 * cnt] = scratch[( ( i + ( ii * n1 ) ) << 1 )];
3996 11016960 : move32();
3997 11016960 : x[( ( cnt << 1 ) + 1 )] = scratch[( ( ( i + ( ii * n1 ) ) << 1 ) + 1 )];
3998 11016960 : move32();
3999 11016960 : cnt = add( cnt, 1 );
4000 : }
4001 : }
4002 : }
4003 : ELSE
4004 : {
4005 0 : assert( !"length not supported" );
4006 : }
4007 : }
4008 : }
4009 :
4010 12072752 : return;
4011 : }
4012 :
4013 4452688 : 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 4452688 : IF( GT_16( numFactors, 1 ) )
4024 : {
4025 780368 : Word32 *tmp = scratch1;
4026 780368 : Word16 n1_inv = 1, n2_inv = 1;
4027 780368 : move16();
4028 780368 : move16();
4029 780368 : Word16 n2 = factor[0 /*idx*/];
4030 780368 : move16();
4031 780368 : Word16 n1 = idiv1616( length, n2 );
4032 : Word16 idx, incr;
4033 :
4034 2157488 : WHILE( ( ( n1_inv * n1 ) % n2 ) != 1 )
4035 : {
4036 1377120 : n1_inv = add( n1_inv, 1 );
4037 : }
4038 1514832 : WHILE( ( ( n2_inv * n2 ) % n1 ) != 1 )
4039 : {
4040 734464 : n2_inv = add( n2_inv, 1 );
4041 : }
4042 780368 : idx = 0;
4043 780368 : move16();
4044 780368 : incr = ( n1 * n1_inv );
4045 780368 : move16();
4046 780368 : cnt = 0;
4047 780368 : move16();
4048 3672320 : FOR( i = 0; i < n1; i++ )
4049 : {
4050 22033920 : FOR( ii = 0; ii < n2 - 1; ii++ )
4051 : {
4052 19141968 : tmp[cnt] = x[2 * idx];
4053 19141968 : move32();
4054 19141968 : cnt = add( cnt, 1 );
4055 19141968 : tmp[cnt] = x[( ( idx << 1 ) + 1 )]; // Qx
4056 19141968 : move32();
4057 19141968 : cnt = add( cnt, 1 );
4058 :
4059 19141968 : idx = add( idx, incr );
4060 :
4061 19141968 : IF( GT_16( idx, length ) )
4062 : {
4063 12577696 : idx = sub( idx, length );
4064 : }
4065 : }
4066 2891952 : tmp[cnt] = x[2 * idx]; // Qx
4067 2891952 : move32();
4068 2891952 : cnt = add( cnt, 1 );
4069 2891952 : tmp[cnt] = x[( ( idx << 1 ) + 1 )]; // Qx
4070 2891952 : move32();
4071 2891952 : cnt = add( cnt, 1 );
4072 2891952 : idx = add( idx, 1 );
4073 : }
4074 3672320 : FOR( cnt = 0; cnt < length; cnt += n2 )
4075 : {
4076 2891952 : cooleyTukeyFFT( tmp + 2 * cnt, n2, x + 2 * cnt );
4077 : }
4078 3672320 : FOR( cnt = 0; cnt < n1; cnt++ )
4079 : {
4080 24925872 : FOR( i = 0; i < n2; i++ )
4081 : {
4082 22033920 : x[( ( cnt + ( i * n1 ) ) << 1 )] = tmp[( ( ( cnt * n2 ) + i ) << 1 )];
4083 22033920 : move32();
4084 22033920 : x[( ( ( cnt + ( i * n1 ) ) << 1 ) + 1 )] = tmp[( ( ( ( cnt * n2 ) + i ) << 1 ) + 1 )];
4085 22033920 : move32();
4086 : }
4087 : }
4088 5187152 : FOR( cnt = 0; cnt < length; cnt += n1 )
4089 : {
4090 4406784 : pfaDFT( x + 2 * cnt, n1, tmp, sub( numFactors, 1 ), &factor[1] );
4091 : }
4092 780368 : idx = 0;
4093 780368 : move16();
4094 780368 : cnt = 0;
4095 780368 : move16();
4096 5187152 : FOR( i = 0; i < n2; i++ )
4097 : {
4098 4406784 : idx = i_mult( i, n1 );
4099 26440704 : FOR( ii = 0; ii < n1; ii++ )
4100 : {
4101 22033920 : tmp[2 * idx] = x[cnt];
4102 22033920 : move32();
4103 22033920 : cnt = add( cnt, 1 );
4104 22033920 : tmp[( ( idx << 1 ) + 1 )] = x[cnt];
4105 22033920 : move32();
4106 22033920 : cnt = add( cnt, 1 );
4107 22033920 : idx = add( idx, n2 );
4108 :
4109 22033920 : IF( GT_16( idx, length ) )
4110 : {
4111 3626416 : idx = sub( idx, length );
4112 : }
4113 : }
4114 : }
4115 22814288 : FOR( cnt = 0; cnt < length; cnt++ )
4116 : {
4117 22033920 : x[2 * cnt] = tmp[2 * cnt];
4118 22033920 : move32();
4119 22033920 : x[( ( cnt << 1 ) + 1 )] = tmp[( ( cnt << 1 ) + 1 )];
4120 22033920 : move32();
4121 : }
4122 : }
4123 : ELSE
4124 : {
4125 3672320 : cooleyTukeyFFT( x, length, scratch1 );
4126 : }
4127 :
4128 4452688 : return;
4129 : }
4130 :
4131 45904 : static void fftf_interleave(
4132 : Word32 *re, // Qx
4133 : Word32 *im, // Qx
4134 : Word32 *out, // Qx
4135 : const Word16 len // Q0
4136 : )
4137 : {
4138 45904 : Word16 i = 0;
4139 45904 : move16();
4140 :
4141 11062864 : FOR( i = 0; i < len; i++ )
4142 : {
4143 11016960 : *out++ = *re++;
4144 11016960 : move32();
4145 11016960 : *out++ = *im++;
4146 11016960 : move32();
4147 : }
4148 :
4149 45904 : return;
4150 : }
4151 :
4152 45904 : static void fftf_deinterleave(
4153 : Word32 *in, // Qx
4154 : Word32 *re, // Qx
4155 : Word32 *im, // Qx
4156 : const Word16 len // Q0
4157 : )
4158 : {
4159 45904 : Word16 i = 0;
4160 45904 : move16();
4161 :
4162 11062864 : FOR( i = 0; i < len; i++ )
4163 : {
4164 11016960 : *re++ = *in++;
4165 11016960 : move32();
4166 11016960 : *im++ = *in++;
4167 11016960 : move32();
4168 : }
4169 :
4170 45904 : 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 45904 : 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 45904 : Word16 factors[3] = { 16, 5, 3 };
4216 45904 : move16();
4217 45904 : move16();
4218 45904 : move16();
4219 :
4220 45904 : fftf_interleave( x, y, cmplx, 240 );
4221 45904 : pfaDFT( cmplx, 240, scratch, 3, factors );
4222 45904 : fftf_deinterleave( cmplx, x, y, 240 );
4223 :
4224 45904 : 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 49922 : void DoFFT_fx(
4263 : Word32 *re2, // Qx
4264 : Word32 *im2, // Qx
4265 : const Word16 length // Q0
4266 : )
4267 : {
4268 49922 : 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 45904 : case 240:
4286 45904 : DoRTFT240( re2, im2 );
4287 45904 : BREAK;
4288 0 : case 200:
4289 0 : DoRTFT200( re2, im2 );
4290 0 : BREAK;
4291 378 : case 160:
4292 378 : DoRTFT160_fx( re2, im2 );
4293 378 : 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 49922 : 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 674080 : static void fft_len10(
4431 : cmplx *x // Qx
4432 : )
4433 : {
4434 : cmplx t;
4435 : cmplx s[4];
4436 : cmplx y[10];
4437 :
4438 674080 : s[0] = CL_add( x[6], x[4] );
4439 674080 : move64();
4440 674080 : s[3] = CL_sub( x[6], x[4] );
4441 674080 : move64();
4442 674080 : s[2] = CL_add( x[2], x[8] );
4443 674080 : move64();
4444 674080 : s[1] = CL_sub( x[2], x[8] );
4445 674080 : move64();
4446 674080 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
4447 674080 : s[0] = CL_add( s[0], s[2] );
4448 674080 : move64();
4449 674080 : y[0] = CL_add( x[0], s[0] );
4450 674080 : move64();
4451 674080 : s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
4452 674080 : move64();
4453 674080 : s[2] = CL_sub( s[0], t );
4454 674080 : move64();
4455 674080 : s[0] = CL_add( s[0], t );
4456 674080 : move64();
4457 674080 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
4458 674080 : move64();
4459 674080 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
4460 674080 : move64();
4461 674080 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
4462 674080 : move64();
4463 :
4464 674080 : y[2] = CL_msu_j( s[0], s[1] );
4465 674080 : move64();
4466 674080 : y[8] = CL_mac_j( s[0], s[1] );
4467 674080 : move64();
4468 674080 : y[4] = CL_mac_j( s[2], s[3] );
4469 674080 : move64();
4470 674080 : y[6] = CL_msu_j( s[2], s[3] );
4471 674080 : move64();
4472 :
4473 674080 : s[0] = CL_add( x[1], x[9] );
4474 674080 : move64();
4475 674080 : s[3] = CL_sub( x[1], x[9] );
4476 674080 : move64();
4477 674080 : s[2] = CL_add( x[7], x[3] );
4478 674080 : move64();
4479 674080 : s[1] = CL_sub( x[7], x[3] );
4480 674080 : move64();
4481 674080 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
4482 674080 : s[0] = CL_add( s[0], s[2] );
4483 674080 : move64();
4484 674080 : y[1] = CL_add( x[5], s[0] );
4485 674080 : move64();
4486 674080 : s[0] = CL_add( y[1], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
4487 674080 : move64();
4488 674080 : s[2] = CL_sub( s[0], t );
4489 674080 : move64();
4490 674080 : s[0] = CL_add( s[0], t );
4491 674080 : move64();
4492 674080 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
4493 674080 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
4494 674080 : move64();
4495 674080 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
4496 674080 : move64();
4497 :
4498 674080 : y[3] = CL_msu_j( s[0], s[1] );
4499 674080 : move64();
4500 674080 : y[9] = CL_mac_j( s[0], s[1] );
4501 674080 : move64();
4502 674080 : move64();
4503 674080 : y[5] = CL_mac_j( s[2], s[3] );
4504 674080 : move64();
4505 674080 : y[7] = CL_msu_j( s[2], s[3] );
4506 674080 : move64();
4507 :
4508 :
4509 674080 : x[0] = CL_add( y[0], y[1] );
4510 674080 : move64();
4511 674080 : x[5] = CL_sub( y[0], y[1] );
4512 674080 : move64();
4513 :
4514 674080 : x[2] = CL_add( y[2], y[3] );
4515 674080 : move64();
4516 674080 : x[7] = CL_sub( y[2], y[3] );
4517 674080 : move64();
4518 :
4519 674080 : x[4] = CL_add( y[4], y[5] );
4520 674080 : move64();
4521 674080 : x[9] = CL_sub( y[4], y[5] );
4522 674080 : move64();
4523 :
4524 674080 : x[6] = CL_add( y[6], y[7] );
4525 674080 : move64();
4526 674080 : x[1] = CL_sub( y[6], y[7] );
4527 674080 : move64();
4528 :
4529 674080 : x[8] = CL_add( y[8], y[9] );
4530 674080 : move64();
4531 674080 : x[3] = CL_sub( y[8], y[9] );
4532 674080 : move64();
4533 :
4534 674080 : return;
4535 : }
4536 :
4537 0 : static void fft_len15(
4538 : cmplx *x // Qx
4539 : )
4540 : {
4541 : cmplx t;
4542 : cmplx s[5];
4543 : cmplx y[15];
4544 :
4545 0 : s[0] = CL_add( x[3], x[12] );
4546 0 : move64();
4547 0 : s[3] = CL_sub( x[3], x[12] );
4548 0 : move64();
4549 0 : s[2] = CL_add( x[6], x[9] );
4550 0 : move64();
4551 0 : s[1] = CL_sub( x[6], x[9] );
4552 0 : move64();
4553 0 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
4554 0 : s[0] = CL_add( s[0], s[2] );
4555 0 : move64();
4556 0 : y[0] = CL_add( x[0], s[0] );
4557 0 : move64();
4558 0 : s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
4559 0 : move64();
4560 0 : s[2] = CL_sub( s[0], t );
4561 0 : move64();
4562 0 : s[0] = CL_add( s[0], t );
4563 0 : move64();
4564 0 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
4565 0 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
4566 0 : move64();
4567 0 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
4568 0 : move64();
4569 :
4570 0 : y[1] = CL_msu_j( s[0], s[1] );
4571 0 : move64();
4572 0 : y[4] = CL_mac_j( s[0], s[1] );
4573 0 : move64();
4574 0 : y[2] = CL_mac_j( s[2], s[3] );
4575 0 : move64();
4576 0 : y[3] = CL_msu_j( s[2], s[3] );
4577 0 : move64();
4578 :
4579 0 : s[0] = CL_add( x[8], x[2] );
4580 0 : move64();
4581 0 : s[3] = CL_sub( x[8], x[2] );
4582 0 : move64();
4583 0 : s[2] = CL_add( x[11], x[14] );
4584 0 : move64();
4585 0 : s[1] = CL_sub( x[11], x[14] );
4586 0 : move64();
4587 0 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
4588 0 : s[0] = CL_add( s[0], s[2] );
4589 0 : move64();
4590 0 : y[5] = CL_add( x[5], s[0] );
4591 0 : move64();
4592 0 : s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
4593 0 : move64();
4594 0 : s[2] = CL_sub( s[0], t );
4595 0 : move64();
4596 0 : s[0] = CL_add( s[0], t );
4597 0 : move64();
4598 0 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
4599 0 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
4600 0 : move64();
4601 0 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
4602 0 : move64();
4603 :
4604 0 : y[6] = CL_msu_j( s[0], s[1] );
4605 0 : move64();
4606 0 : y[9] = CL_mac_j( s[0], s[1] );
4607 0 : move64();
4608 0 : y[7] = CL_mac_j( s[2], s[3] );
4609 0 : move64();
4610 0 : y[8] = CL_msu_j( s[2], s[3] );
4611 0 : move64();
4612 :
4613 0 : s[0] = CL_add( x[13], x[7] );
4614 0 : move64();
4615 0 : s[3] = CL_sub( x[13], x[7] );
4616 0 : move64();
4617 0 : s[2] = CL_add( x[1], x[4] );
4618 0 : move64();
4619 0 : s[1] = CL_sub( x[1], x[4] );
4620 0 : move64();
4621 0 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
4622 0 : s[0] = CL_add( s[0], s[2] );
4623 0 : move64();
4624 0 : y[10] = CL_add( x[10], s[0] );
4625 0 : move64();
4626 0 : s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
4627 0 : move64();
4628 0 : s[2] = CL_sub( s[0], t );
4629 0 : move64();
4630 0 : s[0] = CL_add( s[0], t );
4631 0 : move64();
4632 0 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
4633 0 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
4634 0 : move64();
4635 0 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
4636 0 : move64();
4637 :
4638 0 : y[11] = CL_msu_j( s[0], s[1] );
4639 0 : move64();
4640 0 : y[14] = CL_mac_j( s[0], s[1] );
4641 0 : move64();
4642 0 : y[12] = CL_mac_j( s[2], s[3] );
4643 0 : move64();
4644 0 : y[13] = CL_msu_j( s[2], s[3] );
4645 0 : move64();
4646 :
4647 0 : s[0] = CL_add( y[5], y[10] );
4648 0 : move64();
4649 0 : s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
4650 0 : move64();
4651 0 : x[0] = CL_add( y[0], s[0] );
4652 0 : move64();
4653 0 : s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
4654 0 : move64();
4655 :
4656 0 : x[10] = CL_mac_j( s[0], s[1] );
4657 0 : move64();
4658 0 : x[5] = CL_msu_j( s[0], s[1] );
4659 0 : move64();
4660 :
4661 0 : s[0] = CL_add( y[6], y[11] );
4662 0 : move64();
4663 0 : s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
4664 0 : move64();
4665 0 : x[6] = CL_add( y[1], s[0] );
4666 0 : move64();
4667 0 : s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
4668 0 : move64();
4669 :
4670 0 : x[1] = CL_mac_j( s[0], s[1] );
4671 0 : move64();
4672 0 : x[11] = CL_msu_j( s[0], s[1] );
4673 0 : move64();
4674 :
4675 0 : s[0] = CL_add( y[7], y[12] );
4676 0 : move64();
4677 0 : s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
4678 0 : move64();
4679 0 : x[12] = CL_add( y[2], s[0] );
4680 0 : move64();
4681 0 : s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
4682 0 : move64();
4683 :
4684 0 : x[7] = CL_mac_j( s[0], s[1] );
4685 0 : move64();
4686 0 : x[2] = CL_msu_j( s[0], s[1] );
4687 0 : move64();
4688 :
4689 0 : s[0] = CL_add( y[8], y[13] );
4690 0 : move64();
4691 0 : s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
4692 0 : move64();
4693 0 : x[3] = CL_add( y[3], s[0] );
4694 0 : move64();
4695 0 : s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
4696 0 : move64();
4697 :
4698 0 : x[13] = CL_mac_j( s[0], s[1] );
4699 0 : move64();
4700 0 : x[8] = CL_msu_j( s[0], s[1] );
4701 0 : move64();
4702 :
4703 0 : s[0] = CL_add( y[9], y[14] );
4704 0 : move64();
4705 0 : s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
4706 0 : move64();
4707 0 : x[9] = CL_add( y[4], s[0] );
4708 0 : move64();
4709 0 : s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
4710 0 : move64();
4711 :
4712 0 : x[4] = CL_mac_j( s[0], s[1] );
4713 0 : move64();
4714 0 : x[14] = CL_msu_j( s[0], s[1] );
4715 0 : move64();
4716 :
4717 0 : return;
4718 : }
4719 :
4720 32342832 : static void fft_len16(
4721 : cmplx *x // Qx
4722 : )
4723 : {
4724 : cmplx s[4];
4725 : cmplx t[4];
4726 : cmplx y[16];
4727 :
4728 32342832 : s[0] = x[0]; // Qx
4729 32342832 : move64();
4730 32342832 : s[1] = x[4]; // Qx
4731 32342832 : move64();
4732 32342832 : s[2] = x[8]; // Qx
4733 32342832 : move64();
4734 32342832 : s[3] = x[12]; // Qx
4735 32342832 : move64();
4736 :
4737 32342832 : t[0] = CL_add( s[0], s[2] );
4738 32342832 : move64();
4739 32342832 : t[1] = CL_sub( s[0], s[2] );
4740 32342832 : move64();
4741 32342832 : t[2] = CL_add( s[1], s[3] );
4742 32342832 : move64();
4743 32342832 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
4744 32342832 : move64();
4745 :
4746 32342832 : y[0] = CL_add( t[0], t[2] );
4747 32342832 : move64();
4748 32342832 : y[1] = CL_sub( t[1], t[3] );
4749 32342832 : move64();
4750 32342832 : y[2] = CL_sub( t[0], t[2] );
4751 32342832 : move64();
4752 32342832 : y[3] = CL_add( t[1], t[3] );
4753 32342832 : move64();
4754 :
4755 32342832 : s[0] = x[1]; // Qx
4756 32342832 : move64();
4757 32342832 : s[1] = x[5]; // Qx
4758 32342832 : move64();
4759 32342832 : s[2] = x[9]; // Qx
4760 32342832 : move64();
4761 32342832 : s[3] = x[13]; // Qx
4762 32342832 : move64();
4763 :
4764 32342832 : t[0] = CL_add( s[0], s[2] );
4765 32342832 : move64();
4766 32342832 : t[1] = CL_sub( s[0], s[2] );
4767 32342832 : move64();
4768 32342832 : t[2] = CL_add( s[1], s[3] );
4769 32342832 : move64();
4770 32342832 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
4771 32342832 : move64();
4772 :
4773 32342832 : y[4] = CL_add( t[0], t[2] );
4774 32342832 : move64();
4775 32342832 : y[5] = CL_sub( t[1], t[3] );
4776 32342832 : move64();
4777 32342832 : y[6] = CL_sub( t[0], t[2] );
4778 32342832 : move64();
4779 32342832 : y[7] = CL_add( t[1], t[3] );
4780 32342832 : move64();
4781 :
4782 32342832 : s[0] = x[2]; // Qx
4783 32342832 : move64();
4784 32342832 : s[1] = x[6]; // Qx
4785 32342832 : move64();
4786 32342832 : s[2] = x[10]; // Qx
4787 32342832 : move64();
4788 32342832 : s[3] = x[14]; // Qx
4789 32342832 : move64();
4790 :
4791 32342832 : t[0] = CL_add( s[0], s[2] );
4792 32342832 : move64();
4793 32342832 : t[1] = CL_sub( s[0], s[2] );
4794 32342832 : move64();
4795 32342832 : t[2] = CL_add( s[1], s[3] );
4796 32342832 : move64();
4797 32342832 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
4798 32342832 : move64();
4799 :
4800 32342832 : y[8] = CL_add( t[0], t[2] );
4801 32342832 : move64();
4802 32342832 : y[9] = CL_sub( t[1], t[3] );
4803 32342832 : move64();
4804 32342832 : y[10] = CL_swap_real_imag( CL_sub( t[0], t[2] ) );
4805 32342832 : move64();
4806 32342832 : y[10] = CL_conjugate( y[10] );
4807 32342832 : move64();
4808 32342832 : y[11] = CL_add( t[1], t[3] );
4809 32342832 : move64();
4810 :
4811 32342832 : s[0] = x[3]; // Qx
4812 32342832 : move64();
4813 32342832 : s[1] = x[7]; // Qx
4814 32342832 : move64();
4815 32342832 : s[2] = x[11]; // Qx
4816 32342832 : move64();
4817 32342832 : s[3] = x[15]; // Qx
4818 32342832 : move64();
4819 :
4820 32342832 : t[0] = CL_add( s[0], s[2] );
4821 32342832 : move64();
4822 32342832 : t[1] = CL_sub( s[0], s[2] );
4823 32342832 : move64();
4824 32342832 : t[2] = CL_add( s[1], s[3] );
4825 32342832 : move64();
4826 32342832 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
4827 32342832 : move64();
4828 :
4829 32342832 : y[12] = CL_add( t[0], t[2] );
4830 32342832 : move64();
4831 32342832 : y[13] = CL_sub( t[1], t[3] );
4832 32342832 : move64();
4833 32342832 : y[14] = CL_sub( t[0], t[2] );
4834 32342832 : move64();
4835 32342832 : y[15] = CL_add( t[1], t[3] );
4836 32342832 : move64();
4837 :
4838 32342832 : s[0] = CL_scale( y[11], FFT_C162 ); // Qx
4839 32342832 : move64();
4840 32342832 : y[11] = CL_mac_j( s[0], s[0] );
4841 32342832 : move64();
4842 :
4843 32342832 : s[0] = CL_scale( y[14], FFT_C162 ); // Qx
4844 32342832 : move64();
4845 32342832 : y[14] = CL_mac_j( s[0], s[0] );
4846 32342832 : move64();
4847 :
4848 32342832 : s[0] = CL_scale( y[6], FFT_C161 ); // Qx
4849 32342832 : move64();
4850 32342832 : y[6] = CL_mac_j( s[0], s[0] );
4851 32342832 : move64();
4852 32342832 : y[6] = CL_swap_real_imag( y[6] );
4853 32342832 : move64();
4854 32342832 : y[6] = CL_conjugate( y[6] );
4855 32342832 : move64();
4856 :
4857 32342832 : s[0] = CL_scale( y[9], FFT_C161 ); // Qx
4858 32342832 : move64();
4859 32342832 : y[9] = CL_mac_j( s[0], s[0] );
4860 32342832 : move64();
4861 32342832 : y[9] = CL_swap_real_imag( y[9] );
4862 32342832 : move64();
4863 32342832 : y[9] = CL_conjugate( y[9] );
4864 32342832 : move64();
4865 :
4866 32342832 : s[0] = CL_scale( y[5], FFT_C163 ); // Qx
4867 32342832 : move64();
4868 32342832 : s[1] = CL_scale( y[5], FFT_C166 ); // Qx
4869 32342832 : move64();
4870 32342832 : y[5] = CL_mac_j( s[0], s[1] );
4871 32342832 : move64();
4872 :
4873 32342832 : s[0] = CL_scale( y[7], FFT_C165 ); // Qx
4874 32342832 : move64();
4875 32342832 : s[1] = CL_scale( y[7], FFT_C164 ); // Qx
4876 32342832 : move64();
4877 32342832 : y[7] = CL_mac_j( s[0], s[1] );
4878 32342832 : move64();
4879 :
4880 32342832 : s[0] = CL_scale( y[13], FFT_C165 ); // Qx
4881 32342832 : move64();
4882 32342832 : s[1] = CL_scale( y[13], FFT_C164 ); // Qx
4883 32342832 : move64();
4884 32342832 : y[13] = CL_mac_j( s[0], s[1] );
4885 32342832 : move64();
4886 :
4887 32342832 : s[0] = CL_scale( y[15], FFT_C164 ); // Qx
4888 32342832 : move64();
4889 32342832 : s[1] = CL_scale( y[15], FFT_C165 ); // Qx
4890 32342832 : move64();
4891 32342832 : y[15] = CL_mac_j( s[0], s[1] );
4892 32342832 : move64();
4893 :
4894 32342832 : t[0] = CL_add( y[0], y[8] );
4895 32342832 : move64();
4896 32342832 : t[1] = CL_sub( y[0], y[8] );
4897 32342832 : move64();
4898 32342832 : t[2] = CL_add( y[4], y[12] );
4899 32342832 : move64();
4900 32342832 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[4] ), CL_conjugate( y[12] ) ) );
4901 32342832 : move64();
4902 :
4903 32342832 : x[0] = CL_add( t[0], t[2] );
4904 32342832 : move64();
4905 32342832 : x[4] = CL_sub( t[1], t[3] );
4906 32342832 : move64();
4907 32342832 : x[8] = CL_sub( t[0], t[2] );
4908 32342832 : move64();
4909 32342832 : x[12] = CL_add( t[1], t[3] );
4910 32342832 : move64();
4911 :
4912 32342832 : t[0] = CL_add( y[1], y[9] );
4913 32342832 : move64();
4914 32342832 : t[1] = CL_sub( y[1], y[9] );
4915 32342832 : move64();
4916 32342832 : t[2] = CL_add( y[5], y[13] );
4917 32342832 : move64();
4918 32342832 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[5] ), CL_conjugate( y[13] ) ) );
4919 32342832 : move64();
4920 :
4921 32342832 : x[1] = CL_add( t[0], t[2] );
4922 32342832 : move64();
4923 32342832 : x[5] = CL_sub( t[1], t[3] );
4924 32342832 : move64();
4925 32342832 : x[9] = CL_sub( t[0], t[2] );
4926 32342832 : move64();
4927 32342832 : x[13] = CL_add( t[1], t[3] );
4928 32342832 : move64();
4929 :
4930 32342832 : t[0] = CL_add( y[2], y[10] );
4931 32342832 : move64();
4932 32342832 : t[1] = CL_sub( y[2], y[10] );
4933 32342832 : move64();
4934 32342832 : t[2] = CL_add( y[6], y[14] );
4935 32342832 : move64();
4936 32342832 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[6] ), CL_conjugate( y[14] ) ) );
4937 32342832 : move64();
4938 :
4939 32342832 : x[2] = CL_add( t[0], t[2] );
4940 32342832 : move64();
4941 32342832 : x[6] = CL_sub( t[1], t[3] );
4942 32342832 : move64();
4943 32342832 : x[10] = CL_sub( t[0], t[2] );
4944 32342832 : move64();
4945 32342832 : x[14] = CL_add( t[1], t[3] );
4946 32342832 : move64();
4947 :
4948 32342832 : t[0] = CL_add( y[3], y[11] );
4949 32342832 : move64();
4950 32342832 : t[1] = CL_sub( y[3], y[11] );
4951 32342832 : move64();
4952 32342832 : t[2] = CL_add( y[7], y[15] );
4953 32342832 : move64();
4954 32342832 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[7] ), CL_conjugate( y[15] ) ) );
4955 32342832 : move64();
4956 :
4957 32342832 : x[3] = CL_add( t[0], t[2] );
4958 32342832 : move64();
4959 32342832 : x[7] = CL_sub( t[1], t[3] );
4960 32342832 : move64();
4961 32342832 : x[11] = CL_sub( t[0], t[2] );
4962 32342832 : move64();
4963 32342832 : x[15] = CL_add( t[1], t[3] );
4964 32342832 : move64();
4965 :
4966 32342832 : return;
4967 : }
4968 :
4969 13445368 : 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 13445368 : xx[0] = x[0]; // Qx
4980 13445368 : move64();
4981 13445368 : xx[1] = x[16]; // Qx
4982 13445368 : move64();
4983 13445368 : xx[2] = x[12]; // Qx
4984 13445368 : move64();
4985 13445368 : xx[3] = x[8]; // Qx
4986 13445368 : move64();
4987 13445368 : xx[4] = x[4]; // Qx
4988 13445368 : move64();
4989 :
4990 13445368 : s[0] = CL_add( xx[1], xx[4] );
4991 13445368 : move64();
4992 13445368 : s[3] = CL_sub( xx[1], xx[4] );
4993 13445368 : move64();
4994 13445368 : s[2] = CL_add( xx[2], xx[3] );
4995 13445368 : move64();
4996 13445368 : s[1] = CL_sub( xx[2], xx[3] );
4997 13445368 : move64();
4998 13445368 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
4999 13445368 : s[0] = CL_add( s[0], s[2] );
5000 13445368 : move64();
5001 13445368 : y[0] = CL_add( xx[0], s[0] );
5002 13445368 : move64();
5003 13445368 : s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5004 13445368 : move64();
5005 13445368 : s[2] = CL_sub( s[0], t );
5006 13445368 : move64();
5007 13445368 : s[0] = CL_add( s[0], t );
5008 13445368 : move64();
5009 13445368 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5010 13445368 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5011 13445368 : move64();
5012 13445368 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
5013 13445368 : move64();
5014 :
5015 13445368 : y[4] = CL_msu_j( s[0], s[1] );
5016 13445368 : move64();
5017 13445368 : y[16] = CL_mac_j( s[0], s[1] );
5018 13445368 : move64();
5019 13445368 : y[8] = CL_mac_j( s[2], s[3] );
5020 13445368 : move64();
5021 13445368 : y[12] = CL_msu_j( s[2], s[3] );
5022 13445368 : move64();
5023 :
5024 13445368 : xx[0] = x[5];
5025 13445368 : move64();
5026 13445368 : xx[1] = x[1];
5027 13445368 : move64();
5028 13445368 : xx[2] = x[17];
5029 13445368 : move64();
5030 13445368 : xx[3] = x[13];
5031 13445368 : move64();
5032 13445368 : xx[4] = x[9];
5033 13445368 : move64();
5034 :
5035 13445368 : s[0] = CL_add( xx[1], xx[4] );
5036 13445368 : move64();
5037 13445368 : s[3] = CL_sub( xx[1], xx[4] );
5038 13445368 : move64();
5039 13445368 : s[2] = CL_add( xx[2], xx[3] );
5040 13445368 : move64();
5041 13445368 : s[1] = CL_sub( xx[2], xx[3] );
5042 13445368 : move64();
5043 13445368 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
5044 13445368 : s[0] = CL_add( s[0], s[2] );
5045 13445368 : move64();
5046 13445368 : y[1] = CL_add( xx[0], s[0] );
5047 13445368 : move64();
5048 13445368 : s[0] = CL_add( y[1], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5049 13445368 : move64();
5050 13445368 : s[2] = CL_sub( s[0], t );
5051 13445368 : move64();
5052 13445368 : s[0] = CL_add( s[0], t );
5053 13445368 : move64();
5054 13445368 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5055 13445368 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5056 13445368 : move64();
5057 13445368 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
5058 13445368 : move64();
5059 :
5060 13445368 : y[5] = CL_msu_j( s[0], s[1] );
5061 13445368 : move64();
5062 13445368 : y[17] = CL_mac_j( s[0], s[1] );
5063 13445368 : move64();
5064 13445368 : y[9] = CL_mac_j( s[2], s[3] );
5065 13445368 : move64();
5066 13445368 : y[13] = CL_msu_j( s[2], s[3] );
5067 13445368 : move64();
5068 :
5069 13445368 : xx[0] = x[10];
5070 13445368 : move64();
5071 13445368 : xx[1] = x[6];
5072 13445368 : move64();
5073 13445368 : xx[2] = x[2];
5074 13445368 : move64();
5075 13445368 : xx[3] = x[18];
5076 13445368 : move64();
5077 13445368 : xx[4] = x[14];
5078 13445368 : move64();
5079 :
5080 13445368 : s[0] = CL_add( xx[1], xx[4] );
5081 13445368 : move64();
5082 13445368 : s[3] = CL_sub( xx[1], xx[4] );
5083 13445368 : move64();
5084 13445368 : s[2] = CL_add( xx[2], xx[3] );
5085 13445368 : move64();
5086 13445368 : s[1] = CL_sub( xx[2], xx[3] );
5087 13445368 : move64();
5088 13445368 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
5089 13445368 : s[0] = CL_add( s[0], s[2] );
5090 13445368 : move64();
5091 13445368 : y[2] = CL_add( xx[0], s[0] );
5092 13445368 : move64();
5093 13445368 : s[0] = CL_add( y[2], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5094 13445368 : move64();
5095 13445368 : s[2] = CL_sub( s[0], t );
5096 13445368 : move64();
5097 13445368 : s[0] = CL_add( s[0], t );
5098 13445368 : move64();
5099 13445368 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5100 13445368 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5101 13445368 : move64();
5102 13445368 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
5103 13445368 : move64();
5104 :
5105 13445368 : y[6] = CL_msu_j( s[0], s[1] );
5106 13445368 : move64();
5107 13445368 : y[18] = CL_mac_j( s[0], s[1] );
5108 13445368 : move64();
5109 13445368 : y[10] = CL_mac_j( s[2], s[3] );
5110 13445368 : move64();
5111 13445368 : y[14] = CL_msu_j( s[2], s[3] );
5112 13445368 : move64();
5113 :
5114 13445368 : xx[0] = x[15];
5115 13445368 : move64();
5116 13445368 : xx[1] = x[11];
5117 13445368 : move64();
5118 13445368 : xx[2] = x[7];
5119 13445368 : move64();
5120 13445368 : xx[3] = x[3];
5121 13445368 : move64();
5122 13445368 : xx[4] = x[19];
5123 13445368 : move64();
5124 :
5125 13445368 : s[0] = CL_add( xx[1], xx[4] );
5126 13445368 : move64();
5127 13445368 : s[3] = CL_sub( xx[1], xx[4] );
5128 13445368 : move64();
5129 13445368 : s[2] = CL_add( xx[2], xx[3] );
5130 13445368 : move64();
5131 13445368 : s[1] = CL_sub( xx[2], xx[3] );
5132 13445368 : move64();
5133 13445368 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
5134 13445368 : s[0] = CL_add( s[0], s[2] );
5135 13445368 : move64();
5136 13445368 : y[3] = CL_add( xx[0], s[0] );
5137 13445368 : move64();
5138 13445368 : s[0] = CL_add( y[3], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5139 13445368 : move64();
5140 13445368 : s[2] = CL_sub( s[0], t );
5141 13445368 : move64();
5142 13445368 : s[0] = CL_add( s[0], t );
5143 13445368 : move64();
5144 13445368 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5145 13445368 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5146 13445368 : move64();
5147 13445368 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
5148 13445368 : move64();
5149 :
5150 13445368 : y[7] = CL_msu_j( s[0], s[1] );
5151 13445368 : move64();
5152 13445368 : y[19] = CL_mac_j( s[0], s[1] );
5153 13445368 : move64();
5154 13445368 : y[11] = CL_mac_j( s[2], s[3] );
5155 13445368 : move64();
5156 13445368 : y[15] = CL_msu_j( s[2], s[3] );
5157 13445368 : move64();
5158 :
5159 13445368 : tt[0] = CL_add( y[0], y[2] );
5160 13445368 : move64();
5161 13445368 : tt[1] = CL_sub( y[0], y[2] );
5162 13445368 : move64();
5163 13445368 : tt[2] = CL_add( y[1], y[3] );
5164 13445368 : move64();
5165 13445368 : tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[1], y[3] ) ) );
5166 13445368 : move64();
5167 :
5168 13445368 : x[0] = CL_add( tt[0], tt[2] );
5169 13445368 : move64();
5170 13445368 : x[5] = CL_sub( tt[1], tt[3] );
5171 13445368 : move64();
5172 13445368 : x[10] = CL_sub( tt[0], tt[2] );
5173 13445368 : move64();
5174 13445368 : x[15] = CL_add( tt[1], tt[3] );
5175 13445368 : move64();
5176 :
5177 13445368 : tt[0] = CL_add( y[4], y[6] );
5178 13445368 : move64();
5179 13445368 : tt[1] = CL_sub( y[4], y[6] );
5180 13445368 : move64();
5181 13445368 : tt[2] = CL_add( y[5], y[7] );
5182 13445368 : move64();
5183 13445368 : tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[5], y[7] ) ) );
5184 13445368 : move64();
5185 :
5186 13445368 : x[4] = CL_add( tt[0], tt[2] );
5187 13445368 : move64();
5188 13445368 : x[9] = CL_sub( tt[1], tt[3] );
5189 13445368 : move64();
5190 13445368 : x[14] = CL_sub( tt[0], tt[2] );
5191 13445368 : move64();
5192 13445368 : x[19] = CL_add( tt[1], tt[3] );
5193 13445368 : move64();
5194 :
5195 13445368 : tt[0] = CL_add( y[8], y[10] );
5196 13445368 : move64();
5197 13445368 : tt[1] = CL_sub( y[8], y[10] );
5198 13445368 : move64();
5199 13445368 : tt[2] = CL_add( y[9], y[11] );
5200 13445368 : move64();
5201 13445368 : tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[9], y[11] ) ) );
5202 13445368 : move64();
5203 :
5204 13445368 : x[8] = CL_add( tt[0], tt[2] );
5205 13445368 : move64();
5206 13445368 : x[13] = CL_sub( tt[1], tt[3] );
5207 13445368 : move64();
5208 13445368 : x[18] = CL_sub( tt[0], tt[2] );
5209 13445368 : move64();
5210 13445368 : x[3] = CL_add( tt[1], tt[3] );
5211 13445368 : move64();
5212 :
5213 13445368 : tt[0] = CL_add( y[12], y[14] );
5214 13445368 : move64();
5215 13445368 : tt[1] = CL_sub( y[12], y[14] );
5216 13445368 : move64();
5217 13445368 : tt[2] = CL_add( y[13], y[15] );
5218 13445368 : move64();
5219 13445368 : tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[13], y[15] ) ) );
5220 13445368 : move64();
5221 :
5222 13445368 : x[12] = CL_add( tt[0], tt[2] );
5223 13445368 : move64();
5224 13445368 : x[17] = CL_sub( tt[1], tt[3] );
5225 13445368 : move64();
5226 13445368 : x[2] = CL_sub( tt[0], tt[2] );
5227 13445368 : move64();
5228 13445368 : x[7] = CL_add( tt[1], tt[3] );
5229 13445368 : move64();
5230 :
5231 13445368 : tt[0] = CL_add( y[16], y[18] );
5232 13445368 : move64();
5233 13445368 : tt[1] = CL_sub( y[16], y[18] );
5234 13445368 : move64();
5235 13445368 : tt[2] = CL_add( y[17], y[19] );
5236 13445368 : move64();
5237 13445368 : tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[17], y[19] ) ) );
5238 13445368 : move64();
5239 :
5240 13445368 : x[16] = CL_add( tt[0], tt[2] );
5241 13445368 : move64();
5242 13445368 : x[1] = CL_sub( tt[1], tt[3] );
5243 13445368 : move64();
5244 13445368 : x[6] = CL_sub( tt[0], tt[2] );
5245 13445368 : move64();
5246 13445368 : x[11] = CL_add( tt[1], tt[3] );
5247 13445368 : move64();
5248 :
5249 13445368 : return;
5250 : }
5251 :
5252 64025680 : 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 64025680 : l = &x[0];
5264 64025680 : h = &x[15];
5265 :
5266 64025680 : xx[0] = x[0];
5267 64025680 : move64();
5268 64025680 : xx[1] = x[18];
5269 64025680 : move64();
5270 64025680 : xx[2] = x[6];
5271 64025680 : move64();
5272 64025680 : xx[3] = x[24];
5273 64025680 : move64();
5274 64025680 : xx[4] = x[12];
5275 64025680 : move64();
5276 :
5277 64025680 : xx[5] = x[20];
5278 64025680 : move64();
5279 64025680 : xx[6] = x[8];
5280 64025680 : move64();
5281 64025680 : xx[7] = x[26];
5282 64025680 : move64();
5283 64025680 : xx[8] = x[14];
5284 64025680 : move64();
5285 64025680 : xx[9] = x[2];
5286 64025680 : move64();
5287 :
5288 64025680 : xx[10] = x[10];
5289 64025680 : move64();
5290 64025680 : xx[11] = x[28];
5291 64025680 : move64();
5292 64025680 : xx[12] = x[16];
5293 64025680 : move64();
5294 64025680 : xx[13] = x[4];
5295 64025680 : move64();
5296 64025680 : xx[14] = x[22];
5297 64025680 : move64();
5298 :
5299 64025680 : s[0] = CL_add( xx[1], xx[4] );
5300 64025680 : move64();
5301 64025680 : s[3] = CL_sub( xx[1], xx[4] );
5302 64025680 : move64();
5303 64025680 : s[2] = CL_add( xx[2], xx[3] );
5304 64025680 : move64();
5305 64025680 : s[1] = CL_sub( xx[2], xx[3] );
5306 64025680 : move64();
5307 64025680 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
5308 64025680 : s[0] = CL_add( s[0], s[2] );
5309 64025680 : move64();
5310 64025680 : y[0] = CL_add( xx[0], s[0] );
5311 64025680 : s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5312 64025680 : move64();
5313 64025680 : s[2] = CL_sub( s[0], t );
5314 64025680 : move64();
5315 64025680 : s[0] = CL_add( s[0], t );
5316 64025680 : move64();
5317 64025680 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5318 64025680 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5319 64025680 : move64();
5320 64025680 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
5321 64025680 : move64();
5322 :
5323 64025680 : y[1] = CL_msu_j( s[0], s[1] );
5324 64025680 : move64();
5325 64025680 : y[4] = CL_mac_j( s[0], s[1] );
5326 64025680 : move64();
5327 64025680 : y[2] = CL_mac_j( s[2], s[3] );
5328 64025680 : move64();
5329 64025680 : y[3] = CL_msu_j( s[2], s[3] );
5330 64025680 : move64();
5331 :
5332 64025680 : s[0] = CL_add( xx[6], xx[9] );
5333 64025680 : move64();
5334 64025680 : s[3] = CL_sub( xx[6], xx[9] );
5335 64025680 : move64();
5336 64025680 : s[2] = CL_add( xx[7], xx[8] );
5337 64025680 : move64();
5338 64025680 : s[1] = CL_sub( xx[7], xx[8] );
5339 64025680 : move64();
5340 64025680 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
5341 64025680 : s[0] = CL_add( s[0], s[2] );
5342 64025680 : move64();
5343 64025680 : y[5] = CL_add( xx[5], s[0] );
5344 64025680 : move64();
5345 64025680 : s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5346 64025680 : move64();
5347 64025680 : s[2] = CL_sub( s[0], t );
5348 64025680 : move64();
5349 64025680 : s[0] = CL_add( s[0], t );
5350 64025680 : move64();
5351 64025680 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5352 64025680 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5353 64025680 : move64();
5354 64025680 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
5355 64025680 : move64();
5356 :
5357 64025680 : y[6] = CL_msu_j( s[0], s[1] );
5358 64025680 : move64();
5359 64025680 : y[9] = CL_mac_j( s[0], s[1] );
5360 64025680 : move64();
5361 64025680 : y[7] = CL_mac_j( s[2], s[3] );
5362 64025680 : move64();
5363 64025680 : y[8] = CL_msu_j( s[2], s[3] );
5364 64025680 : move64();
5365 :
5366 64025680 : s[0] = CL_add( xx[11], xx[14] );
5367 64025680 : move64();
5368 64025680 : s[3] = CL_sub( xx[11], xx[14] );
5369 64025680 : move64();
5370 64025680 : s[2] = CL_add( xx[12], xx[13] );
5371 64025680 : move64();
5372 64025680 : s[1] = CL_sub( xx[12], xx[13] );
5373 64025680 : move64();
5374 64025680 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
5375 64025680 : s[0] = CL_add( s[0], s[2] );
5376 64025680 : move64();
5377 64025680 : y[10] = CL_add( xx[10], s[0] );
5378 64025680 : move64();
5379 64025680 : s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5380 64025680 : s[2] = CL_sub( s[0], t );
5381 64025680 : move64();
5382 64025680 : s[0] = CL_add( s[0], t );
5383 64025680 : move64();
5384 64025680 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
5385 64025680 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5386 64025680 : move64();
5387 64025680 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
5388 64025680 : move64();
5389 :
5390 64025680 : y[11] = CL_msu_j( s[0], s[1] );
5391 64025680 : move64();
5392 64025680 : y[14] = CL_mac_j( s[0], s[1] );
5393 64025680 : move64();
5394 64025680 : y[12] = CL_mac_j( s[2], s[3] );
5395 64025680 : move64();
5396 64025680 : y[13] = CL_msu_j( s[2], s[3] );
5397 64025680 : move64();
5398 :
5399 64025680 : s[0] = CL_add( y[5], y[10] );
5400 64025680 : move64();
5401 64025680 : s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
5402 64025680 : move64();
5403 64025680 : z[0] = CL_add( y[0], s[0] );
5404 64025680 : move64();
5405 64025680 : s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
5406 64025680 : move64();
5407 :
5408 64025680 : z[10] = CL_mac_j( s[0], s[1] );
5409 64025680 : move64();
5410 64025680 : z[5] = CL_msu_j( s[0], s[1] );
5411 64025680 : move64();
5412 :
5413 64025680 : s[0] = CL_add( y[6], y[11] );
5414 64025680 : move64();
5415 64025680 : s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
5416 64025680 : move64();
5417 64025680 : z[6] = CL_add( y[1], s[0] );
5418 64025680 : move64();
5419 64025680 : s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
5420 64025680 : move64();
5421 :
5422 64025680 : z[1] = CL_mac_j( s[0], s[1] );
5423 64025680 : move64();
5424 64025680 : z[11] = CL_msu_j( s[0], s[1] );
5425 64025680 : move64();
5426 :
5427 64025680 : s[0] = CL_add( y[7], y[12] );
5428 64025680 : move64();
5429 64025680 : s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
5430 64025680 : move64();
5431 64025680 : z[12] = CL_add( y[2], s[0] );
5432 64025680 : move64();
5433 64025680 : s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
5434 64025680 : move64();
5435 :
5436 64025680 : z[7] = CL_mac_j( s[0], s[1] );
5437 64025680 : move64();
5438 64025680 : z[2] = CL_msu_j( s[0], s[1] );
5439 64025680 : move64();
5440 :
5441 64025680 : s[0] = CL_add( y[8], y[13] );
5442 64025680 : move64();
5443 64025680 : s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
5444 64025680 : move64();
5445 64025680 : z[3] = CL_add( y[3], s[0] );
5446 64025680 : move64();
5447 64025680 : s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
5448 64025680 : move64();
5449 :
5450 64025680 : z[13] = CL_mac_j( s[0], s[1] );
5451 64025680 : move64();
5452 64025680 : z[8] = CL_msu_j( s[0], s[1] );
5453 64025680 : move64();
5454 :
5455 64025680 : s[0] = CL_add( y[9], y[14] );
5456 64025680 : move64();
5457 64025680 : s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
5458 64025680 : move64();
5459 64025680 : z[9] = CL_add( y[4], s[0] );
5460 64025680 : move64();
5461 64025680 : s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
5462 64025680 : move64();
5463 :
5464 64025680 : z[4] = CL_mac_j( s[0], s[1] );
5465 64025680 : move64();
5466 64025680 : z[14] = CL_msu_j( s[0], s[1] );
5467 64025680 : move64();
5468 :
5469 64025680 : xx[0] = x[15];
5470 64025680 : move64();
5471 64025680 : xx[1] = x[3];
5472 64025680 : move64();
5473 64025680 : xx[2] = x[21];
5474 64025680 : move64();
5475 64025680 : xx[3] = x[9];
5476 64025680 : move64();
5477 64025680 : xx[4] = x[27];
5478 64025680 : move64();
5479 :
5480 64025680 : xx[5] = x[5];
5481 64025680 : move64();
5482 64025680 : xx[6] = x[23];
5483 64025680 : move64();
5484 64025680 : xx[7] = x[11];
5485 64025680 : move64();
5486 64025680 : xx[8] = x[29];
5487 64025680 : move64();
5488 64025680 : xx[9] = x[17];
5489 64025680 : move64();
5490 :
5491 64025680 : xx[10] = x[25];
5492 64025680 : move64();
5493 64025680 : xx[11] = x[13];
5494 64025680 : move64();
5495 64025680 : xx[12] = x[1];
5496 64025680 : move64();
5497 64025680 : xx[13] = x[19];
5498 64025680 : move64();
5499 64025680 : xx[14] = x[7];
5500 64025680 : move64();
5501 :
5502 64025680 : s[0] = CL_add( xx[1], xx[4] );
5503 64025680 : move64();
5504 64025680 : s[3] = CL_sub( xx[1], xx[4] );
5505 64025680 : move64();
5506 64025680 : s[2] = CL_add( xx[2], xx[3] );
5507 64025680 : move64();
5508 64025680 : s[1] = CL_sub( xx[2], xx[3] );
5509 64025680 : move64();
5510 64025680 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
5511 64025680 : s[0] = CL_add( s[0], s[2] );
5512 64025680 : move64();
5513 64025680 : y[0] = CL_add( xx[0], s[0] );
5514 64025680 : move64();
5515 64025680 : s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5516 64025680 : move64();
5517 64025680 : s[2] = CL_sub( s[0], t );
5518 64025680 : move64();
5519 64025680 : s[0] = CL_add( s[0], t );
5520 64025680 : move64();
5521 64025680 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
5522 64025680 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5523 64025680 : move64();
5524 64025680 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
5525 64025680 : move64();
5526 :
5527 64025680 : y[1] = CL_msu_j( s[0], s[1] );
5528 64025680 : move64();
5529 64025680 : y[4] = CL_mac_j( s[0], s[1] );
5530 64025680 : move64();
5531 64025680 : y[2] = CL_mac_j( s[2], s[3] );
5532 64025680 : move64();
5533 64025680 : y[3] = CL_msu_j( s[2], s[3] );
5534 64025680 : move64();
5535 :
5536 64025680 : s[0] = CL_add( xx[6], xx[9] );
5537 64025680 : move64();
5538 64025680 : s[3] = CL_sub( xx[6], xx[9] );
5539 64025680 : move64();
5540 64025680 : s[2] = CL_add( xx[7], xx[8] );
5541 64025680 : move64();
5542 64025680 : s[1] = CL_sub( xx[7], xx[8] );
5543 64025680 : move64();
5544 64025680 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
5545 64025680 : s[0] = CL_add( s[0], s[2] );
5546 64025680 : move64();
5547 64025680 : y[5] = CL_add( xx[5], s[0] );
5548 64025680 : move64();
5549 64025680 : s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5550 64025680 : move64();
5551 64025680 : s[2] = CL_sub( s[0], t );
5552 64025680 : move64();
5553 64025680 : s[0] = CL_add( s[0], t );
5554 64025680 : move64();
5555 64025680 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
5556 64025680 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5557 64025680 : move64();
5558 64025680 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
5559 64025680 : move64();
5560 :
5561 64025680 : y[6] = CL_msu_j( s[0], s[1] );
5562 64025680 : move64();
5563 64025680 : y[9] = CL_mac_j( s[0], s[1] );
5564 64025680 : move64();
5565 64025680 : y[7] = CL_mac_j( s[2], s[3] );
5566 64025680 : move64();
5567 64025680 : y[8] = CL_msu_j( s[2], s[3] );
5568 64025680 : move64();
5569 :
5570 64025680 : s[0] = CL_add( xx[11], xx[14] );
5571 64025680 : move64();
5572 64025680 : s[3] = CL_sub( xx[11], xx[14] );
5573 64025680 : move64();
5574 64025680 : s[2] = CL_add( xx[12], xx[13] );
5575 64025680 : move64();
5576 64025680 : s[1] = CL_sub( xx[12], xx[13] );
5577 64025680 : move64();
5578 64025680 : t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
5579 64025680 : s[0] = CL_add( s[0], s[2] );
5580 64025680 : move64();
5581 64025680 : y[10] = CL_add( xx[10], s[0] );
5582 64025680 : move64();
5583 64025680 : s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
5584 64025680 : move64();
5585 64025680 : s[2] = CL_sub( s[0], t );
5586 64025680 : move64();
5587 64025680 : s[0] = CL_add( s[0], t );
5588 64025680 : move64();
5589 64025680 : t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
5590 64025680 : s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
5591 64025680 : move64();
5592 64025680 : s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
5593 64025680 : move64();
5594 :
5595 64025680 : y[11] = CL_msu_j( s[0], s[1] );
5596 64025680 : move64();
5597 64025680 : y[14] = CL_mac_j( s[0], s[1] );
5598 64025680 : move64();
5599 64025680 : y[12] = CL_mac_j( s[2], s[3] );
5600 64025680 : move64();
5601 64025680 : y[13] = CL_msu_j( s[2], s[3] );
5602 64025680 : move64();
5603 :
5604 64025680 : s[0] = CL_add( y[5], y[10] );
5605 64025680 : move64();
5606 64025680 : s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
5607 64025680 : move64();
5608 64025680 : z[15] = CL_add( y[0], s[0] );
5609 64025680 : move64();
5610 64025680 : s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
5611 64025680 : move64();
5612 :
5613 64025680 : z[25] = CL_mac_j( s[0], s[1] );
5614 64025680 : move64();
5615 64025680 : z[20] = CL_msu_j( s[0], s[1] );
5616 64025680 : move64();
5617 :
5618 64025680 : s[0] = CL_add( y[6], y[11] );
5619 64025680 : move64();
5620 64025680 : s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
5621 64025680 : move64();
5622 64025680 : z[21] = CL_add( y[1], s[0] );
5623 64025680 : move64();
5624 64025680 : s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
5625 64025680 : move64();
5626 :
5627 64025680 : z[16] = CL_mac_j( s[0], s[1] );
5628 64025680 : move64();
5629 64025680 : z[26] = CL_msu_j( s[0], s[1] );
5630 64025680 : move64();
5631 :
5632 64025680 : s[0] = CL_add( y[7], y[12] );
5633 64025680 : move64();
5634 64025680 : s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
5635 64025680 : move64();
5636 64025680 : z[27] = CL_add( y[2], s[0] );
5637 64025680 : move64();
5638 64025680 : s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
5639 64025680 : move64();
5640 :
5641 64025680 : z[22] = CL_mac_j( s[0], s[1] );
5642 64025680 : move64();
5643 64025680 : z[17] = CL_msu_j( s[0], s[1] );
5644 64025680 : move64();
5645 :
5646 64025680 : s[0] = CL_add( y[8], y[13] );
5647 64025680 : move64();
5648 64025680 : s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
5649 64025680 : move64();
5650 64025680 : z[18] = CL_add( y[3], s[0] );
5651 64025680 : move64();
5652 64025680 : s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
5653 64025680 : move64();
5654 :
5655 64025680 : z[28] = CL_mac_j( s[0], s[1] );
5656 64025680 : move64();
5657 64025680 : z[23] = CL_msu_j( s[0], s[1] );
5658 64025680 : move64();
5659 :
5660 64025680 : s[0] = CL_add( y[9], y[14] );
5661 64025680 : move64();
5662 64025680 : s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
5663 64025680 : move64();
5664 64025680 : z[24] = CL_add( y[4], s[0] );
5665 64025680 : move64();
5666 64025680 : s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
5667 64025680 : move64();
5668 :
5669 64025680 : z[19] = CL_mac_j( s[0], s[1] );
5670 64025680 : move64();
5671 64025680 : z[29] = CL_msu_j( s[0], s[1] );
5672 64025680 : move64();
5673 :
5674 64025680 : s[0] = z[0];
5675 64025680 : move64();
5676 64025680 : s[1] = z[15];
5677 64025680 : move64();
5678 64025680 : *l = CL_add( s[0], s[1] );
5679 64025680 : move64();
5680 64025680 : *h = CL_sub( s[0], s[1] );
5681 64025680 : move64();
5682 64025680 : l += 1, h += 1;
5683 :
5684 64025680 : s[0] = z[8];
5685 64025680 : move64();
5686 64025680 : s[1] = z[23];
5687 64025680 : move64();
5688 64025680 : *h = CL_add( s[0], s[1] );
5689 64025680 : move64();
5690 64025680 : *l = CL_sub( s[0], s[1] );
5691 64025680 : move64();
5692 64025680 : l += 1, h += 1;
5693 :
5694 64025680 : s[0] = z[1];
5695 64025680 : move64();
5696 64025680 : s[1] = z[16];
5697 64025680 : move64();
5698 64025680 : *l = CL_add( s[0], s[1] );
5699 64025680 : move64();
5700 64025680 : *h = CL_sub( s[0], s[1] );
5701 64025680 : move64();
5702 64025680 : l += 1, h += 1;
5703 :
5704 64025680 : s[0] = z[9];
5705 64025680 : move64();
5706 64025680 : s[1] = z[24];
5707 64025680 : move64();
5708 64025680 : *h = CL_add( s[0], s[1] );
5709 64025680 : move64();
5710 64025680 : *l = CL_sub( s[0], s[1] );
5711 64025680 : move64();
5712 64025680 : l += 1, h += 1;
5713 :
5714 64025680 : s[0] = z[2];
5715 64025680 : move64();
5716 64025680 : s[1] = z[17];
5717 64025680 : move64();
5718 64025680 : *l = CL_add( s[0], s[1] );
5719 64025680 : move64();
5720 64025680 : *h = CL_sub( s[0], s[1] );
5721 64025680 : move64();
5722 64025680 : l += 1, h += 1;
5723 :
5724 64025680 : s[0] = z[10];
5725 64025680 : move64();
5726 64025680 : s[1] = z[25];
5727 64025680 : move64();
5728 64025680 : *h = CL_add( s[0], s[1] );
5729 64025680 : move64();
5730 64025680 : *l = CL_sub( s[0], s[1] );
5731 64025680 : move64();
5732 64025680 : l += 1, h += 1;
5733 :
5734 64025680 : s[0] = z[3];
5735 64025680 : move64();
5736 64025680 : s[1] = z[18];
5737 64025680 : move64();
5738 64025680 : *l = CL_add( s[0], s[1] );
5739 64025680 : move64();
5740 64025680 : *h = CL_sub( s[0], s[1] );
5741 64025680 : move64();
5742 64025680 : l += 1, h += 1;
5743 :
5744 64025680 : s[0] = z[11];
5745 64025680 : move64();
5746 64025680 : s[1] = z[26];
5747 64025680 : move64();
5748 64025680 : *h = CL_add( s[0], s[1] );
5749 64025680 : move64();
5750 64025680 : *l = CL_sub( s[0], s[1] );
5751 64025680 : move64();
5752 64025680 : l += 1, h += 1;
5753 :
5754 64025680 : s[0] = z[4];
5755 64025680 : move64();
5756 64025680 : s[1] = z[19];
5757 64025680 : move64();
5758 64025680 : *l = CL_add( s[0], s[1] );
5759 64025680 : move64();
5760 64025680 : *h = CL_sub( s[0], s[1] );
5761 64025680 : move64();
5762 64025680 : l += 1, h += 1;
5763 :
5764 64025680 : s[0] = z[12];
5765 64025680 : move64();
5766 64025680 : s[1] = z[27];
5767 64025680 : move64();
5768 64025680 : *h = CL_add( s[0], s[1] );
5769 64025680 : move64();
5770 64025680 : *l = CL_sub( s[0], s[1] );
5771 64025680 : move64();
5772 64025680 : l += 1, h += 1;
5773 :
5774 64025680 : s[0] = z[5];
5775 64025680 : move64();
5776 64025680 : s[1] = z[20];
5777 64025680 : move64();
5778 64025680 : *l = CL_add( s[0], s[1] );
5779 64025680 : move64();
5780 64025680 : *h = CL_sub( s[0], s[1] );
5781 64025680 : move64();
5782 64025680 : l += 1, h += 1;
5783 :
5784 64025680 : s[0] = z[13];
5785 64025680 : move64();
5786 64025680 : s[1] = z[28];
5787 64025680 : move64();
5788 64025680 : *h = CL_add( s[0], s[1] );
5789 64025680 : move64();
5790 64025680 : *l = CL_sub( s[0], s[1] );
5791 64025680 : move64();
5792 64025680 : l += 1, h += 1;
5793 :
5794 64025680 : s[0] = z[6];
5795 64025680 : move64();
5796 64025680 : s[1] = z[21];
5797 64025680 : move64();
5798 64025680 : *l = CL_add( s[0], s[1] );
5799 64025680 : move64();
5800 64025680 : *h = CL_sub( s[0], s[1] );
5801 64025680 : move64();
5802 64025680 : l += 1, h += 1;
5803 :
5804 64025680 : s[0] = z[14];
5805 64025680 : move64();
5806 64025680 : s[1] = z[29];
5807 64025680 : move64();
5808 64025680 : *h = CL_add( s[0], s[1] );
5809 64025680 : move64();
5810 64025680 : *l = CL_sub( s[0], s[1] );
5811 64025680 : move64();
5812 64025680 : l += 1, h += 1;
5813 :
5814 64025680 : s[0] = z[7];
5815 64025680 : move64();
5816 64025680 : s[1] = z[22];
5817 64025680 : move64();
5818 64025680 : *l = CL_add( s[0], s[1] );
5819 64025680 : move64();
5820 64025680 : *h = CL_sub( s[0], s[1] );
5821 64025680 : move64();
5822 64025680 : l += 1, h += 1;
5823 :
5824 64025680 : return;
5825 : }
5826 :
5827 1804356 : 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 1804356 : xx[0] = x[0];
5836 1804356 : move64();
5837 1804356 : xx[1] = x[4];
5838 1804356 : move64();
5839 1804356 : xx[2] = x[8];
5840 1804356 : move64();
5841 1804356 : xx[3] = x[12];
5842 1804356 : move64();
5843 1804356 : xx[4] = x[16];
5844 1804356 : move64();
5845 1804356 : xx[5] = x[20];
5846 1804356 : move64();
5847 1804356 : xx[6] = x[24];
5848 1804356 : move64();
5849 1804356 : xx[7] = x[28];
5850 1804356 : move64();
5851 :
5852 1804356 : t[0] = CL_add( xx[0], xx[4] );
5853 1804356 : move64();
5854 1804356 : t[1] = CL_sub( xx[0], xx[4] );
5855 1804356 : move64();
5856 1804356 : t[2] = CL_add( xx[1], xx[5] );
5857 1804356 : move64();
5858 1804356 : t[3] = CL_sub( xx[1], xx[5] );
5859 1804356 : move64();
5860 1804356 : t[4] = CL_add( xx[2], xx[6] );
5861 1804356 : move64();
5862 1804356 : t[5] = CL_sub( xx[2], xx[6] );
5863 1804356 : move64();
5864 1804356 : t[6] = CL_add( xx[3], xx[7] );
5865 1804356 : move64();
5866 1804356 : t[7] = CL_sub( xx[3], xx[7] );
5867 1804356 : move64();
5868 :
5869 1804356 : s[0] = CL_add( t[0], t[4] );
5870 1804356 : move64();
5871 1804356 : s[2] = CL_sub( t[0], t[4] );
5872 1804356 : move64();
5873 1804356 : s[4] = CL_mac_j( t[1], t[5] );
5874 1804356 : move64();
5875 1804356 : s[5] = CL_msu_j( t[1], t[5] );
5876 1804356 : move64();
5877 1804356 : s[1] = CL_add( t[2], t[6] );
5878 1804356 : move64();
5879 1804356 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
5880 1804356 : move64();
5881 1804356 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
5882 1804356 : move64();
5883 1804356 : t[1] = CL_sub( t[3], t[7] );
5884 1804356 : move64();
5885 :
5886 : {
5887 1804356 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
5888 1804356 : move64();
5889 1804356 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
5890 1804356 : move64();
5891 1804356 : s[7] = CL_conjugate( s[7] );
5892 1804356 : move64();
5893 : };
5894 :
5895 1804356 : y[0] = CL_add( s[0], s[1] );
5896 1804356 : move64();
5897 1804356 : y[4] = CL_sub( s[0], s[1] );
5898 1804356 : move64();
5899 1804356 : y[2] = CL_sub( s[2], s[3] );
5900 1804356 : move64();
5901 1804356 : y[6] = CL_add( s[2], s[3] );
5902 1804356 : move64();
5903 1804356 : y[3] = CL_add( s[4], s[7] );
5904 1804356 : move64();
5905 1804356 : y[7] = CL_sub( s[4], s[7] );
5906 1804356 : move64();
5907 1804356 : y[1] = CL_add( s[5], s[6] );
5908 1804356 : move64();
5909 1804356 : y[5] = CL_sub( s[5], s[6] );
5910 1804356 : move64();
5911 :
5912 1804356 : xx[0] = x[1];
5913 1804356 : move64();
5914 1804356 : xx[1] = x[5];
5915 1804356 : move64();
5916 1804356 : xx[2] = x[9];
5917 1804356 : move64();
5918 1804356 : xx[3] = x[13];
5919 1804356 : move64();
5920 1804356 : xx[4] = x[17];
5921 1804356 : move64();
5922 1804356 : xx[5] = x[21];
5923 1804356 : move64();
5924 1804356 : xx[6] = x[25];
5925 1804356 : move64();
5926 1804356 : xx[7] = x[29];
5927 1804356 : move64();
5928 :
5929 1804356 : t[0] = CL_add( xx[0], xx[4] );
5930 1804356 : move64();
5931 1804356 : t[1] = CL_sub( xx[0], xx[4] );
5932 1804356 : move64();
5933 1804356 : t[2] = CL_add( xx[1], xx[5] );
5934 1804356 : move64();
5935 1804356 : t[3] = CL_sub( xx[1], xx[5] );
5936 1804356 : move64();
5937 1804356 : t[4] = CL_add( xx[2], xx[6] );
5938 1804356 : move64();
5939 1804356 : t[5] = CL_sub( xx[2], xx[6] );
5940 1804356 : move64();
5941 1804356 : t[6] = CL_add( xx[3], xx[7] );
5942 1804356 : move64();
5943 1804356 : t[7] = CL_sub( xx[3], xx[7] );
5944 1804356 : move64();
5945 :
5946 1804356 : s[0] = CL_add( t[0], t[4] );
5947 1804356 : move64();
5948 1804356 : s[2] = CL_sub( t[0], t[4] );
5949 1804356 : move64();
5950 1804356 : s[4] = CL_mac_j( t[1], t[5] );
5951 1804356 : move64();
5952 1804356 : s[5] = CL_msu_j( t[1], t[5] );
5953 1804356 : move64();
5954 1804356 : s[1] = CL_add( t[2], t[6] );
5955 1804356 : move64();
5956 1804356 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
5957 1804356 : move64();
5958 1804356 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
5959 1804356 : move64();
5960 1804356 : t[1] = CL_sub( t[3], t[7] );
5961 1804356 : move64();
5962 :
5963 : {
5964 1804356 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 );
5965 1804356 : move64();
5966 1804356 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 );
5967 1804356 : move64();
5968 1804356 : s[7] = CL_conjugate( s[7] );
5969 1804356 : move64();
5970 : };
5971 :
5972 1804356 : y[8] = CL_add( s[0], s[1] );
5973 1804356 : move64();
5974 1804356 : y[12] = CL_sub( s[0], s[1] );
5975 1804356 : move64();
5976 1804356 : y[10] = CL_sub( s[2], s[3] );
5977 1804356 : move64();
5978 1804356 : y[14] = CL_add( s[2], s[3] );
5979 1804356 : move64();
5980 1804356 : y[11] = CL_add( s[4], s[7] );
5981 1804356 : move64();
5982 1804356 : y[15] = CL_sub( s[4], s[7] );
5983 1804356 : move64();
5984 1804356 : y[9] = CL_add( s[5], s[6] );
5985 1804356 : move64();
5986 1804356 : y[13] = CL_sub( s[5], s[6] );
5987 1804356 : move64();
5988 :
5989 1804356 : xx[0] = x[2];
5990 1804356 : move64();
5991 1804356 : xx[1] = x[6];
5992 1804356 : move64();
5993 1804356 : xx[2] = x[10];
5994 1804356 : move64();
5995 1804356 : xx[3] = x[14];
5996 1804356 : move64();
5997 1804356 : xx[4] = x[18];
5998 1804356 : move64();
5999 1804356 : xx[5] = x[22];
6000 1804356 : move64();
6001 1804356 : xx[6] = x[26];
6002 1804356 : move64();
6003 1804356 : xx[7] = x[30];
6004 1804356 : move64();
6005 :
6006 1804356 : t[0] = CL_add( xx[0], xx[4] );
6007 1804356 : move64();
6008 1804356 : t[1] = CL_sub( xx[0], xx[4] );
6009 1804356 : move64();
6010 1804356 : t[2] = CL_add( xx[1], xx[5] );
6011 1804356 : move64();
6012 1804356 : t[3] = CL_sub( xx[1], xx[5] );
6013 1804356 : move64();
6014 1804356 : t[4] = CL_add( xx[2], xx[6] );
6015 1804356 : move64();
6016 1804356 : t[5] = CL_sub( xx[2], xx[6] );
6017 1804356 : move64();
6018 1804356 : t[6] = CL_add( xx[3], xx[7] );
6019 1804356 : move64();
6020 1804356 : t[7] = CL_sub( xx[3], xx[7] );
6021 1804356 : move64();
6022 :
6023 1804356 : s[0] = CL_add( t[0], t[4] );
6024 1804356 : move64();
6025 1804356 : s[2] = CL_sub( t[0], t[4] );
6026 1804356 : move64();
6027 1804356 : s[4] = CL_mac_j( t[1], t[5] );
6028 1804356 : move64();
6029 1804356 : s[5] = CL_msu_j( t[1], t[5] );
6030 1804356 : move64();
6031 1804356 : s[1] = CL_add( t[2], t[6] );
6032 1804356 : move64();
6033 1804356 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
6034 1804356 : move64();
6035 1804356 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
6036 1804356 : move64();
6037 1804356 : t[1] = CL_sub( t[3], t[7] );
6038 1804356 : move64();
6039 :
6040 : {
6041 1804356 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
6042 1804356 : move64();
6043 1804356 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
6044 1804356 : move64();
6045 1804356 : s[7] = CL_conjugate( s[7] );
6046 1804356 : move64();
6047 : };
6048 :
6049 1804356 : y[16] = CL_add( s[0], s[1] );
6050 1804356 : move64();
6051 1804356 : y[20] = CL_sub( s[0], s[1] );
6052 1804356 : move64();
6053 1804356 : y[18] = CL_sub( s[2], s[3] );
6054 1804356 : move64();
6055 1804356 : y[22] = CL_add( s[2], s[3] );
6056 1804356 : move64();
6057 1804356 : y[19] = CL_add( s[4], s[7] );
6058 1804356 : move64();
6059 1804356 : y[23] = CL_sub( s[4], s[7] );
6060 1804356 : move64();
6061 1804356 : y[17] = CL_add( s[5], s[6] );
6062 1804356 : move64();
6063 1804356 : y[21] = CL_sub( s[5], s[6] );
6064 1804356 : move64();
6065 :
6066 1804356 : xx[0] = x[3];
6067 1804356 : move64();
6068 1804356 : xx[1] = x[7];
6069 1804356 : move64();
6070 1804356 : xx[2] = x[11];
6071 1804356 : move64();
6072 1804356 : xx[3] = x[15];
6073 1804356 : move64();
6074 1804356 : xx[4] = x[19];
6075 1804356 : move64();
6076 1804356 : xx[5] = x[23];
6077 1804356 : move64();
6078 1804356 : xx[6] = x[27];
6079 1804356 : move64();
6080 1804356 : xx[7] = x[31];
6081 1804356 : move64();
6082 :
6083 1804356 : t[0] = CL_add( xx[0], xx[4] );
6084 1804356 : move64();
6085 1804356 : t[1] = CL_sub( xx[0], xx[4] );
6086 1804356 : move64();
6087 1804356 : t[2] = CL_add( xx[1], xx[5] );
6088 1804356 : move64();
6089 1804356 : t[3] = CL_sub( xx[1], xx[5] );
6090 1804356 : move64();
6091 1804356 : t[4] = CL_add( xx[2], xx[6] );
6092 1804356 : move64();
6093 1804356 : t[5] = CL_sub( xx[2], xx[6] );
6094 1804356 : move64();
6095 1804356 : t[6] = CL_add( xx[3], xx[7] );
6096 1804356 : move64();
6097 1804356 : t[7] = CL_sub( xx[3], xx[7] );
6098 1804356 : move64();
6099 :
6100 1804356 : s[0] = CL_add( t[0], t[4] );
6101 1804356 : move64();
6102 1804356 : s[2] = CL_sub( t[0], t[4] );
6103 1804356 : move64();
6104 1804356 : s[4] = CL_mac_j( t[1], t[5] );
6105 1804356 : move64();
6106 1804356 : s[5] = CL_msu_j( t[1], t[5] );
6107 1804356 : move64();
6108 1804356 : s[1] = CL_add( t[2], t[6] );
6109 1804356 : move64();
6110 1804356 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
6111 1804356 : move64();
6112 1804356 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
6113 1804356 : move64();
6114 1804356 : t[1] = CL_sub( t[3], t[7] );
6115 1804356 : move64();
6116 :
6117 : {
6118 1804356 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
6119 1804356 : move64();
6120 1804356 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
6121 1804356 : move64();
6122 1804356 : s[7] = CL_conjugate( s[7] );
6123 1804356 : move64();
6124 : };
6125 :
6126 1804356 : y[24] = CL_add( s[0], s[1] );
6127 1804356 : move64();
6128 1804356 : y[28] = CL_sub( s[0], s[1] );
6129 1804356 : move64();
6130 1804356 : y[26] = CL_sub( s[2], s[3] );
6131 1804356 : move64();
6132 1804356 : y[30] = CL_add( s[2], s[3] );
6133 1804356 : move64();
6134 1804356 : y[27] = CL_add( s[4], s[7] );
6135 1804356 : move64();
6136 1804356 : y[31] = CL_sub( s[4], s[7] );
6137 1804356 : move64();
6138 1804356 : y[25] = CL_add( s[5], s[6] );
6139 1804356 : move64();
6140 1804356 : y[29] = CL_sub( s[5], s[6] );
6141 1804356 : move64();
6142 :
6143 : {
6144 1804356 : ab = y[9];
6145 1804356 : move64();
6146 1804356 : y[9] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[0] ), CL_scale( ab, FFT_RotVector_32_fx[1] ) ); // Qx
6147 1804356 : move64();
6148 : };
6149 : {
6150 1804356 : ab = y[10];
6151 1804356 : move64();
6152 1804356 : y[10] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[2] ), CL_scale( ab, FFT_RotVector_32_fx[3] ) ); // Qx
6153 1804356 : move64();
6154 : };
6155 : {
6156 1804356 : ab = y[11];
6157 1804356 : move64();
6158 1804356 : y[11] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[4] ), CL_scale( ab, FFT_RotVector_32_fx[5] ) ); // Qx
6159 1804356 : move64();
6160 : };
6161 : {
6162 1804356 : ab = y[12];
6163 1804356 : move64();
6164 1804356 : y[12] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[6] ), CL_scale( ab, FFT_RotVector_32_fx[7] ) ); // Qx
6165 1804356 : move64();
6166 : };
6167 : {
6168 1804356 : ab = y[13];
6169 1804356 : move64();
6170 1804356 : y[13] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[8] ), CL_scale( ab, FFT_RotVector_32_fx[9] ) ); // Qx
6171 1804356 : move64();
6172 : };
6173 : {
6174 1804356 : ab = y[14];
6175 1804356 : move64();
6176 1804356 : y[14] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[10] ), CL_scale( ab, FFT_RotVector_32_fx[11] ) ); // Qx
6177 1804356 : move64();
6178 : };
6179 : {
6180 1804356 : ab = y[15];
6181 1804356 : move64();
6182 1804356 : y[15] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[12] ), CL_scale( ab, FFT_RotVector_32_fx[13] ) ); // Qx
6183 1804356 : move64();
6184 : };
6185 : {
6186 1804356 : ab = y[17];
6187 1804356 : move64();
6188 1804356 : y[17] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[14] ), CL_scale( ab, FFT_RotVector_32_fx[15] ) );
6189 1804356 : move64();
6190 : };
6191 : {
6192 1804356 : ab = y[18];
6193 1804356 : move64();
6194 1804356 : y[18] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[16] ), CL_scale( ab, FFT_RotVector_32_fx[17] ) );
6195 1804356 : move64();
6196 : };
6197 : {
6198 1804356 : ab = y[19];
6199 1804356 : move64();
6200 1804356 : y[19] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[18] ), CL_scale( ab, FFT_RotVector_32_fx[19] ) );
6201 1804356 : move64();
6202 : };
6203 : {
6204 1804356 : ab = y[21];
6205 1804356 : move64();
6206 1804356 : y[21] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[20] ), CL_scale( ab, FFT_RotVector_32_fx[21] ) );
6207 1804356 : move64();
6208 : };
6209 : {
6210 1804356 : ab = y[22];
6211 1804356 : move64();
6212 1804356 : y[22] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[22] ), CL_scale( ab, FFT_RotVector_32_fx[23] ) );
6213 1804356 : move64();
6214 : };
6215 : {
6216 1804356 : ab = y[23];
6217 1804356 : move64();
6218 1804356 : y[23] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[24] ), CL_scale( ab, FFT_RotVector_32_fx[25] ) );
6219 1804356 : move64();
6220 : };
6221 : {
6222 1804356 : ab = y[25];
6223 1804356 : move64();
6224 1804356 : y[25] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[26] ), CL_scale( ab, FFT_RotVector_32_fx[27] ) );
6225 1804356 : move64();
6226 : };
6227 : {
6228 1804356 : ab = y[26];
6229 1804356 : move64();
6230 1804356 : y[26] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[28] ), CL_scale( ab, FFT_RotVector_32_fx[29] ) );
6231 1804356 : move64();
6232 : };
6233 : {
6234 1804356 : ab = y[27];
6235 1804356 : move64();
6236 1804356 : y[27] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[30] ), CL_scale( ab, FFT_RotVector_32_fx[31] ) );
6237 1804356 : move64();
6238 : };
6239 : {
6240 1804356 : ab = y[28];
6241 1804356 : move64();
6242 1804356 : y[28] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[32] ), CL_scale( ab, FFT_RotVector_32_fx[33] ) );
6243 1804356 : move64();
6244 : };
6245 : {
6246 1804356 : ab = y[29];
6247 1804356 : move64();
6248 1804356 : y[29] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[34] ), CL_scale( ab, FFT_RotVector_32_fx[35] ) );
6249 1804356 : move64();
6250 : };
6251 : {
6252 1804356 : ab = y[30];
6253 1804356 : move64();
6254 1804356 : y[30] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[36] ), CL_scale( ab, FFT_RotVector_32_fx[37] ) );
6255 1804356 : move64();
6256 : };
6257 : {
6258 1804356 : ab = y[31];
6259 1804356 : move64();
6260 1804356 : y[31] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[38] ), CL_scale( ab, FFT_RotVector_32_fx[39] ) );
6261 1804356 : move64();
6262 : };
6263 :
6264 1804356 : t[0] = CL_add( y[0], y[16] );
6265 1804356 : move64();
6266 1804356 : t[1] = CL_sub( y[0], y[16] );
6267 1804356 : move64();
6268 1804356 : t[2] = CL_add( y[8], y[24] );
6269 1804356 : move64();
6270 1804356 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[8] ), CL_conjugate( y[24] ) ) );
6271 1804356 : move64();
6272 :
6273 1804356 : x[0] = CL_add( t[0], t[2] );
6274 1804356 : move64();
6275 1804356 : x[8] = CL_sub( t[1], t[3] );
6276 1804356 : move64();
6277 1804356 : x[16] = CL_sub( t[0], t[2] );
6278 1804356 : move64();
6279 1804356 : x[24] = CL_add( t[1], t[3] );
6280 1804356 : move64();
6281 :
6282 1804356 : t[0] = CL_add( y[1], y[17] );
6283 1804356 : move64();
6284 1804356 : t[1] = CL_sub( y[1], y[17] );
6285 1804356 : move64();
6286 1804356 : t[2] = CL_add( y[9], y[25] );
6287 1804356 : move64();
6288 1804356 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[9] ), CL_conjugate( y[25] ) ) );
6289 1804356 : move64();
6290 :
6291 1804356 : x[1] = CL_add( t[0], t[2] );
6292 1804356 : move64();
6293 1804356 : x[9] = CL_sub( t[1], t[3] );
6294 1804356 : move64();
6295 1804356 : x[17] = CL_sub( t[0], t[2] );
6296 1804356 : move64();
6297 1804356 : x[25] = CL_add( t[1], t[3] );
6298 1804356 : move64();
6299 :
6300 1804356 : t[0] = CL_add( y[2], y[18] );
6301 1804356 : move64();
6302 1804356 : t[1] = CL_sub( y[2], y[18] );
6303 1804356 : move64();
6304 1804356 : t[2] = CL_add( y[10], y[26] );
6305 1804356 : move64();
6306 1804356 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[10] ), CL_conjugate( y[26] ) ) );
6307 1804356 : move64();
6308 :
6309 1804356 : x[2] = CL_add( t[0], t[2] );
6310 1804356 : move64();
6311 1804356 : x[10] = CL_sub( t[1], t[3] );
6312 1804356 : move64();
6313 1804356 : x[18] = CL_sub( t[0], t[2] );
6314 1804356 : move64();
6315 1804356 : x[26] = CL_add( t[1], t[3] );
6316 1804356 : move64();
6317 :
6318 1804356 : t[0] = CL_add( y[3], y[19] );
6319 1804356 : move64();
6320 1804356 : t[1] = CL_sub( y[3], y[19] );
6321 1804356 : move64();
6322 1804356 : t[2] = CL_add( y[11], y[27] );
6323 1804356 : move64();
6324 1804356 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[11] ), CL_conjugate( y[27] ) ) );
6325 1804356 : move64();
6326 :
6327 1804356 : x[3] = CL_add( t[0], t[2] );
6328 1804356 : move64();
6329 1804356 : x[11] = CL_sub( t[1], t[3] );
6330 1804356 : move64();
6331 1804356 : x[19] = CL_sub( t[0], t[2] );
6332 1804356 : move64();
6333 1804356 : x[27] = CL_add( t[1], t[3] );
6334 1804356 : move64();
6335 :
6336 1804356 : t[0] = CL_msu_j( y[4], y[20] );
6337 1804356 : move64();
6338 1804356 : t[1] = CL_mac_j( y[4], y[20] );
6339 1804356 : move64();
6340 1804356 : t[2] = CL_add( y[12], y[28] );
6341 1804356 : move64();
6342 1804356 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[12] ), CL_conjugate( y[28] ) ) );
6343 1804356 : move64();
6344 :
6345 1804356 : x[4] = CL_add( t[0], t[2] );
6346 1804356 : move64();
6347 1804356 : x[12] = CL_sub( t[1], t[3] );
6348 1804356 : move64();
6349 1804356 : x[20] = CL_sub( t[0], t[2] );
6350 1804356 : move64();
6351 1804356 : x[28] = CL_add( t[1], t[3] );
6352 1804356 : move64();
6353 :
6354 1804356 : t[0] = CL_add( y[5], y[21] );
6355 1804356 : move64();
6356 1804356 : t[1] = CL_sub( y[5], y[21] );
6357 1804356 : move64();
6358 1804356 : t[2] = CL_add( y[13], y[29] );
6359 1804356 : move64();
6360 1804356 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[13] ), CL_conjugate( y[29] ) ) );
6361 1804356 : move64();
6362 :
6363 1804356 : x[5] = CL_add( t[0], t[2] );
6364 1804356 : move64();
6365 1804356 : x[13] = CL_sub( t[1], t[3] );
6366 1804356 : move64();
6367 1804356 : x[21] = CL_sub( t[0], t[2] );
6368 1804356 : move64();
6369 1804356 : x[29] = CL_add( t[1], t[3] );
6370 1804356 : move64();
6371 :
6372 1804356 : t[0] = CL_add( y[6], y[22] );
6373 1804356 : move64();
6374 1804356 : t[1] = CL_sub( y[6], y[22] );
6375 1804356 : move64();
6376 1804356 : t[2] = CL_add( y[14], y[30] );
6377 1804356 : move64();
6378 1804356 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[14] ), CL_conjugate( y[30] ) ) );
6379 1804356 : move64();
6380 :
6381 1804356 : x[6] = CL_add( t[0], t[2] );
6382 1804356 : move64();
6383 1804356 : x[14] = CL_sub( t[1], t[3] );
6384 1804356 : move64();
6385 1804356 : x[22] = CL_sub( t[0], t[2] );
6386 1804356 : move64();
6387 1804356 : x[30] = CL_add( t[1], t[3] );
6388 1804356 : move64();
6389 :
6390 1804356 : t[0] = CL_add( y[7], y[23] );
6391 1804356 : move64();
6392 1804356 : t[1] = CL_sub( y[7], y[23] );
6393 1804356 : move64();
6394 1804356 : t[2] = CL_add( y[15], y[31] );
6395 1804356 : move64();
6396 1804356 : t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[15] ), CL_conjugate( y[31] ) ) );
6397 1804356 : move64();
6398 :
6399 1804356 : x[7] = CL_add( t[0], t[2] );
6400 1804356 : move64();
6401 1804356 : x[15] = CL_sub( t[1], t[3] );
6402 1804356 : move64();
6403 1804356 : x[23] = CL_sub( t[0], t[2] );
6404 1804356 : move64();
6405 1804356 : x[31] = CL_add( t[1], t[3] );
6406 1804356 : move64();
6407 :
6408 1804356 : return;
6409 : }
6410 :
6411 8832622 : 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 89651718 : FOR( i = 0; i < dim2; i++ )
6424 : {
6425 2348562200 : FOR( j = 0; j < dim1; j++ )
6426 : {
6427 2267743104 : xx[( ( i * dim1 ) + j )].re = x[( i + ( j * dim2 ) )].re; // Qx
6428 2267743104 : move64();
6429 2267743104 : xx[( ( i * dim1 ) + j )].im = x[( i + ( j * dim2 ) )].im; // Qx
6430 2267743104 : move64();
6431 : }
6432 : }
6433 :
6434 8832622 : 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 84260 : case 10:
6451 758340 : FOR( i = 0; i < dim2; i++ )
6452 : {
6453 674080 : fft_len10( &xx[( i * dim1 )] );
6454 : }
6455 84260 : BREAK;
6456 :
6457 0 : case 15:
6458 0 : FOR( i = 0; i < dim2; i++ )
6459 : {
6460 0 : fft_len15( &xx[( i * dim1 )] );
6461 : }
6462 0 : BREAK;
6463 :
6464 111269 : case 16:
6465 1001421 : FOR( i = 0; i < dim2; i++ )
6466 : {
6467 890152 : fft_len16( &xx[( i * dim1 )] );
6468 : }
6469 111269 : BREAK;
6470 :
6471 1022806 : case 20:
6472 14468174 : FOR( i = 0; i < dim2; i++ )
6473 : {
6474 13445368 : fft_len20_fx( &xx[( i * dim1 )] );
6475 : }
6476 1022806 : BREAK;
6477 :
6478 7391310 : case 30:
6479 71416990 : FOR( i = 0; i < dim2; i++ )
6480 : {
6481 64025680 : fft_len30( &xx[( i * dim1 )] );
6482 : }
6483 7391310 : BREAK;
6484 :
6485 222977 : case 32:
6486 2006793 : FOR( i = 0; i < dim2; i++ )
6487 : {
6488 1783816 : fft_len32( &xx[( i * dim1 )] );
6489 : }
6490 222977 : BREAK;
6491 : }
6492 :
6493 8832622 : SWITCH( dim2 )
6494 : {
6495 :
6496 7564805 : case 8:
6497 : {
6498 : cmplx t[8];
6499 : cmplx s[8];
6500 : cmplx y[8];
6501 :
6502 7564805 : y[1] = xx[1 * dim1];
6503 7564805 : move64();
6504 7564805 : y[2] = xx[2 * dim1];
6505 7564805 : move64();
6506 7564805 : y[3] = xx[3 * dim1];
6507 7564805 : move64();
6508 7564805 : y[4] = xx[4 * dim1];
6509 7564805 : move64();
6510 7564805 : y[5] = xx[5 * dim1];
6511 7564805 : move64();
6512 7564805 : y[6] = xx[6 * dim1];
6513 7564805 : move64();
6514 7564805 : y[7] = xx[7 * dim1];
6515 7564805 : move64();
6516 :
6517 7564805 : test();
6518 7564805 : test();
6519 7564805 : IF( EQ_16( dim1, 8 ) || EQ_16( dim1, 16 ) || EQ_16( dim1, 32 ) )
6520 : {
6521 9249814 : FOR( i = 0; i < dim1; i++ )
6522 : {
6523 : {
6524 8915568 : y[0] = xx[i];
6525 8915568 : move64();
6526 : };
6527 8915568 : IF( i > 0 )
6528 : {
6529 : {
6530 8581322 : y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) - Woff )] ),
6531 8581322 : CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6532 8581322 : move64();
6533 : };
6534 : {
6535 8581322 : y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) - Woff )] ),
6536 8581322 : CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6537 8581322 : move64();
6538 : };
6539 : {
6540 8581322 : y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) - Woff )] ),
6541 8581322 : CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6542 8581322 : move64();
6543 : };
6544 : {
6545 8581322 : y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) - Woff )] ),
6546 8581322 : CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6547 8581322 : move64();
6548 : };
6549 : {
6550 8581322 : y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) - Woff )] ),
6551 8581322 : CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6552 8581322 : move64();
6553 : };
6554 : {
6555 8581322 : y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) - Woff )] ),
6556 8581322 : CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6557 8581322 : move64();
6558 : };
6559 : {
6560 8581322 : y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) - Woff )] ),
6561 8581322 : CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6562 8581322 : move64();
6563 : };
6564 : }
6565 :
6566 8915568 : t[0] = CL_add( y[0], y[4] );
6567 8915568 : move64();
6568 8915568 : t[1] = CL_sub( y[0], y[4] );
6569 8915568 : move64();
6570 8915568 : t[2] = CL_add( y[1], y[5] );
6571 8915568 : move64();
6572 8915568 : t[3] = CL_sub( y[1], y[5] );
6573 8915568 : move64();
6574 8915568 : t[4] = CL_add( y[2], y[6] );
6575 8915568 : move64();
6576 8915568 : t[5] = CL_sub( y[2], y[6] );
6577 8915568 : move64();
6578 8915568 : t[6] = CL_add( y[3], y[7] );
6579 8915568 : move64();
6580 8915568 : t[7] = CL_sub( y[3], y[7] );
6581 8915568 : move64();
6582 :
6583 8915568 : s[0] = CL_add( t[0], t[4] );
6584 8915568 : move64();
6585 8915568 : s[2] = CL_sub( t[0], t[4] );
6586 8915568 : move64();
6587 8915568 : s[4] = CL_mac_j( t[1], t[5] );
6588 8915568 : move64();
6589 8915568 : s[5] = CL_msu_j( t[1], t[5] );
6590 8915568 : move64();
6591 8915568 : s[1] = CL_add( t[2], t[6] );
6592 8915568 : move64();
6593 8915568 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
6594 8915568 : move64();
6595 :
6596 8915568 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
6597 8915568 : move64();
6598 8915568 : t[1] = CL_sub( t[3], t[7] );
6599 8915568 : move64();
6600 :
6601 8915568 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
6602 8915568 : move64();
6603 8915568 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
6604 8915568 : move64();
6605 8915568 : s[7] = CL_conjugate( s[7] );
6606 8915568 : move64();
6607 :
6608 8915568 : x[i] = CL_add( s[0], s[1] );
6609 8915568 : move64();
6610 8915568 : x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] );
6611 8915568 : move64();
6612 8915568 : x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] );
6613 8915568 : move64();
6614 8915568 : x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] );
6615 8915568 : move64();
6616 8915568 : x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] );
6617 8915568 : move64();
6618 8915568 : x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] );
6619 8915568 : move64();
6620 8915568 : x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] );
6621 8915568 : move64();
6622 8915568 : x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] );
6623 8915568 : move64();
6624 : }
6625 : }
6626 : ELSE
6627 : {
6628 218795359 : FOR( i = 0; i < dim1; i++ )
6629 : {
6630 : {
6631 211564800 : y[0] = xx[i];
6632 211564800 : move64();
6633 : };
6634 211564800 : IF( i > 0 )
6635 : {
6636 : {
6637 204334241 : y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) - Woff )] ),
6638 204334241 : CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6639 204334241 : move64();
6640 : };
6641 : {
6642 204334241 : y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) - Woff )] ),
6643 204334241 : CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6644 204334241 : move64();
6645 : };
6646 : {
6647 204334241 : y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) - Woff )] ),
6648 204334241 : CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6649 204334241 : move64();
6650 : };
6651 : {
6652 204334241 : y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) - Woff )] ),
6653 204334241 : CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6654 204334241 : move64();
6655 : };
6656 : {
6657 204334241 : y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) - Woff )] ),
6658 204334241 : CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6659 204334241 : move64();
6660 : };
6661 : {
6662 204334241 : y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) - Woff )] ),
6663 204334241 : CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6664 204334241 : move64();
6665 : };
6666 : {
6667 204334241 : y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) - Woff )] ),
6668 204334241 : CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
6669 204334241 : move64();
6670 : };
6671 : }
6672 :
6673 211564800 : t[0] = CL_add( y[0], y[4] );
6674 211564800 : move64();
6675 211564800 : t[1] = CL_sub( y[0], y[4] );
6676 211564800 : move64();
6677 211564800 : t[2] = CL_add( y[1], y[5] );
6678 211564800 : move64();
6679 211564800 : t[3] = CL_sub( y[1], y[5] );
6680 211564800 : move64();
6681 211564800 : t[4] = CL_add( y[2], y[6] );
6682 211564800 : move64();
6683 211564800 : t[5] = CL_sub( y[2], y[6] );
6684 211564800 : move64();
6685 211564800 : t[6] = CL_add( y[3], y[7] );
6686 211564800 : move64();
6687 211564800 : t[7] = CL_sub( y[3], y[7] );
6688 211564800 : move64();
6689 :
6690 211564800 : s[0] = CL_add( t[0], t[4] );
6691 211564800 : move64();
6692 211564800 : s[2] = CL_sub( t[0], t[4] );
6693 211564800 : move64();
6694 211564800 : s[4] = CL_mac_j( t[1], t[5] );
6695 211564800 : move64();
6696 211564800 : s[5] = CL_msu_j( t[1], t[5] );
6697 211564800 : move64();
6698 211564800 : s[1] = CL_add( t[2], t[6] );
6699 211564800 : move64();
6700 211564800 : s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
6701 211564800 : move64();
6702 :
6703 211564800 : t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
6704 211564800 : move64();
6705 211564800 : t[1] = CL_sub( t[3], t[7] );
6706 211564800 : move64();
6707 :
6708 211564800 : s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
6709 211564800 : move64();
6710 211564800 : s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
6711 211564800 : move64();
6712 211564800 : s[7] = CL_conjugate( s[7] );
6713 211564800 : move64();
6714 :
6715 211564800 : x[i] = CL_add( s[0], s[1] );
6716 211564800 : move64();
6717 211564800 : x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] );
6718 211564800 : move64();
6719 211564800 : x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] );
6720 211564800 : move64();
6721 211564800 : x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] );
6722 211564800 : move64();
6723 211564800 : x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] );
6724 211564800 : move64();
6725 211564800 : x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] );
6726 211564800 : move64();
6727 211564800 : x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] );
6728 211564800 : move64();
6729 211564800 : x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] );
6730 211564800 : move64();
6731 : }
6732 : }
6733 7564805 : 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 1266843 : case 16:
6779 : {
6780 : cmplx y[16];
6781 21536331 : FOR( j = 0; j < dim2; j++ )
6782 : {
6783 : {
6784 20269488 : y[j] = xx[0 + ( j * dim1 )];
6785 20269488 : move64();
6786 : };
6787 : }
6788 :
6789 1266843 : fft_len16( &y[0] );
6790 21536331 : FOR( j = 0; j < dim2; j++ )
6791 : {
6792 20269488 : x[0 + ( j * dim1 )] = y[j];
6793 20269488 : move64();
6794 : }
6795 :
6796 31452680 : FOR( i = 1; i < dim1; i++ )
6797 : {
6798 : {
6799 30185837 : y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1];
6800 30185837 : move64();
6801 : }
6802 :
6803 482973392 : FOR( j = 1; j < dim2; j++ )
6804 : {
6805 : {
6806 452787555 : y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) - Woff )] ),
6807 452787555 : CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6808 452787555 : move64();
6809 : }
6810 : }
6811 30185837 : fft_len16( &y[0] );
6812 513159229 : FOR( j = 0; j < dim2; j++ )
6813 : {
6814 482973392 : x[( i + ( j * dim1 ) )] = y[j];
6815 482973392 : move64();
6816 : }
6817 : }
6818 1266843 : 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 974 : case 32:
6874 : {
6875 : cmplx y[32];
6876 32142 : FOR( j = 0; j < dim2; j++ )
6877 : {
6878 : {
6879 31168 : y[j] = xx[0 + j * dim1];
6880 31168 : move64();
6881 : };
6882 : }
6883 974 : fft_len32( &y[0] );
6884 32142 : FOR( j = 0; j < dim2; j++ )
6885 : {
6886 31168 : x[0 + j * dim1] = y[j];
6887 31168 : move64();
6888 : }
6889 :
6890 20540 : FOR( i = 1; i < dim1; i++ )
6891 : {
6892 : {
6893 19566 : y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1];
6894 19566 : move64();
6895 : }
6896 : {
6897 19566 : y[( 0 + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( len + ( sc * i ) ) + 0 * dim1 - Woff )] ),
6898 19566 : CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + 0 * dim1 + 1 ) - Woff )] ) ); // Qx
6899 19566 : move64();
6900 : }
6901 :
6902 313056 : FOR( j = 2; j < dim2; j = j + 2 )
6903 : {
6904 : {
6905 293490 : y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( j * dim1 ) ) - Woff )] ),
6906 293490 : CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6907 293490 : move64();
6908 : }
6909 : {
6910 293490 : y[( j + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) - Woff )] ),
6911 293490 : CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
6912 293490 : move64();
6913 : }
6914 : }
6915 19566 : fft_len32( &y[0] );
6916 645678 : FOR( j = 0; j < dim2; j++ )
6917 : {
6918 626112 : x[( i + ( j * dim1 ) )] = y[j];
6919 626112 : move64();
6920 : }
6921 : }
6922 974 : BREAK;
6923 : }
6924 : }
6925 8832622 : return;
6926 : }
6927 :
6928 : /*-----------------------------------------------------------------*
6929 : * fft_fx()
6930 : *
6931 : * Complex-value FFT
6932 : *-----------------------------------------------------------------*/
6933 :
6934 8832622 : 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 2276575726 : FOR( Word16 j = 0; j < length; j++ )
6944 : {
6945 2267743104 : x[j].re = re[( s * j )];
6946 2267743104 : move32();
6947 2267743104 : x[j].im = im[( s * j )];
6948 2267743104 : move32();
6949 : }
6950 :
6951 8832622 : 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 84260 : case 80:
6963 84260 : fft_lenN( x, FFT_RotVector_640_fx, 640, 10, 8, 4, 40 );
6964 84260 : BREAK;
6965 0 : case 100:
6966 0 : fft_lenN( x, FFT_RotVector_400_fx, 400, 10, 10, 4, 40 );
6967 0 : BREAK;
6968 0 : case 120:
6969 0 : fft_lenN( x, FFT_RotVector_960_fx, 960, 15, 8, 4, 60 );
6970 0 : BREAK;
6971 111269 : case 128:
6972 111269 : fft_lenN( x, FFT_RotVector_256_fx, 256, 16, 8, 4, 64 );
6973 111269 : BREAK;
6974 366677 : case 160:
6975 366677 : fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 8, 2, 40 );
6976 366677 : BREAK;
6977 0 : case 200:
6978 0 : fft_lenN( x, FFT_RotVector_400_fx, 400, 20, 10, 2, 40 );
6979 0 : BREAK;
6980 6779622 : case 240:
6981 6779622 : fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 8, 2, 60 );
6982 6779622 : BREAK;
6983 222977 : case 256:
6984 222977 : fft_lenN( x, FFT_RotVector_256_fx, 256, 32, 8, 2, 64 );
6985 222977 : BREAK;
6986 655261 : case 320:
6987 655261 : fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 16, 2, 40 );
6988 655261 : BREAK;
6989 0 : case 400:
6990 0 : fft_lenN( x, FFT_RotVector_400_fx, 400, 20, 20, 2, 40 );
6991 0 : BREAK;
6992 611582 : case 480:
6993 611582 : fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 16, 2, 60 );
6994 611582 : BREAK;
6995 0 : case 600:
6996 0 : fft_lenN( x, FFT_RotVector_600_fx, 600, 30, 20, 2, 60 );
6997 0 : BREAK;
6998 868 : case 640:
6999 868 : fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 32, 2, 40 );
7000 868 : BREAK;
7001 106 : case 960:
7002 106 : fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 32, 2, 60 );
7003 106 : BREAK;
7004 0 : default:
7005 0 : assert( !"fft length is not supported!" );
7006 : }
7007 :
7008 2276575726 : FOR( Word16 j = 0; j < length; j++ )
7009 : {
7010 2267743104 : re[( s * j )] = x[j].re;
7011 2267743104 : move32();
7012 2267743104 : im[( s * j )] = x[j].im;
7013 2267743104 : move32();
7014 : }
7015 :
7016 8832622 : return;
7017 : }
7018 :
7019 445959 : 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 445959 : sizeOfFft2 = shr( length, 1 );
7031 445959 : sizeOfFft4 = shr( length, 2 );
7032 445959 : 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 143942 : case 160:
7047 143942 : s1 = 204; //(1/sizeOfFft2).Q15
7048 143942 : move16();
7049 143942 : s2 = -204;
7050 143942 : move16();
7051 143942 : BREAK;
7052 0 : case 240:
7053 0 : s1 = 136; //(1/sizeOfFft2).Q15
7054 0 : move16();
7055 0 : s2 = -136;
7056 0 : move16();
7057 0 : BREAK;
7058 0 : case 256:
7059 0 : s1 = 128; //(1/sizeOfFft2).Q15
7060 0 : move16();
7061 0 : s2 = -128;
7062 0 : move16();
7063 0 : BREAK;
7064 104554 : case 320:
7065 104554 : s1 = 102; //(1/sizeOfFft2).Q15
7066 104554 : move16();
7067 104554 : s2 = -102;
7068 104554 : move16();
7069 104554 : BREAK;
7070 94524 : case 480:
7071 94524 : s1 = 68; //(1/sizeOfFft2).Q15
7072 94524 : move16();
7073 94524 : s2 = -68;
7074 94524 : move16();
7075 94524 : BREAK;
7076 0 : case 640:
7077 0 : s1 = 51; //(1/sizeOfFft2).Q15
7078 0 : move16();
7079 0 : s2 = -51;
7080 0 : move16();
7081 0 : BREAK;
7082 0 : case 960:
7083 0 : s1 = 34; //(1/sizeOfFft2).Q15
7084 0 : move16();
7085 0 : s2 = -34;
7086 0 : move16();
7087 0 : 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 445959 : SWITCH( isign )
7098 : {
7099 :
7100 245587 : case -1:
7101 :
7102 245587 : fft_fx( x, x + 1, sizeOfFft2, 2 );
7103 : // Qx
7104 245587 : tmp = L_add( x[0], x[1] );
7105 245587 : x[1] = L_sub( x[0], x[1] ); // Qx
7106 245587 : move32();
7107 245587 : x[0] = tmp;
7108 245587 : move32();
7109 :
7110 23271411 : FOR( i = 1; i <= sizeOfFft4; i++ )
7111 : {
7112 23025824 : t1 = L_sub( x[2 * i], x[( length - ( i << 1 ) )] ); // Qx
7113 23025824 : t2 = L_add( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] ); // Qx
7114 23025824 : t3 = L_sub( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[i + sizeOfFft4] ) ); // Qx
7115 23025824 : t4 = L_add( Mpy_32_16_1( t1, w[i + sizeOfFft4] ), Mpy_32_16_1( t2, w[i] ) ); // Qx
7116 23025824 : t1 = L_add( x[2 * i], x[( length - ( i << 1 ) )] );
7117 23025824 : t2 = L_sub( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
7118 :
7119 23025824 : x[2 * i] = Mpy_32_16_1( L_sub( t1, t3 ), 16384 /*0.5.Q15*/ );
7120 23025824 : move32();
7121 23025824 : x[( ( i << 1 ) + 1 )] = Mpy_32_16_1( L_sub( t2, t4 ), 16384 /*0.5.Q15*/ );
7122 23025824 : move32();
7123 23025824 : x[( length - ( i << 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 /*0.5.Q15*/ );
7124 23025824 : move32();
7125 23025824 : x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_add( t2, t4 ), -16384 /*0.5.Q15*/ );
7126 23025824 : move32();
7127 : }
7128 :
7129 245587 : BREAK;
7130 :
7131 200372 : case +1:
7132 :
7133 200372 : tmp = Mpy_32_16_1( L_add( x[0], x[1] ), 16384 /*0.5.Q15*/ );
7134 200372 : x[1] = Mpy_32_16_1( L_sub( x[1], x[0] ), 16384 /*0.5.Q15*/ );
7135 200372 : move32();
7136 200372 : x[0] = tmp;
7137 200372 : move32();
7138 :
7139 33862052 : FOR( i = 1; i <= sizeOfFft4; i++ )
7140 : {
7141 33661680 : t1 = L_sub( x[2 * i], x[( length - ( i << 1 ) )] );
7142 33661680 : t2 = L_add( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
7143 33661680 : t3 = L_add( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[( i + sizeOfFft4 )] ) );
7144 33661680 : t4 = L_sub( Mpy_32_16_1( t2, w[i] ), Mpy_32_16_1( t1, w[( i + sizeOfFft4 )] ) );
7145 33661680 : t1 = L_add( x[2 * i], x[( length - ( i << 1 ) )] );
7146 33661680 : t2 = L_sub( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
7147 :
7148 33661680 : x[2 * i] = Mpy_32_16_1( L_sub( t1, t3 ), 16384 /*0.5.Q15*/ ); // Qx
7149 33661680 : move32();
7150 33661680 : x[( ( i << 1 ) + 1 )] = Mpy_32_16_1( L_sub( t4, t2 ), 16384 /*0.5.Q15*/ ); // Qx
7151 33661680 : move32();
7152 33661680 : x[( length - ( i << 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 /*0.5.Q15*/ ); // Qx
7153 33661680 : move32();
7154 33661680 : x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_add( t2, t4 ), 16384 /*0.5.Q15*/ ); // Qx
7155 33661680 : move32();
7156 : }
7157 :
7158 200372 : fft_fx( x, x + 1, sizeOfFft2, 2 );
7159 :
7160 67523732 : FOR( i = 0; i < length; i += 2 )
7161 : {
7162 67323360 : x[i] = Mpy_32_16_1( x[i], s1 ); // Qx
7163 67323360 : move32();
7164 67323360 : x[i + 1] = Mpy_32_16_1( x[i + 1], s2 ); // Qx
7165 67323360 : move32();
7166 : }
7167 :
7168 200372 : BREAK;
7169 : }
7170 :
7171 445959 : 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 1952728 : 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 1952728 : x00 = L_shr( re[s * 0], SCALEFACTOR8 );
7221 1952728 : x01 = L_shr( im[s * 0], SCALEFACTOR8 );
7222 1952728 : x02 = L_shr( re[s * 1], SCALEFACTOR8 );
7223 1952728 : x03 = L_shr( im[s * 1], SCALEFACTOR8 );
7224 1952728 : x04 = L_shr( re[s * 2], SCALEFACTOR8 );
7225 1952728 : x05 = L_shr( im[s * 2], SCALEFACTOR8 );
7226 1952728 : x06 = L_shr( re[s * 3], SCALEFACTOR8 );
7227 1952728 : x07 = L_shr( im[s * 3], SCALEFACTOR8 );
7228 1952728 : x08 = L_shr( re[s * 4], SCALEFACTOR8 );
7229 1952728 : x09 = L_shr( im[s * 4], SCALEFACTOR8 );
7230 1952728 : x10 = L_shr( re[s * 5], SCALEFACTOR8 );
7231 1952728 : x11 = L_shr( im[s * 5], SCALEFACTOR8 );
7232 1952728 : x12 = L_shr( re[s * 6], SCALEFACTOR8 );
7233 1952728 : x13 = L_shr( im[s * 6], SCALEFACTOR8 );
7234 1952728 : x14 = L_shr( re[s * 7], SCALEFACTOR8 );
7235 1952728 : x15 = L_shr( im[s * 7], SCALEFACTOR8 );
7236 :
7237 1952728 : t00 = L_add( x00, x08 );
7238 1952728 : t02 = L_sub( x00, x08 );
7239 1952728 : t01 = L_add( x01, x09 );
7240 1952728 : t03 = L_sub( x01, x09 );
7241 1952728 : t04 = L_add( x02, x10 );
7242 1952728 : t06 = L_sub( x02, x10 );
7243 1952728 : t05 = L_add( x03, x11 );
7244 1952728 : t07 = L_sub( x03, x11 );
7245 1952728 : t08 = L_add( x04, x12 );
7246 1952728 : t10 = L_sub( x04, x12 );
7247 1952728 : t09 = L_add( x05, x13 );
7248 1952728 : t11 = L_sub( x05, x13 );
7249 1952728 : t12 = L_add( x06, x14 );
7250 1952728 : t14 = L_sub( x06, x14 );
7251 1952728 : t13 = L_add( x07, x15 );
7252 1952728 : t15 = L_sub( x07, x15 );
7253 :
7254 : /* Pre-additions and core multiplications */
7255 :
7256 1952728 : s00 = L_add( t00, t08 );
7257 1952728 : s04 = L_sub( t00, t08 );
7258 1952728 : s01 = L_add( t01, t09 );
7259 1952728 : s05 = L_sub( t01, t09 );
7260 1952728 : s08 = L_sub( t02, t11 );
7261 1952728 : s10 = L_add( t02, t11 );
7262 1952728 : s09 = L_add( t03, t10 );
7263 1952728 : s11 = L_sub( t03, t10 );
7264 1952728 : s02 = L_add( t04, t12 );
7265 1952728 : s07 = L_sub( t04, t12 );
7266 1952728 : s03 = L_add( t05, t13 );
7267 1952728 : s06 = L_sub( t13, t05 );
7268 :
7269 1952728 : t01 = L_add( t06, t14 );
7270 1952728 : t02 = L_sub( t06, t14 );
7271 1952728 : t00 = L_add( t07, t15 );
7272 1952728 : t03 = L_sub( t07, t15 );
7273 :
7274 1952728 : s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX );
7275 1952728 : s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX );
7276 1952728 : s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX );
7277 1952728 : s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX );
7278 :
7279 : /* Post-additions */
7280 :
7281 1952728 : re[s * 0] = L_add( s00, s02 );
7282 1952728 : move32();
7283 1952728 : re[s * 4] = L_sub( s00, s02 );
7284 1952728 : move32();
7285 1952728 : im[s * 0] = L_add( s01, s03 );
7286 1952728 : move32();
7287 1952728 : im[s * 4] = L_sub( s01, s03 );
7288 1952728 : move32();
7289 1952728 : re[s * 2] = L_sub( s04, s06 );
7290 1952728 : move32();
7291 1952728 : re[s * 6] = L_add( s04, s06 );
7292 1952728 : move32();
7293 1952728 : im[s * 2] = L_sub( s05, s07 );
7294 1952728 : move32();
7295 1952728 : im[s * 6] = L_add( s05, s07 );
7296 1952728 : move32();
7297 1952728 : re[i_mult( s, 3 )] = L_add( s08, s14 );
7298 1952728 : move32();
7299 1952728 : re[i_mult( s, 7 )] = L_sub( s08, s14 );
7300 1952728 : move32();
7301 1952728 : im[i_mult( s, 3 )] = L_add( s09, s15 );
7302 1952728 : move32();
7303 1952728 : im[i_mult( s, 7 )] = L_sub( s09, s15 );
7304 1952728 : move32();
7305 1952728 : re[s * 1] = L_add( s10, s12 );
7306 1952728 : move32();
7307 1952728 : re[i_mult( s, 5 )] = L_sub( s10, s12 );
7308 1952728 : move32();
7309 1952728 : im[s * 1] = L_add( s11, s13 );
7310 1952728 : move32();
7311 1952728 : im[i_mult( s, 5 )] = L_sub( s11, s13 );
7312 1952728 : move32();
7313 :
7314 1952728 : return;
7315 : }
7316 :
7317 :
7318 : /*-----------------------------------------------------------------*
7319 : * fftN2()
7320 : *
7321 : * Combined FFT
7322 : *-----------------------------------------------------------------*/
7323 :
7324 244091 : 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 2196819 : FOR( i = 0; i < dim2; i++ )
7342 : {
7343 17574552 : FOR( j = 0; j < dim1; j++ )
7344 : {
7345 15621824 : x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2];
7346 15621824 : move32();
7347 15621824 : x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2];
7348 15621824 : move32();
7349 : }
7350 : }
7351 :
7352 : /* dim1 == 8 */
7353 2196819 : FOR( i = 0; i < dim2; i++ )
7354 : {
7355 1952728 : BASOP_fft8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
7356 : }
7357 :
7358 : /* dim2 == 8 */
7359 2196819 : FOR( i = 0; i < dim1; i++ )
7360 : {
7361 1952728 : cplxMpy4_8_1( x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1] );
7362 :
7363 1952728 : IF( i == 0 )
7364 : {
7365 244091 : 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 244091 : 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 244091 : 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 244091 : 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 244091 : 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 244091 : 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 244091 : 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 1708637 : 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 1708637 : 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 1708637 : 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 1708637 : 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 1708637 : 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 1708637 : 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 1708637 : 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 1952728 : t00 = L_shr( L_add( x00, x08 ), SCALEFACTORN2 - 1 );
7384 1952728 : t02 = L_shr( L_sub( x00, x08 ), SCALEFACTORN2 - 1 );
7385 1952728 : t01 = L_shr( L_add( x01, x09 ), SCALEFACTORN2 - 1 );
7386 1952728 : t03 = L_shr( L_sub( x01, x09 ), SCALEFACTORN2 - 1 );
7387 1952728 : t04 = L_shr( L_add( x02, x10 ), SCALEFACTORN2 - 1 );
7388 1952728 : t06 = L_sub( x02, x10 );
7389 1952728 : t05 = L_shr( L_add( x03, x11 ), SCALEFACTORN2 - 1 );
7390 1952728 : t07 = L_sub( x03, x11 );
7391 1952728 : t08 = L_shr( L_add( x04, x12 ), SCALEFACTORN2 - 1 );
7392 1952728 : t10 = L_shr( L_sub( x04, x12 ), SCALEFACTORN2 - 1 );
7393 1952728 : t09 = L_shr( L_add( x05, x13 ), SCALEFACTORN2 - 1 );
7394 1952728 : t11 = L_shr( L_sub( x05, x13 ), SCALEFACTORN2 - 1 );
7395 1952728 : t12 = L_shr( L_add( x06, x14 ), SCALEFACTORN2 - 1 );
7396 1952728 : t14 = L_sub( x06, x14 );
7397 1952728 : t13 = L_shr( L_add( x07, x15 ), SCALEFACTORN2 - 1 );
7398 1952728 : t15 = L_sub( x07, x15 );
7399 :
7400 1952728 : s00 = L_add( t00, t08 );
7401 1952728 : s04 = L_sub( t00, t08 );
7402 1952728 : s01 = L_add( t01, t09 );
7403 1952728 : s05 = L_sub( t01, t09 );
7404 1952728 : s08 = L_sub( t02, t11 );
7405 1952728 : s10 = L_add( t02, t11 );
7406 1952728 : s09 = L_add( t03, t10 );
7407 1952728 : s11 = L_sub( t03, t10 );
7408 1952728 : s02 = L_add( t04, t12 );
7409 1952728 : s07 = L_sub( t04, t12 );
7410 1952728 : s03 = L_add( t05, t13 );
7411 1952728 : s06 = L_sub( t13, t05 );
7412 :
7413 1952728 : t01 = L_shr( L_add( t06, t14 ), SCALEFACTORN2 - 1 );
7414 1952728 : t02 = L_shr( L_sub( t06, t14 ), SCALEFACTORN2 - 1 );
7415 1952728 : t00 = L_shr( L_add( t07, t15 ), SCALEFACTORN2 - 1 );
7416 1952728 : t03 = L_shr( L_sub( t07, t15 ), SCALEFACTORN2 - 1 );
7417 :
7418 1952728 : s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX );
7419 1952728 : s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX );
7420 1952728 : s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX );
7421 1952728 : s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX );
7422 :
7423 1952728 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s00, s02 );
7424 1952728 : move32();
7425 1952728 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s01, s03 );
7426 1952728 : move32();
7427 1952728 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s10, s12 );
7428 1952728 : move32();
7429 1952728 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s11, s13 );
7430 1952728 : move32();
7431 1952728 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s04, s06 );
7432 1952728 : move32();
7433 1952728 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s05, s07 );
7434 1952728 : move32();
7435 1952728 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s08, s14 );
7436 1952728 : move32();
7437 1952728 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s09, s15 );
7438 1952728 : move32();
7439 1952728 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s00, s02 );
7440 1952728 : move32();
7441 1952728 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s01, s03 );
7442 1952728 : move32();
7443 1952728 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s10, s12 );
7444 1952728 : move32();
7445 1952728 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s11, s13 );
7446 1952728 : move32();
7447 1952728 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s04, s06 );
7448 1952728 : move32();
7449 1952728 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s05, s07 );
7450 1952728 : move32();
7451 1952728 : re[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s08, s14 );
7452 1952728 : move32();
7453 1952728 : im[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s09, s15 );
7454 1952728 : move32();
7455 : }
7456 :
7457 244091 : return;
7458 : }
7459 :
7460 :
7461 : /*-----------------------------------------------------------------*
7462 : * BASOP_cfft_ivas()
7463 : *
7464 : * Complex valued FFT
7465 : *-----------------------------------------------------------------*/
7466 :
7467 244091 : 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 244091 : BASOP_fftN2( re, im, RotVector_256, 8, 8, s, 8, x, 64 );
7478 244091 : s = add( *scale, SCALEFACTOR64 );
7479 :
7480 244091 : *scale = s;
7481 244091 : move16();
7482 :
7483 244091 : return;
7484 : }
7485 :
7486 : #undef WMC_TOOL_SKIP
|