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