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