1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker
4*e5436536SAndroid Build Coastguard Worker © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker
7*e5436536SAndroid Build Coastguard Worker 1. INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker
34*e5436536SAndroid Build Coastguard Worker 2. COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker
61*e5436536SAndroid Build Coastguard Worker 3. NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker
71*e5436536SAndroid Build Coastguard Worker 4. DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker
84*e5436536SAndroid Build Coastguard Worker 5. CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker
95*e5436536SAndroid Build Coastguard Worker /******************* Library for basic calculation routines ********************
96*e5436536SAndroid Build Coastguard Worker
97*e5436536SAndroid Build Coastguard Worker Author(s): Josef Hoepfl, DSP Solutions
98*e5436536SAndroid Build Coastguard Worker
99*e5436536SAndroid Build Coastguard Worker Description: Fix point FFT
100*e5436536SAndroid Build Coastguard Worker
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker
103*e5436536SAndroid Build Coastguard Worker #include "fft_rad2.h"
104*e5436536SAndroid Build Coastguard Worker #include "FDK_tools_rom.h"
105*e5436536SAndroid Build Coastguard Worker
106*e5436536SAndroid Build Coastguard Worker #define W_PiFOURTH STC(0x5a82799a)
107*e5436536SAndroid Build Coastguard Worker //#define W_PiFOURTH ((FIXP_DBL)(0x5a82799a))
108*e5436536SAndroid Build Coastguard Worker #ifndef SUMDIFF_PIFOURTH
109*e5436536SAndroid Build Coastguard Worker #define SUMDIFF_PIFOURTH(diff, sum, a, b) \
110*e5436536SAndroid Build Coastguard Worker { \
111*e5436536SAndroid Build Coastguard Worker FIXP_DBL wa, wb; \
112*e5436536SAndroid Build Coastguard Worker wa = fMultDiv2(a, W_PiFOURTH); \
113*e5436536SAndroid Build Coastguard Worker wb = fMultDiv2(b, W_PiFOURTH); \
114*e5436536SAndroid Build Coastguard Worker diff = wb - wa; \
115*e5436536SAndroid Build Coastguard Worker sum = wb + wa; \
116*e5436536SAndroid Build Coastguard Worker }
117*e5436536SAndroid Build Coastguard Worker #define SUMDIFF_PIFOURTH16(diff, sum, a, b) \
118*e5436536SAndroid Build Coastguard Worker { \
119*e5436536SAndroid Build Coastguard Worker FIXP_SGL wa, wb; \
120*e5436536SAndroid Build Coastguard Worker wa = FX_DBL2FX_SGL(fMultDiv2(a, W_PiFOURTH)); \
121*e5436536SAndroid Build Coastguard Worker wb = FX_DBL2FX_SGL(fMultDiv2(b, W_PiFOURTH)); \
122*e5436536SAndroid Build Coastguard Worker diff = wb - wa; \
123*e5436536SAndroid Build Coastguard Worker sum = wb + wa; \
124*e5436536SAndroid Build Coastguard Worker }
125*e5436536SAndroid Build Coastguard Worker #endif
126*e5436536SAndroid Build Coastguard Worker
127*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR2048 10
128*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR1024 9
129*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR512 8
130*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR256 7
131*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR128 6
132*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR64 5
133*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR32 4
134*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR16 3
135*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR8 2
136*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR4 1
137*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR2 1
138*e5436536SAndroid Build Coastguard Worker
139*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR3 1
140*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR5 1
141*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR6 (SCALEFACTOR2 + SCALEFACTOR3 + 2)
142*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR7 2
143*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR9 2
144*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR10 5
145*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR12 3
146*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR15 3
147*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR18 (SCALEFACTOR2 + SCALEFACTOR9 + 2)
148*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR20 (SCALEFACTOR4 + SCALEFACTOR5 + 2)
149*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR21 (SCALEFACTOR3 + SCALEFACTOR7 + 2)
150*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR24 (SCALEFACTOR2 + SCALEFACTOR12 + 2)
151*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR30 (SCALEFACTOR2 + SCALEFACTOR15 + 2)
152*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR40 (SCALEFACTOR5 + SCALEFACTOR8 + 2)
153*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR48 (SCALEFACTOR4 + SCALEFACTOR12 + 2)
154*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR60 (SCALEFACTOR4 + SCALEFACTOR15 + 2)
155*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR80 (SCALEFACTOR5 + SCALEFACTOR16 + 2)
156*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR96 (SCALEFACTOR3 + SCALEFACTOR32 + 2)
157*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR120 (SCALEFACTOR8 + SCALEFACTOR15 + 2)
158*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR160 (SCALEFACTOR10 + SCALEFACTOR16 + 2)
159*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR168 (SCALEFACTOR21 + SCALEFACTOR8 + 2)
160*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR192 (SCALEFACTOR12 + SCALEFACTOR16 + 2)
161*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR240 (SCALEFACTOR16 + SCALEFACTOR15 + 2)
162*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR320 (SCALEFACTOR10 + SCALEFACTOR32 + 2)
163*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR336 (SCALEFACTOR21 + SCALEFACTOR16 + 2)
164*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR384 (SCALEFACTOR12 + SCALEFACTOR32 + 2)
165*e5436536SAndroid Build Coastguard Worker #define SCALEFACTOR480 (SCALEFACTOR32 + SCALEFACTOR15 + 2)
166*e5436536SAndroid Build Coastguard Worker
167*e5436536SAndroid Build Coastguard Worker #include "fft.h"
168*e5436536SAndroid Build Coastguard Worker
169*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft2
170*e5436536SAndroid Build Coastguard Worker
171*e5436536SAndroid Build Coastguard Worker /* Performs the FFT of length 2. Input vector unscaled, output vector scaled
172*e5436536SAndroid Build Coastguard Worker * with factor 0.5 */
fft2(FIXP_DBL * RESTRICT pDat)173*e5436536SAndroid Build Coastguard Worker static FDK_FORCEINLINE void fft2(FIXP_DBL *RESTRICT pDat) {
174*e5436536SAndroid Build Coastguard Worker FIXP_DBL r1, i1;
175*e5436536SAndroid Build Coastguard Worker FIXP_DBL r2, i2;
176*e5436536SAndroid Build Coastguard Worker
177*e5436536SAndroid Build Coastguard Worker /* real part */
178*e5436536SAndroid Build Coastguard Worker r1 = pDat[2];
179*e5436536SAndroid Build Coastguard Worker r2 = pDat[0];
180*e5436536SAndroid Build Coastguard Worker
181*e5436536SAndroid Build Coastguard Worker /* imaginary part */
182*e5436536SAndroid Build Coastguard Worker i1 = pDat[3];
183*e5436536SAndroid Build Coastguard Worker i2 = pDat[1];
184*e5436536SAndroid Build Coastguard Worker
185*e5436536SAndroid Build Coastguard Worker /* real part */
186*e5436536SAndroid Build Coastguard Worker pDat[0] = (r2 + r1) >> 1;
187*e5436536SAndroid Build Coastguard Worker pDat[2] = (r2 - r1) >> 1;
188*e5436536SAndroid Build Coastguard Worker
189*e5436536SAndroid Build Coastguard Worker /* imaginary part */
190*e5436536SAndroid Build Coastguard Worker pDat[1] = (i2 + i1) >> 1;
191*e5436536SAndroid Build Coastguard Worker pDat[3] = (i2 - i1) >> 1;
192*e5436536SAndroid Build Coastguard Worker }
193*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft2 */
194*e5436536SAndroid Build Coastguard Worker
195*e5436536SAndroid Build Coastguard Worker #define C31 (STC(0x91261468)) /* FL2FXCONST_DBL(-0.86602540) = -sqrt(3)/2 */
196*e5436536SAndroid Build Coastguard Worker
197*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft3
198*e5436536SAndroid Build Coastguard Worker /* Performs the FFT of length 3 according to the algorithm after winograd. */
fft3(FIXP_DBL * RESTRICT pDat)199*e5436536SAndroid Build Coastguard Worker static FDK_FORCEINLINE void fft3(FIXP_DBL *RESTRICT pDat) {
200*e5436536SAndroid Build Coastguard Worker FIXP_DBL r1, r2;
201*e5436536SAndroid Build Coastguard Worker FIXP_DBL s1, s2;
202*e5436536SAndroid Build Coastguard Worker FIXP_DBL pD;
203*e5436536SAndroid Build Coastguard Worker
204*e5436536SAndroid Build Coastguard Worker /* real part */
205*e5436536SAndroid Build Coastguard Worker r1 = pDat[2] + pDat[4];
206*e5436536SAndroid Build Coastguard Worker r2 = fMultDiv2((pDat[2] - pDat[4]), C31);
207*e5436536SAndroid Build Coastguard Worker pD = pDat[0] >> 1;
208*e5436536SAndroid Build Coastguard Worker pDat[0] = pD + (r1 >> 1);
209*e5436536SAndroid Build Coastguard Worker r1 = pD - (r1 >> 2);
210*e5436536SAndroid Build Coastguard Worker
211*e5436536SAndroid Build Coastguard Worker /* imaginary part */
212*e5436536SAndroid Build Coastguard Worker s1 = pDat[3] + pDat[5];
213*e5436536SAndroid Build Coastguard Worker s2 = fMultDiv2((pDat[3] - pDat[5]), C31);
214*e5436536SAndroid Build Coastguard Worker pD = pDat[1] >> 1;
215*e5436536SAndroid Build Coastguard Worker pDat[1] = pD + (s1 >> 1);
216*e5436536SAndroid Build Coastguard Worker s1 = pD - (s1 >> 2);
217*e5436536SAndroid Build Coastguard Worker
218*e5436536SAndroid Build Coastguard Worker /* combination */
219*e5436536SAndroid Build Coastguard Worker pDat[2] = r1 - s2;
220*e5436536SAndroid Build Coastguard Worker pDat[4] = r1 + s2;
221*e5436536SAndroid Build Coastguard Worker pDat[3] = s1 + r2;
222*e5436536SAndroid Build Coastguard Worker pDat[5] = s1 - r2;
223*e5436536SAndroid Build Coastguard Worker }
224*e5436536SAndroid Build Coastguard Worker #endif /* #ifndef FUNCTION_fft3 */
225*e5436536SAndroid Build Coastguard Worker
226*e5436536SAndroid Build Coastguard Worker #define F5C(x) STC(x)
227*e5436536SAndroid Build Coastguard Worker
228*e5436536SAndroid Build Coastguard Worker #define C51 (F5C(0x79bc3854)) /* FL2FXCONST_DBL( 0.95105652) */
229*e5436536SAndroid Build Coastguard Worker #define C52 (F5C(0x9d839db0)) /* FL2FXCONST_DBL(-1.53884180/2) */
230*e5436536SAndroid Build Coastguard Worker #define C53 (F5C(0xd18053ce)) /* FL2FXCONST_DBL(-0.36327126) */
231*e5436536SAndroid Build Coastguard Worker #define C54 (F5C(0x478dde64)) /* FL2FXCONST_DBL( 0.55901699) */
232*e5436536SAndroid Build Coastguard Worker #define C55 (F5C(0xb0000001)) /* FL2FXCONST_DBL(-1.25/2) */
233*e5436536SAndroid Build Coastguard Worker
234*e5436536SAndroid Build Coastguard Worker /* performs the FFT of length 5 according to the algorithm after winograd */
235*e5436536SAndroid Build Coastguard Worker /* This version works with a prescale of 2 instead of 3 */
fft5(FIXP_DBL * RESTRICT pDat)236*e5436536SAndroid Build Coastguard Worker static FDK_FORCEINLINE void fft5(FIXP_DBL *RESTRICT pDat) {
237*e5436536SAndroid Build Coastguard Worker FIXP_DBL r1, r2, r3, r4;
238*e5436536SAndroid Build Coastguard Worker FIXP_DBL s1, s2, s3, s4;
239*e5436536SAndroid Build Coastguard Worker FIXP_DBL t;
240*e5436536SAndroid Build Coastguard Worker
241*e5436536SAndroid Build Coastguard Worker /* real part */
242*e5436536SAndroid Build Coastguard Worker r1 = (pDat[2] + pDat[8]) >> 1;
243*e5436536SAndroid Build Coastguard Worker r4 = (pDat[2] - pDat[8]) >> 1;
244*e5436536SAndroid Build Coastguard Worker r3 = (pDat[4] + pDat[6]) >> 1;
245*e5436536SAndroid Build Coastguard Worker r2 = (pDat[4] - pDat[6]) >> 1;
246*e5436536SAndroid Build Coastguard Worker t = fMult((r1 - r3), C54);
247*e5436536SAndroid Build Coastguard Worker r1 = r1 + r3;
248*e5436536SAndroid Build Coastguard Worker pDat[0] = (pDat[0] >> 1) + r1;
249*e5436536SAndroid Build Coastguard Worker /* Bit shift left because of the constant C55 which was scaled with the factor
250*e5436536SAndroid Build Coastguard Worker 0.5 because of the representation of the values as fracts */
251*e5436536SAndroid Build Coastguard Worker r1 = pDat[0] + (fMultDiv2(r1, C55) << (2));
252*e5436536SAndroid Build Coastguard Worker r3 = r1 - t;
253*e5436536SAndroid Build Coastguard Worker r1 = r1 + t;
254*e5436536SAndroid Build Coastguard Worker t = fMult((r4 + r2), C51);
255*e5436536SAndroid Build Coastguard Worker /* Bit shift left because of the constant C55 which was scaled with the factor
256*e5436536SAndroid Build Coastguard Worker 0.5 because of the representation of the values as fracts */
257*e5436536SAndroid Build Coastguard Worker r4 = t + (fMultDiv2(r4, C52) << (2));
258*e5436536SAndroid Build Coastguard Worker r2 = t + fMult(r2, C53);
259*e5436536SAndroid Build Coastguard Worker
260*e5436536SAndroid Build Coastguard Worker /* imaginary part */
261*e5436536SAndroid Build Coastguard Worker s1 = (pDat[3] + pDat[9]) >> 1;
262*e5436536SAndroid Build Coastguard Worker s4 = (pDat[3] - pDat[9]) >> 1;
263*e5436536SAndroid Build Coastguard Worker s3 = (pDat[5] + pDat[7]) >> 1;
264*e5436536SAndroid Build Coastguard Worker s2 = (pDat[5] - pDat[7]) >> 1;
265*e5436536SAndroid Build Coastguard Worker t = fMult((s1 - s3), C54);
266*e5436536SAndroid Build Coastguard Worker s1 = s1 + s3;
267*e5436536SAndroid Build Coastguard Worker pDat[1] = (pDat[1] >> 1) + s1;
268*e5436536SAndroid Build Coastguard Worker /* Bit shift left because of the constant C55 which was scaled with the factor
269*e5436536SAndroid Build Coastguard Worker 0.5 because of the representation of the values as fracts */
270*e5436536SAndroid Build Coastguard Worker s1 = pDat[1] + (fMultDiv2(s1, C55) << (2));
271*e5436536SAndroid Build Coastguard Worker s3 = s1 - t;
272*e5436536SAndroid Build Coastguard Worker s1 = s1 + t;
273*e5436536SAndroid Build Coastguard Worker t = fMult((s4 + s2), C51);
274*e5436536SAndroid Build Coastguard Worker /* Bit shift left because of the constant C55 which was scaled with the factor
275*e5436536SAndroid Build Coastguard Worker 0.5 because of the representation of the values as fracts */
276*e5436536SAndroid Build Coastguard Worker s4 = t + (fMultDiv2(s4, C52) << (2));
277*e5436536SAndroid Build Coastguard Worker s2 = t + fMult(s2, C53);
278*e5436536SAndroid Build Coastguard Worker
279*e5436536SAndroid Build Coastguard Worker /* combination */
280*e5436536SAndroid Build Coastguard Worker pDat[2] = r1 + s2;
281*e5436536SAndroid Build Coastguard Worker pDat[8] = r1 - s2;
282*e5436536SAndroid Build Coastguard Worker pDat[4] = r3 - s4;
283*e5436536SAndroid Build Coastguard Worker pDat[6] = r3 + s4;
284*e5436536SAndroid Build Coastguard Worker
285*e5436536SAndroid Build Coastguard Worker pDat[3] = s1 - r2;
286*e5436536SAndroid Build Coastguard Worker pDat[9] = s1 + r2;
287*e5436536SAndroid Build Coastguard Worker pDat[5] = s3 + r4;
288*e5436536SAndroid Build Coastguard Worker pDat[7] = s3 - r4;
289*e5436536SAndroid Build Coastguard Worker }
290*e5436536SAndroid Build Coastguard Worker
291*e5436536SAndroid Build Coastguard Worker #define F5C(x) STC(x)
292*e5436536SAndroid Build Coastguard Worker
293*e5436536SAndroid Build Coastguard Worker #define C51 (F5C(0x79bc3854)) /* FL2FXCONST_DBL( 0.95105652) */
294*e5436536SAndroid Build Coastguard Worker #define C52 (F5C(0x9d839db0)) /* FL2FXCONST_DBL(-1.53884180/2) */
295*e5436536SAndroid Build Coastguard Worker #define C53 (F5C(0xd18053ce)) /* FL2FXCONST_DBL(-0.36327126) */
296*e5436536SAndroid Build Coastguard Worker #define C54 (F5C(0x478dde64)) /* FL2FXCONST_DBL( 0.55901699) */
297*e5436536SAndroid Build Coastguard Worker #define C55 (F5C(0xb0000001)) /* FL2FXCONST_DBL(-1.25/2) */
298*e5436536SAndroid Build Coastguard Worker /**
299*e5436536SAndroid Build Coastguard Worker * \brief Function performs a complex 10-point FFT
300*e5436536SAndroid Build Coastguard Worker * The FFT is performed inplace. The result of the FFT
301*e5436536SAndroid Build Coastguard Worker * is scaled by SCALEFACTOR10 bits.
302*e5436536SAndroid Build Coastguard Worker *
303*e5436536SAndroid Build Coastguard Worker * WOPS FLC version: 1093 cycles
304*e5436536SAndroid Build Coastguard Worker * WOPS with 32x16 bit multiplications: 196 cycles
305*e5436536SAndroid Build Coastguard Worker *
306*e5436536SAndroid Build Coastguard Worker * \param [i/o] re real input / output
307*e5436536SAndroid Build Coastguard Worker * \param [i/o] im imag input / output
308*e5436536SAndroid Build Coastguard Worker * \param [i ] s stride real and imag input / output
309*e5436536SAndroid Build Coastguard Worker *
310*e5436536SAndroid Build Coastguard Worker * \return void
311*e5436536SAndroid Build Coastguard Worker */
fft10(FIXP_DBL * x)312*e5436536SAndroid Build Coastguard Worker static void fft10(FIXP_DBL *x) // FIXP_DBL *re, FIXP_DBL *im, FIXP_SGL s)
313*e5436536SAndroid Build Coastguard Worker {
314*e5436536SAndroid Build Coastguard Worker FIXP_DBL t;
315*e5436536SAndroid Build Coastguard Worker FIXP_DBL x0, x1, x2, x3, x4;
316*e5436536SAndroid Build Coastguard Worker FIXP_DBL r1, r2, r3, r4;
317*e5436536SAndroid Build Coastguard Worker FIXP_DBL s1, s2, s3, s4;
318*e5436536SAndroid Build Coastguard Worker FIXP_DBL y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
319*e5436536SAndroid Build Coastguard Worker FIXP_DBL y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
320*e5436536SAndroid Build Coastguard Worker
321*e5436536SAndroid Build Coastguard Worker const int s = 1; // stride factor
322*e5436536SAndroid Build Coastguard Worker
323*e5436536SAndroid Build Coastguard Worker /* 2 fft5 stages */
324*e5436536SAndroid Build Coastguard Worker
325*e5436536SAndroid Build Coastguard Worker /* real part */
326*e5436536SAndroid Build Coastguard Worker x0 = (x[s * 0] >> SCALEFACTOR10);
327*e5436536SAndroid Build Coastguard Worker x1 = (x[s * 4] >> SCALEFACTOR10);
328*e5436536SAndroid Build Coastguard Worker x2 = (x[s * 8] >> SCALEFACTOR10);
329*e5436536SAndroid Build Coastguard Worker x3 = (x[s * 12] >> SCALEFACTOR10);
330*e5436536SAndroid Build Coastguard Worker x4 = (x[s * 16] >> SCALEFACTOR10);
331*e5436536SAndroid Build Coastguard Worker
332*e5436536SAndroid Build Coastguard Worker r1 = (x3 + x2);
333*e5436536SAndroid Build Coastguard Worker r4 = (x3 - x2);
334*e5436536SAndroid Build Coastguard Worker r3 = (x1 + x4);
335*e5436536SAndroid Build Coastguard Worker r2 = (x1 - x4);
336*e5436536SAndroid Build Coastguard Worker t = fMult((r1 - r3), C54);
337*e5436536SAndroid Build Coastguard Worker r1 = (r1 + r3);
338*e5436536SAndroid Build Coastguard Worker y00 = (x0 + r1);
339*e5436536SAndroid Build Coastguard Worker r1 = (y00 + ((fMult(r1, C55) << 1)));
340*e5436536SAndroid Build Coastguard Worker r3 = (r1 - t);
341*e5436536SAndroid Build Coastguard Worker r1 = (r1 + t);
342*e5436536SAndroid Build Coastguard Worker t = fMult((r4 + r2), C51);
343*e5436536SAndroid Build Coastguard Worker r4 = (t + (fMult(r4, C52) << 1));
344*e5436536SAndroid Build Coastguard Worker r2 = (t + fMult(r2, C53));
345*e5436536SAndroid Build Coastguard Worker
346*e5436536SAndroid Build Coastguard Worker /* imaginary part */
347*e5436536SAndroid Build Coastguard Worker x0 = (x[s * 0 + 1] >> SCALEFACTOR10);
348*e5436536SAndroid Build Coastguard Worker x1 = (x[s * 4 + 1] >> SCALEFACTOR10);
349*e5436536SAndroid Build Coastguard Worker x2 = (x[s * 8 + 1] >> SCALEFACTOR10);
350*e5436536SAndroid Build Coastguard Worker x3 = (x[s * 12 + 1] >> SCALEFACTOR10);
351*e5436536SAndroid Build Coastguard Worker x4 = (x[s * 16 + 1] >> SCALEFACTOR10);
352*e5436536SAndroid Build Coastguard Worker
353*e5436536SAndroid Build Coastguard Worker s1 = (x3 + x2);
354*e5436536SAndroid Build Coastguard Worker s4 = (x3 - x2);
355*e5436536SAndroid Build Coastguard Worker s3 = (x1 + x4);
356*e5436536SAndroid Build Coastguard Worker s2 = (x1 - x4);
357*e5436536SAndroid Build Coastguard Worker t = fMult((s1 - s3), C54);
358*e5436536SAndroid Build Coastguard Worker s1 = (s1 + s3);
359*e5436536SAndroid Build Coastguard Worker y01 = (x0 + s1);
360*e5436536SAndroid Build Coastguard Worker s1 = (y01 + (fMult(s1, C55) << 1));
361*e5436536SAndroid Build Coastguard Worker s3 = (s1 - t);
362*e5436536SAndroid Build Coastguard Worker s1 = (s1 + t);
363*e5436536SAndroid Build Coastguard Worker t = fMult((s4 + s2), C51);
364*e5436536SAndroid Build Coastguard Worker s4 = (t + (fMult(s4, C52) << 1));
365*e5436536SAndroid Build Coastguard Worker s2 = (t + fMult(s2, C53));
366*e5436536SAndroid Build Coastguard Worker
367*e5436536SAndroid Build Coastguard Worker /* combination */
368*e5436536SAndroid Build Coastguard Worker y04 = (r1 + s2);
369*e5436536SAndroid Build Coastguard Worker y16 = (r1 - s2);
370*e5436536SAndroid Build Coastguard Worker y08 = (r3 - s4);
371*e5436536SAndroid Build Coastguard Worker y12 = (r3 + s4);
372*e5436536SAndroid Build Coastguard Worker
373*e5436536SAndroid Build Coastguard Worker y05 = (s1 - r2);
374*e5436536SAndroid Build Coastguard Worker y17 = (s1 + r2);
375*e5436536SAndroid Build Coastguard Worker y09 = (s3 + r4);
376*e5436536SAndroid Build Coastguard Worker y13 = (s3 - r4);
377*e5436536SAndroid Build Coastguard Worker
378*e5436536SAndroid Build Coastguard Worker /* real part */
379*e5436536SAndroid Build Coastguard Worker x0 = (x[s * 10] >> SCALEFACTOR10);
380*e5436536SAndroid Build Coastguard Worker x1 = (x[s * 2] >> SCALEFACTOR10);
381*e5436536SAndroid Build Coastguard Worker x2 = (x[s * 6] >> SCALEFACTOR10);
382*e5436536SAndroid Build Coastguard Worker x3 = (x[s * 14] >> SCALEFACTOR10);
383*e5436536SAndroid Build Coastguard Worker x4 = (x[s * 18] >> SCALEFACTOR10);
384*e5436536SAndroid Build Coastguard Worker
385*e5436536SAndroid Build Coastguard Worker r1 = (x1 + x4);
386*e5436536SAndroid Build Coastguard Worker r4 = (x1 - x4);
387*e5436536SAndroid Build Coastguard Worker r3 = (x3 + x2);
388*e5436536SAndroid Build Coastguard Worker r2 = (x3 - x2);
389*e5436536SAndroid Build Coastguard Worker t = fMult((r1 - r3), C54);
390*e5436536SAndroid Build Coastguard Worker r1 = (r1 + r3);
391*e5436536SAndroid Build Coastguard Worker y02 = (x0 + r1);
392*e5436536SAndroid Build Coastguard Worker r1 = (y02 + ((fMult(r1, C55) << 1)));
393*e5436536SAndroid Build Coastguard Worker r3 = (r1 - t);
394*e5436536SAndroid Build Coastguard Worker r1 = (r1 + t);
395*e5436536SAndroid Build Coastguard Worker t = fMult(((r4 + r2)), C51);
396*e5436536SAndroid Build Coastguard Worker r4 = (t + (fMult(r4, C52) << 1));
397*e5436536SAndroid Build Coastguard Worker r2 = (t + fMult(r2, C53));
398*e5436536SAndroid Build Coastguard Worker
399*e5436536SAndroid Build Coastguard Worker /* imaginary part */
400*e5436536SAndroid Build Coastguard Worker x0 = (x[s * 10 + 1] >> SCALEFACTOR10);
401*e5436536SAndroid Build Coastguard Worker x1 = (x[s * 2 + 1] >> SCALEFACTOR10);
402*e5436536SAndroid Build Coastguard Worker x2 = (x[s * 6 + 1] >> SCALEFACTOR10);
403*e5436536SAndroid Build Coastguard Worker x3 = (x[s * 14 + 1] >> SCALEFACTOR10);
404*e5436536SAndroid Build Coastguard Worker x4 = (x[s * 18 + 1] >> SCALEFACTOR10);
405*e5436536SAndroid Build Coastguard Worker
406*e5436536SAndroid Build Coastguard Worker s1 = (x1 + x4);
407*e5436536SAndroid Build Coastguard Worker s4 = (x1 - x4);
408*e5436536SAndroid Build Coastguard Worker s3 = (x3 + x2);
409*e5436536SAndroid Build Coastguard Worker s2 = (x3 - x2);
410*e5436536SAndroid Build Coastguard Worker t = fMult((s1 - s3), C54);
411*e5436536SAndroid Build Coastguard Worker s1 = (s1 + s3);
412*e5436536SAndroid Build Coastguard Worker y03 = (x0 + s1);
413*e5436536SAndroid Build Coastguard Worker s1 = (y03 + (fMult(s1, C55) << 1));
414*e5436536SAndroid Build Coastguard Worker s3 = (s1 - t);
415*e5436536SAndroid Build Coastguard Worker s1 = (s1 + t);
416*e5436536SAndroid Build Coastguard Worker t = fMult((s4 + s2), C51);
417*e5436536SAndroid Build Coastguard Worker s4 = (t + (fMult(s4, C52) << 1));
418*e5436536SAndroid Build Coastguard Worker s2 = (t + fMult(s2, C53));
419*e5436536SAndroid Build Coastguard Worker
420*e5436536SAndroid Build Coastguard Worker /* combination */
421*e5436536SAndroid Build Coastguard Worker y06 = (r1 + s2);
422*e5436536SAndroid Build Coastguard Worker y18 = (r1 - s2);
423*e5436536SAndroid Build Coastguard Worker y10 = (r3 - s4);
424*e5436536SAndroid Build Coastguard Worker y14 = (r3 + s4);
425*e5436536SAndroid Build Coastguard Worker
426*e5436536SAndroid Build Coastguard Worker y07 = (s1 - r2);
427*e5436536SAndroid Build Coastguard Worker y19 = (s1 + r2);
428*e5436536SAndroid Build Coastguard Worker y11 = (s3 + r4);
429*e5436536SAndroid Build Coastguard Worker y15 = (s3 - r4);
430*e5436536SAndroid Build Coastguard Worker
431*e5436536SAndroid Build Coastguard Worker /* 5 fft2 stages */
432*e5436536SAndroid Build Coastguard Worker x[s * 0] = (y00 + y02);
433*e5436536SAndroid Build Coastguard Worker x[s * 0 + 1] = (y01 + y03);
434*e5436536SAndroid Build Coastguard Worker x[s * 10] = (y00 - y02);
435*e5436536SAndroid Build Coastguard Worker x[s * 10 + 1] = (y01 - y03);
436*e5436536SAndroid Build Coastguard Worker
437*e5436536SAndroid Build Coastguard Worker x[s * 4] = (y04 + y06);
438*e5436536SAndroid Build Coastguard Worker x[s * 4 + 1] = (y05 + y07);
439*e5436536SAndroid Build Coastguard Worker x[s * 14] = (y04 - y06);
440*e5436536SAndroid Build Coastguard Worker x[s * 14 + 1] = (y05 - y07);
441*e5436536SAndroid Build Coastguard Worker
442*e5436536SAndroid Build Coastguard Worker x[s * 8] = (y08 + y10);
443*e5436536SAndroid Build Coastguard Worker x[s * 8 + 1] = (y09 + y11);
444*e5436536SAndroid Build Coastguard Worker x[s * 18] = (y08 - y10);
445*e5436536SAndroid Build Coastguard Worker x[s * 18 + 1] = (y09 - y11);
446*e5436536SAndroid Build Coastguard Worker
447*e5436536SAndroid Build Coastguard Worker x[s * 12] = (y12 + y14);
448*e5436536SAndroid Build Coastguard Worker x[s * 12 + 1] = (y13 + y15);
449*e5436536SAndroid Build Coastguard Worker x[s * 2] = (y12 - y14);
450*e5436536SAndroid Build Coastguard Worker x[s * 2 + 1] = (y13 - y15);
451*e5436536SAndroid Build Coastguard Worker
452*e5436536SAndroid Build Coastguard Worker x[s * 16] = (y16 + y18);
453*e5436536SAndroid Build Coastguard Worker x[s * 16 + 1] = (y17 + y19);
454*e5436536SAndroid Build Coastguard Worker x[s * 6] = (y16 - y18);
455*e5436536SAndroid Build Coastguard Worker x[s * 6 + 1] = (y17 - y19);
456*e5436536SAndroid Build Coastguard Worker }
457*e5436536SAndroid Build Coastguard Worker
458*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft12
459*e5436536SAndroid Build Coastguard Worker #define FUNCTION_fft12
460*e5436536SAndroid Build Coastguard Worker
461*e5436536SAndroid Build Coastguard Worker #undef C31
462*e5436536SAndroid Build Coastguard Worker #define C31 (STC(0x91261468)) /* FL2FXCONST_DBL(-0.86602540) = -sqrt(3)/2 */
463*e5436536SAndroid Build Coastguard Worker
fft12(FIXP_DBL * pInput)464*e5436536SAndroid Build Coastguard Worker static inline void fft12(FIXP_DBL *pInput) {
465*e5436536SAndroid Build Coastguard Worker FIXP_DBL aDst[24];
466*e5436536SAndroid Build Coastguard Worker FIXP_DBL *pSrc, *pDst;
467*e5436536SAndroid Build Coastguard Worker int i;
468*e5436536SAndroid Build Coastguard Worker
469*e5436536SAndroid Build Coastguard Worker pSrc = pInput;
470*e5436536SAndroid Build Coastguard Worker pDst = aDst;
471*e5436536SAndroid Build Coastguard Worker FIXP_DBL r1, r2, s1, s2, pD;
472*e5436536SAndroid Build Coastguard Worker
473*e5436536SAndroid Build Coastguard Worker /* First 3*2 samples are shifted right by 2 before output */
474*e5436536SAndroid Build Coastguard Worker r1 = pSrc[8] + pSrc[16];
475*e5436536SAndroid Build Coastguard Worker r2 = fMultDiv2((pSrc[8] - pSrc[16]), C31);
476*e5436536SAndroid Build Coastguard Worker pD = pSrc[0] >> 1;
477*e5436536SAndroid Build Coastguard Worker pDst[0] = (pD + (r1 >> 1)) >> 1;
478*e5436536SAndroid Build Coastguard Worker r1 = pD - (r1 >> 2);
479*e5436536SAndroid Build Coastguard Worker
480*e5436536SAndroid Build Coastguard Worker /* imaginary part */
481*e5436536SAndroid Build Coastguard Worker s1 = pSrc[9] + pSrc[17];
482*e5436536SAndroid Build Coastguard Worker s2 = fMultDiv2((pSrc[9] - pSrc[17]), C31);
483*e5436536SAndroid Build Coastguard Worker pD = pSrc[1] >> 1;
484*e5436536SAndroid Build Coastguard Worker pDst[1] = (pD + (s1 >> 1)) >> 1;
485*e5436536SAndroid Build Coastguard Worker s1 = pD - (s1 >> 2);
486*e5436536SAndroid Build Coastguard Worker
487*e5436536SAndroid Build Coastguard Worker /* combination */
488*e5436536SAndroid Build Coastguard Worker pDst[2] = (r1 - s2) >> 1;
489*e5436536SAndroid Build Coastguard Worker pDst[3] = (s1 + r2) >> 1;
490*e5436536SAndroid Build Coastguard Worker pDst[4] = (r1 + s2) >> 1;
491*e5436536SAndroid Build Coastguard Worker pDst[5] = (s1 - r2) >> 1;
492*e5436536SAndroid Build Coastguard Worker pSrc += 2;
493*e5436536SAndroid Build Coastguard Worker pDst += 6;
494*e5436536SAndroid Build Coastguard Worker
495*e5436536SAndroid Build Coastguard Worker const FIXP_STB *pVecRe = RotVectorReal12;
496*e5436536SAndroid Build Coastguard Worker const FIXP_STB *pVecIm = RotVectorImag12;
497*e5436536SAndroid Build Coastguard Worker FIXP_DBL re, im;
498*e5436536SAndroid Build Coastguard Worker FIXP_STB vre, vim;
499*e5436536SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
500*e5436536SAndroid Build Coastguard Worker /* sample 0,1 are shifted right by 2 before output */
501*e5436536SAndroid Build Coastguard Worker /* sample 2,3 4,5 are shifted right by 1 and complex multiplied before
502*e5436536SAndroid Build Coastguard Worker * output */
503*e5436536SAndroid Build Coastguard Worker
504*e5436536SAndroid Build Coastguard Worker r1 = pSrc[8] + pSrc[16];
505*e5436536SAndroid Build Coastguard Worker r2 = fMultDiv2((pSrc[8] - pSrc[16]), C31);
506*e5436536SAndroid Build Coastguard Worker pD = pSrc[0] >> 1;
507*e5436536SAndroid Build Coastguard Worker pDst[0] = (pD + (r1 >> 1)) >> 1;
508*e5436536SAndroid Build Coastguard Worker r1 = pD - (r1 >> 2);
509*e5436536SAndroid Build Coastguard Worker
510*e5436536SAndroid Build Coastguard Worker /* imaginary part */
511*e5436536SAndroid Build Coastguard Worker s1 = pSrc[9] + pSrc[17];
512*e5436536SAndroid Build Coastguard Worker s2 = fMultDiv2((pSrc[9] - pSrc[17]), C31);
513*e5436536SAndroid Build Coastguard Worker pD = pSrc[1] >> 1;
514*e5436536SAndroid Build Coastguard Worker pDst[1] = (pD + (s1 >> 1)) >> 1;
515*e5436536SAndroid Build Coastguard Worker s1 = pD - (s1 >> 2);
516*e5436536SAndroid Build Coastguard Worker
517*e5436536SAndroid Build Coastguard Worker /* combination */
518*e5436536SAndroid Build Coastguard Worker re = (r1 - s2) >> 0;
519*e5436536SAndroid Build Coastguard Worker im = (s1 + r2) >> 0;
520*e5436536SAndroid Build Coastguard Worker vre = *pVecRe++;
521*e5436536SAndroid Build Coastguard Worker vim = *pVecIm++;
522*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&pDst[3], &pDst[2], im, re, vre, vim);
523*e5436536SAndroid Build Coastguard Worker
524*e5436536SAndroid Build Coastguard Worker re = (r1 + s2) >> 0;
525*e5436536SAndroid Build Coastguard Worker im = (s1 - r2) >> 0;
526*e5436536SAndroid Build Coastguard Worker vre = *pVecRe++;
527*e5436536SAndroid Build Coastguard Worker vim = *pVecIm++;
528*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&pDst[5], &pDst[4], im, re, vre, vim);
529*e5436536SAndroid Build Coastguard Worker
530*e5436536SAndroid Build Coastguard Worker pDst += 6;
531*e5436536SAndroid Build Coastguard Worker pSrc += 2;
532*e5436536SAndroid Build Coastguard Worker }
533*e5436536SAndroid Build Coastguard Worker /* sample 0,1 are shifted right by 2 before output */
534*e5436536SAndroid Build Coastguard Worker /* sample 2,3 is shifted right by 1 and complex multiplied with (0.0,+1.0) */
535*e5436536SAndroid Build Coastguard Worker /* sample 4,5 is shifted right by 1 and complex multiplied with (-1.0,0.0) */
536*e5436536SAndroid Build Coastguard Worker r1 = pSrc[8] + pSrc[16];
537*e5436536SAndroid Build Coastguard Worker r2 = fMultDiv2((pSrc[8] - pSrc[16]), C31);
538*e5436536SAndroid Build Coastguard Worker pD = pSrc[0] >> 1;
539*e5436536SAndroid Build Coastguard Worker pDst[0] = (pD + (r1 >> 1)) >> 1;
540*e5436536SAndroid Build Coastguard Worker r1 = pD - (r1 >> 2);
541*e5436536SAndroid Build Coastguard Worker
542*e5436536SAndroid Build Coastguard Worker /* imaginary part */
543*e5436536SAndroid Build Coastguard Worker s1 = pSrc[9] + pSrc[17];
544*e5436536SAndroid Build Coastguard Worker s2 = fMultDiv2((pSrc[9] - pSrc[17]), C31);
545*e5436536SAndroid Build Coastguard Worker pD = pSrc[1] >> 1;
546*e5436536SAndroid Build Coastguard Worker pDst[1] = (pD + (s1 >> 1)) >> 1;
547*e5436536SAndroid Build Coastguard Worker s1 = pD - (s1 >> 2);
548*e5436536SAndroid Build Coastguard Worker
549*e5436536SAndroid Build Coastguard Worker /* combination */
550*e5436536SAndroid Build Coastguard Worker pDst[2] = (s1 + r2) >> 1;
551*e5436536SAndroid Build Coastguard Worker pDst[3] = (s2 - r1) >> 1;
552*e5436536SAndroid Build Coastguard Worker pDst[4] = -((r1 + s2) >> 1);
553*e5436536SAndroid Build Coastguard Worker pDst[5] = (r2 - s1) >> 1;
554*e5436536SAndroid Build Coastguard Worker
555*e5436536SAndroid Build Coastguard Worker /* Perform 3 times the fft of length 4. The input samples are at the address
556*e5436536SAndroid Build Coastguard Worker of aDst and the output samples are at the address of pInput. The input vector
557*e5436536SAndroid Build Coastguard Worker for the fft of length 4 is built of the interleaved samples in aDst, the
558*e5436536SAndroid Build Coastguard Worker output samples are stored consecutively at the address of pInput.
559*e5436536SAndroid Build Coastguard Worker */
560*e5436536SAndroid Build Coastguard Worker pSrc = aDst;
561*e5436536SAndroid Build Coastguard Worker pDst = pInput;
562*e5436536SAndroid Build Coastguard Worker for (i = 0; i < 3; i++) {
563*e5436536SAndroid Build Coastguard Worker /* inline FFT4 merged with incoming resorting loop */
564*e5436536SAndroid Build Coastguard Worker FIXP_DBL a00, a10, a20, a30, tmp0, tmp1;
565*e5436536SAndroid Build Coastguard Worker
566*e5436536SAndroid Build Coastguard Worker a00 = (pSrc[0] + pSrc[12]) >> 1; /* Re A + Re B */
567*e5436536SAndroid Build Coastguard Worker a10 = (pSrc[6] + pSrc[18]) >> 1; /* Re C + Re D */
568*e5436536SAndroid Build Coastguard Worker a20 = (pSrc[1] + pSrc[13]) >> 1; /* Im A + Im B */
569*e5436536SAndroid Build Coastguard Worker a30 = (pSrc[7] + pSrc[19]) >> 1; /* Im C + Im D */
570*e5436536SAndroid Build Coastguard Worker
571*e5436536SAndroid Build Coastguard Worker pDst[0] = a00 + a10; /* Re A' = Re A + Re B + Re C + Re D */
572*e5436536SAndroid Build Coastguard Worker pDst[1] = a20 + a30; /* Im A' = Im A + Im B + Im C + Im D */
573*e5436536SAndroid Build Coastguard Worker
574*e5436536SAndroid Build Coastguard Worker tmp0 = a00 - pSrc[12]; /* Re A - Re B */
575*e5436536SAndroid Build Coastguard Worker tmp1 = a20 - pSrc[13]; /* Im A - Im B */
576*e5436536SAndroid Build Coastguard Worker
577*e5436536SAndroid Build Coastguard Worker pDst[12] = a00 - a10; /* Re C' = Re A + Re B - Re C - Re D */
578*e5436536SAndroid Build Coastguard Worker pDst[13] = a20 - a30; /* Im C' = Im A + Im B - Im C - Im D */
579*e5436536SAndroid Build Coastguard Worker
580*e5436536SAndroid Build Coastguard Worker a10 = a10 - pSrc[18]; /* Re C - Re D */
581*e5436536SAndroid Build Coastguard Worker a30 = a30 - pSrc[19]; /* Im C - Im D */
582*e5436536SAndroid Build Coastguard Worker
583*e5436536SAndroid Build Coastguard Worker pDst[6] = tmp0 + a30; /* Re B' = Re A - Re B + Im C - Im D */
584*e5436536SAndroid Build Coastguard Worker pDst[18] = tmp0 - a30; /* Re D' = Re A - Re B - Im C + Im D */
585*e5436536SAndroid Build Coastguard Worker pDst[7] = tmp1 - a10; /* Im B' = Im A - Im B - Re C + Re D */
586*e5436536SAndroid Build Coastguard Worker pDst[19] = tmp1 + a10; /* Im D' = Im A - Im B + Re C - Re D */
587*e5436536SAndroid Build Coastguard Worker
588*e5436536SAndroid Build Coastguard Worker pSrc += 2;
589*e5436536SAndroid Build Coastguard Worker pDst += 2;
590*e5436536SAndroid Build Coastguard Worker }
591*e5436536SAndroid Build Coastguard Worker }
592*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft12 */
593*e5436536SAndroid Build Coastguard Worker
594*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft15
595*e5436536SAndroid Build Coastguard Worker
596*e5436536SAndroid Build Coastguard Worker #define N3 3
597*e5436536SAndroid Build Coastguard Worker #define N5 5
598*e5436536SAndroid Build Coastguard Worker #define N6 6
599*e5436536SAndroid Build Coastguard Worker #define N15 15
600*e5436536SAndroid Build Coastguard Worker
601*e5436536SAndroid Build Coastguard Worker /* Performs the FFT of length 15. It is split into FFTs of length 3 and
602*e5436536SAndroid Build Coastguard Worker * length 5. */
fft15(FIXP_DBL * pInput)603*e5436536SAndroid Build Coastguard Worker static inline void fft15(FIXP_DBL *pInput) {
604*e5436536SAndroid Build Coastguard Worker FIXP_DBL aDst[2 * N15];
605*e5436536SAndroid Build Coastguard Worker FIXP_DBL aDst1[2 * N15];
606*e5436536SAndroid Build Coastguard Worker int i, k, l;
607*e5436536SAndroid Build Coastguard Worker
608*e5436536SAndroid Build Coastguard Worker /* Sort input vector for fft's of length 3
609*e5436536SAndroid Build Coastguard Worker input3(0:2) = [input(0) input(5) input(10)];
610*e5436536SAndroid Build Coastguard Worker input3(3:5) = [input(3) input(8) input(13)];
611*e5436536SAndroid Build Coastguard Worker input3(6:8) = [input(6) input(11) input(1)];
612*e5436536SAndroid Build Coastguard Worker input3(9:11) = [input(9) input(14) input(4)];
613*e5436536SAndroid Build Coastguard Worker input3(12:14) = [input(12) input(2) input(7)]; */
614*e5436536SAndroid Build Coastguard Worker {
615*e5436536SAndroid Build Coastguard Worker const FIXP_DBL *pSrc = pInput;
616*e5436536SAndroid Build Coastguard Worker FIXP_DBL *RESTRICT pDst = aDst;
617*e5436536SAndroid Build Coastguard Worker /* Merge 3 loops into one, skip call of fft3 */
618*e5436536SAndroid Build Coastguard Worker for (i = 0, l = 0, k = 0; i < N5; i++, k += 6) {
619*e5436536SAndroid Build Coastguard Worker pDst[k + 0] = pSrc[l];
620*e5436536SAndroid Build Coastguard Worker pDst[k + 1] = pSrc[l + 1];
621*e5436536SAndroid Build Coastguard Worker l += 2 * N5;
622*e5436536SAndroid Build Coastguard Worker if (l >= (2 * N15)) l -= (2 * N15);
623*e5436536SAndroid Build Coastguard Worker
624*e5436536SAndroid Build Coastguard Worker pDst[k + 2] = pSrc[l];
625*e5436536SAndroid Build Coastguard Worker pDst[k + 3] = pSrc[l + 1];
626*e5436536SAndroid Build Coastguard Worker l += 2 * N5;
627*e5436536SAndroid Build Coastguard Worker if (l >= (2 * N15)) l -= (2 * N15);
628*e5436536SAndroid Build Coastguard Worker pDst[k + 4] = pSrc[l];
629*e5436536SAndroid Build Coastguard Worker pDst[k + 5] = pSrc[l + 1];
630*e5436536SAndroid Build Coastguard Worker l += (2 * N5) + (2 * N3);
631*e5436536SAndroid Build Coastguard Worker if (l >= (2 * N15)) l -= (2 * N15);
632*e5436536SAndroid Build Coastguard Worker
633*e5436536SAndroid Build Coastguard Worker /* fft3 merged with shift right by 2 loop */
634*e5436536SAndroid Build Coastguard Worker FIXP_DBL r1, r2, r3;
635*e5436536SAndroid Build Coastguard Worker FIXP_DBL s1, s2;
636*e5436536SAndroid Build Coastguard Worker /* real part */
637*e5436536SAndroid Build Coastguard Worker r1 = pDst[k + 2] + pDst[k + 4];
638*e5436536SAndroid Build Coastguard Worker r2 = fMult((pDst[k + 2] - pDst[k + 4]), C31);
639*e5436536SAndroid Build Coastguard Worker s1 = pDst[k + 0];
640*e5436536SAndroid Build Coastguard Worker pDst[k + 0] = (s1 + r1) >> 2;
641*e5436536SAndroid Build Coastguard Worker r1 = s1 - (r1 >> 1);
642*e5436536SAndroid Build Coastguard Worker
643*e5436536SAndroid Build Coastguard Worker /* imaginary part */
644*e5436536SAndroid Build Coastguard Worker s1 = pDst[k + 3] + pDst[k + 5];
645*e5436536SAndroid Build Coastguard Worker s2 = fMult((pDst[k + 3] - pDst[k + 5]), C31);
646*e5436536SAndroid Build Coastguard Worker r3 = pDst[k + 1];
647*e5436536SAndroid Build Coastguard Worker pDst[k + 1] = (r3 + s1) >> 2;
648*e5436536SAndroid Build Coastguard Worker s1 = r3 - (s1 >> 1);
649*e5436536SAndroid Build Coastguard Worker
650*e5436536SAndroid Build Coastguard Worker /* combination */
651*e5436536SAndroid Build Coastguard Worker pDst[k + 2] = (r1 - s2) >> 2;
652*e5436536SAndroid Build Coastguard Worker pDst[k + 4] = (r1 + s2) >> 2;
653*e5436536SAndroid Build Coastguard Worker pDst[k + 3] = (s1 + r2) >> 2;
654*e5436536SAndroid Build Coastguard Worker pDst[k + 5] = (s1 - r2) >> 2;
655*e5436536SAndroid Build Coastguard Worker }
656*e5436536SAndroid Build Coastguard Worker }
657*e5436536SAndroid Build Coastguard Worker /* Sort input vector for fft's of length 5
658*e5436536SAndroid Build Coastguard Worker input5(0:4) = [output3(0) output3(3) output3(6) output3(9) output3(12)];
659*e5436536SAndroid Build Coastguard Worker input5(5:9) = [output3(1) output3(4) output3(7) output3(10) output3(13)];
660*e5436536SAndroid Build Coastguard Worker input5(10:14) = [output3(2) output3(5) output3(8) output3(11) output3(14)]; */
661*e5436536SAndroid Build Coastguard Worker /* Merge 2 loops into one, brings about 10% */
662*e5436536SAndroid Build Coastguard Worker {
663*e5436536SAndroid Build Coastguard Worker const FIXP_DBL *pSrc = aDst;
664*e5436536SAndroid Build Coastguard Worker FIXP_DBL *RESTRICT pDst = aDst1;
665*e5436536SAndroid Build Coastguard Worker for (i = 0, l = 0, k = 0; i < N3; i++, k += 10) {
666*e5436536SAndroid Build Coastguard Worker l = 2 * i;
667*e5436536SAndroid Build Coastguard Worker pDst[k + 0] = pSrc[l + 0];
668*e5436536SAndroid Build Coastguard Worker pDst[k + 1] = pSrc[l + 1];
669*e5436536SAndroid Build Coastguard Worker pDst[k + 2] = pSrc[l + 0 + (2 * N3)];
670*e5436536SAndroid Build Coastguard Worker pDst[k + 3] = pSrc[l + 1 + (2 * N3)];
671*e5436536SAndroid Build Coastguard Worker pDst[k + 4] = pSrc[l + 0 + (4 * N3)];
672*e5436536SAndroid Build Coastguard Worker pDst[k + 5] = pSrc[l + 1 + (4 * N3)];
673*e5436536SAndroid Build Coastguard Worker pDst[k + 6] = pSrc[l + 0 + (6 * N3)];
674*e5436536SAndroid Build Coastguard Worker pDst[k + 7] = pSrc[l + 1 + (6 * N3)];
675*e5436536SAndroid Build Coastguard Worker pDst[k + 8] = pSrc[l + 0 + (8 * N3)];
676*e5436536SAndroid Build Coastguard Worker pDst[k + 9] = pSrc[l + 1 + (8 * N3)];
677*e5436536SAndroid Build Coastguard Worker fft5(&pDst[k]);
678*e5436536SAndroid Build Coastguard Worker }
679*e5436536SAndroid Build Coastguard Worker }
680*e5436536SAndroid Build Coastguard Worker /* Sort output vector of length 15
681*e5436536SAndroid Build Coastguard Worker output = [out5(0) out5(6) out5(12) out5(3) out5(9)
682*e5436536SAndroid Build Coastguard Worker out5(10) out5(1) out5(7) out5(13) out5(4)
683*e5436536SAndroid Build Coastguard Worker out5(5) out5(11) out5(2) out5(8) out5(14)]; */
684*e5436536SAndroid Build Coastguard Worker /* optimize clumsy loop, brings about 5% */
685*e5436536SAndroid Build Coastguard Worker {
686*e5436536SAndroid Build Coastguard Worker const FIXP_DBL *pSrc = aDst1;
687*e5436536SAndroid Build Coastguard Worker FIXP_DBL *RESTRICT pDst = pInput;
688*e5436536SAndroid Build Coastguard Worker for (i = 0, l = 0, k = 0; i < N3; i++, k += 10) {
689*e5436536SAndroid Build Coastguard Worker pDst[k + 0] = pSrc[l];
690*e5436536SAndroid Build Coastguard Worker pDst[k + 1] = pSrc[l + 1];
691*e5436536SAndroid Build Coastguard Worker l += (2 * N6);
692*e5436536SAndroid Build Coastguard Worker if (l >= (2 * N15)) l -= (2 * N15);
693*e5436536SAndroid Build Coastguard Worker pDst[k + 2] = pSrc[l];
694*e5436536SAndroid Build Coastguard Worker pDst[k + 3] = pSrc[l + 1];
695*e5436536SAndroid Build Coastguard Worker l += (2 * N6);
696*e5436536SAndroid Build Coastguard Worker if (l >= (2 * N15)) l -= (2 * N15);
697*e5436536SAndroid Build Coastguard Worker pDst[k + 4] = pSrc[l];
698*e5436536SAndroid Build Coastguard Worker pDst[k + 5] = pSrc[l + 1];
699*e5436536SAndroid Build Coastguard Worker l += (2 * N6);
700*e5436536SAndroid Build Coastguard Worker if (l >= (2 * N15)) l -= (2 * N15);
701*e5436536SAndroid Build Coastguard Worker pDst[k + 6] = pSrc[l];
702*e5436536SAndroid Build Coastguard Worker pDst[k + 7] = pSrc[l + 1];
703*e5436536SAndroid Build Coastguard Worker l += (2 * N6);
704*e5436536SAndroid Build Coastguard Worker if (l >= (2 * N15)) l -= (2 * N15);
705*e5436536SAndroid Build Coastguard Worker pDst[k + 8] = pSrc[l];
706*e5436536SAndroid Build Coastguard Worker pDst[k + 9] = pSrc[l + 1];
707*e5436536SAndroid Build Coastguard Worker l += 2; /* no modulo check needed, it cannot occur */
708*e5436536SAndroid Build Coastguard Worker }
709*e5436536SAndroid Build Coastguard Worker }
710*e5436536SAndroid Build Coastguard Worker }
711*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft15 */
712*e5436536SAndroid Build Coastguard Worker
713*e5436536SAndroid Build Coastguard Worker /*
714*e5436536SAndroid Build Coastguard Worker Select shift placement.
715*e5436536SAndroid Build Coastguard Worker Some processors like ARM may shift "for free" in combination with an addition
716*e5436536SAndroid Build Coastguard Worker or substraction, but others don't so either combining shift with +/- or reduce
717*e5436536SAndroid Build Coastguard Worker the total amount or shift operations is optimal
718*e5436536SAndroid Build Coastguard Worker */
719*e5436536SAndroid Build Coastguard Worker #if !defined(__arm__)
720*e5436536SAndroid Build Coastguard Worker #define SHIFT_A >> 1
721*e5436536SAndroid Build Coastguard Worker #define SHIFT_B
722*e5436536SAndroid Build Coastguard Worker #else
723*e5436536SAndroid Build Coastguard Worker #define SHIFT_A
724*e5436536SAndroid Build Coastguard Worker #define SHIFT_B >> 1
725*e5436536SAndroid Build Coastguard Worker #endif
726*e5436536SAndroid Build Coastguard Worker
727*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft_16 /* we check, if fft_16 (FIXP_DBL *) is not yet defined \
728*e5436536SAndroid Build Coastguard Worker */
729*e5436536SAndroid Build Coastguard Worker
730*e5436536SAndroid Build Coastguard Worker /* This defines prevents this array to be declared twice, if 16-bit fft is
731*e5436536SAndroid Build Coastguard Worker * enabled too */
732*e5436536SAndroid Build Coastguard Worker #define FUNCTION_DATA_fft_16_w16
733*e5436536SAndroid Build Coastguard Worker static const FIXP_STP fft16_w16[2] = {STCP(0x7641af3d, 0x30fbc54d),
734*e5436536SAndroid Build Coastguard Worker STCP(0x30fbc54d, 0x7641af3d)};
735*e5436536SAndroid Build Coastguard Worker
736*e5436536SAndroid Build Coastguard Worker LNK_SECTION_CODE_L1
fft_16(FIXP_DBL * RESTRICT x)737*e5436536SAndroid Build Coastguard Worker inline void fft_16(FIXP_DBL *RESTRICT x) {
738*e5436536SAndroid Build Coastguard Worker FIXP_DBL vr, ur;
739*e5436536SAndroid Build Coastguard Worker FIXP_DBL vr2, ur2;
740*e5436536SAndroid Build Coastguard Worker FIXP_DBL vr3, ur3;
741*e5436536SAndroid Build Coastguard Worker FIXP_DBL vr4, ur4;
742*e5436536SAndroid Build Coastguard Worker FIXP_DBL vi, ui;
743*e5436536SAndroid Build Coastguard Worker FIXP_DBL vi2, ui2;
744*e5436536SAndroid Build Coastguard Worker FIXP_DBL vi3, ui3;
745*e5436536SAndroid Build Coastguard Worker
746*e5436536SAndroid Build Coastguard Worker vr = (x[0] >> 1) + (x[16] >> 1); /* Re A + Re B */
747*e5436536SAndroid Build Coastguard Worker ur = (x[1] >> 1) + (x[17] >> 1); /* Im A + Im B */
748*e5436536SAndroid Build Coastguard Worker vi = (x[8] SHIFT_A) + (x[24] SHIFT_A); /* Re C + Re D */
749*e5436536SAndroid Build Coastguard Worker ui = (x[9] SHIFT_A) + (x[25] SHIFT_A); /* Im C + Im D */
750*e5436536SAndroid Build Coastguard Worker x[0] = vr + (vi SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
751*e5436536SAndroid Build Coastguard Worker x[1] = ur + (ui SHIFT_B); /* Im A' = sum of imag values */
752*e5436536SAndroid Build Coastguard Worker
753*e5436536SAndroid Build Coastguard Worker vr2 = (x[4] >> 1) + (x[20] >> 1); /* Re A + Re B */
754*e5436536SAndroid Build Coastguard Worker ur2 = (x[5] >> 1) + (x[21] >> 1); /* Im A + Im B */
755*e5436536SAndroid Build Coastguard Worker
756*e5436536SAndroid Build Coastguard Worker x[4] = vr - (vi SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
757*e5436536SAndroid Build Coastguard Worker x[5] = ur - (ui SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
758*e5436536SAndroid Build Coastguard Worker vr -= x[16]; /* Re A - Re B */
759*e5436536SAndroid Build Coastguard Worker vi = (vi SHIFT_B)-x[24]; /* Re C - Re D */
760*e5436536SAndroid Build Coastguard Worker ur -= x[17]; /* Im A - Im B */
761*e5436536SAndroid Build Coastguard Worker ui = (ui SHIFT_B)-x[25]; /* Im C - Im D */
762*e5436536SAndroid Build Coastguard Worker
763*e5436536SAndroid Build Coastguard Worker vr3 = (x[2] >> 1) + (x[18] >> 1); /* Re A + Re B */
764*e5436536SAndroid Build Coastguard Worker ur3 = (x[3] >> 1) + (x[19] >> 1); /* Im A + Im B */
765*e5436536SAndroid Build Coastguard Worker
766*e5436536SAndroid Build Coastguard Worker x[2] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */
767*e5436536SAndroid Build Coastguard Worker x[3] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */
768*e5436536SAndroid Build Coastguard Worker
769*e5436536SAndroid Build Coastguard Worker vr4 = (x[6] >> 1) + (x[22] >> 1); /* Re A + Re B */
770*e5436536SAndroid Build Coastguard Worker ur4 = (x[7] >> 1) + (x[23] >> 1); /* Im A + Im B */
771*e5436536SAndroid Build Coastguard Worker
772*e5436536SAndroid Build Coastguard Worker x[6] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */
773*e5436536SAndroid Build Coastguard Worker x[7] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */
774*e5436536SAndroid Build Coastguard Worker
775*e5436536SAndroid Build Coastguard Worker vi2 = (x[12] SHIFT_A) + (x[28] SHIFT_A); /* Re C + Re D */
776*e5436536SAndroid Build Coastguard Worker ui2 = (x[13] SHIFT_A) + (x[29] SHIFT_A); /* Im C + Im D */
777*e5436536SAndroid Build Coastguard Worker x[8] = vr2 + (vi2 SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
778*e5436536SAndroid Build Coastguard Worker x[9] = ur2 + (ui2 SHIFT_B); /* Im A' = sum of imag values */
779*e5436536SAndroid Build Coastguard Worker x[12] = vr2 - (vi2 SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
780*e5436536SAndroid Build Coastguard Worker x[13] = ur2 - (ui2 SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
781*e5436536SAndroid Build Coastguard Worker vr2 -= x[20]; /* Re A - Re B */
782*e5436536SAndroid Build Coastguard Worker ur2 -= x[21]; /* Im A - Im B */
783*e5436536SAndroid Build Coastguard Worker vi2 = (vi2 SHIFT_B)-x[28]; /* Re C - Re D */
784*e5436536SAndroid Build Coastguard Worker ui2 = (ui2 SHIFT_B)-x[29]; /* Im C - Im D */
785*e5436536SAndroid Build Coastguard Worker
786*e5436536SAndroid Build Coastguard Worker vi = (x[10] SHIFT_A) + (x[26] SHIFT_A); /* Re C + Re D */
787*e5436536SAndroid Build Coastguard Worker ui = (x[11] SHIFT_A) + (x[27] SHIFT_A); /* Im C + Im D */
788*e5436536SAndroid Build Coastguard Worker
789*e5436536SAndroid Build Coastguard Worker x[10] = ui2 + vr2; /* Re B' = Im C - Im D + Re A - Re B */
790*e5436536SAndroid Build Coastguard Worker x[11] = ur2 - vi2; /* Im B'= -Re C + Re D + Im A - Im B */
791*e5436536SAndroid Build Coastguard Worker
792*e5436536SAndroid Build Coastguard Worker vi3 = (x[14] SHIFT_A) + (x[30] SHIFT_A); /* Re C + Re D */
793*e5436536SAndroid Build Coastguard Worker ui3 = (x[15] SHIFT_A) + (x[31] SHIFT_A); /* Im C + Im D */
794*e5436536SAndroid Build Coastguard Worker
795*e5436536SAndroid Build Coastguard Worker x[14] = vr2 - ui2; /* Re D' = -Im C + Im D + Re A - Re B */
796*e5436536SAndroid Build Coastguard Worker x[15] = vi2 + ur2; /* Im D'= Re C - Re D + Im A - Im B */
797*e5436536SAndroid Build Coastguard Worker
798*e5436536SAndroid Build Coastguard Worker x[16] = vr3 + (vi SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
799*e5436536SAndroid Build Coastguard Worker x[17] = ur3 + (ui SHIFT_B); /* Im A' = sum of imag values */
800*e5436536SAndroid Build Coastguard Worker x[20] = vr3 - (vi SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
801*e5436536SAndroid Build Coastguard Worker x[21] = ur3 - (ui SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
802*e5436536SAndroid Build Coastguard Worker vr3 -= x[18]; /* Re A - Re B */
803*e5436536SAndroid Build Coastguard Worker ur3 -= x[19]; /* Im A - Im B */
804*e5436536SAndroid Build Coastguard Worker vi = (vi SHIFT_B)-x[26]; /* Re C - Re D */
805*e5436536SAndroid Build Coastguard Worker ui = (ui SHIFT_B)-x[27]; /* Im C - Im D */
806*e5436536SAndroid Build Coastguard Worker x[18] = ui + vr3; /* Re B' = Im C - Im D + Re A - Re B */
807*e5436536SAndroid Build Coastguard Worker x[19] = ur3 - vi; /* Im B'= -Re C + Re D + Im A - Im B */
808*e5436536SAndroid Build Coastguard Worker
809*e5436536SAndroid Build Coastguard Worker x[24] = vr4 + (vi3 SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
810*e5436536SAndroid Build Coastguard Worker x[28] = vr4 - (vi3 SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
811*e5436536SAndroid Build Coastguard Worker x[25] = ur4 + (ui3 SHIFT_B); /* Im A' = sum of imag values */
812*e5436536SAndroid Build Coastguard Worker x[29] = ur4 - (ui3 SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
813*e5436536SAndroid Build Coastguard Worker vr4 -= x[22]; /* Re A - Re B */
814*e5436536SAndroid Build Coastguard Worker ur4 -= x[23]; /* Im A - Im B */
815*e5436536SAndroid Build Coastguard Worker
816*e5436536SAndroid Build Coastguard Worker x[22] = vr3 - ui; /* Re D' = -Im C + Im D + Re A - Re B */
817*e5436536SAndroid Build Coastguard Worker x[23] = vi + ur3; /* Im D'= Re C - Re D + Im A - Im B */
818*e5436536SAndroid Build Coastguard Worker
819*e5436536SAndroid Build Coastguard Worker vi3 = (vi3 SHIFT_B)-x[30]; /* Re C - Re D */
820*e5436536SAndroid Build Coastguard Worker ui3 = (ui3 SHIFT_B)-x[31]; /* Im C - Im D */
821*e5436536SAndroid Build Coastguard Worker x[26] = ui3 + vr4; /* Re B' = Im C - Im D + Re A - Re B */
822*e5436536SAndroid Build Coastguard Worker x[30] = vr4 - ui3; /* Re D' = -Im C + Im D + Re A - Re B */
823*e5436536SAndroid Build Coastguard Worker x[27] = ur4 - vi3; /* Im B'= -Re C + Re D + Im A - Im B */
824*e5436536SAndroid Build Coastguard Worker x[31] = vi3 + ur4; /* Im D'= Re C - Re D + Im A - Im B */
825*e5436536SAndroid Build Coastguard Worker
826*e5436536SAndroid Build Coastguard Worker // xt1 = 0
827*e5436536SAndroid Build Coastguard Worker // xt2 = 8
828*e5436536SAndroid Build Coastguard Worker vr = x[8];
829*e5436536SAndroid Build Coastguard Worker vi = x[9];
830*e5436536SAndroid Build Coastguard Worker ur = x[0] >> 1;
831*e5436536SAndroid Build Coastguard Worker ui = x[1] >> 1;
832*e5436536SAndroid Build Coastguard Worker x[0] = ur + (vr >> 1);
833*e5436536SAndroid Build Coastguard Worker x[1] = ui + (vi >> 1);
834*e5436536SAndroid Build Coastguard Worker x[8] = ur - (vr >> 1);
835*e5436536SAndroid Build Coastguard Worker x[9] = ui - (vi >> 1);
836*e5436536SAndroid Build Coastguard Worker
837*e5436536SAndroid Build Coastguard Worker // xt1 = 4
838*e5436536SAndroid Build Coastguard Worker // xt2 = 12
839*e5436536SAndroid Build Coastguard Worker vr = x[13];
840*e5436536SAndroid Build Coastguard Worker vi = x[12];
841*e5436536SAndroid Build Coastguard Worker ur = x[4] >> 1;
842*e5436536SAndroid Build Coastguard Worker ui = x[5] >> 1;
843*e5436536SAndroid Build Coastguard Worker x[4] = ur + (vr >> 1);
844*e5436536SAndroid Build Coastguard Worker x[5] = ui - (vi >> 1);
845*e5436536SAndroid Build Coastguard Worker x[12] = ur - (vr >> 1);
846*e5436536SAndroid Build Coastguard Worker x[13] = ui + (vi >> 1);
847*e5436536SAndroid Build Coastguard Worker
848*e5436536SAndroid Build Coastguard Worker // xt1 = 16
849*e5436536SAndroid Build Coastguard Worker // xt2 = 24
850*e5436536SAndroid Build Coastguard Worker vr = x[24];
851*e5436536SAndroid Build Coastguard Worker vi = x[25];
852*e5436536SAndroid Build Coastguard Worker ur = x[16] >> 1;
853*e5436536SAndroid Build Coastguard Worker ui = x[17] >> 1;
854*e5436536SAndroid Build Coastguard Worker x[16] = ur + (vr >> 1);
855*e5436536SAndroid Build Coastguard Worker x[17] = ui + (vi >> 1);
856*e5436536SAndroid Build Coastguard Worker x[24] = ur - (vr >> 1);
857*e5436536SAndroid Build Coastguard Worker x[25] = ui - (vi >> 1);
858*e5436536SAndroid Build Coastguard Worker
859*e5436536SAndroid Build Coastguard Worker // xt1 = 20
860*e5436536SAndroid Build Coastguard Worker // xt2 = 28
861*e5436536SAndroid Build Coastguard Worker vr = x[29];
862*e5436536SAndroid Build Coastguard Worker vi = x[28];
863*e5436536SAndroid Build Coastguard Worker ur = x[20] >> 1;
864*e5436536SAndroid Build Coastguard Worker ui = x[21] >> 1;
865*e5436536SAndroid Build Coastguard Worker x[20] = ur + (vr >> 1);
866*e5436536SAndroid Build Coastguard Worker x[21] = ui - (vi >> 1);
867*e5436536SAndroid Build Coastguard Worker x[28] = ur - (vr >> 1);
868*e5436536SAndroid Build Coastguard Worker x[29] = ui + (vi >> 1);
869*e5436536SAndroid Build Coastguard Worker
870*e5436536SAndroid Build Coastguard Worker // xt1 = 2
871*e5436536SAndroid Build Coastguard Worker // xt2 = 10
872*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vi, vr, x[10], x[11])
873*e5436536SAndroid Build Coastguard Worker // vr = fMultDiv2((x[11] + x[10]),W_PiFOURTH);
874*e5436536SAndroid Build Coastguard Worker // vi = fMultDiv2((x[11] - x[10]),W_PiFOURTH);
875*e5436536SAndroid Build Coastguard Worker ur = x[2];
876*e5436536SAndroid Build Coastguard Worker ui = x[3];
877*e5436536SAndroid Build Coastguard Worker x[2] = (ur >> 1) + vr;
878*e5436536SAndroid Build Coastguard Worker x[3] = (ui >> 1) + vi;
879*e5436536SAndroid Build Coastguard Worker x[10] = (ur >> 1) - vr;
880*e5436536SAndroid Build Coastguard Worker x[11] = (ui >> 1) - vi;
881*e5436536SAndroid Build Coastguard Worker
882*e5436536SAndroid Build Coastguard Worker // xt1 = 6
883*e5436536SAndroid Build Coastguard Worker // xt2 = 14
884*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vr, vi, x[14], x[15])
885*e5436536SAndroid Build Coastguard Worker ur = x[6];
886*e5436536SAndroid Build Coastguard Worker ui = x[7];
887*e5436536SAndroid Build Coastguard Worker x[6] = (ur >> 1) + vr;
888*e5436536SAndroid Build Coastguard Worker x[7] = (ui >> 1) - vi;
889*e5436536SAndroid Build Coastguard Worker x[14] = (ur >> 1) - vr;
890*e5436536SAndroid Build Coastguard Worker x[15] = (ui >> 1) + vi;
891*e5436536SAndroid Build Coastguard Worker
892*e5436536SAndroid Build Coastguard Worker // xt1 = 18
893*e5436536SAndroid Build Coastguard Worker // xt2 = 26
894*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vi, vr, x[26], x[27])
895*e5436536SAndroid Build Coastguard Worker ur = x[18];
896*e5436536SAndroid Build Coastguard Worker ui = x[19];
897*e5436536SAndroid Build Coastguard Worker x[18] = (ur >> 1) + vr;
898*e5436536SAndroid Build Coastguard Worker x[19] = (ui >> 1) + vi;
899*e5436536SAndroid Build Coastguard Worker x[26] = (ur >> 1) - vr;
900*e5436536SAndroid Build Coastguard Worker x[27] = (ui >> 1) - vi;
901*e5436536SAndroid Build Coastguard Worker
902*e5436536SAndroid Build Coastguard Worker // xt1 = 22
903*e5436536SAndroid Build Coastguard Worker // xt2 = 30
904*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vr, vi, x[30], x[31])
905*e5436536SAndroid Build Coastguard Worker ur = x[22];
906*e5436536SAndroid Build Coastguard Worker ui = x[23];
907*e5436536SAndroid Build Coastguard Worker x[22] = (ur >> 1) + vr;
908*e5436536SAndroid Build Coastguard Worker x[23] = (ui >> 1) - vi;
909*e5436536SAndroid Build Coastguard Worker x[30] = (ur >> 1) - vr;
910*e5436536SAndroid Build Coastguard Worker x[31] = (ui >> 1) + vi;
911*e5436536SAndroid Build Coastguard Worker
912*e5436536SAndroid Build Coastguard Worker // xt1 = 0
913*e5436536SAndroid Build Coastguard Worker // xt2 = 16
914*e5436536SAndroid Build Coastguard Worker vr = x[16];
915*e5436536SAndroid Build Coastguard Worker vi = x[17];
916*e5436536SAndroid Build Coastguard Worker ur = x[0] >> 1;
917*e5436536SAndroid Build Coastguard Worker ui = x[1] >> 1;
918*e5436536SAndroid Build Coastguard Worker x[0] = ur + (vr >> 1);
919*e5436536SAndroid Build Coastguard Worker x[1] = ui + (vi >> 1);
920*e5436536SAndroid Build Coastguard Worker x[16] = ur - (vr >> 1);
921*e5436536SAndroid Build Coastguard Worker x[17] = ui - (vi >> 1);
922*e5436536SAndroid Build Coastguard Worker
923*e5436536SAndroid Build Coastguard Worker // xt1 = 8
924*e5436536SAndroid Build Coastguard Worker // xt2 = 24
925*e5436536SAndroid Build Coastguard Worker vi = x[24];
926*e5436536SAndroid Build Coastguard Worker vr = x[25];
927*e5436536SAndroid Build Coastguard Worker ur = x[8] >> 1;
928*e5436536SAndroid Build Coastguard Worker ui = x[9] >> 1;
929*e5436536SAndroid Build Coastguard Worker x[8] = ur + (vr >> 1);
930*e5436536SAndroid Build Coastguard Worker x[9] = ui - (vi >> 1);
931*e5436536SAndroid Build Coastguard Worker x[24] = ur - (vr >> 1);
932*e5436536SAndroid Build Coastguard Worker x[25] = ui + (vi >> 1);
933*e5436536SAndroid Build Coastguard Worker
934*e5436536SAndroid Build Coastguard Worker // xt1 = 2
935*e5436536SAndroid Build Coastguard Worker // xt2 = 18
936*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[19], x[18], fft16_w16[0]);
937*e5436536SAndroid Build Coastguard Worker ur = x[2];
938*e5436536SAndroid Build Coastguard Worker ui = x[3];
939*e5436536SAndroid Build Coastguard Worker x[2] = (ur >> 1) + vr;
940*e5436536SAndroid Build Coastguard Worker x[3] = (ui >> 1) + vi;
941*e5436536SAndroid Build Coastguard Worker x[18] = (ur >> 1) - vr;
942*e5436536SAndroid Build Coastguard Worker x[19] = (ui >> 1) - vi;
943*e5436536SAndroid Build Coastguard Worker
944*e5436536SAndroid Build Coastguard Worker // xt1 = 10
945*e5436536SAndroid Build Coastguard Worker // xt2 = 26
946*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[27], x[26], fft16_w16[0]);
947*e5436536SAndroid Build Coastguard Worker ur = x[10];
948*e5436536SAndroid Build Coastguard Worker ui = x[11];
949*e5436536SAndroid Build Coastguard Worker x[10] = (ur >> 1) + vr;
950*e5436536SAndroid Build Coastguard Worker x[11] = (ui >> 1) - vi;
951*e5436536SAndroid Build Coastguard Worker x[26] = (ur >> 1) - vr;
952*e5436536SAndroid Build Coastguard Worker x[27] = (ui >> 1) + vi;
953*e5436536SAndroid Build Coastguard Worker
954*e5436536SAndroid Build Coastguard Worker // xt1 = 4
955*e5436536SAndroid Build Coastguard Worker // xt2 = 20
956*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vi, vr, x[20], x[21])
957*e5436536SAndroid Build Coastguard Worker ur = x[4];
958*e5436536SAndroid Build Coastguard Worker ui = x[5];
959*e5436536SAndroid Build Coastguard Worker x[4] = (ur >> 1) + vr;
960*e5436536SAndroid Build Coastguard Worker x[5] = (ui >> 1) + vi;
961*e5436536SAndroid Build Coastguard Worker x[20] = (ur >> 1) - vr;
962*e5436536SAndroid Build Coastguard Worker x[21] = (ui >> 1) - vi;
963*e5436536SAndroid Build Coastguard Worker
964*e5436536SAndroid Build Coastguard Worker // xt1 = 12
965*e5436536SAndroid Build Coastguard Worker // xt2 = 28
966*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vr, vi, x[28], x[29])
967*e5436536SAndroid Build Coastguard Worker ur = x[12];
968*e5436536SAndroid Build Coastguard Worker ui = x[13];
969*e5436536SAndroid Build Coastguard Worker x[12] = (ur >> 1) + vr;
970*e5436536SAndroid Build Coastguard Worker x[13] = (ui >> 1) - vi;
971*e5436536SAndroid Build Coastguard Worker x[28] = (ur >> 1) - vr;
972*e5436536SAndroid Build Coastguard Worker x[29] = (ui >> 1) + vi;
973*e5436536SAndroid Build Coastguard Worker
974*e5436536SAndroid Build Coastguard Worker // xt1 = 6
975*e5436536SAndroid Build Coastguard Worker // xt2 = 22
976*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[23], x[22], fft16_w16[1]);
977*e5436536SAndroid Build Coastguard Worker ur = x[6];
978*e5436536SAndroid Build Coastguard Worker ui = x[7];
979*e5436536SAndroid Build Coastguard Worker x[6] = (ur >> 1) + vr;
980*e5436536SAndroid Build Coastguard Worker x[7] = (ui >> 1) + vi;
981*e5436536SAndroid Build Coastguard Worker x[22] = (ur >> 1) - vr;
982*e5436536SAndroid Build Coastguard Worker x[23] = (ui >> 1) - vi;
983*e5436536SAndroid Build Coastguard Worker
984*e5436536SAndroid Build Coastguard Worker // xt1 = 14
985*e5436536SAndroid Build Coastguard Worker // xt2 = 30
986*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[31], x[30], fft16_w16[1]);
987*e5436536SAndroid Build Coastguard Worker ur = x[14];
988*e5436536SAndroid Build Coastguard Worker ui = x[15];
989*e5436536SAndroid Build Coastguard Worker x[14] = (ur >> 1) + vr;
990*e5436536SAndroid Build Coastguard Worker x[15] = (ui >> 1) - vi;
991*e5436536SAndroid Build Coastguard Worker x[30] = (ur >> 1) - vr;
992*e5436536SAndroid Build Coastguard Worker x[31] = (ui >> 1) + vi;
993*e5436536SAndroid Build Coastguard Worker }
994*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft_16 */
995*e5436536SAndroid Build Coastguard Worker
996*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft_32
997*e5436536SAndroid Build Coastguard Worker static const FIXP_STP fft32_w32[6] = {
998*e5436536SAndroid Build Coastguard Worker STCP(0x7641af3d, 0x30fbc54d), STCP(0x30fbc54d, 0x7641af3d),
999*e5436536SAndroid Build Coastguard Worker STCP(0x7d8a5f40, 0x18f8b83c), STCP(0x6a6d98a4, 0x471cece7),
1000*e5436536SAndroid Build Coastguard Worker STCP(0x471cece7, 0x6a6d98a4), STCP(0x18f8b83c, 0x7d8a5f40)};
1001*e5436536SAndroid Build Coastguard Worker #define W_PiFOURTH STC(0x5a82799a)
1002*e5436536SAndroid Build Coastguard Worker
1003*e5436536SAndroid Build Coastguard Worker LNK_SECTION_CODE_L1
fft_32(FIXP_DBL * const _x)1004*e5436536SAndroid Build Coastguard Worker inline void fft_32(FIXP_DBL *const _x) {
1005*e5436536SAndroid Build Coastguard Worker /*
1006*e5436536SAndroid Build Coastguard Worker * 1+2 stage radix 4
1007*e5436536SAndroid Build Coastguard Worker */
1008*e5436536SAndroid Build Coastguard Worker
1009*e5436536SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////////
1010*e5436536SAndroid Build Coastguard Worker {
1011*e5436536SAndroid Build Coastguard Worker FIXP_DBL *const x = _x;
1012*e5436536SAndroid Build Coastguard Worker FIXP_DBL vi, ui;
1013*e5436536SAndroid Build Coastguard Worker FIXP_DBL vi2, ui2;
1014*e5436536SAndroid Build Coastguard Worker FIXP_DBL vi3, ui3;
1015*e5436536SAndroid Build Coastguard Worker FIXP_DBL vr, ur;
1016*e5436536SAndroid Build Coastguard Worker FIXP_DBL vr2, ur2;
1017*e5436536SAndroid Build Coastguard Worker FIXP_DBL vr3, ur3;
1018*e5436536SAndroid Build Coastguard Worker FIXP_DBL vr4, ur4;
1019*e5436536SAndroid Build Coastguard Worker
1020*e5436536SAndroid Build Coastguard Worker // i = 0
1021*e5436536SAndroid Build Coastguard Worker vr = (x[0] + x[32]) >> 1; /* Re A + Re B */
1022*e5436536SAndroid Build Coastguard Worker ur = (x[1] + x[33]) >> 1; /* Im A + Im B */
1023*e5436536SAndroid Build Coastguard Worker vi = (x[16] + x[48]) SHIFT_A; /* Re C + Re D */
1024*e5436536SAndroid Build Coastguard Worker ui = (x[17] + x[49]) SHIFT_A; /* Im C + Im D */
1025*e5436536SAndroid Build Coastguard Worker
1026*e5436536SAndroid Build Coastguard Worker x[0] = vr + (vi SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
1027*e5436536SAndroid Build Coastguard Worker x[1] = ur + (ui SHIFT_B); /* Im A' = sum of imag values */
1028*e5436536SAndroid Build Coastguard Worker
1029*e5436536SAndroid Build Coastguard Worker vr2 = (x[4] + x[36]) >> 1; /* Re A + Re B */
1030*e5436536SAndroid Build Coastguard Worker ur2 = (x[5] + x[37]) >> 1; /* Im A + Im B */
1031*e5436536SAndroid Build Coastguard Worker
1032*e5436536SAndroid Build Coastguard Worker x[4] = vr - (vi SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
1033*e5436536SAndroid Build Coastguard Worker x[5] = ur - (ui SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
1034*e5436536SAndroid Build Coastguard Worker
1035*e5436536SAndroid Build Coastguard Worker vr -= x[32]; /* Re A - Re B */
1036*e5436536SAndroid Build Coastguard Worker ur -= x[33]; /* Im A - Im B */
1037*e5436536SAndroid Build Coastguard Worker vi = (vi SHIFT_B)-x[48]; /* Re C - Re D */
1038*e5436536SAndroid Build Coastguard Worker ui = (ui SHIFT_B)-x[49]; /* Im C - Im D */
1039*e5436536SAndroid Build Coastguard Worker
1040*e5436536SAndroid Build Coastguard Worker vr3 = (x[2] + x[34]) >> 1; /* Re A + Re B */
1041*e5436536SAndroid Build Coastguard Worker ur3 = (x[3] + x[35]) >> 1; /* Im A + Im B */
1042*e5436536SAndroid Build Coastguard Worker
1043*e5436536SAndroid Build Coastguard Worker x[2] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */
1044*e5436536SAndroid Build Coastguard Worker x[3] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */
1045*e5436536SAndroid Build Coastguard Worker
1046*e5436536SAndroid Build Coastguard Worker vr4 = (x[6] + x[38]) >> 1; /* Re A + Re B */
1047*e5436536SAndroid Build Coastguard Worker ur4 = (x[7] + x[39]) >> 1; /* Im A + Im B */
1048*e5436536SAndroid Build Coastguard Worker
1049*e5436536SAndroid Build Coastguard Worker x[6] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */
1050*e5436536SAndroid Build Coastguard Worker x[7] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */
1051*e5436536SAndroid Build Coastguard Worker
1052*e5436536SAndroid Build Coastguard Worker // i=16
1053*e5436536SAndroid Build Coastguard Worker vi = (x[20] + x[52]) SHIFT_A; /* Re C + Re D */
1054*e5436536SAndroid Build Coastguard Worker ui = (x[21] + x[53]) SHIFT_A; /* Im C + Im D */
1055*e5436536SAndroid Build Coastguard Worker
1056*e5436536SAndroid Build Coastguard Worker x[16] = vr2 + (vi SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
1057*e5436536SAndroid Build Coastguard Worker x[17] = ur2 + (ui SHIFT_B); /* Im A' = sum of imag values */
1058*e5436536SAndroid Build Coastguard Worker x[20] = vr2 - (vi SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
1059*e5436536SAndroid Build Coastguard Worker x[21] = ur2 - (ui SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
1060*e5436536SAndroid Build Coastguard Worker
1061*e5436536SAndroid Build Coastguard Worker vr2 -= x[36]; /* Re A - Re B */
1062*e5436536SAndroid Build Coastguard Worker ur2 -= x[37]; /* Im A - Im B */
1063*e5436536SAndroid Build Coastguard Worker vi = (vi SHIFT_B)-x[52]; /* Re C - Re D */
1064*e5436536SAndroid Build Coastguard Worker ui = (ui SHIFT_B)-x[53]; /* Im C - Im D */
1065*e5436536SAndroid Build Coastguard Worker
1066*e5436536SAndroid Build Coastguard Worker vi2 = (x[18] + x[50]) SHIFT_A; /* Re C + Re D */
1067*e5436536SAndroid Build Coastguard Worker ui2 = (x[19] + x[51]) SHIFT_A; /* Im C + Im D */
1068*e5436536SAndroid Build Coastguard Worker
1069*e5436536SAndroid Build Coastguard Worker x[18] = ui + vr2; /* Re B' = Im C - Im D + Re A - Re B */
1070*e5436536SAndroid Build Coastguard Worker x[19] = ur2 - vi; /* Im B'= -Re C + Re D + Im A - Im B */
1071*e5436536SAndroid Build Coastguard Worker
1072*e5436536SAndroid Build Coastguard Worker vi3 = (x[22] + x[54]) SHIFT_A; /* Re C + Re D */
1073*e5436536SAndroid Build Coastguard Worker ui3 = (x[23] + x[55]) SHIFT_A; /* Im C + Im D */
1074*e5436536SAndroid Build Coastguard Worker
1075*e5436536SAndroid Build Coastguard Worker x[22] = vr2 - ui; /* Re D' = -Im C + Im D + Re A - Re B */
1076*e5436536SAndroid Build Coastguard Worker x[23] = vi + ur2; /* Im D'= Re C - Re D + Im A - Im B */
1077*e5436536SAndroid Build Coastguard Worker
1078*e5436536SAndroid Build Coastguard Worker // i = 32
1079*e5436536SAndroid Build Coastguard Worker
1080*e5436536SAndroid Build Coastguard Worker x[32] = vr3 + (vi2 SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
1081*e5436536SAndroid Build Coastguard Worker x[33] = ur3 + (ui2 SHIFT_B); /* Im A' = sum of imag values */
1082*e5436536SAndroid Build Coastguard Worker x[36] = vr3 - (vi2 SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
1083*e5436536SAndroid Build Coastguard Worker x[37] = ur3 - (ui2 SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
1084*e5436536SAndroid Build Coastguard Worker
1085*e5436536SAndroid Build Coastguard Worker vr3 -= x[34]; /* Re A - Re B */
1086*e5436536SAndroid Build Coastguard Worker ur3 -= x[35]; /* Im A - Im B */
1087*e5436536SAndroid Build Coastguard Worker vi2 = (vi2 SHIFT_B)-x[50]; /* Re C - Re D */
1088*e5436536SAndroid Build Coastguard Worker ui2 = (ui2 SHIFT_B)-x[51]; /* Im C - Im D */
1089*e5436536SAndroid Build Coastguard Worker
1090*e5436536SAndroid Build Coastguard Worker x[34] = ui2 + vr3; /* Re B' = Im C - Im D + Re A - Re B */
1091*e5436536SAndroid Build Coastguard Worker x[35] = ur3 - vi2; /* Im B'= -Re C + Re D + Im A - Im B */
1092*e5436536SAndroid Build Coastguard Worker
1093*e5436536SAndroid Build Coastguard Worker // i=48
1094*e5436536SAndroid Build Coastguard Worker
1095*e5436536SAndroid Build Coastguard Worker x[48] = vr4 + (vi3 SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
1096*e5436536SAndroid Build Coastguard Worker x[52] = vr4 - (vi3 SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
1097*e5436536SAndroid Build Coastguard Worker x[49] = ur4 + (ui3 SHIFT_B); /* Im A' = sum of imag values */
1098*e5436536SAndroid Build Coastguard Worker x[53] = ur4 - (ui3 SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
1099*e5436536SAndroid Build Coastguard Worker
1100*e5436536SAndroid Build Coastguard Worker vr4 -= x[38]; /* Re A - Re B */
1101*e5436536SAndroid Build Coastguard Worker ur4 -= x[39]; /* Im A - Im B */
1102*e5436536SAndroid Build Coastguard Worker
1103*e5436536SAndroid Build Coastguard Worker x[38] = vr3 - ui2; /* Re D' = -Im C + Im D + Re A - Re B */
1104*e5436536SAndroid Build Coastguard Worker x[39] = vi2 + ur3; /* Im D'= Re C - Re D + Im A - Im B */
1105*e5436536SAndroid Build Coastguard Worker
1106*e5436536SAndroid Build Coastguard Worker vi3 = (vi3 SHIFT_B)-x[54]; /* Re C - Re D */
1107*e5436536SAndroid Build Coastguard Worker ui3 = (ui3 SHIFT_B)-x[55]; /* Im C - Im D */
1108*e5436536SAndroid Build Coastguard Worker
1109*e5436536SAndroid Build Coastguard Worker x[50] = ui3 + vr4; /* Re B' = Im C - Im D + Re A - Re B */
1110*e5436536SAndroid Build Coastguard Worker x[54] = vr4 - ui3; /* Re D' = -Im C + Im D + Re A - Re B */
1111*e5436536SAndroid Build Coastguard Worker x[51] = ur4 - vi3; /* Im B'= -Re C + Re D + Im A - Im B */
1112*e5436536SAndroid Build Coastguard Worker x[55] = vi3 + ur4; /* Im D'= Re C - Re D + Im A - Im B */
1113*e5436536SAndroid Build Coastguard Worker
1114*e5436536SAndroid Build Coastguard Worker // i=8
1115*e5436536SAndroid Build Coastguard Worker vr = (x[8] + x[40]) >> 1; /* Re A + Re B */
1116*e5436536SAndroid Build Coastguard Worker ur = (x[9] + x[41]) >> 1; /* Im A + Im B */
1117*e5436536SAndroid Build Coastguard Worker vi = (x[24] + x[56]) SHIFT_A; /* Re C + Re D */
1118*e5436536SAndroid Build Coastguard Worker ui = (x[25] + x[57]) SHIFT_A; /* Im C + Im D */
1119*e5436536SAndroid Build Coastguard Worker
1120*e5436536SAndroid Build Coastguard Worker x[8] = vr + (vi SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
1121*e5436536SAndroid Build Coastguard Worker x[9] = ur + (ui SHIFT_B); /* Im A' = sum of imag values */
1122*e5436536SAndroid Build Coastguard Worker
1123*e5436536SAndroid Build Coastguard Worker vr2 = (x[12] + x[44]) >> 1; /* Re A + Re B */
1124*e5436536SAndroid Build Coastguard Worker ur2 = (x[13] + x[45]) >> 1; /* Im A + Im B */
1125*e5436536SAndroid Build Coastguard Worker
1126*e5436536SAndroid Build Coastguard Worker x[12] = vr - (vi SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
1127*e5436536SAndroid Build Coastguard Worker x[13] = ur - (ui SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
1128*e5436536SAndroid Build Coastguard Worker
1129*e5436536SAndroid Build Coastguard Worker vr -= x[40]; /* Re A - Re B */
1130*e5436536SAndroid Build Coastguard Worker ur -= x[41]; /* Im A - Im B */
1131*e5436536SAndroid Build Coastguard Worker vi = (vi SHIFT_B)-x[56]; /* Re C - Re D */
1132*e5436536SAndroid Build Coastguard Worker ui = (ui SHIFT_B)-x[57]; /* Im C - Im D */
1133*e5436536SAndroid Build Coastguard Worker
1134*e5436536SAndroid Build Coastguard Worker vr3 = (x[10] + x[42]) >> 1; /* Re A + Re B */
1135*e5436536SAndroid Build Coastguard Worker ur3 = (x[11] + x[43]) >> 1; /* Im A + Im B */
1136*e5436536SAndroid Build Coastguard Worker
1137*e5436536SAndroid Build Coastguard Worker x[10] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */
1138*e5436536SAndroid Build Coastguard Worker x[11] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */
1139*e5436536SAndroid Build Coastguard Worker
1140*e5436536SAndroid Build Coastguard Worker vr4 = (x[14] + x[46]) >> 1; /* Re A + Re B */
1141*e5436536SAndroid Build Coastguard Worker ur4 = (x[15] + x[47]) >> 1; /* Im A + Im B */
1142*e5436536SAndroid Build Coastguard Worker
1143*e5436536SAndroid Build Coastguard Worker x[14] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */
1144*e5436536SAndroid Build Coastguard Worker x[15] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */
1145*e5436536SAndroid Build Coastguard Worker
1146*e5436536SAndroid Build Coastguard Worker // i=24
1147*e5436536SAndroid Build Coastguard Worker vi = (x[28] + x[60]) SHIFT_A; /* Re C + Re D */
1148*e5436536SAndroid Build Coastguard Worker ui = (x[29] + x[61]) SHIFT_A; /* Im C + Im D */
1149*e5436536SAndroid Build Coastguard Worker
1150*e5436536SAndroid Build Coastguard Worker x[24] = vr2 + (vi SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
1151*e5436536SAndroid Build Coastguard Worker x[28] = vr2 - (vi SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
1152*e5436536SAndroid Build Coastguard Worker x[25] = ur2 + (ui SHIFT_B); /* Im A' = sum of imag values */
1153*e5436536SAndroid Build Coastguard Worker x[29] = ur2 - (ui SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
1154*e5436536SAndroid Build Coastguard Worker
1155*e5436536SAndroid Build Coastguard Worker vr2 -= x[44]; /* Re A - Re B */
1156*e5436536SAndroid Build Coastguard Worker ur2 -= x[45]; /* Im A - Im B */
1157*e5436536SAndroid Build Coastguard Worker vi = (vi SHIFT_B)-x[60]; /* Re C - Re D */
1158*e5436536SAndroid Build Coastguard Worker ui = (ui SHIFT_B)-x[61]; /* Im C - Im D */
1159*e5436536SAndroid Build Coastguard Worker
1160*e5436536SAndroid Build Coastguard Worker vi2 = (x[26] + x[58]) SHIFT_A; /* Re C + Re D */
1161*e5436536SAndroid Build Coastguard Worker ui2 = (x[27] + x[59]) SHIFT_A; /* Im C + Im D */
1162*e5436536SAndroid Build Coastguard Worker
1163*e5436536SAndroid Build Coastguard Worker x[26] = ui + vr2; /* Re B' = Im C - Im D + Re A - Re B */
1164*e5436536SAndroid Build Coastguard Worker x[27] = ur2 - vi; /* Im B'= -Re C + Re D + Im A - Im B */
1165*e5436536SAndroid Build Coastguard Worker
1166*e5436536SAndroid Build Coastguard Worker vi3 = (x[30] + x[62]) SHIFT_A; /* Re C + Re D */
1167*e5436536SAndroid Build Coastguard Worker ui3 = (x[31] + x[63]) SHIFT_A; /* Im C + Im D */
1168*e5436536SAndroid Build Coastguard Worker
1169*e5436536SAndroid Build Coastguard Worker x[30] = vr2 - ui; /* Re D' = -Im C + Im D + Re A - Re B */
1170*e5436536SAndroid Build Coastguard Worker x[31] = vi + ur2; /* Im D'= Re C - Re D + Im A - Im B */
1171*e5436536SAndroid Build Coastguard Worker
1172*e5436536SAndroid Build Coastguard Worker // i=40
1173*e5436536SAndroid Build Coastguard Worker
1174*e5436536SAndroid Build Coastguard Worker x[40] = vr3 + (vi2 SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
1175*e5436536SAndroid Build Coastguard Worker x[44] = vr3 - (vi2 SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
1176*e5436536SAndroid Build Coastguard Worker x[41] = ur3 + (ui2 SHIFT_B); /* Im A' = sum of imag values */
1177*e5436536SAndroid Build Coastguard Worker x[45] = ur3 - (ui2 SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
1178*e5436536SAndroid Build Coastguard Worker
1179*e5436536SAndroid Build Coastguard Worker vr3 -= x[42]; /* Re A - Re B */
1180*e5436536SAndroid Build Coastguard Worker ur3 -= x[43]; /* Im A - Im B */
1181*e5436536SAndroid Build Coastguard Worker vi2 = (vi2 SHIFT_B)-x[58]; /* Re C - Re D */
1182*e5436536SAndroid Build Coastguard Worker ui2 = (ui2 SHIFT_B)-x[59]; /* Im C - Im D */
1183*e5436536SAndroid Build Coastguard Worker
1184*e5436536SAndroid Build Coastguard Worker x[42] = ui2 + vr3; /* Re B' = Im C - Im D + Re A - Re B */
1185*e5436536SAndroid Build Coastguard Worker x[43] = ur3 - vi2; /* Im B'= -Re C + Re D + Im A - Im B */
1186*e5436536SAndroid Build Coastguard Worker
1187*e5436536SAndroid Build Coastguard Worker // i=56
1188*e5436536SAndroid Build Coastguard Worker
1189*e5436536SAndroid Build Coastguard Worker x[56] = vr4 + (vi3 SHIFT_B); /* Re A' = ReA + ReB +ReC + ReD */
1190*e5436536SAndroid Build Coastguard Worker x[60] = vr4 - (vi3 SHIFT_B); /* Re C' = -(ReC+ReD) + (ReA+ReB) */
1191*e5436536SAndroid Build Coastguard Worker x[57] = ur4 + (ui3 SHIFT_B); /* Im A' = sum of imag values */
1192*e5436536SAndroid Build Coastguard Worker x[61] = ur4 - (ui3 SHIFT_B); /* Im C' = -Im C -Im D +Im A +Im B */
1193*e5436536SAndroid Build Coastguard Worker
1194*e5436536SAndroid Build Coastguard Worker vr4 -= x[46]; /* Re A - Re B */
1195*e5436536SAndroid Build Coastguard Worker ur4 -= x[47]; /* Im A - Im B */
1196*e5436536SAndroid Build Coastguard Worker
1197*e5436536SAndroid Build Coastguard Worker x[46] = vr3 - ui2; /* Re D' = -Im C + Im D + Re A - Re B */
1198*e5436536SAndroid Build Coastguard Worker x[47] = vi2 + ur3; /* Im D'= Re C - Re D + Im A - Im B */
1199*e5436536SAndroid Build Coastguard Worker
1200*e5436536SAndroid Build Coastguard Worker vi3 = (vi3 SHIFT_B)-x[62]; /* Re C - Re D */
1201*e5436536SAndroid Build Coastguard Worker ui3 = (ui3 SHIFT_B)-x[63]; /* Im C - Im D */
1202*e5436536SAndroid Build Coastguard Worker
1203*e5436536SAndroid Build Coastguard Worker x[58] = ui3 + vr4; /* Re B' = Im C - Im D + Re A - Re B */
1204*e5436536SAndroid Build Coastguard Worker x[62] = vr4 - ui3; /* Re D' = -Im C + Im D + Re A - Re B */
1205*e5436536SAndroid Build Coastguard Worker x[59] = ur4 - vi3; /* Im B'= -Re C + Re D + Im A - Im B */
1206*e5436536SAndroid Build Coastguard Worker x[63] = vi3 + ur4; /* Im D'= Re C - Re D + Im A - Im B */
1207*e5436536SAndroid Build Coastguard Worker }
1208*e5436536SAndroid Build Coastguard Worker
1209*e5436536SAndroid Build Coastguard Worker {
1210*e5436536SAndroid Build Coastguard Worker FIXP_DBL *xt = _x;
1211*e5436536SAndroid Build Coastguard Worker
1212*e5436536SAndroid Build Coastguard Worker int j = 4;
1213*e5436536SAndroid Build Coastguard Worker do {
1214*e5436536SAndroid Build Coastguard Worker FIXP_DBL vi, ui, vr, ur;
1215*e5436536SAndroid Build Coastguard Worker
1216*e5436536SAndroid Build Coastguard Worker vr = xt[8];
1217*e5436536SAndroid Build Coastguard Worker vi = xt[9];
1218*e5436536SAndroid Build Coastguard Worker ur = xt[0] >> 1;
1219*e5436536SAndroid Build Coastguard Worker ui = xt[1] >> 1;
1220*e5436536SAndroid Build Coastguard Worker xt[0] = ur + (vr >> 1);
1221*e5436536SAndroid Build Coastguard Worker xt[1] = ui + (vi >> 1);
1222*e5436536SAndroid Build Coastguard Worker xt[8] = ur - (vr >> 1);
1223*e5436536SAndroid Build Coastguard Worker xt[9] = ui - (vi >> 1);
1224*e5436536SAndroid Build Coastguard Worker
1225*e5436536SAndroid Build Coastguard Worker vr = xt[13];
1226*e5436536SAndroid Build Coastguard Worker vi = xt[12];
1227*e5436536SAndroid Build Coastguard Worker ur = xt[4] >> 1;
1228*e5436536SAndroid Build Coastguard Worker ui = xt[5] >> 1;
1229*e5436536SAndroid Build Coastguard Worker xt[4] = ur + (vr >> 1);
1230*e5436536SAndroid Build Coastguard Worker xt[5] = ui - (vi >> 1);
1231*e5436536SAndroid Build Coastguard Worker xt[12] = ur - (vr >> 1);
1232*e5436536SAndroid Build Coastguard Worker xt[13] = ui + (vi >> 1);
1233*e5436536SAndroid Build Coastguard Worker
1234*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vi, vr, xt[10], xt[11])
1235*e5436536SAndroid Build Coastguard Worker ur = xt[2];
1236*e5436536SAndroid Build Coastguard Worker ui = xt[3];
1237*e5436536SAndroid Build Coastguard Worker xt[2] = (ur >> 1) + vr;
1238*e5436536SAndroid Build Coastguard Worker xt[3] = (ui >> 1) + vi;
1239*e5436536SAndroid Build Coastguard Worker xt[10] = (ur >> 1) - vr;
1240*e5436536SAndroid Build Coastguard Worker xt[11] = (ui >> 1) - vi;
1241*e5436536SAndroid Build Coastguard Worker
1242*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vr, vi, xt[14], xt[15])
1243*e5436536SAndroid Build Coastguard Worker ur = xt[6];
1244*e5436536SAndroid Build Coastguard Worker ui = xt[7];
1245*e5436536SAndroid Build Coastguard Worker
1246*e5436536SAndroid Build Coastguard Worker xt[6] = (ur >> 1) + vr;
1247*e5436536SAndroid Build Coastguard Worker xt[7] = (ui >> 1) - vi;
1248*e5436536SAndroid Build Coastguard Worker xt[14] = (ur >> 1) - vr;
1249*e5436536SAndroid Build Coastguard Worker xt[15] = (ui >> 1) + vi;
1250*e5436536SAndroid Build Coastguard Worker xt += 16;
1251*e5436536SAndroid Build Coastguard Worker } while (--j != 0);
1252*e5436536SAndroid Build Coastguard Worker }
1253*e5436536SAndroid Build Coastguard Worker
1254*e5436536SAndroid Build Coastguard Worker {
1255*e5436536SAndroid Build Coastguard Worker FIXP_DBL *const x = _x;
1256*e5436536SAndroid Build Coastguard Worker FIXP_DBL vi, ui, vr, ur;
1257*e5436536SAndroid Build Coastguard Worker
1258*e5436536SAndroid Build Coastguard Worker vr = x[16];
1259*e5436536SAndroid Build Coastguard Worker vi = x[17];
1260*e5436536SAndroid Build Coastguard Worker ur = x[0] >> 1;
1261*e5436536SAndroid Build Coastguard Worker ui = x[1] >> 1;
1262*e5436536SAndroid Build Coastguard Worker x[0] = ur + (vr >> 1);
1263*e5436536SAndroid Build Coastguard Worker x[1] = ui + (vi >> 1);
1264*e5436536SAndroid Build Coastguard Worker x[16] = ur - (vr >> 1);
1265*e5436536SAndroid Build Coastguard Worker x[17] = ui - (vi >> 1);
1266*e5436536SAndroid Build Coastguard Worker
1267*e5436536SAndroid Build Coastguard Worker vi = x[24];
1268*e5436536SAndroid Build Coastguard Worker vr = x[25];
1269*e5436536SAndroid Build Coastguard Worker ur = x[8] >> 1;
1270*e5436536SAndroid Build Coastguard Worker ui = x[9] >> 1;
1271*e5436536SAndroid Build Coastguard Worker x[8] = ur + (vr >> 1);
1272*e5436536SAndroid Build Coastguard Worker x[9] = ui - (vi >> 1);
1273*e5436536SAndroid Build Coastguard Worker x[24] = ur - (vr >> 1);
1274*e5436536SAndroid Build Coastguard Worker x[25] = ui + (vi >> 1);
1275*e5436536SAndroid Build Coastguard Worker
1276*e5436536SAndroid Build Coastguard Worker vr = x[48];
1277*e5436536SAndroid Build Coastguard Worker vi = x[49];
1278*e5436536SAndroid Build Coastguard Worker ur = x[32] >> 1;
1279*e5436536SAndroid Build Coastguard Worker ui = x[33] >> 1;
1280*e5436536SAndroid Build Coastguard Worker x[32] = ur + (vr >> 1);
1281*e5436536SAndroid Build Coastguard Worker x[33] = ui + (vi >> 1);
1282*e5436536SAndroid Build Coastguard Worker x[48] = ur - (vr >> 1);
1283*e5436536SAndroid Build Coastguard Worker x[49] = ui - (vi >> 1);
1284*e5436536SAndroid Build Coastguard Worker
1285*e5436536SAndroid Build Coastguard Worker vi = x[56];
1286*e5436536SAndroid Build Coastguard Worker vr = x[57];
1287*e5436536SAndroid Build Coastguard Worker ur = x[40] >> 1;
1288*e5436536SAndroid Build Coastguard Worker ui = x[41] >> 1;
1289*e5436536SAndroid Build Coastguard Worker x[40] = ur + (vr >> 1);
1290*e5436536SAndroid Build Coastguard Worker x[41] = ui - (vi >> 1);
1291*e5436536SAndroid Build Coastguard Worker x[56] = ur - (vr >> 1);
1292*e5436536SAndroid Build Coastguard Worker x[57] = ui + (vi >> 1);
1293*e5436536SAndroid Build Coastguard Worker
1294*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[19], x[18], fft32_w32[0]);
1295*e5436536SAndroid Build Coastguard Worker ur = x[2];
1296*e5436536SAndroid Build Coastguard Worker ui = x[3];
1297*e5436536SAndroid Build Coastguard Worker x[2] = (ur >> 1) + vr;
1298*e5436536SAndroid Build Coastguard Worker x[3] = (ui >> 1) + vi;
1299*e5436536SAndroid Build Coastguard Worker x[18] = (ur >> 1) - vr;
1300*e5436536SAndroid Build Coastguard Worker x[19] = (ui >> 1) - vi;
1301*e5436536SAndroid Build Coastguard Worker
1302*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[27], x[26], fft32_w32[0]);
1303*e5436536SAndroid Build Coastguard Worker ur = x[10];
1304*e5436536SAndroid Build Coastguard Worker ui = x[11];
1305*e5436536SAndroid Build Coastguard Worker x[10] = (ur >> 1) + vr;
1306*e5436536SAndroid Build Coastguard Worker x[11] = (ui >> 1) - vi;
1307*e5436536SAndroid Build Coastguard Worker x[26] = (ur >> 1) - vr;
1308*e5436536SAndroid Build Coastguard Worker x[27] = (ui >> 1) + vi;
1309*e5436536SAndroid Build Coastguard Worker
1310*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[51], x[50], fft32_w32[0]);
1311*e5436536SAndroid Build Coastguard Worker ur = x[34];
1312*e5436536SAndroid Build Coastguard Worker ui = x[35];
1313*e5436536SAndroid Build Coastguard Worker x[34] = (ur >> 1) + vr;
1314*e5436536SAndroid Build Coastguard Worker x[35] = (ui >> 1) + vi;
1315*e5436536SAndroid Build Coastguard Worker x[50] = (ur >> 1) - vr;
1316*e5436536SAndroid Build Coastguard Worker x[51] = (ui >> 1) - vi;
1317*e5436536SAndroid Build Coastguard Worker
1318*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[59], x[58], fft32_w32[0]);
1319*e5436536SAndroid Build Coastguard Worker ur = x[42];
1320*e5436536SAndroid Build Coastguard Worker ui = x[43];
1321*e5436536SAndroid Build Coastguard Worker x[42] = (ur >> 1) + vr;
1322*e5436536SAndroid Build Coastguard Worker x[43] = (ui >> 1) - vi;
1323*e5436536SAndroid Build Coastguard Worker x[58] = (ur >> 1) - vr;
1324*e5436536SAndroid Build Coastguard Worker x[59] = (ui >> 1) + vi;
1325*e5436536SAndroid Build Coastguard Worker
1326*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vi, vr, x[20], x[21])
1327*e5436536SAndroid Build Coastguard Worker ur = x[4];
1328*e5436536SAndroid Build Coastguard Worker ui = x[5];
1329*e5436536SAndroid Build Coastguard Worker x[4] = (ur >> 1) + vr;
1330*e5436536SAndroid Build Coastguard Worker x[5] = (ui >> 1) + vi;
1331*e5436536SAndroid Build Coastguard Worker x[20] = (ur >> 1) - vr;
1332*e5436536SAndroid Build Coastguard Worker x[21] = (ui >> 1) - vi;
1333*e5436536SAndroid Build Coastguard Worker
1334*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vr, vi, x[28], x[29])
1335*e5436536SAndroid Build Coastguard Worker ur = x[12];
1336*e5436536SAndroid Build Coastguard Worker ui = x[13];
1337*e5436536SAndroid Build Coastguard Worker x[12] = (ur >> 1) + vr;
1338*e5436536SAndroid Build Coastguard Worker x[13] = (ui >> 1) - vi;
1339*e5436536SAndroid Build Coastguard Worker x[28] = (ur >> 1) - vr;
1340*e5436536SAndroid Build Coastguard Worker x[29] = (ui >> 1) + vi;
1341*e5436536SAndroid Build Coastguard Worker
1342*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vi, vr, x[52], x[53])
1343*e5436536SAndroid Build Coastguard Worker ur = x[36];
1344*e5436536SAndroid Build Coastguard Worker ui = x[37];
1345*e5436536SAndroid Build Coastguard Worker x[36] = (ur >> 1) + vr;
1346*e5436536SAndroid Build Coastguard Worker x[37] = (ui >> 1) + vi;
1347*e5436536SAndroid Build Coastguard Worker x[52] = (ur >> 1) - vr;
1348*e5436536SAndroid Build Coastguard Worker x[53] = (ui >> 1) - vi;
1349*e5436536SAndroid Build Coastguard Worker
1350*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vr, vi, x[60], x[61])
1351*e5436536SAndroid Build Coastguard Worker ur = x[44];
1352*e5436536SAndroid Build Coastguard Worker ui = x[45];
1353*e5436536SAndroid Build Coastguard Worker x[44] = (ur >> 1) + vr;
1354*e5436536SAndroid Build Coastguard Worker x[45] = (ui >> 1) - vi;
1355*e5436536SAndroid Build Coastguard Worker x[60] = (ur >> 1) - vr;
1356*e5436536SAndroid Build Coastguard Worker x[61] = (ui >> 1) + vi;
1357*e5436536SAndroid Build Coastguard Worker
1358*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[23], x[22], fft32_w32[1]);
1359*e5436536SAndroid Build Coastguard Worker ur = x[6];
1360*e5436536SAndroid Build Coastguard Worker ui = x[7];
1361*e5436536SAndroid Build Coastguard Worker x[6] = (ur >> 1) + vr;
1362*e5436536SAndroid Build Coastguard Worker x[7] = (ui >> 1) + vi;
1363*e5436536SAndroid Build Coastguard Worker x[22] = (ur >> 1) - vr;
1364*e5436536SAndroid Build Coastguard Worker x[23] = (ui >> 1) - vi;
1365*e5436536SAndroid Build Coastguard Worker
1366*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[31], x[30], fft32_w32[1]);
1367*e5436536SAndroid Build Coastguard Worker ur = x[14];
1368*e5436536SAndroid Build Coastguard Worker ui = x[15];
1369*e5436536SAndroid Build Coastguard Worker x[14] = (ur >> 1) + vr;
1370*e5436536SAndroid Build Coastguard Worker x[15] = (ui >> 1) - vi;
1371*e5436536SAndroid Build Coastguard Worker x[30] = (ur >> 1) - vr;
1372*e5436536SAndroid Build Coastguard Worker x[31] = (ui >> 1) + vi;
1373*e5436536SAndroid Build Coastguard Worker
1374*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[55], x[54], fft32_w32[1]);
1375*e5436536SAndroid Build Coastguard Worker ur = x[38];
1376*e5436536SAndroid Build Coastguard Worker ui = x[39];
1377*e5436536SAndroid Build Coastguard Worker x[38] = (ur >> 1) + vr;
1378*e5436536SAndroid Build Coastguard Worker x[39] = (ui >> 1) + vi;
1379*e5436536SAndroid Build Coastguard Worker x[54] = (ur >> 1) - vr;
1380*e5436536SAndroid Build Coastguard Worker x[55] = (ui >> 1) - vi;
1381*e5436536SAndroid Build Coastguard Worker
1382*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[63], x[62], fft32_w32[1]);
1383*e5436536SAndroid Build Coastguard Worker ur = x[46];
1384*e5436536SAndroid Build Coastguard Worker ui = x[47];
1385*e5436536SAndroid Build Coastguard Worker
1386*e5436536SAndroid Build Coastguard Worker x[46] = (ur >> 1) + vr;
1387*e5436536SAndroid Build Coastguard Worker x[47] = (ui >> 1) - vi;
1388*e5436536SAndroid Build Coastguard Worker x[62] = (ur >> 1) - vr;
1389*e5436536SAndroid Build Coastguard Worker x[63] = (ui >> 1) + vi;
1390*e5436536SAndroid Build Coastguard Worker
1391*e5436536SAndroid Build Coastguard Worker vr = x[32];
1392*e5436536SAndroid Build Coastguard Worker vi = x[33];
1393*e5436536SAndroid Build Coastguard Worker ur = x[0] >> 1;
1394*e5436536SAndroid Build Coastguard Worker ui = x[1] >> 1;
1395*e5436536SAndroid Build Coastguard Worker x[0] = ur + (vr >> 1);
1396*e5436536SAndroid Build Coastguard Worker x[1] = ui + (vi >> 1);
1397*e5436536SAndroid Build Coastguard Worker x[32] = ur - (vr >> 1);
1398*e5436536SAndroid Build Coastguard Worker x[33] = ui - (vi >> 1);
1399*e5436536SAndroid Build Coastguard Worker
1400*e5436536SAndroid Build Coastguard Worker vi = x[48];
1401*e5436536SAndroid Build Coastguard Worker vr = x[49];
1402*e5436536SAndroid Build Coastguard Worker ur = x[16] >> 1;
1403*e5436536SAndroid Build Coastguard Worker ui = x[17] >> 1;
1404*e5436536SAndroid Build Coastguard Worker x[16] = ur + (vr >> 1);
1405*e5436536SAndroid Build Coastguard Worker x[17] = ui - (vi >> 1);
1406*e5436536SAndroid Build Coastguard Worker x[48] = ur - (vr >> 1);
1407*e5436536SAndroid Build Coastguard Worker x[49] = ui + (vi >> 1);
1408*e5436536SAndroid Build Coastguard Worker
1409*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[35], x[34], fft32_w32[2]);
1410*e5436536SAndroid Build Coastguard Worker ur = x[2];
1411*e5436536SAndroid Build Coastguard Worker ui = x[3];
1412*e5436536SAndroid Build Coastguard Worker x[2] = (ur >> 1) + vr;
1413*e5436536SAndroid Build Coastguard Worker x[3] = (ui >> 1) + vi;
1414*e5436536SAndroid Build Coastguard Worker x[34] = (ur >> 1) - vr;
1415*e5436536SAndroid Build Coastguard Worker x[35] = (ui >> 1) - vi;
1416*e5436536SAndroid Build Coastguard Worker
1417*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[51], x[50], fft32_w32[2]);
1418*e5436536SAndroid Build Coastguard Worker ur = x[18];
1419*e5436536SAndroid Build Coastguard Worker ui = x[19];
1420*e5436536SAndroid Build Coastguard Worker x[18] = (ur >> 1) + vr;
1421*e5436536SAndroid Build Coastguard Worker x[19] = (ui >> 1) - vi;
1422*e5436536SAndroid Build Coastguard Worker x[50] = (ur >> 1) - vr;
1423*e5436536SAndroid Build Coastguard Worker x[51] = (ui >> 1) + vi;
1424*e5436536SAndroid Build Coastguard Worker
1425*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[37], x[36], fft32_w32[0]);
1426*e5436536SAndroid Build Coastguard Worker ur = x[4];
1427*e5436536SAndroid Build Coastguard Worker ui = x[5];
1428*e5436536SAndroid Build Coastguard Worker x[4] = (ur >> 1) + vr;
1429*e5436536SAndroid Build Coastguard Worker x[5] = (ui >> 1) + vi;
1430*e5436536SAndroid Build Coastguard Worker x[36] = (ur >> 1) - vr;
1431*e5436536SAndroid Build Coastguard Worker x[37] = (ui >> 1) - vi;
1432*e5436536SAndroid Build Coastguard Worker
1433*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[53], x[52], fft32_w32[0]);
1434*e5436536SAndroid Build Coastguard Worker ur = x[20];
1435*e5436536SAndroid Build Coastguard Worker ui = x[21];
1436*e5436536SAndroid Build Coastguard Worker x[20] = (ur >> 1) + vr;
1437*e5436536SAndroid Build Coastguard Worker x[21] = (ui >> 1) - vi;
1438*e5436536SAndroid Build Coastguard Worker x[52] = (ur >> 1) - vr;
1439*e5436536SAndroid Build Coastguard Worker x[53] = (ui >> 1) + vi;
1440*e5436536SAndroid Build Coastguard Worker
1441*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[39], x[38], fft32_w32[3]);
1442*e5436536SAndroid Build Coastguard Worker ur = x[6];
1443*e5436536SAndroid Build Coastguard Worker ui = x[7];
1444*e5436536SAndroid Build Coastguard Worker x[6] = (ur >> 1) + vr;
1445*e5436536SAndroid Build Coastguard Worker x[7] = (ui >> 1) + vi;
1446*e5436536SAndroid Build Coastguard Worker x[38] = (ur >> 1) - vr;
1447*e5436536SAndroid Build Coastguard Worker x[39] = (ui >> 1) - vi;
1448*e5436536SAndroid Build Coastguard Worker
1449*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[55], x[54], fft32_w32[3]);
1450*e5436536SAndroid Build Coastguard Worker ur = x[22];
1451*e5436536SAndroid Build Coastguard Worker ui = x[23];
1452*e5436536SAndroid Build Coastguard Worker x[22] = (ur >> 1) + vr;
1453*e5436536SAndroid Build Coastguard Worker x[23] = (ui >> 1) - vi;
1454*e5436536SAndroid Build Coastguard Worker x[54] = (ur >> 1) - vr;
1455*e5436536SAndroid Build Coastguard Worker x[55] = (ui >> 1) + vi;
1456*e5436536SAndroid Build Coastguard Worker
1457*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vi, vr, x[40], x[41])
1458*e5436536SAndroid Build Coastguard Worker ur = x[8];
1459*e5436536SAndroid Build Coastguard Worker ui = x[9];
1460*e5436536SAndroid Build Coastguard Worker x[8] = (ur >> 1) + vr;
1461*e5436536SAndroid Build Coastguard Worker x[9] = (ui >> 1) + vi;
1462*e5436536SAndroid Build Coastguard Worker x[40] = (ur >> 1) - vr;
1463*e5436536SAndroid Build Coastguard Worker x[41] = (ui >> 1) - vi;
1464*e5436536SAndroid Build Coastguard Worker
1465*e5436536SAndroid Build Coastguard Worker SUMDIFF_PIFOURTH(vr, vi, x[56], x[57])
1466*e5436536SAndroid Build Coastguard Worker ur = x[24];
1467*e5436536SAndroid Build Coastguard Worker ui = x[25];
1468*e5436536SAndroid Build Coastguard Worker x[24] = (ur >> 1) + vr;
1469*e5436536SAndroid Build Coastguard Worker x[25] = (ui >> 1) - vi;
1470*e5436536SAndroid Build Coastguard Worker x[56] = (ur >> 1) - vr;
1471*e5436536SAndroid Build Coastguard Worker x[57] = (ui >> 1) + vi;
1472*e5436536SAndroid Build Coastguard Worker
1473*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[43], x[42], fft32_w32[4]);
1474*e5436536SAndroid Build Coastguard Worker ur = x[10];
1475*e5436536SAndroid Build Coastguard Worker ui = x[11];
1476*e5436536SAndroid Build Coastguard Worker
1477*e5436536SAndroid Build Coastguard Worker x[10] = (ur >> 1) + vr;
1478*e5436536SAndroid Build Coastguard Worker x[11] = (ui >> 1) + vi;
1479*e5436536SAndroid Build Coastguard Worker x[42] = (ur >> 1) - vr;
1480*e5436536SAndroid Build Coastguard Worker x[43] = (ui >> 1) - vi;
1481*e5436536SAndroid Build Coastguard Worker
1482*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[59], x[58], fft32_w32[4]);
1483*e5436536SAndroid Build Coastguard Worker ur = x[26];
1484*e5436536SAndroid Build Coastguard Worker ui = x[27];
1485*e5436536SAndroid Build Coastguard Worker x[26] = (ur >> 1) + vr;
1486*e5436536SAndroid Build Coastguard Worker x[27] = (ui >> 1) - vi;
1487*e5436536SAndroid Build Coastguard Worker x[58] = (ur >> 1) - vr;
1488*e5436536SAndroid Build Coastguard Worker x[59] = (ui >> 1) + vi;
1489*e5436536SAndroid Build Coastguard Worker
1490*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[45], x[44], fft32_w32[1]);
1491*e5436536SAndroid Build Coastguard Worker ur = x[12];
1492*e5436536SAndroid Build Coastguard Worker ui = x[13];
1493*e5436536SAndroid Build Coastguard Worker x[12] = (ur >> 1) + vr;
1494*e5436536SAndroid Build Coastguard Worker x[13] = (ui >> 1) + vi;
1495*e5436536SAndroid Build Coastguard Worker x[44] = (ur >> 1) - vr;
1496*e5436536SAndroid Build Coastguard Worker x[45] = (ui >> 1) - vi;
1497*e5436536SAndroid Build Coastguard Worker
1498*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[61], x[60], fft32_w32[1]);
1499*e5436536SAndroid Build Coastguard Worker ur = x[28];
1500*e5436536SAndroid Build Coastguard Worker ui = x[29];
1501*e5436536SAndroid Build Coastguard Worker x[28] = (ur >> 1) + vr;
1502*e5436536SAndroid Build Coastguard Worker x[29] = (ui >> 1) - vi;
1503*e5436536SAndroid Build Coastguard Worker x[60] = (ur >> 1) - vr;
1504*e5436536SAndroid Build Coastguard Worker x[61] = (ui >> 1) + vi;
1505*e5436536SAndroid Build Coastguard Worker
1506*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vi, &vr, x[47], x[46], fft32_w32[5]);
1507*e5436536SAndroid Build Coastguard Worker ur = x[14];
1508*e5436536SAndroid Build Coastguard Worker ui = x[15];
1509*e5436536SAndroid Build Coastguard Worker x[14] = (ur >> 1) + vr;
1510*e5436536SAndroid Build Coastguard Worker x[15] = (ui >> 1) + vi;
1511*e5436536SAndroid Build Coastguard Worker x[46] = (ur >> 1) - vr;
1512*e5436536SAndroid Build Coastguard Worker x[47] = (ui >> 1) - vi;
1513*e5436536SAndroid Build Coastguard Worker
1514*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&vr, &vi, x[63], x[62], fft32_w32[5]);
1515*e5436536SAndroid Build Coastguard Worker ur = x[30];
1516*e5436536SAndroid Build Coastguard Worker ui = x[31];
1517*e5436536SAndroid Build Coastguard Worker x[30] = (ur >> 1) + vr;
1518*e5436536SAndroid Build Coastguard Worker x[31] = (ui >> 1) - vi;
1519*e5436536SAndroid Build Coastguard Worker x[62] = (ur >> 1) - vr;
1520*e5436536SAndroid Build Coastguard Worker x[63] = (ui >> 1) + vi;
1521*e5436536SAndroid Build Coastguard Worker }
1522*e5436536SAndroid Build Coastguard Worker }
1523*e5436536SAndroid Build Coastguard Worker #endif /* #ifndef FUNCTION_fft_32 */
1524*e5436536SAndroid Build Coastguard Worker
1525*e5436536SAndroid Build Coastguard Worker /**
1526*e5436536SAndroid Build Coastguard Worker * \brief Apply rotation vectors to a data buffer.
1527*e5436536SAndroid Build Coastguard Worker * \param cl length of each row of input data.
1528*e5436536SAndroid Build Coastguard Worker * \param l total length of input data.
1529*e5436536SAndroid Build Coastguard Worker * \param pVecRe real part of rotation coefficient vector.
1530*e5436536SAndroid Build Coastguard Worker * \param pVecIm imaginary part of rotation coefficient vector.
1531*e5436536SAndroid Build Coastguard Worker */
1532*e5436536SAndroid Build Coastguard Worker
1533*e5436536SAndroid Build Coastguard Worker /*
1534*e5436536SAndroid Build Coastguard Worker This defines patches each inaccurate 0x7FFF i.e. 0.9999 and uses 0x8000
1535*e5436536SAndroid Build Coastguard Worker (-1.0) instead. At the end, the sign of the result is inverted
1536*e5436536SAndroid Build Coastguard Worker */
1537*e5436536SAndroid Build Coastguard Worker #define noFFT_APPLY_ROT_VECTOR_HQ
1538*e5436536SAndroid Build Coastguard Worker
1539*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft_apply_rot_vector__FIXP_DBL
fft_apply_rot_vector(FIXP_DBL * RESTRICT pData,const int cl,const int l,const FIXP_STB * pVecRe,const FIXP_STB * pVecIm)1540*e5436536SAndroid Build Coastguard Worker static inline void fft_apply_rot_vector(FIXP_DBL *RESTRICT pData, const int cl,
1541*e5436536SAndroid Build Coastguard Worker const int l, const FIXP_STB *pVecRe,
1542*e5436536SAndroid Build Coastguard Worker const FIXP_STB *pVecIm) {
1543*e5436536SAndroid Build Coastguard Worker FIXP_DBL re, im;
1544*e5436536SAndroid Build Coastguard Worker FIXP_STB vre, vim;
1545*e5436536SAndroid Build Coastguard Worker
1546*e5436536SAndroid Build Coastguard Worker int i, c;
1547*e5436536SAndroid Build Coastguard Worker
1548*e5436536SAndroid Build Coastguard Worker for (i = 0; i < cl; i++) {
1549*e5436536SAndroid Build Coastguard Worker re = pData[2 * i];
1550*e5436536SAndroid Build Coastguard Worker im = pData[2 * i + 1];
1551*e5436536SAndroid Build Coastguard Worker
1552*e5436536SAndroid Build Coastguard Worker pData[2 * i] = re >> 2; /* * 0.25 */
1553*e5436536SAndroid Build Coastguard Worker pData[2 * i + 1] = im >> 2; /* * 0.25 */
1554*e5436536SAndroid Build Coastguard Worker }
1555*e5436536SAndroid Build Coastguard Worker for (; i < l; i += cl) {
1556*e5436536SAndroid Build Coastguard Worker re = pData[2 * i];
1557*e5436536SAndroid Build Coastguard Worker im = pData[2 * i + 1];
1558*e5436536SAndroid Build Coastguard Worker
1559*e5436536SAndroid Build Coastguard Worker pData[2 * i] = re >> 2; /* * 0.25 */
1560*e5436536SAndroid Build Coastguard Worker pData[2 * i + 1] = im >> 2; /* * 0.25 */
1561*e5436536SAndroid Build Coastguard Worker
1562*e5436536SAndroid Build Coastguard Worker for (c = i + 1; c < i + cl; c++) {
1563*e5436536SAndroid Build Coastguard Worker re = pData[2 * c] >> 1;
1564*e5436536SAndroid Build Coastguard Worker im = pData[2 * c + 1] >> 1;
1565*e5436536SAndroid Build Coastguard Worker vre = *pVecRe++;
1566*e5436536SAndroid Build Coastguard Worker vim = *pVecIm++;
1567*e5436536SAndroid Build Coastguard Worker
1568*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&pData[2 * c + 1], &pData[2 * c], im, re, vre, vim);
1569*e5436536SAndroid Build Coastguard Worker }
1570*e5436536SAndroid Build Coastguard Worker }
1571*e5436536SAndroid Build Coastguard Worker }
1572*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft_apply_rot_vector__FIXP_DBL */
1573*e5436536SAndroid Build Coastguard Worker
1574*e5436536SAndroid Build Coastguard Worker /* select either switch case of function pointer. */
1575*e5436536SAndroid Build Coastguard Worker //#define FFT_TWO_STAGE_SWITCH_CASE
1576*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fftN2_func
fftN2_func(FIXP_DBL * pInput,const int length,const int dim1,const int dim2,void (* const fft1)(FIXP_DBL *),void (* const fft2)(FIXP_DBL *),const FIXP_STB * RotVectorReal,const FIXP_STB * RotVectorImag,FIXP_DBL * aDst,FIXP_DBL * aDst2)1577*e5436536SAndroid Build Coastguard Worker static inline void fftN2_func(FIXP_DBL *pInput, const int length,
1578*e5436536SAndroid Build Coastguard Worker const int dim1, const int dim2,
1579*e5436536SAndroid Build Coastguard Worker void (*const fft1)(FIXP_DBL *),
1580*e5436536SAndroid Build Coastguard Worker void (*const fft2)(FIXP_DBL *),
1581*e5436536SAndroid Build Coastguard Worker const FIXP_STB *RotVectorReal,
1582*e5436536SAndroid Build Coastguard Worker const FIXP_STB *RotVectorImag, FIXP_DBL *aDst,
1583*e5436536SAndroid Build Coastguard Worker FIXP_DBL *aDst2) {
1584*e5436536SAndroid Build Coastguard Worker /* The real part of the input samples are at the addresses with even indices
1585*e5436536SAndroid Build Coastguard Worker and the imaginary part of the input samples are at the addresses with odd
1586*e5436536SAndroid Build Coastguard Worker indices. The output samples are stored at the address of pInput
1587*e5436536SAndroid Build Coastguard Worker */
1588*e5436536SAndroid Build Coastguard Worker FIXP_DBL *pSrc, *pDst, *pDstOut;
1589*e5436536SAndroid Build Coastguard Worker int i;
1590*e5436536SAndroid Build Coastguard Worker
1591*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(length == dim1 * dim2);
1592*e5436536SAndroid Build Coastguard Worker
1593*e5436536SAndroid Build Coastguard Worker /* Perform dim2 times the fft of length dim1. The input samples are at the
1594*e5436536SAndroid Build Coastguard Worker address of pSrc and the output samples are at the address of pDst. The input
1595*e5436536SAndroid Build Coastguard Worker vector for the fft of length dim1 is built of the interleaved samples in pSrc,
1596*e5436536SAndroid Build Coastguard Worker the output samples are stored consecutively.
1597*e5436536SAndroid Build Coastguard Worker */
1598*e5436536SAndroid Build Coastguard Worker pSrc = pInput;
1599*e5436536SAndroid Build Coastguard Worker pDst = aDst;
1600*e5436536SAndroid Build Coastguard Worker for (i = 0; i < dim2; i++) {
1601*e5436536SAndroid Build Coastguard Worker for (int j = 0; j < dim1; j++) {
1602*e5436536SAndroid Build Coastguard Worker pDst[2 * j] = pSrc[2 * j * dim2];
1603*e5436536SAndroid Build Coastguard Worker pDst[2 * j + 1] = pSrc[2 * j * dim2 + 1];
1604*e5436536SAndroid Build Coastguard Worker }
1605*e5436536SAndroid Build Coastguard Worker
1606*e5436536SAndroid Build Coastguard Worker /* fft of size dim1 */
1607*e5436536SAndroid Build Coastguard Worker #ifndef FFT_TWO_STAGE_SWITCH_CASE
1608*e5436536SAndroid Build Coastguard Worker fft1(pDst);
1609*e5436536SAndroid Build Coastguard Worker #else
1610*e5436536SAndroid Build Coastguard Worker switch (dim1) {
1611*e5436536SAndroid Build Coastguard Worker case 2:
1612*e5436536SAndroid Build Coastguard Worker fft2(pDst);
1613*e5436536SAndroid Build Coastguard Worker break;
1614*e5436536SAndroid Build Coastguard Worker case 3:
1615*e5436536SAndroid Build Coastguard Worker fft3(pDst);
1616*e5436536SAndroid Build Coastguard Worker break;
1617*e5436536SAndroid Build Coastguard Worker case 4:
1618*e5436536SAndroid Build Coastguard Worker fft_4(pDst);
1619*e5436536SAndroid Build Coastguard Worker break;
1620*e5436536SAndroid Build Coastguard Worker /* case 5: fft5(pDst); break; */
1621*e5436536SAndroid Build Coastguard Worker /* case 8: fft_8(pDst); break; */
1622*e5436536SAndroid Build Coastguard Worker case 12:
1623*e5436536SAndroid Build Coastguard Worker fft12(pDst);
1624*e5436536SAndroid Build Coastguard Worker break;
1625*e5436536SAndroid Build Coastguard Worker /* case 15: fft15(pDst); break; */
1626*e5436536SAndroid Build Coastguard Worker case 16:
1627*e5436536SAndroid Build Coastguard Worker fft_16(pDst);
1628*e5436536SAndroid Build Coastguard Worker break;
1629*e5436536SAndroid Build Coastguard Worker case 32:
1630*e5436536SAndroid Build Coastguard Worker fft_32(pDst);
1631*e5436536SAndroid Build Coastguard Worker break;
1632*e5436536SAndroid Build Coastguard Worker /*case 64: fft_64(pDst); break;*/
1633*e5436536SAndroid Build Coastguard Worker /* case 128: fft_128(pDst); break; */
1634*e5436536SAndroid Build Coastguard Worker }
1635*e5436536SAndroid Build Coastguard Worker #endif
1636*e5436536SAndroid Build Coastguard Worker pSrc += 2;
1637*e5436536SAndroid Build Coastguard Worker pDst = pDst + 2 * dim1;
1638*e5436536SAndroid Build Coastguard Worker }
1639*e5436536SAndroid Build Coastguard Worker
1640*e5436536SAndroid Build Coastguard Worker /* Perform the modulation of the output of the fft of length dim1 */
1641*e5436536SAndroid Build Coastguard Worker pSrc = aDst;
1642*e5436536SAndroid Build Coastguard Worker fft_apply_rot_vector(pSrc, dim1, length, RotVectorReal, RotVectorImag);
1643*e5436536SAndroid Build Coastguard Worker
1644*e5436536SAndroid Build Coastguard Worker /* Perform dim1 times the fft of length dim2. The input samples are at the
1645*e5436536SAndroid Build Coastguard Worker address of aDst and the output samples are at the address of pInput. The input
1646*e5436536SAndroid Build Coastguard Worker vector for the fft of length dim2 is built of the interleaved samples in aDst,
1647*e5436536SAndroid Build Coastguard Worker the output samples are stored consecutively at the address of pInput.
1648*e5436536SAndroid Build Coastguard Worker */
1649*e5436536SAndroid Build Coastguard Worker pSrc = aDst;
1650*e5436536SAndroid Build Coastguard Worker pDst = aDst2;
1651*e5436536SAndroid Build Coastguard Worker pDstOut = pInput;
1652*e5436536SAndroid Build Coastguard Worker for (i = 0; i < dim1; i++) {
1653*e5436536SAndroid Build Coastguard Worker for (int j = 0; j < dim2; j++) {
1654*e5436536SAndroid Build Coastguard Worker pDst[2 * j] = pSrc[2 * j * dim1];
1655*e5436536SAndroid Build Coastguard Worker pDst[2 * j + 1] = pSrc[2 * j * dim1 + 1];
1656*e5436536SAndroid Build Coastguard Worker }
1657*e5436536SAndroid Build Coastguard Worker
1658*e5436536SAndroid Build Coastguard Worker #ifndef FFT_TWO_STAGE_SWITCH_CASE
1659*e5436536SAndroid Build Coastguard Worker fft2(pDst);
1660*e5436536SAndroid Build Coastguard Worker #else
1661*e5436536SAndroid Build Coastguard Worker switch (dim2) {
1662*e5436536SAndroid Build Coastguard Worker case 4:
1663*e5436536SAndroid Build Coastguard Worker fft_4(pDst);
1664*e5436536SAndroid Build Coastguard Worker break;
1665*e5436536SAndroid Build Coastguard Worker case 9:
1666*e5436536SAndroid Build Coastguard Worker fft9(pDst);
1667*e5436536SAndroid Build Coastguard Worker break;
1668*e5436536SAndroid Build Coastguard Worker case 12:
1669*e5436536SAndroid Build Coastguard Worker fft12(pDst);
1670*e5436536SAndroid Build Coastguard Worker break;
1671*e5436536SAndroid Build Coastguard Worker case 15:
1672*e5436536SAndroid Build Coastguard Worker fft15(pDst);
1673*e5436536SAndroid Build Coastguard Worker break;
1674*e5436536SAndroid Build Coastguard Worker case 16:
1675*e5436536SAndroid Build Coastguard Worker fft_16(pDst);
1676*e5436536SAndroid Build Coastguard Worker break;
1677*e5436536SAndroid Build Coastguard Worker case 32:
1678*e5436536SAndroid Build Coastguard Worker fft_32(pDst);
1679*e5436536SAndroid Build Coastguard Worker break;
1680*e5436536SAndroid Build Coastguard Worker }
1681*e5436536SAndroid Build Coastguard Worker #endif
1682*e5436536SAndroid Build Coastguard Worker
1683*e5436536SAndroid Build Coastguard Worker for (int j = 0; j < dim2; j++) {
1684*e5436536SAndroid Build Coastguard Worker pDstOut[2 * j * dim1] = pDst[2 * j];
1685*e5436536SAndroid Build Coastguard Worker pDstOut[2 * j * dim1 + 1] = pDst[2 * j + 1];
1686*e5436536SAndroid Build Coastguard Worker }
1687*e5436536SAndroid Build Coastguard Worker pSrc += 2;
1688*e5436536SAndroid Build Coastguard Worker pDstOut += 2;
1689*e5436536SAndroid Build Coastguard Worker }
1690*e5436536SAndroid Build Coastguard Worker }
1691*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fftN2_function */
1692*e5436536SAndroid Build Coastguard Worker
1693*e5436536SAndroid Build Coastguard Worker #define fftN2(DATA_TYPE, pInput, length, dim1, dim2, fft_func1, fft_func2, \
1694*e5436536SAndroid Build Coastguard Worker RotVectorReal, RotVectorImag) \
1695*e5436536SAndroid Build Coastguard Worker { \
1696*e5436536SAndroid Build Coastguard Worker C_AALLOC_SCRATCH_START(aDst, DATA_TYPE, 2 * length) \
1697*e5436536SAndroid Build Coastguard Worker C_AALLOC_SCRATCH_START(aDst2, DATA_TYPE, 2 * dim2) \
1698*e5436536SAndroid Build Coastguard Worker fftN2_func(pInput, length, dim1, dim2, fft_func1, fft_func2, \
1699*e5436536SAndroid Build Coastguard Worker RotVectorReal, RotVectorImag, aDst, aDst2); \
1700*e5436536SAndroid Build Coastguard Worker C_AALLOC_SCRATCH_END(aDst2, DATA_TYPE, 2 * dim2) \
1701*e5436536SAndroid Build Coastguard Worker C_AALLOC_SCRATCH_END(aDst, DATA_TYPE, 2 * length) \
1702*e5436536SAndroid Build Coastguard Worker }
1703*e5436536SAndroid Build Coastguard Worker
1704*e5436536SAndroid Build Coastguard Worker /*!
1705*e5436536SAndroid Build Coastguard Worker *
1706*e5436536SAndroid Build Coastguard Worker * \brief complex FFT of length 12,18,24,30,48,60,96, 192, 240, 384, 480
1707*e5436536SAndroid Build Coastguard Worker * \param pInput contains the input signal prescaled right by 2
1708*e5436536SAndroid Build Coastguard Worker * pInput contains the output signal scaled by SCALEFACTOR<#length>
1709*e5436536SAndroid Build Coastguard Worker * The output signal does not have any fixed headroom
1710*e5436536SAndroid Build Coastguard Worker * \return void
1711*e5436536SAndroid Build Coastguard Worker *
1712*e5436536SAndroid Build Coastguard Worker */
1713*e5436536SAndroid Build Coastguard Worker
1714*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft6
fft6(FIXP_DBL * pInput)1715*e5436536SAndroid Build Coastguard Worker static inline void fft6(FIXP_DBL *pInput) {
1716*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 6, 2, 3, fft2, fft3, RotVectorReal6, RotVectorImag6);
1717*e5436536SAndroid Build Coastguard Worker }
1718*e5436536SAndroid Build Coastguard Worker #endif /* #ifndef FUNCTION_fft6 */
1719*e5436536SAndroid Build Coastguard Worker
1720*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft12
fft12(FIXP_DBL * pInput)1721*e5436536SAndroid Build Coastguard Worker static inline void fft12(FIXP_DBL *pInput) {
1722*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 12, 3, 4, fft3, fft_4, RotVectorReal12,
1723*e5436536SAndroid Build Coastguard Worker RotVectorImag12); /* 16,58 */
1724*e5436536SAndroid Build Coastguard Worker }
1725*e5436536SAndroid Build Coastguard Worker #endif /* #ifndef FUNCTION_fft12 */
1726*e5436536SAndroid Build Coastguard Worker
1727*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft20
fft20(FIXP_DBL * pInput)1728*e5436536SAndroid Build Coastguard Worker static inline void fft20(FIXP_DBL *pInput) {
1729*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 20, 4, 5, fft_4, fft5, RotVectorReal20,
1730*e5436536SAndroid Build Coastguard Worker RotVectorImag20);
1731*e5436536SAndroid Build Coastguard Worker }
1732*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft20 */
1733*e5436536SAndroid Build Coastguard Worker
fft24(FIXP_DBL * pInput)1734*e5436536SAndroid Build Coastguard Worker static inline void fft24(FIXP_DBL *pInput) {
1735*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 24, 2, 12, fft2, fft12, RotVectorReal24,
1736*e5436536SAndroid Build Coastguard Worker RotVectorImag24); /* 16,73 */
1737*e5436536SAndroid Build Coastguard Worker }
1738*e5436536SAndroid Build Coastguard Worker
fft48(FIXP_DBL * pInput)1739*e5436536SAndroid Build Coastguard Worker static inline void fft48(FIXP_DBL *pInput) {
1740*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 48, 4, 12, fft_4, fft12, RotVectorReal48,
1741*e5436536SAndroid Build Coastguard Worker RotVectorImag48); /* 16,32 */
1742*e5436536SAndroid Build Coastguard Worker }
1743*e5436536SAndroid Build Coastguard Worker
1744*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft60
fft60(FIXP_DBL * pInput)1745*e5436536SAndroid Build Coastguard Worker static inline void fft60(FIXP_DBL *pInput) {
1746*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 60, 4, 15, fft_4, fft15, RotVectorReal60,
1747*e5436536SAndroid Build Coastguard Worker RotVectorImag60); /* 15,51 */
1748*e5436536SAndroid Build Coastguard Worker }
1749*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft60 */
1750*e5436536SAndroid Build Coastguard Worker
1751*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft80
fft80(FIXP_DBL * pInput)1752*e5436536SAndroid Build Coastguard Worker static inline void fft80(FIXP_DBL *pInput) {
1753*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 80, 5, 16, fft5, fft_16, RotVectorReal80,
1754*e5436536SAndroid Build Coastguard Worker RotVectorImag80); /* */
1755*e5436536SAndroid Build Coastguard Worker }
1756*e5436536SAndroid Build Coastguard Worker #endif
1757*e5436536SAndroid Build Coastguard Worker
1758*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft96
fft96(FIXP_DBL * pInput)1759*e5436536SAndroid Build Coastguard Worker static inline void fft96(FIXP_DBL *pInput) {
1760*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 96, 3, 32, fft3, fft_32, RotVectorReal96,
1761*e5436536SAndroid Build Coastguard Worker RotVectorImag96); /* 15,47 */
1762*e5436536SAndroid Build Coastguard Worker }
1763*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft96*/
1764*e5436536SAndroid Build Coastguard Worker
1765*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft120
fft120(FIXP_DBL * pInput)1766*e5436536SAndroid Build Coastguard Worker static inline void fft120(FIXP_DBL *pInput) {
1767*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 120, 8, 15, fft_8, fft15, RotVectorReal120,
1768*e5436536SAndroid Build Coastguard Worker RotVectorImag120);
1769*e5436536SAndroid Build Coastguard Worker }
1770*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft120 */
1771*e5436536SAndroid Build Coastguard Worker
1772*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft192
fft192(FIXP_DBL * pInput)1773*e5436536SAndroid Build Coastguard Worker static inline void fft192(FIXP_DBL *pInput) {
1774*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 192, 16, 12, fft_16, fft12, RotVectorReal192,
1775*e5436536SAndroid Build Coastguard Worker RotVectorImag192); /* 15,50 */
1776*e5436536SAndroid Build Coastguard Worker }
1777*e5436536SAndroid Build Coastguard Worker #endif
1778*e5436536SAndroid Build Coastguard Worker
1779*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft240
fft240(FIXP_DBL * pInput)1780*e5436536SAndroid Build Coastguard Worker static inline void fft240(FIXP_DBL *pInput) {
1781*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 240, 16, 15, fft_16, fft15, RotVectorReal240,
1782*e5436536SAndroid Build Coastguard Worker RotVectorImag240); /* 15.44 */
1783*e5436536SAndroid Build Coastguard Worker }
1784*e5436536SAndroid Build Coastguard Worker #endif
1785*e5436536SAndroid Build Coastguard Worker
1786*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft384
fft384(FIXP_DBL * pInput)1787*e5436536SAndroid Build Coastguard Worker static inline void fft384(FIXP_DBL *pInput) {
1788*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 384, 12, 32, fft12, fft_32, RotVectorReal384,
1789*e5436536SAndroid Build Coastguard Worker RotVectorImag384); /* 16.02 */
1790*e5436536SAndroid Build Coastguard Worker }
1791*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft384 */
1792*e5436536SAndroid Build Coastguard Worker
1793*e5436536SAndroid Build Coastguard Worker #ifndef FUNCTION_fft480
fft480(FIXP_DBL * pInput)1794*e5436536SAndroid Build Coastguard Worker static inline void fft480(FIXP_DBL *pInput) {
1795*e5436536SAndroid Build Coastguard Worker fftN2(FIXP_DBL, pInput, 480, 32, 15, fft_32, fft15, RotVectorReal480,
1796*e5436536SAndroid Build Coastguard Worker RotVectorImag480); /* 15.84 */
1797*e5436536SAndroid Build Coastguard Worker }
1798*e5436536SAndroid Build Coastguard Worker #endif /* FUNCTION_fft480 */
1799*e5436536SAndroid Build Coastguard Worker
fft(int length,FIXP_DBL * pInput,INT * pScalefactor)1800*e5436536SAndroid Build Coastguard Worker void fft(int length, FIXP_DBL *pInput, INT *pScalefactor) {
1801*e5436536SAndroid Build Coastguard Worker /* Ensure, that the io-ptr is always (at least 8-byte) aligned */
1802*e5436536SAndroid Build Coastguard Worker C_ALLOC_ALIGNED_CHECK(pInput);
1803*e5436536SAndroid Build Coastguard Worker
1804*e5436536SAndroid Build Coastguard Worker if (length == 32) {
1805*e5436536SAndroid Build Coastguard Worker fft_32(pInput);
1806*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR32;
1807*e5436536SAndroid Build Coastguard Worker } else {
1808*e5436536SAndroid Build Coastguard Worker switch (length) {
1809*e5436536SAndroid Build Coastguard Worker case 16:
1810*e5436536SAndroid Build Coastguard Worker fft_16(pInput);
1811*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR16;
1812*e5436536SAndroid Build Coastguard Worker break;
1813*e5436536SAndroid Build Coastguard Worker case 8:
1814*e5436536SAndroid Build Coastguard Worker fft_8(pInput);
1815*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR8;
1816*e5436536SAndroid Build Coastguard Worker break;
1817*e5436536SAndroid Build Coastguard Worker case 2:
1818*e5436536SAndroid Build Coastguard Worker fft2(pInput);
1819*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR2;
1820*e5436536SAndroid Build Coastguard Worker break;
1821*e5436536SAndroid Build Coastguard Worker case 3:
1822*e5436536SAndroid Build Coastguard Worker fft3(pInput);
1823*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR3;
1824*e5436536SAndroid Build Coastguard Worker break;
1825*e5436536SAndroid Build Coastguard Worker case 4:
1826*e5436536SAndroid Build Coastguard Worker fft_4(pInput);
1827*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR4;
1828*e5436536SAndroid Build Coastguard Worker break;
1829*e5436536SAndroid Build Coastguard Worker case 5:
1830*e5436536SAndroid Build Coastguard Worker fft5(pInput);
1831*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR5;
1832*e5436536SAndroid Build Coastguard Worker break;
1833*e5436536SAndroid Build Coastguard Worker case 6:
1834*e5436536SAndroid Build Coastguard Worker fft6(pInput);
1835*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR6;
1836*e5436536SAndroid Build Coastguard Worker break;
1837*e5436536SAndroid Build Coastguard Worker case 10:
1838*e5436536SAndroid Build Coastguard Worker fft10(pInput);
1839*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR10;
1840*e5436536SAndroid Build Coastguard Worker break;
1841*e5436536SAndroid Build Coastguard Worker case 12:
1842*e5436536SAndroid Build Coastguard Worker fft12(pInput);
1843*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR12;
1844*e5436536SAndroid Build Coastguard Worker break;
1845*e5436536SAndroid Build Coastguard Worker case 15:
1846*e5436536SAndroid Build Coastguard Worker fft15(pInput);
1847*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR15;
1848*e5436536SAndroid Build Coastguard Worker break;
1849*e5436536SAndroid Build Coastguard Worker case 20:
1850*e5436536SAndroid Build Coastguard Worker fft20(pInput);
1851*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR20;
1852*e5436536SAndroid Build Coastguard Worker break;
1853*e5436536SAndroid Build Coastguard Worker case 24:
1854*e5436536SAndroid Build Coastguard Worker fft24(pInput);
1855*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR24;
1856*e5436536SAndroid Build Coastguard Worker break;
1857*e5436536SAndroid Build Coastguard Worker case 48:
1858*e5436536SAndroid Build Coastguard Worker fft48(pInput);
1859*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR48;
1860*e5436536SAndroid Build Coastguard Worker break;
1861*e5436536SAndroid Build Coastguard Worker case 60:
1862*e5436536SAndroid Build Coastguard Worker fft60(pInput);
1863*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR60;
1864*e5436536SAndroid Build Coastguard Worker break;
1865*e5436536SAndroid Build Coastguard Worker case 64:
1866*e5436536SAndroid Build Coastguard Worker dit_fft(pInput, 6, SineTable512, 512);
1867*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR64;
1868*e5436536SAndroid Build Coastguard Worker break;
1869*e5436536SAndroid Build Coastguard Worker case 80:
1870*e5436536SAndroid Build Coastguard Worker fft80(pInput);
1871*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR80;
1872*e5436536SAndroid Build Coastguard Worker break;
1873*e5436536SAndroid Build Coastguard Worker case 96:
1874*e5436536SAndroid Build Coastguard Worker fft96(pInput);
1875*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR96;
1876*e5436536SAndroid Build Coastguard Worker break;
1877*e5436536SAndroid Build Coastguard Worker case 120:
1878*e5436536SAndroid Build Coastguard Worker fft120(pInput);
1879*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR120;
1880*e5436536SAndroid Build Coastguard Worker break;
1881*e5436536SAndroid Build Coastguard Worker case 128:
1882*e5436536SAndroid Build Coastguard Worker dit_fft(pInput, 7, SineTable512, 512);
1883*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR128;
1884*e5436536SAndroid Build Coastguard Worker break;
1885*e5436536SAndroid Build Coastguard Worker case 192:
1886*e5436536SAndroid Build Coastguard Worker fft192(pInput);
1887*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR192;
1888*e5436536SAndroid Build Coastguard Worker break;
1889*e5436536SAndroid Build Coastguard Worker case 240:
1890*e5436536SAndroid Build Coastguard Worker fft240(pInput);
1891*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR240;
1892*e5436536SAndroid Build Coastguard Worker break;
1893*e5436536SAndroid Build Coastguard Worker case 256:
1894*e5436536SAndroid Build Coastguard Worker dit_fft(pInput, 8, SineTable512, 512);
1895*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR256;
1896*e5436536SAndroid Build Coastguard Worker break;
1897*e5436536SAndroid Build Coastguard Worker case 384:
1898*e5436536SAndroid Build Coastguard Worker fft384(pInput);
1899*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR384;
1900*e5436536SAndroid Build Coastguard Worker break;
1901*e5436536SAndroid Build Coastguard Worker case 480:
1902*e5436536SAndroid Build Coastguard Worker fft480(pInput);
1903*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR480;
1904*e5436536SAndroid Build Coastguard Worker break;
1905*e5436536SAndroid Build Coastguard Worker case 512:
1906*e5436536SAndroid Build Coastguard Worker dit_fft(pInput, 9, SineTable512, 512);
1907*e5436536SAndroid Build Coastguard Worker *pScalefactor += SCALEFACTOR512;
1908*e5436536SAndroid Build Coastguard Worker break;
1909*e5436536SAndroid Build Coastguard Worker default:
1910*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(0); /* FFT length not supported! */
1911*e5436536SAndroid Build Coastguard Worker break;
1912*e5436536SAndroid Build Coastguard Worker }
1913*e5436536SAndroid Build Coastguard Worker }
1914*e5436536SAndroid Build Coastguard Worker }
1915*e5436536SAndroid Build Coastguard Worker
ifft(int length,FIXP_DBL * pInput,INT * scalefactor)1916*e5436536SAndroid Build Coastguard Worker void ifft(int length, FIXP_DBL *pInput, INT *scalefactor) {
1917*e5436536SAndroid Build Coastguard Worker switch (length) {
1918*e5436536SAndroid Build Coastguard Worker default:
1919*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(0); /* IFFT length not supported! */
1920*e5436536SAndroid Build Coastguard Worker break;
1921*e5436536SAndroid Build Coastguard Worker }
1922*e5436536SAndroid Build Coastguard Worker }
1923