1 /*
2 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 /**
17 * @file picofftsg.c
18 *
19 * FFT/DCT related data types, constants and functions in Pico
20 *
21 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
22 * All rights reserved.
23 *
24 * History:
25 * - 2009-04-20 -- initial version
26 *
27 */
28
29 #include "picoos.h"
30 #include "picofftsg.h"
31 #include "picodbg.h"
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 /**
38 * @addtogroup picofft
39 * ---------------------------------------------------\n
40 * <b> Fast Fourier/Cosine/Sine Transform </b>\n
41 * Adapted from http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html (Copyright Takuya OOURA, 1996-2001)\n
42 * ---------------------------------------------------\n
43
44 Overall features
45 - dimension :one
46 - data length :power of 2
47 - decimation :frequency
48 - radix :split-radix
49 - data :inplace
50 - table :not use
51
52 functions
53 - cdft: Complex Discrete Fourier Transform
54 - rdft: Real Discrete Fourier Transform
55 - ddct: Discrete Cosine Transform
56 - ddst: Discrete Sine Transform
57 - dfct: Cosine Transform of RDFT (Real Symmetric DFT)
58 - dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)
59
60 function prototypes
61 - void cdft(picoos_int32, picoos_int32, PICOFFTSG_FFTTYPE *);
62 - void rdft(picoos_int32, picoos_int32, PICOFFTSG_FFTTYPE *);
63 - void ddct(picoos_int32, picoos_int32, PICOFFTSG_FFTTYPE *);
64 - void ddst(picoos_int32, picoos_int32, PICOFFTSG_FFTTYPE *);
65 - void dfct(picoos_int32, PICOFFTSG_FFTTYPE *);
66 - void dfst(picoos_int32, PICOFFTSG_FFTTYPE *);
67
68 <b>Complex DFT (Discrete Fourier Transform)</b>
69
70 [definition]
71 - <case1>
72 - X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n
73 - <case2>
74 - X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n
75 - (notes: sum_j=0^n-1 is a summation from j=0 to n-1)
76
77 [usage]
78 - <case1>
79 - cdft(2*n, 1, a);
80 - <case2>
81 - cdft(2*n, -1, a);
82
83 [parameters]
84 - 2*n :data length (picoos_int32)
85 - n >= 1, n = power of 2
86 - a[0...2*n-1] :input/output data (PICOFFTSG_FFTTYPE *)
87 - input data
88 - a[2*j] = Re(x[j]),
89 - a[2*j+1] = Im(x[j]), 0<=j<n
90 - output data
91 - a[2*k] = Re(X[k]),
92 - a[2*k+1] = Im(X[k]), 0<=k<n
93
94 [remark]
95 - Inverse of cdft(2*n, -1, a); is
96 -cdft(2*n, 1, a);
97 - for (j = 0; j <= 2 * n - 1; j++) {
98 - a[j] *= 1.0 / n;
99 - }
100
101
102 <b> Real DFT / Inverse of Real DFT </b>
103
104 [definition]
105 - <case1> RDFT
106 - R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2
107 - I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2
108 - <case2> IRDFT (excluding scale)
109 - a[k] = (R[0] + R[n/2]*cos(pi*k))/2 +
110 - sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) +
111 - sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n
112
113 [usage]
114 - <case1>
115 - rdft(n, 1, a);
116 - <case2>
117 - rdft(n, -1, a);
118
119 [parameters]
120 - n :data length (picoos_int32)
121 - n >= 2, n = power of 2
122 - a[0...n-1] :input/output data (PICOFFTSG_FFTTYPE *)
123 - <case1>
124 - output data
125 - a[2*k] = R[k], 0<=k<n/2
126 - a[2*k+1] = I[k], 0<k<n/2
127 - a[1] = R[n/2]
128 - <case2>
129 - input data
130 - a[2*j] = R[j], 0<=j<n/2
131 - a[2*j+1] = I[j], 0<j<n/2
132 - a[1] = R[n/2]
133
134 [remark]
135 - Inverse of rdft(n, 1, a); is
136 - rdft(n, -1, a);
137 - for (j = 0; j <= n - 1; j++) {
138 - a[j] *= 2.0 / n;
139 -}
140
141
142 <b> DCT (Discrete Cosine Transform) / Inverse of DCT</b>
143
144 [definition]
145 - <case1> IDCT (excluding scale)
146 - C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n
147 - <case2> DCT
148 - C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n
149
150 [usage]
151 - <case1>
152 - ddct(n, 1, a);
153 - <case2>
154 - ddct(n, -1, a);
155
156 [parameters]
157 - n :data length (picoos_int32)
158 - n >= 2, n = power of 2
159 - a[0...n-1] :input/output data (PICOFFTSG_FFTTYPE *)
160 - output data
161 - a[k] = C[k], 0<=k<n
162
163 [remark]
164 - Inverse of ddct(n, -1, a); is
165 - a[0] *= 0.5;
166 - ddct(n, 1, a);
167 - for (j = 0; j <= n - 1; j++) {
168 - a[j] *= 2.0 / n;
169 - }
170
171 <b> DST (Discrete Sine Transform) / Inverse of DST</b>
172
173 [definition]
174 - <case1> IDST (excluding scale)
175 - S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n
176 - <case2> DST
177 - S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n
178
179 [usage]
180 - <case1>
181 - ddst(n, 1, a);
182 - <case2>
183 - ddst(n, -1, a);
184
185 [parameters]
186 - n :data length (picoos_int32)
187 - n >= 2, n = power of 2
188 - a[0...n-1] :input/output data (PICOFFTSG_FFTTYPE *)
189 - <case1>
190 - input data
191 - a[j] = A[j], 0<j<n
192 - a[0] = A[n]
193 - output data
194 - a[k] = S[k], 0<=k<n
195 - <case2>
196 - output data
197 - a[k] = S[k], 0<k<n
198 - a[0] = S[n]
199
200 [remark]
201 - Inverse of ddst(n, -1, a); is
202 - a[0] *= 0.5;
203 - ddst(n, 1, a);
204 - for (j = 0; j <= n - 1; j++) {
205 - a[j] *= 2.0 / n;
206 - }
207
208 <b> Cosine Transform of RDFT (Real Symmetric DFT)</b>
209
210 [definition]
211 - C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n
212
213 [usage]
214 - dfct(n, a);
215
216 [parameters]
217 - n :data length - 1 (picoos_int32)
218 - n >= 2, n = power of 2
219 - a[0...n] :input/output data (PICOFFTSG_FFTTYPE *)
220
221 - output data
222 - a[k] = C[k], 0<=k<=n
223
224 [remark]
225 - Inverse of a[0] *= 0.5; a[n] *= 0.5; dfct(n, a); is
226 - a[0] *= 0.5;
227 - a[n] *= 0.5;
228 - dfct(n, a);
229 - for (j = 0; j <= n; j++) {
230 - a[j] *= 2.0 / n;
231 - }
232
233 <b> Sine Transform of RDFT (Real Anti-symmetric DFT)</b>
234
235 [definition]
236 - S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n
237
238 [usage]
239 - dfst(n, a);
240
241 [parameters]
242 - n :data length + 1 (picoos_int32)
243 - n >= 2, n = power of 2
244 - a[0...n-1] :input/output data (PICOFFTSG_FFTTYPE *)
245 - output data
246 - a[k] = S[k], 0<k<n
247 - (a[0] is used for work area)
248
249 [remark]
250 - Inverse of dfst(n, a); is
251 - dfst(n, a);
252 - for (j = 1; j <= n - 1; j++) {
253 - a[j] *= 2.0 / n;
254 - }
255
256 */
257
258 /* fixed point multiplier for weights */
259 #define PICODSP_WGT_SHIFT (0x20000000) /* 2^29 */
260 #define PICOFFTSG_WGT_SHIFT2 (0x10000000) /* PICODSP_WGT_SHIFT/2 */
261 #define PICOFFTSG_WGT_N_SHIFT (29) /* 2^29 */
262 /* fixed point known constants */
263 #ifndef WR5000 /* cos(M_PI_2*0.5000) */
264 #define WR5000 (PICOFFTSG_FFTTYPE)(0.707106781186547524400844362104849039284835937688*PICODSP_WGT_SHIFT)
265 #ifndef WR2500 /* cos(M_PI_2*0.2500) */
266 #define WR2500 (PICOFFTSG_FFTTYPE)(0.923879532511286756128183189396788286822416625863*PICODSP_WGT_SHIFT)
267 #endif
268 #ifndef WI2500 /* sin(M_PI_2*0.2500) */
269 #define WI2500 (PICOFFTSG_FFTTYPE)(0.382683432365089771728459984030398866761344562485*PICODSP_WGT_SHIFT)
270 #endif
271 #ifndef WR1250 /* cos(M_PI_2*0.1250) */
272 #define WR1250 (PICOFFTSG_FFTTYPE)(0.980785280403230449126182236134239036973933730893*PICODSP_WGT_SHIFT)
273 #endif
274 #ifndef WI1250 /* sin(M_PI_2*0.1250) */
275 #define WI1250 (PICOFFTSG_FFTTYPE)(0.195090322016128267848284868477022240927691617751*PICODSP_WGT_SHIFT)
276 #endif
277 #ifndef WR3750 /* cos(M_PI_2*0.3750) */
278 #define WR3750 (PICOFFTSG_FFTTYPE)(0.831469612302545237078788377617905756738560811987*PICODSP_WGT_SHIFT)
279 #endif
280 #ifndef WI3750 /* sin(M_PI_2*0.3750) */
281 #define WI3750 (PICOFFTSG_FFTTYPE)(0.555570233019602224742830813948532874374937190754*PICODSP_WGT_SHIFT)
282 #endif
283
284 #else
285
286 /*#ifndef M_PI_2
287 #define M_PI_2 (PICOFFTSG_FFTTYPE)1.570796326794896619231321691639751442098584699687
288 #endif*/
289 #ifndef WR5000 /* cos(M_PI_2*0.5000) */
290 #define WR5000 (PICOFFTSG_FFTTYPE)0.707106781186547524400844362104849039284835937688
291 #endif
292 #ifndef WR2500 /* cos(M_PI_2*0.2500) */
293 #define WR2500 (PICOFFTSG_FFTTYPE)0.923879532511286756128183189396788286822416625863
294 #endif
295 #ifndef WI2500 /* sin(M_PI_2*0.2500) */
296 #define WI2500 (PICOFFTSG_FFTTYPE)0.382683432365089771728459984030398866761344562485
297 #endif
298 #ifndef WR1250 /* cos(M_PI_2*0.1250) */
299 #define WR1250 (PICOFFTSG_FFTTYPE)0.980785280403230449126182236134239036973933730893
300 #endif
301 #ifndef WI1250 /* sin(M_PI_2*0.1250) */
302 #define WI1250 (PICOFFTSG_FFTTYPE)0.195090322016128267848284868477022240927691617751
303 #endif
304 #ifndef WR3750 /* cos(M_PI_2*0.3750) */
305 #define WR3750 (PICOFFTSG_FFTTYPE)0.831469612302545237078788377617905756738560811987
306 #endif
307 #ifndef WI3750 /* sin(M_PI_2*0.3750) */
308 #define WI3750 (PICOFFTSG_FFTTYPE)0.555570233019602224742830813948532874374937190754
309 #endif
310
311 #endif
312
313 #ifndef CDFT_LOOP_DIV /* control of the CDFT's speed & tolerance */
314 #define CDFT_LOOP_DIV 32
315 #define CDFT_LOOP_DIV_4 128
316 #endif
317
318 #ifndef RDFT_LOOP_DIV /* control of the RDFT's speed & tolerance */
319 #define RDFT_LOOP_DIV 64
320 #define RDFT_LOOP_DIV4 256
321 #define RDFT_LOOP_DIV_4 256
322 #endif
323
324 #ifndef DCST_LOOP_DIV /* control of the DCT,DST's speed & tolerance */
325 #define DCST_LOOP_DIV 64
326 #define DCST_LOOP_DIV2 128
327 #endif
328
329
330 #define POW1 (0x1)
331 #define POW2 (0x2)
332 #define POW3 (0x4)
333 #define POW4 (0x8)
334 #define POW5 (0x10)
335 #define POW6 (0x20)
336 #define POW7 (0x40)
337 #define POW8 (0x80)
338 #define POW9 (0x100)
339 #define POW10 (0x200)
340 #define POW11 (0x400)
341 #define POW12 (0x800)
342 #define POW13 (0x1000)
343 #define POW14 (0x2000)
344 #define POW15 (0x4000)
345 #define POW16 (0x8000)
346 #define POW17 (0x10000)
347 #define POW18 (0x20000)
348 #define POW19 (0x40000)
349 #define POW20 (0x80000)
350 #define POW21 (0x100000)
351 #define POW22 (0x200000)
352 #define POW23 (0x400000)
353 #define POW24 (0x800000)
354 #define POW25 (0x1000000)
355 #define POW26 (0x2000000)
356 #define POW27 (0x4000000)
357 #define POW28 (0x8000000)
358 #define POW29 (0x10000000)
359 #define POW30 (0x20000000)
360 #define POW31 (0x40000000)
361 /**************
362 * useful macros
363 ************** */
364 #define picofftsg_highestBitPos(x) (x==0?0:(x>=POW17?(x>=POW25?(x>=POW29?(x>=POW31?31:(x>=POW30?30:29)):(x>=POW27?(x>=POW28?28:27):(x>=POW26?26:25))):(x>=POW21?(x>=POW23?(x>=POW24?24:23):(x>=POW22?22:21)):(x>=POW19?(x>=POW20?20:19):(x>=POW18?18:17)))):(x>=POW9?(x>=POW13?(x>=POW15?(x>=POW16?16:15):(x>=POW14?14:13)):(x>=POW11?(x>=POW12?12:11):(x>=POW10?10:9))):(x>=POW5?(x>=POW7?(x>=POW8?8:7):(x>=POW6?6:5)):(x>=POW3?(x>=POW4?4:3):(x>=POW2?2:1))))))
365 #define picofftsg_highestBit(x) (x==0?0:(x<0?(zz=-x,(zz>=POW17?(zz>=POW25?(zz>=POW29?(zz>=POW31?31:(zz>=POW30?30:29)):(zz>=POW27?(zz>=POW28?28:27):(zz>=POW26?26:25))):(zz>=POW21?(zz>=POW23?(zz>=POW24?24:23):(zz>=POW22?22:21)):(zz>=POW19?(zz>=POW20?20:19):(zz>=POW18?18:17)))):(zz>=POW9?(zz>=POW13?(zz>=POW15?(zz>=POW16?16:15):(zz>=POW14?14:13)):(zz>=POW11?(zz>=POW12?12:11):(zz>=POW10?10:9))):(zz>=POW5?(zz>=POW7?(zz>=POW8?8:7):(zz>=POW6?6:5)):(zz>=POW3?(zz>=POW4?4:3):(zz>=POW2?2:1)))))):(x>=POW17?(x>=POW25?(x>=POW29?(x>=POW31?31:(x>=POW30?30:29)):(x>=POW27?(x>=POW28?28:27):(x>=POW26?26:25))):(x>=POW21?(x>=POW23?(x>=POW24?24:23):(x>=POW22?22:21)):(x>=POW19?(x>=POW20?20:19):(x>=POW18?18:17)))):(x>=POW9?(x>=POW13?(x>=POW15?(x>=POW16?16:15):(x>=POW14?14:13)):(x>=POW11?(x>=POW12?12:11):(x>=POW10?10:9))):(x>=POW5?(x>=POW7?(x>=POW8?8:7):(x>=POW6?6:5)):(x>=POW3?(x>=POW4?4:3):(x>=POW2?2:1)))))))
366 #define Mult_W_W picofftsg_mult_w_w
367
368
369 /* ***********************************************************************************************/
370 /* forward declarations */
371 /* ***********************************************************************************************/
372 static PICOFFTSG_FFTTYPE picofftsg_mult_w_w(PICOFFTSG_FFTTYPE x1, PICOFFTSG_FFTTYPE y1);
373 static PICOFFTSG_FFTTYPE picofftsg_mult_w_a(PICOFFTSG_FFTTYPE x1, PICOFFTSG_FFTTYPE y1);
374
375
376 static void cftfsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
377 static void cftbsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
378 static void rftfsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
379 static void rftbsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
380
381 static void cftfsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
382 static void cftbsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
383 static void rftfsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
384 static void rftbsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
385 static void dctsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
386 static void dctsub4(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
387
388 static void ddct(picoos_int32 n, picoos_int32 isgn, PICOFFTSG_FFTTYPE *a);
389 static void bitrv1(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
390
391 static void bitrv2(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
392 static void bitrv216(PICOFFTSG_FFTTYPE *a);
393 static void bitrv208(PICOFFTSG_FFTTYPE *a);
394 static void cftmdl1(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
395 static void cftrec4(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
396 static void cftleaf(picoos_int32 n, picoos_int32 isplt, PICOFFTSG_FFTTYPE *a);
397 static void cftfx41(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
398 static void cftf161(PICOFFTSG_FFTTYPE *a);
399 static void cftf081(PICOFFTSG_FFTTYPE *a);
400 static void cftf040(PICOFFTSG_FFTTYPE *a);
401 static void cftx020(PICOFFTSG_FFTTYPE *a);
402
403 void bitrv2conj(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
404 void bitrv216neg(PICOFFTSG_FFTTYPE *a);
405 void bitrv208neg(PICOFFTSG_FFTTYPE *a);
406 void cftb1st(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
407 void cftrec4(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
408 void cftleaf(picoos_int32 n, picoos_int32 isplt, PICOFFTSG_FFTTYPE *a);
409 void cftfx41(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
410 void cftf161(PICOFFTSG_FFTTYPE *a);
411 void cftf081(PICOFFTSG_FFTTYPE *a);
412 void cftb040(PICOFFTSG_FFTTYPE *a);
413 void cftx020(PICOFFTSG_FFTTYPE *a);
414
415 static picoos_int32 cfttree(picoos_int32 n, picoos_int32 j, picoos_int32 k, PICOFFTSG_FFTTYPE *a);
416 static void cftleaf(picoos_int32 n, picoos_int32 isplt, PICOFFTSG_FFTTYPE *a);
417 static void cftmdl1(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
418
419 static void cftmdl1(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
420 static void cftmdl2(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
421
422 static void cftmdl1(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
423 static void cftmdl2(picoos_int32 n, PICOFFTSG_FFTTYPE *a);
424 static void cftf161(PICOFFTSG_FFTTYPE *a);
425 static void cftf162(PICOFFTSG_FFTTYPE *a);
426 static void cftf081(PICOFFTSG_FFTTYPE *a);
427 static void cftf082(PICOFFTSG_FFTTYPE *a);
428
429 static void cftf161(PICOFFTSG_FFTTYPE *a);
430 static void cftf162(PICOFFTSG_FFTTYPE *a);
431 static void cftf081(PICOFFTSG_FFTTYPE *a);
432 static void cftf082(PICOFFTSG_FFTTYPE *a);
433
434 /* ***********************************************************************************************/
435 /* Exported functions */
436 /* ***********************************************************************************************/
rdft(picoos_int32 n,picoos_int32 isgn,PICOFFTSG_FFTTYPE * a)437 void rdft(picoos_int32 n, picoos_int32 isgn, PICOFFTSG_FFTTYPE *a)
438 {
439 PICOFFTSG_FFTTYPE xi;
440
441 if (isgn >= 0) {
442 if (n > 4) {
443 cftfsub(n, a);
444 rftfsub(n, a);
445 } else if (n == 4) {
446 cftfsub(n, a);
447 }
448 xi = a[0] - a[1];
449 a[0] += a[1];
450 a[1] = xi;
451 } else {
452 a[1] = (a[0] - a[1]) / 2;
453 a[0] -= a[1];
454 if (n > 4) {
455 rftbsub(n, a);
456 cftbsub(n, a);
457 } else if (n == 4) {
458 cftbsub(n, a);
459 }
460 }
461
462 }
463
464
norm_result(picoos_int32 m2,PICOFFTSG_FFTTYPE * tmpX,PICOFFTSG_FFTTYPE * norm_window)465 picoos_single norm_result(picoos_int32 m2, PICOFFTSG_FFTTYPE *tmpX, PICOFFTSG_FFTTYPE *norm_window)
466 {
467 picoos_int16 nI;
468 PICOFFTSG_FFTTYPE a,b, E;
469
470 E = (picoos_int32)0;
471 for (nI=0; nI<m2; nI++) {
472 a = (norm_window[nI]>>18) * ((tmpX[nI]>0) ? tmpX[nI]>>11 : -((-tmpX[nI])>>11));
473 tmpX[nI] = a;
474 b = (a>=0?a:-a) >> 18;
475 E += (b*b);
476 }
477
478 if (E>0) {
479 return (picoos_single)sqrt((double)E/16.0)/m2;
480 }
481 else {
482 return 0.0;
483 }
484 }
485
ddct(picoos_int32 n,picoos_int32 isgn,PICOFFTSG_FFTTYPE * a)486 void ddct(picoos_int32 n, picoos_int32 isgn, PICOFFTSG_FFTTYPE *a)
487 {
488 picoos_int32 j;
489 PICOFFTSG_FFTTYPE xr;
490
491 if (isgn < 0) {
492 xr = a[n - 1];
493 for (j = n - 2; j >= 2; j -= 2) {
494 a[j + 1] = a[j] - a[j - 1];
495 a[j] += a[j - 1];
496 }
497 a[1] = a[0] - xr;
498 a[0] += xr;
499 if (n > 4) {
500 rftbsub(n, a);
501 cftbsub(n, a);
502 } else if (n == 4) {
503 cftbsub(n, a);
504 }
505 }
506 if (n > 4) {
507 dctsub(n, a);
508 } else {
509 dctsub4(n, a);
510 }
511 if (isgn >= 0) {
512 if (n > 4) {
513 cftfsub(n, a);
514 rftfsub(n, a);
515 } else if (n == 4) {
516 cftfsub(n, a);
517 }
518
519
520 xr = a[0] - a[1];
521 a[0] += a[1];
522 for (j = 2; j < n; j += 2) {
523 a[j - 1] = a[j] - a[j + 1];
524 a[j] += a[j + 1];
525 }
526 a[n - 1] = xr;
527 }
528 }
529
dfct_nmf(picoos_int32 n,picoos_int32 * a)530 void dfct_nmf(picoos_int32 n, picoos_int32 *a)
531 {
532 picoos_int32 j, k, m, mh;
533 PICOFFTSG_FFTTYPE xr, xi, yr, yi, an;
534 PICOFFTSG_FFTTYPE *aj, *ak, *amj, *amk;
535
536 m = n >> 1;
537 for (j = 0; j < m; j++) {
538 k = n - j;
539 xr = a[j] + a[k];
540 a[j] -= a[k];
541 a[k] = xr;
542 }
543 an = a[n];
544 while (m >= 2) {
545 ddct(m, 1, a);
546 if (m > 2) {
547 bitrv1(m, a);
548 }
549 mh = m >> 1;
550 xi = a[m];
551 a[m] = a[0];
552 a[0] = an - xi;
553 an += xi;
554 k = m-1;
555 aj = a + 1; ak = a + k; amj = aj + m; amk = ak + m;
556 for (j = 1; j < mh; j++, aj++, ak--, amj++, amk--) {
557 xr = *amk;
558 xi = *amj;
559 yr = *aj;
560 yi = *ak;
561 *amj = yr;
562 *amk = yi;
563 *aj = xr - xi;
564 *ak = xr + xi;
565 }
566 xr = *aj;
567 *aj = *amj;
568 *amj = xr;
569
570 m = mh;
571 }
572
573 xi = a[1];
574 a[1] = a[0];
575 a[0] = an + xi;
576 a[n] = an - xi;
577 if (n > 2) {
578 bitrv1(n, a);
579 }
580
581 }
582
583 /* ***********************************************************************************************/
584 /* internal routines */
585 /* ***********************************************************************************************/
586 /*
587 mult two numbers which are guaranteed to be in the range -1..1
588 shift right as little as possible before mult, and the rest after the mult
589 Also, shift bigger number more - lose less accuracy
590 */
picofftsg_mult_w_w(PICOFFTSG_FFTTYPE x1,PICOFFTSG_FFTTYPE y1)591 static PICOFFTSG_FFTTYPE picofftsg_mult_w_w(PICOFFTSG_FFTTYPE x1, PICOFFTSG_FFTTYPE y1)
592 {
593 PICOFFTSG_FFTTYPE x, y;
594 x = x1>=0 ? x1>>15 : -((-x1)>>15);
595 y = y1>=0 ? y1>>14 : -((-y1)>>14);
596 return x * y;
597 }
598
picofftsg_mult_w_a(PICOFFTSG_FFTTYPE x1,PICOFFTSG_FFTTYPE y1)599 static PICOFFTSG_FFTTYPE picofftsg_mult_w_a(PICOFFTSG_FFTTYPE x1, PICOFFTSG_FFTTYPE y1)
600 {
601 PICOFFTSG_FFTTYPE x, y;
602
603
604 x = x1>=0 ? x1>>15 : -((-x1)>>15);
605 y = y1>=0 ? y1>>14 : -((-y1)>>14);
606 return x * y;
607 }
608
cftfsub(picoos_int32 n,PICOFFTSG_FFTTYPE * a)609 static void cftfsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
610 {
611
612 if (n > 8) {
613 if (n > 32) {
614 cftmdl1(n, a);
615 if (n > 512) {
616 cftrec4(n, a);
617 } else if (n > 128) {
618 cftleaf(n, 1, a);
619 } else {
620 cftfx41(n, a);
621 }
622 bitrv2(n, a);
623 } else if (n == 32) {
624 cftf161(a);
625 bitrv216(a);
626 } else {
627 cftf081(a);
628 bitrv208(a);
629 }
630 } else if (n == 8) {
631 cftf040(a);
632 } else if (n == 4) {
633 cftx020(a);
634 }
635 }
636
637
cftbsub(picoos_int32 n,PICOFFTSG_FFTTYPE * a)638 void cftbsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
639 {
640 if (n > 8) {
641 if (n > 32) {
642 cftb1st(n, a);
643 if (n > 512) {
644 cftrec4(n, a);
645 } else if (n > 128) {
646 cftleaf(n, 1, a);
647 } else {
648 cftfx41(n, a);
649 }
650 bitrv2conj(n, a);
651 } else if (n == 32) {
652 cftf161(a);
653 bitrv216neg(a);
654 } else {
655 cftf081(a);
656 bitrv208neg(a);
657 }
658 } else if (n == 8) {
659 cftb040(a);
660 } else if (n == 4) {
661 cftx020(a);
662 }
663 }
664
665 /* **************************************************************************************************/
666
667 /* **************************************************************************************************/
bitrv2(picoos_int32 n,PICOFFTSG_FFTTYPE * a)668 void bitrv2(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
669 {
670 picoos_int32 j0, k0, j1, k1, l, m, i, j, k, nh, m2;
671 PICOFFTSG_FFTTYPE xr, xi, yr, yi;
672
673 m = 4;
674 for (l = n >> 2; l > 8; l >>= 2) {
675 m <<= 1;
676 }
677 m2 = m + m;
678 nh = n >> 1;
679 if (l == 8) {
680 j0 = 0;
681 for (k0 = 0; k0 < m; k0 += 4) {
682 k = k0;
683 for (j = j0; j < j0 + k0; j += 4) {
684 xr = a[j];
685 xi = a[j + 1];
686 yr = a[k];
687 yi = a[k + 1];
688 a[j] = yr;
689 a[j + 1] = yi;
690 a[k] = xr;
691 a[k + 1] = xi;
692 j1 = j + m;
693 k1 = k + m2;
694 xr = a[j1];
695 xi = a[j1 + 1];
696 yr = a[k1];
697 yi = a[k1 + 1];
698 a[j1] = yr;
699 a[j1 + 1] = yi;
700 a[k1] = xr;
701 a[k1 + 1] = xi;
702 j1 += m;
703 k1 -= m;
704 xr = a[j1];
705 xi = a[j1 + 1];
706 yr = a[k1];
707 yi = a[k1 + 1];
708 a[j1] = yr;
709 a[j1 + 1] = yi;
710 a[k1] = xr;
711 a[k1 + 1] = xi;
712 j1 += m;
713 k1 += m2;
714 xr = a[j1];
715 xi = a[j1 + 1];
716 yr = a[k1];
717 yi = a[k1 + 1];
718 a[j1] = yr;
719 a[j1 + 1] = yi;
720 a[k1] = xr;
721 a[k1 + 1] = xi;
722 j1 += nh;
723 k1 += 2;
724 xr = a[j1];
725 xi = a[j1 + 1];
726 yr = a[k1];
727 yi = a[k1 + 1];
728 a[j1] = yr;
729 a[j1 + 1] = yi;
730 a[k1] = xr;
731 a[k1 + 1] = xi;
732 j1 -= m;
733 k1 -= m2;
734 xr = a[j1];
735 xi = a[j1 + 1];
736 yr = a[k1];
737 yi = a[k1 + 1];
738 a[j1] = yr;
739 a[j1 + 1] = yi;
740 a[k1] = xr;
741 a[k1 + 1] = xi;
742 j1 -= m;
743 k1 += m;
744 xr = a[j1];
745 xi = a[j1 + 1];
746 yr = a[k1];
747 yi = a[k1 + 1];
748 a[j1] = yr;
749 a[j1 + 1] = yi;
750 a[k1] = xr;
751 a[k1 + 1] = xi;
752 j1 -= m;
753 k1 -= m2;
754 xr = a[j1];
755 xi = a[j1 + 1];
756 yr = a[k1];
757 yi = a[k1 + 1];
758 a[j1] = yr;
759 a[j1 + 1] = yi;
760 a[k1] = xr;
761 a[k1 + 1] = xi;
762 j1 += 2;
763 k1 += nh;
764 xr = a[j1];
765 xi = a[j1 + 1];
766 yr = a[k1];
767 yi = a[k1 + 1];
768 a[j1] = yr;
769 a[j1 + 1] = yi;
770 a[k1] = xr;
771 a[k1 + 1] = xi;
772 j1 += m;
773 k1 += m2;
774 xr = a[j1];
775 xi = a[j1 + 1];
776 yr = a[k1];
777 yi = a[k1 + 1];
778 a[j1] = yr;
779 a[j1 + 1] = yi;
780 a[k1] = xr;
781 a[k1 + 1] = xi;
782 j1 += m;
783 k1 -= m;
784 xr = a[j1];
785 xi = a[j1 + 1];
786 yr = a[k1];
787 yi = a[k1 + 1];
788 a[j1] = yr;
789 a[j1 + 1] = yi;
790 a[k1] = xr;
791 a[k1 + 1] = xi;
792 j1 += m;
793 k1 += m2;
794 xr = a[j1];
795 xi = a[j1 + 1];
796 yr = a[k1];
797 yi = a[k1 + 1];
798 a[j1] = yr;
799 a[j1 + 1] = yi;
800 a[k1] = xr;
801 a[k1 + 1] = xi;
802 j1 -= nh;
803 k1 -= 2;
804 xr = a[j1];
805 xi = a[j1 + 1];
806 yr = a[k1];
807 yi = a[k1 + 1];
808 a[j1] = yr;
809 a[j1 + 1] = yi;
810 a[k1] = xr;
811 a[k1 + 1] = xi;
812 j1 -= m;
813 k1 -= m2;
814 xr = a[j1];
815 xi = a[j1 + 1];
816 yr = a[k1];
817 yi = a[k1 + 1];
818 a[j1] = yr;
819 a[j1 + 1] = yi;
820 a[k1] = xr;
821 a[k1 + 1] = xi;
822 j1 -= m;
823 k1 += m;
824 xr = a[j1];
825 xi = a[j1 + 1];
826 yr = a[k1];
827 yi = a[k1 + 1];
828 a[j1] = yr;
829 a[j1 + 1] = yi;
830 a[k1] = xr;
831 a[k1 + 1] = xi;
832 j1 -= m;
833 k1 -= m2;
834 xr = a[j1];
835 xi = a[j1 + 1];
836 yr = a[k1];
837 yi = a[k1 + 1];
838 a[j1] = yr;
839 a[j1 + 1] = yi;
840 a[k1] = xr;
841 a[k1 + 1] = xi;
842 for (i = nh >> 1; i > (k ^= i); i >>= 1) {
843 /* Avoid warning*/
844 };
845 }
846 k1 = j0 + k0;
847 j1 = k1 + 2;
848 k1 += nh;
849 xr = a[j1];
850 xi = a[j1 + 1];
851 yr = a[k1];
852 yi = a[k1 + 1];
853 a[j1] = yr;
854 a[j1 + 1] = yi;
855 a[k1] = xr;
856 a[k1 + 1] = xi;
857 j1 += m;
858 k1 += m2;
859 xr = a[j1];
860 xi = a[j1 + 1];
861 yr = a[k1];
862 yi = a[k1 + 1];
863 a[j1] = yr;
864 a[j1 + 1] = yi;
865 a[k1] = xr;
866 a[k1 + 1] = xi;
867 j1 += m;
868 k1 -= m;
869 xr = a[j1];
870 xi = a[j1 + 1];
871 yr = a[k1];
872 yi = a[k1 + 1];
873 a[j1] = yr;
874 a[j1 + 1] = yi;
875 a[k1] = xr;
876 a[k1 + 1] = xi;
877 j1 -= 2;
878 k1 -= nh;
879 xr = a[j1];
880 xi = a[j1 + 1];
881 yr = a[k1];
882 yi = a[k1 + 1];
883 a[j1] = yr;
884 a[j1 + 1] = yi;
885 a[k1] = xr;
886 a[k1 + 1] = xi;
887 j1 += nh + 2;
888 k1 += nh + 2;
889 xr = a[j1];
890 xi = a[j1 + 1];
891 yr = a[k1];
892 yi = a[k1 + 1];
893 a[j1] = yr;
894 a[j1 + 1] = yi;
895 a[k1] = xr;
896 a[k1 + 1] = xi;
897 j1 -= nh - m;
898 k1 += m2 - 2;
899 xr = a[j1];
900 xi = a[j1 + 1];
901 yr = a[k1];
902 yi = a[k1 + 1];
903 a[j1] = yr;
904 a[j1 + 1] = yi;
905 a[k1] = xr;
906 a[k1 + 1] = xi;
907 for (i = nh >> 1; i > (j0 ^= i); i >>= 1) {
908 /* Avoid warning */
909 }
910 }
911 } else {
912 j0 = 0;
913 for (k0 = 0; k0 < m; k0 += 4) {
914 k = k0;
915 for (j = j0; j < j0 + k0; j += 4) {
916 xr = a[j];
917 xi = a[j + 1];
918 yr = a[k];
919 yi = a[k + 1];
920 a[j] = yr;
921 a[j + 1] = yi;
922 a[k] = xr;
923 a[k + 1] = xi;
924 j1 = j + m;
925 k1 = k + m;
926 xr = a[j1];
927 xi = a[j1 + 1];
928 yr = a[k1];
929 yi = a[k1 + 1];
930 a[j1] = yr;
931 a[j1 + 1] = yi;
932 a[k1] = xr;
933 a[k1 + 1] = xi;
934 j1 += nh;
935 k1 += 2;
936 xr = a[j1];
937 xi = a[j1 + 1];
938 yr = a[k1];
939 yi = a[k1 + 1];
940 a[j1] = yr;
941 a[j1 + 1] = yi;
942 a[k1] = xr;
943 a[k1 + 1] = xi;
944 j1 -= m;
945 k1 -= m;
946 xr = a[j1];
947 xi = a[j1 + 1];
948 yr = a[k1];
949 yi = a[k1 + 1];
950 a[j1] = yr;
951 a[j1 + 1] = yi;
952 a[k1] = xr;
953 a[k1 + 1] = xi;
954 j1 += 2;
955 k1 += nh;
956 xr = a[j1];
957 xi = a[j1 + 1];
958 yr = a[k1];
959 yi = a[k1 + 1];
960 a[j1] = yr;
961 a[j1 + 1] = yi;
962 a[k1] = xr;
963 a[k1 + 1] = xi;
964 j1 += m;
965 k1 += m;
966 xr = a[j1];
967 xi = a[j1 + 1];
968 yr = a[k1];
969 yi = a[k1 + 1];
970 a[j1] = yr;
971 a[j1 + 1] = yi;
972 a[k1] = xr;
973 a[k1 + 1] = xi;
974 j1 -= nh;
975 k1 -= 2;
976 xr = a[j1];
977 xi = a[j1 + 1];
978 yr = a[k1];
979 yi = a[k1 + 1];
980 a[j1] = yr;
981 a[j1 + 1] = yi;
982 a[k1] = xr;
983 a[k1 + 1] = xi;
984 j1 -= m;
985 k1 -= m;
986 xr = a[j1];
987 xi = a[j1 + 1];
988 yr = a[k1];
989 yi = a[k1 + 1];
990 a[j1] = yr;
991 a[j1 + 1] = yi;
992 a[k1] = xr;
993 a[k1 + 1] = xi;
994 for (i = nh >> 1; i > (k ^= i); i >>= 1){
995 /* Avoid warning */
996 }
997 }
998 k1 = j0 + k0;
999 j1 = k1 + 2;
1000 k1 += nh;
1001 xr = a[j1];
1002 xi = a[j1 + 1];
1003 yr = a[k1];
1004 yi = a[k1 + 1];
1005 a[j1] = yr;
1006 a[j1 + 1] = yi;
1007 a[k1] = xr;
1008 a[k1 + 1] = xi;
1009 j1 += m;
1010 k1 += m;
1011 xr = a[j1];
1012 xi = a[j1 + 1];
1013 yr = a[k1];
1014 yi = a[k1 + 1];
1015 a[j1] = yr;
1016 a[j1 + 1] = yi;
1017 a[k1] = xr;
1018 a[k1 + 1] = xi;
1019 for (i = nh >> 1; i > (j0 ^= i); i >>= 1){
1020 /* Avoid warning */
1021 }
1022 }
1023 }
1024 }
1025
1026
bitrv2conj(picoos_int32 n,PICOFFTSG_FFTTYPE * a)1027 void bitrv2conj(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
1028 {
1029 picoos_int32 j0, k0, j1, k1, l, m, i, j, k, nh, m2;
1030 PICOFFTSG_FFTTYPE xr, xi, yr, yi;
1031
1032
1033 m = 4;
1034 for (l = n >> 2; l > 8; l >>= 2) {
1035 m <<= 1;
1036 }
1037 m2 = m + m;
1038 nh = n >> 1;
1039 if (l == 8) {
1040 j0 = 0;
1041 for (k0 = 0; k0 < m; k0 += 4) {
1042 k = k0;
1043 for (j = j0; j < j0 + k0; j += 4) {
1044 xr = a[j];
1045 xi = -a[j + 1];
1046 yr = a[k];
1047 yi = -a[k + 1];
1048 a[j] = yr;
1049 a[j + 1] = yi;
1050 a[k] = xr;
1051 a[k + 1] = xi;
1052 j1 = j + m;
1053 k1 = k + m2;
1054 xr = a[j1];
1055 xi = -a[j1 + 1];
1056 yr = a[k1];
1057 yi = -a[k1 + 1];
1058 a[j1] = yr;
1059 a[j1 + 1] = yi;
1060 a[k1] = xr;
1061 a[k1 + 1] = xi;
1062 j1 += m;
1063 k1 -= m;
1064 xr = a[j1];
1065 xi = -a[j1 + 1];
1066 yr = a[k1];
1067 yi = -a[k1 + 1];
1068 a[j1] = yr;
1069 a[j1 + 1] = yi;
1070 a[k1] = xr;
1071 a[k1 + 1] = xi;
1072 j1 += m;
1073 k1 += m2;
1074 xr = a[j1];
1075 xi = -a[j1 + 1];
1076 yr = a[k1];
1077 yi = -a[k1 + 1];
1078 a[j1] = yr;
1079 a[j1 + 1] = yi;
1080 a[k1] = xr;
1081 a[k1 + 1] = xi;
1082 j1 += nh;
1083 k1 += 2;
1084 xr = a[j1];
1085 xi = -a[j1 + 1];
1086 yr = a[k1];
1087 yi = -a[k1 + 1];
1088 a[j1] = yr;
1089 a[j1 + 1] = yi;
1090 a[k1] = xr;
1091 a[k1 + 1] = xi;
1092 j1 -= m;
1093 k1 -= m2;
1094 xr = a[j1];
1095 xi = -a[j1 + 1];
1096 yr = a[k1];
1097 yi = -a[k1 + 1];
1098 a[j1] = yr;
1099 a[j1 + 1] = yi;
1100 a[k1] = xr;
1101 a[k1 + 1] = xi;
1102 j1 -= m;
1103 k1 += m;
1104 xr = a[j1];
1105 xi = -a[j1 + 1];
1106 yr = a[k1];
1107 yi = -a[k1 + 1];
1108 a[j1] = yr;
1109 a[j1 + 1] = yi;
1110 a[k1] = xr;
1111 a[k1 + 1] = xi;
1112 j1 -= m;
1113 k1 -= m2;
1114 xr = a[j1];
1115 xi = -a[j1 + 1];
1116 yr = a[k1];
1117 yi = -a[k1 + 1];
1118 a[j1] = yr;
1119 a[j1 + 1] = yi;
1120 a[k1] = xr;
1121 a[k1 + 1] = xi;
1122 j1 += 2;
1123 k1 += nh;
1124 xr = a[j1];
1125 xi = -a[j1 + 1];
1126 yr = a[k1];
1127 yi = -a[k1 + 1];
1128 a[j1] = yr;
1129 a[j1 + 1] = yi;
1130 a[k1] = xr;
1131 a[k1 + 1] = xi;
1132 j1 += m;
1133 k1 += m2;
1134 xr = a[j1];
1135 xi = -a[j1 + 1];
1136 yr = a[k1];
1137 yi = -a[k1 + 1];
1138 a[j1] = yr;
1139 a[j1 + 1] = yi;
1140 a[k1] = xr;
1141 a[k1 + 1] = xi;
1142 j1 += m;
1143 k1 -= m;
1144 xr = a[j1];
1145 xi = -a[j1 + 1];
1146 yr = a[k1];
1147 yi = -a[k1 + 1];
1148 a[j1] = yr;
1149 a[j1 + 1] = yi;
1150 a[k1] = xr;
1151 a[k1 + 1] = xi;
1152 j1 += m;
1153 k1 += m2;
1154 xr = a[j1];
1155 xi = -a[j1 + 1];
1156 yr = a[k1];
1157 yi = -a[k1 + 1];
1158 a[j1] = yr;
1159 a[j1 + 1] = yi;
1160 a[k1] = xr;
1161 a[k1 + 1] = xi;
1162 j1 -= nh;
1163 k1 -= 2;
1164 xr = a[j1];
1165 xi = -a[j1 + 1];
1166 yr = a[k1];
1167 yi = -a[k1 + 1];
1168 a[j1] = yr;
1169 a[j1 + 1] = yi;
1170 a[k1] = xr;
1171 a[k1 + 1] = xi;
1172 j1 -= m;
1173 k1 -= m2;
1174 xr = a[j1];
1175 xi = -a[j1 + 1];
1176 yr = a[k1];
1177 yi = -a[k1 + 1];
1178 a[j1] = yr;
1179 a[j1 + 1] = yi;
1180 a[k1] = xr;
1181 a[k1 + 1] = xi;
1182 j1 -= m;
1183 k1 += m;
1184 xr = a[j1];
1185 xi = -a[j1 + 1];
1186 yr = a[k1];
1187 yi = -a[k1 + 1];
1188 a[j1] = yr;
1189 a[j1 + 1] = yi;
1190 a[k1] = xr;
1191 a[k1 + 1] = xi;
1192 j1 -= m;
1193 k1 -= m2;
1194 xr = a[j1];
1195 xi = -a[j1 + 1];
1196 yr = a[k1];
1197 yi = -a[k1 + 1];
1198 a[j1] = yr;
1199 a[j1 + 1] = yi;
1200 a[k1] = xr;
1201 a[k1 + 1] = xi;
1202 for (i = nh >> 1; i > (k ^= i); i >>= 1) {
1203 /* Avoid warning */
1204 }
1205 }
1206 k1 = j0 + k0;
1207 j1 = k1 + 2;
1208 k1 += nh;
1209 a[j1 - 1] = -a[j1 - 1];
1210 xr = a[j1];
1211 xi = -a[j1 + 1];
1212 yr = a[k1];
1213 yi = -a[k1 + 1];
1214 a[j1] = yr;
1215 a[j1 + 1] = yi;
1216 a[k1] = xr;
1217 a[k1 + 1] = xi;
1218 a[k1 + 3] = -a[k1 + 3];
1219 j1 += m;
1220 k1 += m2;
1221 xr = a[j1];
1222 xi = -a[j1 + 1];
1223 yr = a[k1];
1224 yi = -a[k1 + 1];
1225 a[j1] = yr;
1226 a[j1 + 1] = yi;
1227 a[k1] = xr;
1228 a[k1 + 1] = xi;
1229 j1 += m;
1230 k1 -= m;
1231 xr = a[j1];
1232 xi = -a[j1 + 1];
1233 yr = a[k1];
1234 yi = -a[k1 + 1];
1235 a[j1] = yr;
1236 a[j1 + 1] = yi;
1237 a[k1] = xr;
1238 a[k1 + 1] = xi;
1239 j1 -= 2;
1240 k1 -= nh;
1241 xr = a[j1];
1242 xi = -a[j1 + 1];
1243 yr = a[k1];
1244 yi = -a[k1 + 1];
1245 a[j1] = yr;
1246 a[j1 + 1] = yi;
1247 a[k1] = xr;
1248 a[k1 + 1] = xi;
1249 j1 += nh + 2;
1250 k1 += nh + 2;
1251 xr = a[j1];
1252 xi = -a[j1 + 1];
1253 yr = a[k1];
1254 yi = -a[k1 + 1];
1255 a[j1] = yr;
1256 a[j1 + 1] = yi;
1257 a[k1] = xr;
1258 a[k1 + 1] = xi;
1259 j1 -= nh - m;
1260 k1 += m2 - 2;
1261 a[j1 - 1] = -a[j1 - 1];
1262 xr = a[j1];
1263 xi = -a[j1 + 1];
1264 yr = a[k1];
1265 yi = -a[k1 + 1];
1266 a[j1] = yr;
1267 a[j1 + 1] = yi;
1268 a[k1] = xr;
1269 a[k1 + 1] = xi;
1270 a[k1 + 3] = -a[k1 + 3];
1271 for (i = nh >> 1; i > (j0 ^= i); i >>= 1) { /* Avoid warning*/
1272
1273 }
1274 }
1275 } else {
1276 j0 = 0;
1277 for (k0 = 0; k0 < m; k0 += 4) {
1278 k = k0;
1279 for (j = j0; j < j0 + k0; j += 4) {
1280 xr = a[j];
1281 xi = -a[j + 1];
1282 yr = a[k];
1283 yi = -a[k + 1];
1284 a[j] = yr;
1285 a[j + 1] = yi;
1286 a[k] = xr;
1287 a[k + 1] = xi;
1288 j1 = j + m;
1289 k1 = k + m;
1290 xr = a[j1];
1291 xi = -a[j1 + 1];
1292 yr = a[k1];
1293 yi = -a[k1 + 1];
1294 a[j1] = yr;
1295 a[j1 + 1] = yi;
1296 a[k1] = xr;
1297 a[k1 + 1] = xi;
1298 j1 += nh;
1299 k1 += 2;
1300 xr = a[j1];
1301 xi = -a[j1 + 1];
1302 yr = a[k1];
1303 yi = -a[k1 + 1];
1304 a[j1] = yr;
1305 a[j1 + 1] = yi;
1306 a[k1] = xr;
1307 a[k1 + 1] = xi;
1308 j1 -= m;
1309 k1 -= m;
1310 xr = a[j1];
1311 xi = -a[j1 + 1];
1312 yr = a[k1];
1313 yi = -a[k1 + 1];
1314 a[j1] = yr;
1315 a[j1 + 1] = yi;
1316 a[k1] = xr;
1317 a[k1 + 1] = xi;
1318 j1 += 2;
1319 k1 += nh;
1320 xr = a[j1];
1321 xi = -a[j1 + 1];
1322 yr = a[k1];
1323 yi = -a[k1 + 1];
1324 a[j1] = yr;
1325 a[j1 + 1] = yi;
1326 a[k1] = xr;
1327 a[k1 + 1] = xi;
1328 j1 += m;
1329 k1 += m;
1330 xr = a[j1];
1331 xi = -a[j1 + 1];
1332 yr = a[k1];
1333 yi = -a[k1 + 1];
1334 a[j1] = yr;
1335 a[j1 + 1] = yi;
1336 a[k1] = xr;
1337 a[k1 + 1] = xi;
1338 j1 -= nh;
1339 k1 -= 2;
1340 xr = a[j1];
1341 xi = -a[j1 + 1];
1342 yr = a[k1];
1343 yi = -a[k1 + 1];
1344 a[j1] = yr;
1345 a[j1 + 1] = yi;
1346 a[k1] = xr;
1347 a[k1 + 1] = xi;
1348 j1 -= m;
1349 k1 -= m;
1350 xr = a[j1];
1351 xi = -a[j1 + 1];
1352 yr = a[k1];
1353 yi = -a[k1 + 1];
1354 a[j1] = yr;
1355 a[j1 + 1] = yi;
1356 a[k1] = xr;
1357 a[k1 + 1] = xi;
1358 for (i = nh >> 1; i > (k ^= i); i >>= 1) {
1359 /* Avoid warning*/
1360 }
1361 }
1362 k1 = j0 + k0;
1363 j1 = k1 + 2;
1364 k1 += nh;
1365 a[j1 - 1] = -a[j1 - 1];
1366 xr = a[j1];
1367 xi = -a[j1 + 1];
1368 yr = a[k1];
1369 yi = -a[k1 + 1];
1370 a[j1] = yr;
1371 a[j1 + 1] = yi;
1372 a[k1] = xr;
1373 a[k1 + 1] = xi;
1374 a[k1 + 3] = -a[k1 + 3];
1375 j1 += m;
1376 k1 += m;
1377 a[j1 - 1] = -a[j1 - 1];
1378 xr = a[j1];
1379 xi = -a[j1 + 1];
1380 yr = a[k1];
1381 yi = -a[k1 + 1];
1382 a[j1] = yr;
1383 a[j1 + 1] = yi;
1384 a[k1] = xr;
1385 a[k1 + 1] = xi;
1386 a[k1 + 3] = -a[k1 + 3];
1387 for (i = nh >> 1; i > (j0 ^= i); i >>= 1) {
1388 /* Avoid warning*/
1389 }
1390 }
1391 }
1392 }
1393
1394
bitrv216(PICOFFTSG_FFTTYPE * a)1395 void bitrv216(PICOFFTSG_FFTTYPE *a)
1396 {
1397 PICOFFTSG_FFTTYPE x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i,
1398 x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i,
1399 x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i;
1400
1401 x1r = a[2];
1402 x1i = a[3];
1403 x2r = a[4];
1404 x2i = a[5];
1405 x3r = a[6];
1406 x3i = a[7];
1407 x4r = a[8];
1408 x4i = a[9];
1409 x5r = a[10];
1410 x5i = a[11];
1411 x7r = a[14];
1412 x7i = a[15];
1413 x8r = a[16];
1414 x8i = a[17];
1415 x10r = a[20];
1416 x10i = a[21];
1417 x11r = a[22];
1418 x11i = a[23];
1419 x12r = a[24];
1420 x12i = a[25];
1421 x13r = a[26];
1422 x13i = a[27];
1423 x14r = a[28];
1424 x14i = a[29];
1425 a[2] = x8r;
1426 a[3] = x8i;
1427 a[4] = x4r;
1428 a[5] = x4i;
1429 a[6] = x12r;
1430 a[7] = x12i;
1431 a[8] = x2r;
1432 a[9] = x2i;
1433 a[10] = x10r;
1434 a[11] = x10i;
1435 a[14] = x14r;
1436 a[15] = x14i;
1437 a[16] = x1r;
1438 a[17] = x1i;
1439 a[20] = x5r;
1440 a[21] = x5i;
1441 a[22] = x13r;
1442 a[23] = x13i;
1443 a[24] = x3r;
1444 a[25] = x3i;
1445 a[26] = x11r;
1446 a[27] = x11i;
1447 a[28] = x7r;
1448 a[29] = x7i;
1449 }
1450
1451
bitrv216neg(PICOFFTSG_FFTTYPE * a)1452 void bitrv216neg(PICOFFTSG_FFTTYPE *a)
1453 {
1454 PICOFFTSG_FFTTYPE x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i,
1455 x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i,
1456 x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i,
1457 x13r, x13i, x14r, x14i, x15r, x15i;
1458
1459 x1r = a[2];
1460 x1i = a[3];
1461 x2r = a[4];
1462 x2i = a[5];
1463 x3r = a[6];
1464 x3i = a[7];
1465 x4r = a[8];
1466 x4i = a[9];
1467 x5r = a[10];
1468 x5i = a[11];
1469 x6r = a[12];
1470 x6i = a[13];
1471 x7r = a[14];
1472 x7i = a[15];
1473 x8r = a[16];
1474 x8i = a[17];
1475 x9r = a[18];
1476 x9i = a[19];
1477 x10r = a[20];
1478 x10i = a[21];
1479 x11r = a[22];
1480 x11i = a[23];
1481 x12r = a[24];
1482 x12i = a[25];
1483 x13r = a[26];
1484 x13i = a[27];
1485 x14r = a[28];
1486 x14i = a[29];
1487 x15r = a[30];
1488 x15i = a[31];
1489 a[2] = x15r;
1490 a[3] = x15i;
1491 a[4] = x7r;
1492 a[5] = x7i;
1493 a[6] = x11r;
1494 a[7] = x11i;
1495 a[8] = x3r;
1496 a[9] = x3i;
1497 a[10] = x13r;
1498 a[11] = x13i;
1499 a[12] = x5r;
1500 a[13] = x5i;
1501 a[14] = x9r;
1502 a[15] = x9i;
1503 a[16] = x1r;
1504 a[17] = x1i;
1505 a[18] = x14r;
1506 a[19] = x14i;
1507 a[20] = x6r;
1508 a[21] = x6i;
1509 a[22] = x10r;
1510 a[23] = x10i;
1511 a[24] = x2r;
1512 a[25] = x2i;
1513 a[26] = x12r;
1514 a[27] = x12i;
1515 a[28] = x4r;
1516 a[29] = x4i;
1517 a[30] = x8r;
1518 a[31] = x8i;
1519 }
1520
1521
bitrv208(PICOFFTSG_FFTTYPE * a)1522 void bitrv208(PICOFFTSG_FFTTYPE *a)
1523 {
1524 PICOFFTSG_FFTTYPE x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i;
1525
1526 x1r = a[2];
1527 x1i = a[3];
1528 x3r = a[6];
1529 x3i = a[7];
1530 x4r = a[8];
1531 x4i = a[9];
1532 x6r = a[12];
1533 x6i = a[13];
1534 a[2] = x4r;
1535 a[3] = x4i;
1536 a[6] = x6r;
1537 a[7] = x6i;
1538 a[8] = x1r;
1539 a[9] = x1i;
1540 a[12] = x3r;
1541 a[13] = x3i;
1542 }
1543
1544
bitrv208neg(PICOFFTSG_FFTTYPE * a)1545 void bitrv208neg(PICOFFTSG_FFTTYPE *a)
1546 {
1547 PICOFFTSG_FFTTYPE x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i,
1548 x5r, x5i, x6r, x6i, x7r, x7i;
1549
1550 x1r = a[2];
1551 x1i = a[3];
1552 x2r = a[4];
1553 x2i = a[5];
1554 x3r = a[6];
1555 x3i = a[7];
1556 x4r = a[8];
1557 x4i = a[9];
1558 x5r = a[10];
1559 x5i = a[11];
1560 x6r = a[12];
1561 x6i = a[13];
1562 x7r = a[14];
1563 x7i = a[15];
1564 a[2] = x7r;
1565 a[3] = x7i;
1566 a[4] = x3r;
1567 a[5] = x3i;
1568 a[6] = x5r;
1569 a[7] = x5i;
1570 a[8] = x1r;
1571 a[9] = x1i;
1572 a[10] = x6r;
1573 a[11] = x6i;
1574 a[12] = x2r;
1575 a[13] = x2i;
1576 a[14] = x4r;
1577 a[15] = x4i;
1578 }
1579
1580
bitrv1(picoos_int32 n,PICOFFTSG_FFTTYPE * a)1581 void bitrv1(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
1582 {
1583 picoos_int32 j0, k0, j1, k1, l, m, i, j, k, nh;
1584 PICOFFTSG_FFTTYPE x;
1585 nh = n >> 1;
1586 x = a[1];
1587 a[1] = a[nh];
1588 a[nh] = x;
1589 m = 2;
1590 for (l = n >> 2; l > 2; l >>= 2) {
1591 m <<= 1;
1592 }
1593 if (l == 2) {
1594 j1 = m + 1;
1595 k1 = m + nh;
1596 x = a[j1];
1597 a[j1] = a[k1];
1598 a[k1] = x;
1599 j0 = 0;
1600 for (k0 = 2; k0 < m; k0 += 2) {
1601 for (i = nh >> 1; i > (j0 ^= i); i >>= 1) {
1602 /* Avoid warning*/
1603 }
1604 k = k0;
1605 for (j = j0; j < j0 + k0; j += 2) {
1606 x = a[j];
1607 a[j] = a[k];
1608 a[k] = x;
1609 j1 = j + m;
1610 k1 = k + m;
1611 x = a[j1];
1612 a[j1] = a[k1];
1613 a[k1] = x;
1614 j1 += nh;
1615 k1++;
1616 x = a[j1];
1617 a[j1] = a[k1];
1618 a[k1] = x;
1619 j1 -= m;
1620 k1 -= m;
1621 x = a[j1];
1622 a[j1] = a[k1];
1623 a[k1] = x;
1624 j1++;
1625 k1 += nh;
1626 x = a[j1];
1627 a[j1] = a[k1];
1628 a[k1] = x;
1629 j1 += m;
1630 k1 += m;
1631 x = a[j1];
1632 a[j1] = a[k1];
1633 a[k1] = x;
1634 j1 -= nh;
1635 k1--;
1636 x = a[j1];
1637 a[j1] = a[k1];
1638 a[k1] = x;
1639 j1 -= m;
1640 k1 -= m;
1641 x = a[j1];
1642 a[j1] = a[k1];
1643 a[k1] = x;
1644 for (i = nh >> 1; i > (k ^= i); i >>= 1) {
1645 /* Avoid warning*/
1646 }
1647 }
1648 k1 = j0 + k0;
1649 j1 = k1 + 1;
1650 k1 += nh;
1651 x = a[j1];
1652 a[j1] = a[k1];
1653 a[k1] = x;
1654 j1 += m;
1655 k1 += m;
1656 x = a[j1];
1657 a[j1] = a[k1];
1658 a[k1] = x;
1659 }
1660 } else {
1661 j0 = 0;
1662 for (k0 = 2; k0 < m; k0 += 2) {
1663 for (i = nh >> 1; i > (j0 ^= i); i >>= 1) {
1664 /* Avoid warning*/
1665 }
1666 k = k0;
1667 for (j = j0; j < j0 + k0; j += 2) {
1668 x = a[j];
1669 a[j] = a[k];
1670 a[k] = x;
1671 j1 = j + nh;
1672 k1 = k + 1;
1673 x = a[j1];
1674 a[j1] = a[k1];
1675 a[k1] = x;
1676 j1++;
1677 k1 += nh;
1678 x = a[j1];
1679 a[j1] = a[k1];
1680 a[k1] = x;
1681 j1 -= nh;
1682 k1--;
1683 x = a[j1];
1684 a[j1] = a[k1];
1685 a[k1] = x;
1686 for (i = nh >> 1; i > (k ^= i); i >>= 1) {
1687 /* Avoid warning*/
1688 }
1689 }
1690 k1 = j0 + k0;
1691 j1 = k1 + 1;
1692 k1 += nh;
1693 x = a[j1];
1694 a[j1] = a[k1];
1695 a[k1] = x;
1696 }
1697 }
1698 }
1699
1700
1701 /* **************************************************************************************************/
1702
1703 /* **************************************************************************************************/
1704
cftb1st(picoos_int32 n,PICOFFTSG_FFTTYPE * a)1705 void cftb1st(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
1706 {
1707 picoos_int32 i, i0, j, j0, j1, j2, j3, m, mh;
1708 PICOFFTSG_FFTTYPE wk1r, wk1i, wk3r, wk3i,
1709 wd1r, wd1i, wd3r, wd3i, ss1, ss3;
1710 PICOFFTSG_FFTTYPE x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1711
1712 mh = n >> 3;
1713 m = 2 * mh;
1714 j1 = m;
1715 j2 = j1 + m;
1716 j3 = j2 + m;
1717 x0r = a[0] + a[j2];
1718 x0i = -a[1] - a[j2 + 1];
1719 x1r = a[0] - a[j2];
1720 x1i = -a[1] + a[j2 + 1];
1721 x2r = a[j1] + a[j3];
1722 x2i = a[j1 + 1] + a[j3 + 1];
1723 x3r = a[j1] - a[j3];
1724 x3i = a[j1 + 1] - a[j3 + 1];
1725 a[0] = x0r + x2r;
1726 a[1] = x0i - x2i;
1727 a[j1] = x0r - x2r;
1728 a[j1 + 1] = x0i + x2i;
1729 a[j2] = x1r + x3i;
1730 a[j2 + 1] = x1i + x3r;
1731 a[j3] = x1r - x3i;
1732 a[j3 + 1] = x1i - x3r;
1733 wd1r = PICODSP_WGT_SHIFT;
1734 wd1i = 0;
1735 wd3r = PICODSP_WGT_SHIFT;
1736 wd3i = 0;
1737
1738 wk1r = (PICOFFTSG_FFTTYPE) (0.998795449734 *PICODSP_WGT_SHIFT);
1739 wk1i = (PICOFFTSG_FFTTYPE) (0.049067676067 *PICODSP_WGT_SHIFT);
1740 ss1 = (PICOFFTSG_FFTTYPE) (0.098135352135 *PICODSP_WGT_SHIFT);
1741 wk3i = (PICOFFTSG_FFTTYPE) (-0.146730467677 *PICODSP_WGT_SHIFT);
1742 wk3r = (PICOFFTSG_FFTTYPE) (0.989176511765 *PICODSP_WGT_SHIFT);
1743 ss3 = (PICOFFTSG_FFTTYPE) (-0.293460935354 *PICODSP_WGT_SHIFT);
1744
1745 i = 0;
1746 for (;;) {
1747 i0 = i + CDFT_LOOP_DIV_4;
1748 if (i0 > mh - 4) {
1749 i0 = mh - 4;
1750 }
1751 for (j = i + 2; j < i0; j += 4) {
1752
1753 wd1r -= Mult_W_W(ss1, wk1i);
1754 wd1i += Mult_W_W(ss1, wk1r);
1755 wd3r -= Mult_W_W(ss3, wk3i);
1756 wd3i += Mult_W_W(ss3, wk3r);
1757
1758 j1 = j + m;
1759 j2 = j1 + m;
1760 j3 = j2 + m;
1761 x0r = a[j] + a[j2];
1762 x0i = -a[j + 1] - a[j2 + 1];
1763 x1r = a[j] - a[j2];
1764 x1i = -a[j + 1] + a[j2 + 1];
1765 x2r = a[j1] + a[j3];
1766 x2i = a[j1 + 1] + a[j3 + 1];
1767 x3r = a[j1] - a[j3];
1768 x3i = a[j1 + 1] - a[j3 + 1];
1769 a[j] = x0r + x2r;
1770 a[j + 1] = x0i - x2i;
1771 a[j1] = x0r - x2r;
1772 a[j1 + 1] = x0i + x2i;
1773 x0r = x1r + x3i;
1774 x0i = x1i + x3r;
1775 a[j2] = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
1776 a[j2 + 1] = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
1777 x0r = x1r - x3i;
1778 x0i = x1i - x3r;
1779 a[j3] = Mult_W_W(wk3r, x0r) + Mult_W_W(wk3i, x0i);
1780 a[j3 + 1] = Mult_W_W(wk3r, x0i) - Mult_W_W(wk3i, x0r);
1781 x0r = a[j + 2] + a[j2 + 2];
1782 x0i = -a[j + 3] - a[j2 + 3];
1783 x1r = a[j + 2] - a[j2 + 2];
1784 x1i = -a[j + 3] + a[j2 + 3];
1785 x2r = a[j1 + 2] + a[j3 + 2];
1786 x2i = a[j1 + 3] + a[j3 + 3];
1787 x3r = a[j1 + 2] - a[j3 + 2];
1788 x3i = a[j1 + 3] - a[j3 + 3];
1789 a[j + 2] = x0r + x2r;
1790 a[j + 3] = x0i - x2i;
1791 a[j1 + 2] = x0r - x2r;
1792 a[j1 + 3] = x0i + x2i;
1793 x0r = x1r + x3i;
1794 x0i = x1i + x3r;
1795 a[j2 + 2] = Mult_W_W(wd1r, x0r) - Mult_W_W(wd1i, x0i);
1796 a[j2 + 3] = Mult_W_W(wd1r, x0i) + Mult_W_W(wd1i, x0r);
1797 x0r = x1r - x3i;
1798 x0i = x1i - x3r;
1799 a[j3 + 2] = Mult_W_W(wd3r, x0r) + Mult_W_W(wd3i, x0i);
1800 a[j3 + 3] = Mult_W_W(wd3r, x0i) - Mult_W_W(wd3i, x0r);
1801 j0 = m - j;
1802 j1 = j0 + m;
1803 j2 = j1 + m;
1804 j3 = j2 + m;
1805 x0r = a[j0] + a[j2];
1806 x0i = -a[j0 + 1] - a[j2 + 1];
1807 x1r = a[j0] - a[j2];
1808 x1i = -a[j0 + 1] + a[j2 + 1];
1809 x2r = a[j1] + a[j3];
1810 x2i = a[j1 + 1] + a[j3 + 1];
1811 x3r = a[j1] - a[j3];
1812 x3i = a[j1 + 1] - a[j3 + 1];
1813 a[j0] = x0r + x2r;
1814 a[j0 + 1] = x0i - x2i;
1815 a[j1] = x0r - x2r;
1816 a[j1 + 1] = x0i + x2i;
1817 x0r = x1r + x3i;
1818 x0i = x1i + x3r;
1819 a[j2] = Mult_W_W(wk1i, x0r) - Mult_W_W(wk1r, x0i);
1820 a[j2 + 1] = Mult_W_W(wk1i, x0i) + Mult_W_W(wk1r, x0r);
1821 x0r = x1r - x3i;
1822 x0i = x1i - x3r;
1823 a[j3] = Mult_W_W(wk3i, x0r) + Mult_W_W(wk3r, x0i);
1824 a[j3 + 1] = Mult_W_W(wk3i, x0i) - Mult_W_W(wk3r, x0r);
1825 x0r = a[j0 - 2] + a[j2 - 2];
1826 x0i = -a[j0 - 1] - a[j2 - 1];
1827 x1r = a[j0 - 2] - a[j2 - 2];
1828 x1i = -a[j0 - 1] + a[j2 - 1];
1829 x2r = a[j1 - 2] + a[j3 - 2];
1830 x2i = a[j1 - 1] + a[j3 - 1];
1831 x3r = a[j1 - 2] - a[j3 - 2];
1832 x3i = a[j1 - 1] - a[j3 - 1];
1833 a[j0 - 2] = x0r + x2r;
1834 a[j0 - 1] = x0i - x2i;
1835 a[j1 - 2] = x0r - x2r;
1836 a[j1 - 1] = x0i + x2i;
1837 x0r = x1r + x3i;
1838 x0i = x1i + x3r;
1839 a[j2 - 2] = Mult_W_W(wd1i, x0r) - Mult_W_W(wd1r, x0i);
1840 a[j2 - 1] = Mult_W_W(wd1i, x0i) + Mult_W_W(wd1r, x0r);
1841 x0r = x1r - x3i;
1842 x0i = x1i - x3r;
1843 a[j3 - 2] = Mult_W_W(wd3i, x0r) + Mult_W_W(wd3r, x0i);
1844 a[j3 - 1] = Mult_W_W(wd3i, x0i) - Mult_W_W(wd3r, x0r);
1845 wk1r -= Mult_W_W(ss1, wd1i);
1846 wk1i += Mult_W_W(ss1, wd1r);
1847 wk3r -= Mult_W_W(ss3, wd3i);
1848 wk3i += Mult_W_W(ss3, wd3r);
1849 }
1850 if (i0 == mh - 4) {
1851 break;
1852 }
1853 }
1854 wd1r = WR5000;
1855 j0 = mh;
1856 j1 = j0 + m;
1857 j2 = j1 + m;
1858 j3 = j2 + m;
1859 x0r = a[j0 - 2] + a[j2 - 2];
1860 x0i = -a[j0 - 1] - a[j2 - 1];
1861 x1r = a[j0 - 2] - a[j2 - 2];
1862 x1i = -a[j0 - 1] + a[j2 - 1];
1863 x2r = a[j1 - 2] + a[j3 - 2];
1864 x2i = a[j1 - 1] + a[j3 - 1];
1865 x3r = a[j1 - 2] - a[j3 - 2];
1866 x3i = a[j1 - 1] - a[j3 - 1];
1867 a[j0 - 2] = x0r + x2r;
1868 a[j0 - 1] = x0i - x2i;
1869 a[j1 - 2] = x0r - x2r;
1870 a[j1 - 1] = x0i + x2i;
1871 x0r = x1r + x3i;
1872 x0i = x1i + x3r;
1873 a[j2 - 2] = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
1874 a[j2 - 1] = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
1875 x0r = x1r - x3i;
1876 x0i = x1i - x3r;
1877 a[j3 - 2] = Mult_W_W(wk3r, x0r) + Mult_W_W(wk3i, x0i);
1878 a[j3 - 1] = Mult_W_W(wk3r, x0i) - Mult_W_W(wk3i, x0r);
1879 x0r = a[j0] + a[j2];
1880 x0i = -a[j0 + 1] - a[j2 + 1];
1881 x1r = a[j0] - a[j2];
1882 x1i = -a[j0 + 1] + a[j2 + 1];
1883 x2r = a[j1] + a[j3];
1884 x2i = a[j1 + 1] + a[j3 + 1];
1885 x3r = a[j1] - a[j3];
1886 x3i = a[j1 + 1] - a[j3 + 1];
1887 a[j0] = x0r + x2r;
1888 a[j0 + 1] = x0i - x2i;
1889 a[j1] = x0r - x2r;
1890 a[j1 + 1] = x0i + x2i;
1891 x0r = x1r + x3i;
1892 x0i = x1i + x3r;
1893 a[j2] = picofftsg_mult_w_a(wd1r, (x0r - x0i));
1894 a[j2 + 1] = picofftsg_mult_w_a(wd1r, (x0i + x0r));
1895 x0r = x1r - x3i;
1896 x0i = x1i - x3r;
1897 a[j3] = -picofftsg_mult_w_a(wd1r, (x0r + x0i));
1898 a[j3 + 1] = -picofftsg_mult_w_a(wd1r, (x0i - x0r));
1899 x0r = a[j0 + 2] + a[j2 + 2];
1900 x0i = -a[j0 + 3] - a[j2 + 3];
1901 x1r = a[j0 + 2] - a[j2 + 2];
1902 x1i = -a[j0 + 3] + a[j2 + 3];
1903 x2r = a[j1 + 2] + a[j3 + 2];
1904 x2i = a[j1 + 3] + a[j3 + 3];
1905 x3r = a[j1 + 2] - a[j3 + 2];
1906 x3i = a[j1 + 3] - a[j3 + 3];
1907 a[j0 + 2] = x0r + x2r;
1908 a[j0 + 3] = x0i - x2i;
1909 a[j1 + 2] = x0r - x2r;
1910 a[j1 + 3] = x0i + x2i;
1911 x0r = x1r + x3i;
1912 x0i = x1i + x3r;
1913 a[j2 + 2] = Mult_W_W(wk1i, x0r) - Mult_W_W(wk1r, x0i);
1914 a[j2 + 3] = Mult_W_W(wk1i, x0i) + Mult_W_W(wk1r, x0r);
1915 x0r = x1r - x3i;
1916 x0i = x1i - x3r;
1917 a[j3 + 2] = Mult_W_W(wk3i, x0r) + Mult_W_W(wk3r, x0i);
1918 a[j3 + 3] = Mult_W_W(wk3i, x0i) - Mult_W_W(wk3r, x0r);
1919 }
1920
cftrec4(picoos_int32 n,PICOFFTSG_FFTTYPE * a)1921 void cftrec4(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
1922 {
1923 picoos_int32 isplt, j, k, m;
1924
1925 m = n;
1926 while (m > 512) {
1927 m >>= 2;
1928 cftmdl1(m, &a[n - m]);
1929 }
1930 cftleaf(m, 1, &a[n - m]);
1931 k = 0;
1932 for (j = n - m; j > 0; j -= m) {
1933 k++;
1934 isplt = cfttree(m, j, k, a);
1935 cftleaf(m, isplt, &a[j - m]);
1936 }
1937 }
1938
1939
cfttree(picoos_int32 n,picoos_int32 j,picoos_int32 k,PICOFFTSG_FFTTYPE * a)1940 picoos_int32 cfttree(picoos_int32 n, picoos_int32 j, picoos_int32 k, PICOFFTSG_FFTTYPE *a)
1941 {
1942 picoos_int32 i, isplt, m;
1943
1944 if ((k & 3) != 0) {
1945 isplt = k & 1;
1946 if (isplt != 0) {
1947 cftmdl1(n, &a[j - n]);
1948 } else {
1949 cftmdl2(n, &a[j - n]);
1950 }
1951 } else {
1952 m = n;
1953 for (i = k; (i & 3) == 0; i >>= 2) {
1954 m <<= 2;
1955 }
1956 isplt = i & 1;
1957 if (isplt != 0) {
1958 while (m > 128) {
1959 cftmdl1(m, &a[j - m]);
1960 m >>= 2;
1961 }
1962 } else {
1963 while (m > 128) {
1964 cftmdl2(m, &a[j - m]);
1965 m >>= 2;
1966 }
1967 }
1968 }
1969 return isplt;
1970 }
1971
1972
cftleaf(picoos_int32 n,picoos_int32 isplt,PICOFFTSG_FFTTYPE * a)1973 void cftleaf(picoos_int32 n, picoos_int32 isplt, PICOFFTSG_FFTTYPE *a)
1974 {
1975
1976 if (n == 512) {
1977 cftmdl1(128, a);
1978 cftf161(a);
1979 cftf162(&a[32]);
1980 cftf161(&a[64]);
1981 cftf161(&a[96]);
1982 cftmdl2(128, &a[128]);
1983 cftf161(&a[128]);
1984 cftf162(&a[160]);
1985 cftf161(&a[192]);
1986 cftf162(&a[224]);
1987 cftmdl1(128, &a[256]);
1988 cftf161(&a[256]);
1989 cftf162(&a[288]);
1990 cftf161(&a[320]);
1991 cftf161(&a[352]);
1992 if (isplt != 0) {
1993 cftmdl1(128, &a[384]);
1994 cftf161(&a[480]);
1995 } else {
1996 cftmdl2(128, &a[384]);
1997 cftf162(&a[480]);
1998 }
1999 cftf161(&a[384]);
2000 cftf162(&a[416]);
2001 cftf161(&a[448]);
2002 } else {
2003 cftmdl1(64, a);
2004 cftf081(a);
2005 cftf082(&a[16]);
2006 cftf081(&a[32]);
2007 cftf081(&a[48]);
2008 cftmdl2(64, &a[64]);
2009 cftf081(&a[64]);
2010 cftf082(&a[80]);
2011 cftf081(&a[96]);
2012 cftf082(&a[112]);
2013 cftmdl1(64, &a[128]);
2014 cftf081(&a[128]);
2015 cftf082(&a[144]);
2016 cftf081(&a[160]);
2017 cftf081(&a[176]);
2018 if (isplt != 0) {
2019 cftmdl1(64, &a[192]);
2020 cftf081(&a[240]);
2021 } else {
2022 cftmdl2(64, &a[192]);
2023 cftf082(&a[240]);
2024 }
2025 cftf081(&a[192]);
2026 cftf082(&a[208]);
2027 cftf081(&a[224]);
2028 }
2029 }
2030
2031
cftmdl1(picoos_int32 n,PICOFFTSG_FFTTYPE * a)2032 void cftmdl1(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
2033 {
2034 picoos_int32 i, i0, j, j0, j1, j2, j3, m, mh;
2035 PICOFFTSG_FFTTYPE wk1r, wk1i, wk3r, wk3i,
2036 wd1r, wd1i, wd3r, wd3i, ss1, ss3;
2037 PICOFFTSG_FFTTYPE x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
2038
2039 mh = n >> 3;
2040 m = 2 * mh;
2041 j1 = m;
2042 j2 = j1 + m;
2043 j3 = j2 + m;
2044 x0r = a[0] + a[j2];
2045 x0i = a[1] + a[j2 + 1];
2046 x1r = a[0] - a[j2];
2047 x1i = a[1] - a[j2 + 1];
2048 x2r = a[j1] + a[j3];
2049 x2i = a[j1 + 1] + a[j3 + 1];
2050 x3r = a[j1] - a[j3];
2051 x3i = a[j1 + 1] - a[j3 + 1];
2052 a[0] = x0r + x2r;
2053 a[1] = x0i + x2i;
2054 a[j1] = x0r - x2r;
2055 a[j1 + 1] = x0i - x2i;
2056 a[j2] = x1r - x3i;
2057 a[j2 + 1] = x1i + x3r;
2058 a[j3] = x1r + x3i;
2059 a[j3 + 1] = x1i - x3r;
2060 wd1r = (PICOFFTSG_FFTTYPE)(PICODSP_WGT_SHIFT);
2061 wd1i = 0;
2062 wd3r = (PICOFFTSG_FFTTYPE)(PICODSP_WGT_SHIFT);
2063 wd3i = 0;
2064 wk1r = (PICOFFTSG_FFTTYPE) (0.980785250664 *PICODSP_WGT_SHIFT);
2065 wk1i = (PICOFFTSG_FFTTYPE) (0.195090323687 *PICODSP_WGT_SHIFT);
2066 ss1 = (PICOFFTSG_FFTTYPE) (0.390180647373 *PICODSP_WGT_SHIFT);
2067 wk3i = (PICOFFTSG_FFTTYPE) (-0.555570185184 *PICODSP_WGT_SHIFT);
2068 wk3r = (PICOFFTSG_FFTTYPE) (0.831469595432 *PICODSP_WGT_SHIFT);
2069 ss3 = (PICOFFTSG_FFTTYPE) (-1.111140370369 *PICODSP_WGT_SHIFT);
2070
2071 i = 0;
2072 for (;;) {
2073 i0 = i + CDFT_LOOP_DIV_4;
2074 if (i0 > mh - 4) {
2075 i0 = mh - 4;
2076 }
2077 for (j = i + 2; j < i0; j += 4) {
2078 wd1r -= Mult_W_W(ss1, wk1i);
2079 wd1i += Mult_W_W(ss1, wk1r);
2080 wd3r -= Mult_W_W(ss3, wk3i);
2081 wd3i += Mult_W_W(ss3, wk3r);
2082 j1 = j + m;
2083 j2 = j1 + m;
2084 j3 = j2 + m;
2085 x0r = a[j] + a[j2];
2086 x0i = a[j + 1] + a[j2 + 1];
2087 x1r = a[j] - a[j2];
2088 x1i = a[j + 1] - a[j2 + 1];
2089 x2r = a[j1] + a[j3];
2090 x2i = a[j1 + 1] + a[j3 + 1];
2091 x3r = a[j1] - a[j3];
2092 x3i = a[j1 + 1] - a[j3 + 1];
2093 a[j] = x0r + x2r;
2094 a[j + 1] = x0i + x2i;
2095 a[j1] = x0r - x2r;
2096 a[j1 + 1] = x0i - x2i;
2097 x0r = x1r - x3i;
2098 x0i = x1i + x3r;
2099 a[j2] = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
2100 a[j2 + 1] = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
2101 x0r = x1r + x3i;
2102 x0i = x1i - x3r;
2103 a[j3] = Mult_W_W(wk3r, x0r) + Mult_W_W(wk3i, x0i);
2104 a[j3 + 1] = Mult_W_W(wk3r, x0i) - Mult_W_W(wk3i, x0r);
2105 x0r = a[j + 2] + a[j2 + 2];
2106 x0i = a[j + 3] + a[j2 + 3];
2107 x1r = a[j + 2] - a[j2 + 2];
2108 x1i = a[j + 3] - a[j2 + 3];
2109 x2r = a[j1 + 2] + a[j3 + 2];
2110 x2i = a[j1 + 3] + a[j3 + 3];
2111 x3r = a[j1 + 2] - a[j3 + 2];
2112 x3i = a[j1 + 3] - a[j3 + 3];
2113 a[j + 2] = x0r + x2r;
2114 a[j + 3] = x0i + x2i;
2115 a[j1 + 2] = x0r - x2r;
2116 a[j1 + 3] = x0i - x2i;
2117 x0r = x1r - x3i;
2118 x0i = x1i + x3r;
2119 a[j2 + 2] = Mult_W_W(wd1r, x0r) - Mult_W_W(wd1i, x0i);
2120 a[j2 + 3] = Mult_W_W(wd1r, x0i) + Mult_W_W(wd1i, x0r);
2121 x0r = x1r + x3i;
2122 x0i = x1i - x3r;
2123 a[j3 + 2] = Mult_W_W(wd3r, x0r) + Mult_W_W(wd3i, x0i);
2124 a[j3 + 3] = Mult_W_W(wd3r, x0i) - Mult_W_W(wd3i, x0r);
2125 j0 = m - j;
2126 j1 = j0 + m;
2127 j2 = j1 + m;
2128 j3 = j2 + m;
2129 x0r = a[j0] + a[j2];
2130 x0i = a[j0 + 1] + a[j2 + 1];
2131 x1r = a[j0] - a[j2];
2132 x1i = a[j0 + 1] - a[j2 + 1];
2133 x2r = a[j1] + a[j3];
2134 x2i = a[j1 + 1] + a[j3 + 1];
2135 x3r = a[j1] - a[j3];
2136 x3i = a[j1 + 1] - a[j3 + 1];
2137 a[j0] = x0r + x2r;
2138 a[j0 + 1] = x0i + x2i;
2139 a[j1] = x0r - x2r;
2140 a[j1 + 1] = x0i - x2i;
2141 x0r = x1r - x3i;
2142 x0i = x1i + x3r;
2143 a[j2] = Mult_W_W(wk1i, x0r) - Mult_W_W(wk1r, x0i);
2144 a[j2 + 1] = Mult_W_W(wk1i, x0i) + Mult_W_W(wk1r, x0r);
2145 x0r = x1r + x3i;
2146 x0i = x1i - x3r;
2147 a[j3] = Mult_W_W(wk3i, x0r) + Mult_W_W(wk3r, x0i);
2148 a[j3 + 1] = Mult_W_W(wk3i, x0i) - Mult_W_W(wk3r, x0r);
2149 x0r = a[j0 - 2] + a[j2 - 2];
2150 x0i = a[j0 - 1] + a[j2 - 1];
2151 x1r = a[j0 - 2] - a[j2 - 2];
2152 x1i = a[j0 - 1] - a[j2 - 1];
2153 x2r = a[j1 - 2] + a[j3 - 2];
2154 x2i = a[j1 - 1] + a[j3 - 1];
2155 x3r = a[j1 - 2] - a[j3 - 2];
2156 x3i = a[j1 - 1] - a[j3 - 1];
2157 a[j0 - 2] = x0r + x2r;
2158 a[j0 - 1] = x0i + x2i;
2159 a[j1 - 2] = x0r - x2r;
2160 a[j1 - 1] = x0i - x2i;
2161 x0r = x1r - x3i;
2162 x0i = x1i + x3r;
2163 a[j2 - 2] = Mult_W_W(wd1i, x0r) - Mult_W_W(wd1r, x0i);
2164 a[j2 - 1] = Mult_W_W(wd1i, x0i) + Mult_W_W(wd1r, x0r);
2165 x0r = x1r + x3i;
2166 x0i = x1i - x3r;
2167 a[j3 - 2] = Mult_W_W(wd3i, x0r) + Mult_W_W(wd3r, x0i);
2168 a[j3 - 1] = Mult_W_W(wd3i, x0i) - Mult_W_W(wd3r, x0r);
2169 wk1r -= Mult_W_W(ss1, wd1i);
2170 wk1i += Mult_W_W(ss1, wd1r);
2171 wk3r -= Mult_W_W(ss3, wd3i);
2172 wk3i += Mult_W_W(ss3, wd3r);
2173 }
2174 if (i0 == mh - 4) {
2175 break;
2176 }
2177 }
2178 wd1r = WR5000;
2179 j0 = mh;
2180 j1 = j0 + m;
2181 j2 = j1 + m;
2182 j3 = j2 + m;
2183 x0r = a[j0 - 2] + a[j2 - 2];
2184 x0i = a[j0 - 1] + a[j2 - 1];
2185 x1r = a[j0 - 2] - a[j2 - 2];
2186 x1i = a[j0 - 1] - a[j2 - 1];
2187 x2r = a[j1 - 2] + a[j3 - 2];
2188 x2i = a[j1 - 1] + a[j3 - 1];
2189 x3r = a[j1 - 2] - a[j3 - 2];
2190 x3i = a[j1 - 1] - a[j3 - 1];
2191 a[j0 - 2] = x0r + x2r;
2192 a[j0 - 1] = x0i + x2i;
2193 a[j1 - 2] = x0r - x2r;
2194 a[j1 - 1] = x0i - x2i;
2195 x0r = x1r - x3i;
2196 x0i = x1i + x3r;
2197 a[j2 - 2] = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
2198 a[j2 - 1] = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
2199 x0r = x1r + x3i;
2200 x0i = x1i - x3r;
2201 a[j3 - 2] = Mult_W_W(wk3r, x0r) + Mult_W_W(wk3i, x0i);
2202 a[j3 - 1] = Mult_W_W(wk3r, x0i) - Mult_W_W(wk3i, x0r);
2203 x0r = a[j0] + a[j2];
2204 x0i = a[j0 + 1] + a[j2 + 1];
2205 x1r = a[j0] - a[j2];
2206 x1i = a[j0 + 1] - a[j2 + 1];
2207 x2r = a[j1] + a[j3];
2208 x2i = a[j1 + 1] + a[j3 + 1];
2209 x3r = a[j1] - a[j3];
2210 x3i = a[j1 + 1] - a[j3 + 1];
2211 a[j0] = x0r + x2r;
2212 a[j0 + 1] = x0i + x2i;
2213 a[j1] = x0r - x2r;
2214 a[j1 + 1] = x0i - x2i;
2215 x0r = x1r - x3i;
2216 x0i = x1i + x3r;
2217 a[j2] = picofftsg_mult_w_a(wd1r, (x0r - x0i));
2218 a[j2 + 1] = picofftsg_mult_w_a(wd1r, (x0i + x0r));
2219 x0r = x1r + x3i;
2220 x0i = x1i - x3r;
2221 a[j3] = -picofftsg_mult_w_a(wd1r, (x0r + x0i));
2222 a[j3 + 1] = -picofftsg_mult_w_a(wd1r, (x0i - x0r));
2223 x0r = a[j0 + 2] + a[j2 + 2];
2224 x0i = a[j0 + 3] + a[j2 + 3];
2225 x1r = a[j0 + 2] - a[j2 + 2];
2226 x1i = a[j0 + 3] - a[j2 + 3];
2227 x2r = a[j1 + 2] + a[j3 + 2];
2228 x2i = a[j1 + 3] + a[j3 + 3];
2229 x3r = a[j1 + 2] - a[j3 + 2];
2230 x3i = a[j1 + 3] - a[j3 + 3];
2231 a[j0 + 2] = x0r + x2r;
2232 a[j0 + 3] = x0i + x2i;
2233 a[j1 + 2] = x0r - x2r;
2234 a[j1 + 3] = x0i - x2i;
2235 x0r = x1r - x3i;
2236 x0i = x1i + x3r;
2237 a[j2 + 2] = Mult_W_W(wk1i, x0r) - Mult_W_W(wk1r, x0i);
2238 a[j2 + 3] = Mult_W_W(wk1i, x0i) + Mult_W_W(wk1r, x0r);
2239 x0r = x1r + x3i;
2240 x0i = x1i - x3r;
2241 a[j3 + 2] = Mult_W_W(wk3i, x0r) + Mult_W_W(wk3r, x0i);
2242 a[j3 + 3] = Mult_W_W(wk3i, x0i) - Mult_W_W(wk3r, x0r);
2243 }
2244
2245
cftmdl2(picoos_int32 n,PICOFFTSG_FFTTYPE * a)2246 void cftmdl2(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
2247 {
2248 picoos_int32 i, i0, j, j0, j1, j2, j3, m, mh;
2249 PICOFFTSG_FFTTYPE wn4r, wk1r, wk1i, wk3r, wk3i,
2250 wl1r, wl1i, wl3r, wl3i, wd1r, wd1i, wd3r, wd3i,
2251 we1r, we1i, we3r, we3i, ss1, ss3;
2252 PICOFFTSG_FFTTYPE x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i;
2253
2254 mh = n >> 3;
2255 m = 2 * mh;
2256 wn4r = WR5000;
2257 j1 = m;
2258 j2 = j1 + m;
2259 j3 = j2 + m;
2260 x0r = a[0] - a[j2 + 1];
2261 x0i = a[1] + a[j2];
2262 x1r = a[0] + a[j2 + 1];
2263 x1i = a[1] - a[j2];
2264 x2r = a[j1] - a[j3 + 1];
2265 x2i = a[j1 + 1] + a[j3];
2266 x3r = a[j1] + a[j3 + 1];
2267 x3i = a[j1 + 1] - a[j3];
2268 y0r = picofftsg_mult_w_a(wn4r, (x2r - x2i));
2269 y0i = picofftsg_mult_w_a(wn4r, (x2i + x2r));
2270 a[0] = x0r + y0r;
2271 a[1] = x0i + y0i;
2272 a[j1] = x0r - y0r;
2273 a[j1 + 1] = x0i - y0i;
2274 y0r = picofftsg_mult_w_a(wn4r, (x3r - x3i));
2275 y0i = picofftsg_mult_w_a(wn4r, (x3i + x3r));
2276 a[j2] = x1r - y0i;
2277 a[j2 + 1] = x1i + y0r;
2278 a[j3] = x1r + y0i;
2279 a[j3 + 1] = x1i - y0r;
2280 wl1r = PICODSP_WGT_SHIFT;
2281 wl1i = 0;
2282 wl3r = PICODSP_WGT_SHIFT;
2283 wl3i = 0;
2284 we1r = wn4r;
2285 we1i = wn4r;
2286 we3r = -wn4r;
2287 we3i = -wn4r;
2288
2289 wk1r = (PICOFFTSG_FFTTYPE)(0.995184719563 *PICODSP_WGT_SHIFT);
2290 wk1i = (PICOFFTSG_FFTTYPE)(0.098017141223 *PICODSP_WGT_SHIFT);
2291 wd1r = (PICOFFTSG_FFTTYPE)(0.634393274784 *PICODSP_WGT_SHIFT);
2292 wd1i = (PICOFFTSG_FFTTYPE)(0.773010432720 *PICODSP_WGT_SHIFT);
2293 ss1 = (PICOFFTSG_FFTTYPE)(0.196034282446 *PICODSP_WGT_SHIFT);
2294 wk3i = (PICOFFTSG_FFTTYPE)(-0.290284663439 *PICODSP_WGT_SHIFT);
2295 wk3r = (PICOFFTSG_FFTTYPE)(0.956940352917 *PICODSP_WGT_SHIFT);
2296 ss3 = (PICOFFTSG_FFTTYPE)(-0.580569326878 *PICODSP_WGT_SHIFT);
2297 wd3r = (PICOFFTSG_FFTTYPE)(-0.881921231747 *PICODSP_WGT_SHIFT);
2298 wd3i = (PICOFFTSG_FFTTYPE)(-0.471396744251 *PICODSP_WGT_SHIFT);
2299
2300 i = 0;
2301 for (;;) {
2302 i0 = i + 4 * CDFT_LOOP_DIV;
2303 if (i0 > mh - 4) {
2304 i0 = mh - 4;
2305 }
2306 for (j = i + 2; j < i0; j += 4) {
2307 wl1r -= Mult_W_W(ss1, wk1i);
2308 wl1i += Mult_W_W(ss1, wk1r);
2309 wl3r -= Mult_W_W(ss3, wk3i);
2310 wl3i += Mult_W_W(ss3, wk3r);
2311 we1r -= Mult_W_W(ss1, wd1i);
2312 we1i += Mult_W_W(ss1, wd1r);
2313 we3r -= Mult_W_W(ss3, wd3i);
2314 we3i += Mult_W_W(ss3, wd3r);
2315 j1 = j + m;
2316 j2 = j1 + m;
2317 j3 = j2 + m;
2318 x0r = a[j] - a[j2 + 1];
2319 x0i = a[j + 1] + a[j2];
2320 x1r = a[j] + a[j2 + 1];
2321 x1i = a[j + 1] - a[j2];
2322 x2r = a[j1] - a[j3 + 1];
2323 x2i = a[j1 + 1] + a[j3];
2324 x3r = a[j1] + a[j3 + 1];
2325 x3i = a[j1 + 1] - a[j3];
2326 y0r = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
2327 y0i = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
2328 y2r = Mult_W_W(wd1r, x2r) - Mult_W_W(wd1i, x2i);
2329 y2i = Mult_W_W(wd1r, x2i) + Mult_W_W(wd1i, x2r);
2330 a[j] = y0r + y2r;
2331 a[j + 1] = y0i + y2i;
2332 a[j1] = y0r - y2r;
2333 a[j1 + 1] = y0i - y2i;
2334 y0r = Mult_W_W(wk3r, x1r) + Mult_W_W(wk3i, x1i);
2335 y0i = Mult_W_W(wk3r, x1i) - Mult_W_W(wk3i, x1r);
2336 y2r = Mult_W_W(wd3r, x3r) + Mult_W_W(wd3i, x3i);
2337 y2i = Mult_W_W(wd3r, x3i) - Mult_W_W(wd3i, x3r);
2338 a[j2] = y0r + y2r;
2339 a[j2 + 1] = y0i + y2i;
2340 a[j3] = y0r - y2r;
2341 a[j3 + 1] = y0i - y2i;
2342 x0r = a[j + 2] - a[j2 + 3];
2343 x0i = a[j + 3] + a[j2 + 2];
2344 x1r = a[j + 2] + a[j2 + 3];
2345 x1i = a[j + 3] - a[j2 + 2];
2346 x2r = a[j1 + 2] - a[j3 + 3];
2347 x2i = a[j1 + 3] + a[j3 + 2];
2348 x3r = a[j1 + 2] + a[j3 + 3];
2349 x3i = a[j1 + 3] - a[j3 + 2];
2350 y0r = Mult_W_W(wl1r, x0r) - Mult_W_W(wl1i, x0i);
2351 y0i = Mult_W_W(wl1r, x0i) + Mult_W_W(wl1i, x0r);
2352 y2r = Mult_W_W(we1r, x2r) - Mult_W_W(we1i, x2i);
2353 y2i = Mult_W_W(we1r, x2i) + Mult_W_W(we1i, x2r);
2354 a[j + 2] = y0r + y2r;
2355 a[j + 3] = y0i + y2i;
2356 a[j1 + 2] = y0r - y2r;
2357 a[j1 + 3] = y0i - y2i;
2358 y0r = Mult_W_W(wl3r, x1r) + Mult_W_W(wl3i, x1i);
2359 y0i = Mult_W_W(wl3r, x1i) - Mult_W_W(wl3i, x1r);
2360 y2r = Mult_W_W(we3r, x3r) + Mult_W_W(we3i, x3i);
2361 y2i = Mult_W_W(we3r, x3i) - Mult_W_W(we3i, x3r);
2362 a[j2 + 2] = y0r + y2r;
2363 a[j2 + 3] = y0i + y2i;
2364 a[j3 + 2] = y0r - y2r;
2365 a[j3 + 3] = y0i - y2i;
2366 j0 = m - j;
2367 j1 = j0 + m;
2368 j2 = j1 + m;
2369 j3 = j2 + m;
2370 x0r = a[j0] - a[j2 + 1];
2371 x0i = a[j0 + 1] + a[j2];
2372 x1r = a[j0] + a[j2 + 1];
2373 x1i = a[j0 + 1] - a[j2];
2374 x2r = a[j1] - a[j3 + 1];
2375 x2i = a[j1 + 1] + a[j3];
2376 x3r = a[j1] + a[j3 + 1];
2377 x3i = a[j1 + 1] - a[j3];
2378 y0r = Mult_W_W(wd1i, x0r) - Mult_W_W(wd1r, x0i);
2379 y0i = Mult_W_W(wd1i, x0i) + Mult_W_W(wd1r, x0r);
2380 y2r = Mult_W_W(wk1i, x2r) - Mult_W_W(wk1r, x2i);
2381 y2i = Mult_W_W(wk1i, x2i) + Mult_W_W(wk1r, x2r);
2382 a[j0] = y0r + y2r;
2383 a[j0 + 1] = y0i + y2i;
2384 a[j1] = y0r - y2r;
2385 a[j1 + 1] = y0i - y2i;
2386 y0r = Mult_W_W(wd3i, x1r) + Mult_W_W(wd3r, x1i);
2387 y0i = Mult_W_W(wd3i, x1i) - Mult_W_W(wd3r, x1r);
2388 y2r = Mult_W_W(wk3i, x3r) + Mult_W_W(wk3r, x3i);
2389 y2i = Mult_W_W(wk3i, x3i) - Mult_W_W(wk3r, x3r);
2390 a[j2] = y0r + y2r;
2391 a[j2 + 1] = y0i + y2i;
2392 a[j3] = y0r - y2r;
2393 a[j3 + 1] = y0i - y2i;
2394 x0r = a[j0 - 2] - a[j2 - 1];
2395 x0i = a[j0 - 1] + a[j2 - 2];
2396 x1r = a[j0 - 2] + a[j2 - 1];
2397 x1i = a[j0 - 1] - a[j2 - 2];
2398 x2r = a[j1 - 2] - a[j3 - 1];
2399 x2i = a[j1 - 1] + a[j3 - 2];
2400 x3r = a[j1 - 2] + a[j3 - 1];
2401 x3i = a[j1 - 1] - a[j3 - 2];
2402 y0r = Mult_W_W(we1i, x0r) - Mult_W_W(we1r, x0i);
2403 y0i = Mult_W_W(we1i, x0i) + Mult_W_W(we1r, x0r);
2404 y2r = Mult_W_W(wl1i, x2r) - Mult_W_W(wl1r, x2i);
2405 y2i = Mult_W_W(wl1i, x2i) + Mult_W_W(wl1r, x2r);
2406 a[j0 - 2] = y0r + y2r;
2407 a[j0 - 1] = y0i + y2i;
2408 a[j1 - 2] = y0r - y2r;
2409 a[j1 - 1] = y0i - y2i;
2410 y0r = Mult_W_W(we3i, x1r) + Mult_W_W(we3r, x1i);
2411 y0i = Mult_W_W(we3i, x1i) - Mult_W_W(we3r, x1r);
2412 y2r = Mult_W_W(wl3i, x3r) + Mult_W_W(wl3r, x3i);
2413 y2i = Mult_W_W(wl3i, x3i) - Mult_W_W(wl3r, x3r);
2414 a[j2 - 2] = y0r + y2r;
2415 a[j2 - 1] = y0i + y2i;
2416 a[j3 - 2] = y0r - y2r;
2417 a[j3 - 1] = y0i - y2i;
2418 wk1r -= Mult_W_W(ss1, wl1i);
2419 wk1i += Mult_W_W(ss1, wl1r);
2420 wk3r -= Mult_W_W(ss3, wl3i);
2421 wk3i += Mult_W_W(ss3, wl3r);
2422 wd1r -= Mult_W_W(ss1, we1i);
2423 wd1i += Mult_W_W(ss1, we1r);
2424 wd3r -= Mult_W_W(ss3, we3i);
2425 wd3i += Mult_W_W(ss3, we3r);
2426 }
2427 if (i0 == mh - 4) {
2428 break;
2429 }
2430 }
2431 wl1r = WR2500;
2432 wl1i = WI2500;
2433 j0 = mh;
2434 j1 = j0 + m;
2435 j2 = j1 + m;
2436 j3 = j2 + m;
2437 x0r = a[j0 - 2] - a[j2 - 1];
2438 x0i = a[j0 - 1] + a[j2 - 2];
2439 x1r = a[j0 - 2] + a[j2 - 1];
2440 x1i = a[j0 - 1] - a[j2 - 2];
2441 x2r = a[j1 - 2] - a[j3 - 1];
2442 x2i = a[j1 - 1] + a[j3 - 2];
2443 x3r = a[j1 - 2] + a[j3 - 1];
2444 x3i = a[j1 - 1] - a[j3 - 2];
2445 y0r = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
2446 y0i = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
2447 y2r = Mult_W_W(wd1r, x2r) - Mult_W_W(wd1i, x2i);
2448 y2i = Mult_W_W(wd1r, x2i) + Mult_W_W(wd1i, x2r);
2449 a[j0 - 2] = y0r + y2r;
2450 a[j0 - 1] = y0i + y2i;
2451 a[j1 - 2] = y0r - y2r;
2452 a[j1 - 1] = y0i - y2i;
2453 y0r = Mult_W_W(wk3r, x1r) + Mult_W_W(wk3i, x1i);
2454 y0i = Mult_W_W(wk3r, x1i) - Mult_W_W(wk3i, x1r);
2455 y2r = Mult_W_W(wd3r, x3r) + Mult_W_W(wd3i, x3i);
2456 y2i = Mult_W_W(wd3r, x3i) - Mult_W_W(wd3i, x3r);
2457 a[j2 - 2] = y0r + y2r;
2458 a[j2 - 1] = y0i + y2i;
2459 a[j3 - 2] = y0r - y2r;
2460 a[j3 - 1] = y0i - y2i;
2461 x0r = a[j0] - a[j2 + 1];
2462 x0i = a[j0 + 1] + a[j2];
2463 x1r = a[j0] + a[j2 + 1];
2464 x1i = a[j0 + 1] - a[j2];
2465 x2r = a[j1] - a[j3 + 1];
2466 x2i = a[j1 + 1] + a[j3];
2467 x3r = a[j1] + a[j3 + 1];
2468 x3i = a[j1 + 1] - a[j3];
2469 y0r = Mult_W_W(wl1r, x0r) - Mult_W_W(wl1i, x0i);
2470 y0i = Mult_W_W(wl1r, x0i) + Mult_W_W(wl1i, x0r);
2471 y2r = Mult_W_W(wl1i, x2r) - Mult_W_W(wl1r, x2i);
2472 y2i = Mult_W_W(wl1i, x2i) + Mult_W_W(wl1r, x2r);
2473 a[j0] = y0r + y2r;
2474 a[j0 + 1] = y0i + y2i;
2475 a[j1] = y0r - y2r;
2476 a[j1 + 1] = y0i - y2i;
2477 y0r = Mult_W_W(wl1i, x1r) - Mult_W_W(wl1r, x1i);
2478 y0i = Mult_W_W(wl1i, x1i) + Mult_W_W(wl1r, x1r);
2479 y2r = Mult_W_W(wl1r, x3r) - Mult_W_W(wl1i, x3i);
2480 y2i = Mult_W_W(wl1r, x3i) + Mult_W_W(wl1i, x3r);
2481 a[j2] = y0r - y2r;
2482 a[j2 + 1] = y0i - y2i;
2483 a[j3] = y0r + y2r;
2484 a[j3 + 1] = y0i + y2i;
2485 x0r = a[j0 + 2] - a[j2 + 3];
2486 x0i = a[j0 + 3] + a[j2 + 2];
2487 x1r = a[j0 + 2] + a[j2 + 3];
2488 x1i = a[j0 + 3] - a[j2 + 2];
2489 x2r = a[j1 + 2] - a[j3 + 3];
2490 x2i = a[j1 + 3] + a[j3 + 2];
2491 x3r = a[j1 + 2] + a[j3 + 3];
2492 x3i = a[j1 + 3] - a[j3 + 2];
2493 y0r = Mult_W_W(wd1i, x0r) - Mult_W_W(wd1r, x0i);
2494 y0i = Mult_W_W(wd1i, x0i) + Mult_W_W(wd1r, x0r);
2495 y2r = Mult_W_W(wk1i, x2r) - Mult_W_W(wk1r, x2i);
2496 y2i = Mult_W_W(wk1i, x2i) + Mult_W_W(wk1r, x2r);
2497 a[j0 + 2] = y0r + y2r;
2498 a[j0 + 3] = y0i + y2i;
2499 a[j1 + 2] = y0r - y2r;
2500 a[j1 + 3] = y0i - y2i;
2501 y0r = Mult_W_W(wd3i, x1r) + Mult_W_W(wd3r, x1i);
2502 y0i = Mult_W_W(wd3i, x1i) - Mult_W_W(wd3r, x1r);
2503 y2r = Mult_W_W(wk3i, x3r) + Mult_W_W(wk3r, x3i);
2504 y2i = Mult_W_W(wk3i, x3i) - Mult_W_W(wk3r, x3r);
2505 a[j2 + 2] = y0r + y2r;
2506 a[j2 + 3] = y0i + y2i;
2507 a[j3 + 2] = y0r - y2r;
2508 a[j3 + 3] = y0i - y2i;
2509 }
2510
2511
cftfx41(picoos_int32 n,PICOFFTSG_FFTTYPE * a)2512 void cftfx41(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
2513 {
2514
2515 if (n == 128) {
2516 cftf161(a);
2517 cftf162(&a[32]);
2518 cftf161(&a[64]);
2519 cftf161(&a[96]);
2520 } else {
2521 cftf081(a);
2522 cftf082(&a[16]);
2523 cftf081(&a[32]);
2524 cftf081(&a[48]);
2525 }
2526 }
2527
2528
cftf161(PICOFFTSG_FFTTYPE * a)2529 void cftf161(PICOFFTSG_FFTTYPE *a)
2530 {
2531 PICOFFTSG_FFTTYPE wn4r, wk1r, wk1i,
2532 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i,
2533 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i,
2534 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i,
2535 y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i,
2536 y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
2537
2538 wn4r = WR5000;
2539 wk1r = WR2500;
2540 wk1i = WI2500;
2541 x0r = a[0] + a[16];
2542 x0i = a[1] + a[17];
2543 x1r = a[0] - a[16];
2544 x1i = a[1] - a[17];
2545 x2r = a[8] + a[24];
2546 x2i = a[9] + a[25];
2547 x3r = a[8] - a[24];
2548 x3i = a[9] - a[25];
2549 y0r = x0r + x2r;
2550 y0i = x0i + x2i;
2551 y4r = x0r - x2r;
2552 y4i = x0i - x2i;
2553 y8r = x1r - x3i;
2554 y8i = x1i + x3r;
2555 y12r = x1r + x3i;
2556 y12i = x1i - x3r;
2557 x0r = a[2] + a[18];
2558 x0i = a[3] + a[19];
2559 x1r = a[2] - a[18];
2560 x1i = a[3] - a[19];
2561 x2r = a[10] + a[26];
2562 x2i = a[11] + a[27];
2563 x3r = a[10] - a[26];
2564 x3i = a[11] - a[27];
2565 y1r = x0r + x2r;
2566 y1i = x0i + x2i;
2567 y5r = x0r - x2r;
2568 y5i = x0i - x2i;
2569 x0r = x1r - x3i;
2570 x0i = x1i + x3r;
2571 y9r = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
2572 y9i = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
2573 x0r = x1r + x3i;
2574 x0i = x1i - x3r;
2575 y13r = Mult_W_W(wk1i, x0r) - Mult_W_W(wk1r, x0i);
2576 y13i = Mult_W_W(wk1i, x0i) + Mult_W_W(wk1r, x0r);
2577 x0r = a[4] + a[20];
2578 x0i = a[5] + a[21];
2579 x1r = a[4] - a[20];
2580 x1i = a[5] - a[21];
2581 x2r = a[12] + a[28];
2582 x2i = a[13] + a[29];
2583 x3r = a[12] - a[28];
2584 x3i = a[13] - a[29];
2585 y2r = x0r + x2r;
2586 y2i = x0i + x2i;
2587 y6r = x0r - x2r;
2588 y6i = x0i - x2i;
2589 x0r = x1r - x3i;
2590 x0i = x1i + x3r;
2591 y10r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2592 y10i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2593 x0r = x1r + x3i;
2594 x0i = x1i - x3r;
2595 y14r = picofftsg_mult_w_a(wn4r, (x0r + x0i));
2596 y14i = picofftsg_mult_w_a(wn4r, (x0i - x0r));
2597 x0r = a[6] + a[22];
2598 x0i = a[7] + a[23];
2599 x1r = a[6] - a[22];
2600 x1i = a[7] - a[23];
2601 x2r = a[14] + a[30];
2602 x2i = a[15] + a[31];
2603 x3r = a[14] - a[30];
2604 x3i = a[15] - a[31];
2605 y3r = x0r + x2r;
2606 y3i = x0i + x2i;
2607 y7r = x0r - x2r;
2608 y7i = x0i - x2i;
2609 x0r = x1r - x3i;
2610 x0i = x1i + x3r;
2611 y11r = Mult_W_W(wk1i, x0r) - Mult_W_W(wk1r, x0i);
2612 y11i = Mult_W_W(wk1i, x0i) + Mult_W_W(wk1r, x0r);
2613 x0r = x1r + x3i;
2614 x0i = x1i - x3r;
2615 y15r = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
2616 y15i = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
2617 x0r = y12r - y14r;
2618 x0i = y12i - y14i;
2619 x1r = y12r + y14r;
2620 x1i = y12i + y14i;
2621 x2r = y13r - y15r;
2622 x2i = y13i - y15i;
2623 x3r = y13r + y15r;
2624 x3i = y13i + y15i;
2625 a[24] = x0r + x2r;
2626 a[25] = x0i + x2i;
2627 a[26] = x0r - x2r;
2628 a[27] = x0i - x2i;
2629 a[28] = x1r - x3i;
2630 a[29] = x1i + x3r;
2631 a[30] = x1r + x3i;
2632 a[31] = x1i - x3r;
2633 x0r = y8r + y10r;
2634 x0i = y8i + y10i;
2635 x1r = y8r - y10r;
2636 x1i = y8i - y10i;
2637 x2r = y9r + y11r;
2638 x2i = y9i + y11i;
2639 x3r = y9r - y11r;
2640 x3i = y9i - y11i;
2641 a[16] = x0r + x2r;
2642 a[17] = x0i + x2i;
2643 a[18] = x0r - x2r;
2644 a[19] = x0i - x2i;
2645 a[20] = x1r - x3i;
2646 a[21] = x1i + x3r;
2647 a[22] = x1r + x3i;
2648 a[23] = x1i - x3r;
2649 x0r = y5r - y7i;
2650 x0i = y5i + y7r;
2651 x2r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2652 x2i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2653 x0r = y5r + y7i;
2654 x0i = y5i - y7r;
2655 x3r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2656 x3i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2657 x0r = y4r - y6i;
2658 x0i = y4i + y6r;
2659 x1r = y4r + y6i;
2660 x1i = y4i - y6r;
2661 a[8] = x0r + x2r;
2662 a[9] = x0i + x2i;
2663 a[10] = x0r - x2r;
2664 a[11] = x0i - x2i;
2665 a[12] = x1r - x3i;
2666 a[13] = x1i + x3r;
2667 a[14] = x1r + x3i;
2668 a[15] = x1i - x3r;
2669 x0r = y0r + y2r;
2670 x0i = y0i + y2i;
2671 x1r = y0r - y2r;
2672 x1i = y0i - y2i;
2673 x2r = y1r + y3r;
2674 x2i = y1i + y3i;
2675 x3r = y1r - y3r;
2676 x3i = y1i - y3i;
2677 a[0] = x0r + x2r;
2678 a[1] = x0i + x2i;
2679 a[2] = x0r - x2r;
2680 a[3] = x0i - x2i;
2681 a[4] = x1r - x3i;
2682 a[5] = x1i + x3r;
2683 a[6] = x1r + x3i;
2684 a[7] = x1i - x3r;
2685 }
2686
2687
cftf162(PICOFFTSG_FFTTYPE * a)2688 void cftf162(PICOFFTSG_FFTTYPE *a)
2689 {
2690 PICOFFTSG_FFTTYPE wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i,
2691 x0r, x0i, x1r, x1i, x2r, x2i,
2692 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i,
2693 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i,
2694 y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i,
2695 y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
2696
2697 wn4r = WR5000;
2698 wk1r = WR1250;
2699 wk1i = WI1250;
2700 wk2r = WR2500;
2701 wk2i = WI2500;
2702 wk3r = WR3750;
2703 wk3i = WI3750;
2704 x1r = a[0] - a[17];
2705 x1i = a[1] + a[16];
2706 x0r = a[8] - a[25];
2707 x0i = a[9] + a[24];
2708 x2r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2709 x2i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2710 y0r = x1r + x2r;
2711 y0i = x1i + x2i;
2712 y4r = x1r - x2r;
2713 y4i = x1i - x2i;
2714 x1r = a[0] + a[17];
2715 x1i = a[1] - a[16];
2716 x0r = a[8] + a[25];
2717 x0i = a[9] - a[24];
2718 x2r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2719 x2i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2720 y8r = x1r - x2i;
2721 y8i = x1i + x2r;
2722 y12r = x1r + x2i;
2723 y12i = x1i - x2r;
2724 x0r = a[2] - a[19];
2725 x0i = a[3] + a[18];
2726 x1r = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
2727 x1i = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
2728 x0r = a[10] - a[27];
2729 x0i = a[11] + a[26];
2730 x2r = Mult_W_W(wk3i, x0r) - Mult_W_W(wk3r, x0i);
2731 x2i = Mult_W_W(wk3i, x0i) + Mult_W_W(wk3r, x0r);
2732 y1r = x1r + x2r;
2733 y1i = x1i + x2i;
2734 y5r = x1r - x2r;
2735 y5i = x1i - x2i;
2736 x0r = a[2] + a[19];
2737 x0i = a[3] - a[18];
2738 x1r = Mult_W_W(wk3r, x0r) - Mult_W_W(wk3i, x0i);
2739 x1i = Mult_W_W(wk3r, x0i) + Mult_W_W(wk3i, x0r);
2740 x0r = a[10] + a[27];
2741 x0i = a[11] - a[26];
2742 x2r = Mult_W_W(wk1r, x0r) + Mult_W_W(wk1i, x0i);
2743 x2i = Mult_W_W(wk1r, x0i) - Mult_W_W(wk1i, x0r);
2744 y9r = x1r - x2r;
2745 y9i = x1i - x2i;
2746 y13r = x1r + x2r;
2747 y13i = x1i + x2i;
2748 x0r = a[4] - a[21];
2749 x0i = a[5] + a[20];
2750 x1r = Mult_W_W(wk2r, x0r) - Mult_W_W(wk2i, x0i);
2751 x1i = Mult_W_W(wk2r, x0i) + Mult_W_W(wk2i, x0r);
2752 x0r = a[12] - a[29];
2753 x0i = a[13] + a[28];
2754 x2r = Mult_W_W(wk2i, x0r) - Mult_W_W(wk2r, x0i);
2755 x2i = Mult_W_W(wk2i, x0i) + Mult_W_W(wk2r, x0r);
2756 y2r = x1r + x2r;
2757 y2i = x1i + x2i;
2758 y6r = x1r - x2r;
2759 y6i = x1i - x2i;
2760 x0r = a[4] + a[21];
2761 x0i = a[5] - a[20];
2762 x1r = Mult_W_W(wk2i, x0r) - Mult_W_W(wk2r, x0i);
2763 x1i = Mult_W_W(wk2i, x0i) + Mult_W_W(wk2r, x0r);
2764 x0r = a[12] + a[29];
2765 x0i = a[13] - a[28];
2766 x2r = Mult_W_W(wk2r, x0r) - Mult_W_W(wk2i, x0i);
2767 x2i = Mult_W_W(wk2r, x0i) + Mult_W_W(wk2i, x0r);
2768 y10r = x1r - x2r;
2769 y10i = x1i - x2i;
2770 y14r = x1r + x2r;
2771 y14i = x1i + x2i;
2772 x0r = a[6] - a[23];
2773 x0i = a[7] + a[22];
2774 x1r = Mult_W_W(wk3r, x0r) - Mult_W_W(wk3i, x0i);
2775 x1i = Mult_W_W(wk3r, x0i) + Mult_W_W(wk3i, x0r);
2776 x0r = a[14] - a[31];
2777 x0i = a[15] + a[30];
2778 x2r = Mult_W_W(wk1i, x0r) - Mult_W_W(wk1r, x0i);
2779 x2i = Mult_W_W(wk1i, x0i) + Mult_W_W(wk1r, x0r);
2780 y3r = x1r + x2r;
2781 y3i = x1i + x2i;
2782 y7r = x1r - x2r;
2783 y7i = x1i - x2i;
2784 x0r = a[6] + a[23];
2785 x0i = a[7] - a[22];
2786 x1r = Mult_W_W(wk1i, x0r) + Mult_W_W(wk1r, x0i);
2787 x1i = Mult_W_W(wk1i, x0i) - Mult_W_W(wk1r, x0r);
2788 x0r = a[14] + a[31];
2789 x0i = a[15] - a[30];
2790 x2r = Mult_W_W(wk3i, x0r) - Mult_W_W(wk3r, x0i);
2791 x2i = Mult_W_W(wk3i, x0i) + Mult_W_W(wk3r, x0r);
2792 y11r = x1r + x2r;
2793 y11i = x1i + x2i;
2794 y15r = x1r - x2r;
2795 y15i = x1i - x2i;
2796 x1r = y0r + y2r;
2797 x1i = y0i + y2i;
2798 x2r = y1r + y3r;
2799 x2i = y1i + y3i;
2800 a[0] = x1r + x2r;
2801 a[1] = x1i + x2i;
2802 a[2] = x1r - x2r;
2803 a[3] = x1i - x2i;
2804 x1r = y0r - y2r;
2805 x1i = y0i - y2i;
2806 x2r = y1r - y3r;
2807 x2i = y1i - y3i;
2808 a[4] = x1r - x2i;
2809 a[5] = x1i + x2r;
2810 a[6] = x1r + x2i;
2811 a[7] = x1i - x2r;
2812 x1r = y4r - y6i;
2813 x1i = y4i + y6r;
2814 x0r = y5r - y7i;
2815 x0i = y5i + y7r;
2816 x2r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2817 x2i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2818 a[8] = x1r + x2r;
2819 a[9] = x1i + x2i;
2820 a[10] = x1r - x2r;
2821 a[11] = x1i - x2i;
2822 x1r = y4r + y6i;
2823 x1i = y4i - y6r;
2824 x0r = y5r + y7i;
2825 x0i = y5i - y7r;
2826 x2r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2827 x2i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2828 a[12] = x1r - x2i;
2829 a[13] = x1i + x2r;
2830 a[14] = x1r + x2i;
2831 a[15] = x1i - x2r;
2832 x1r = y8r + y10r;
2833 x1i = y8i + y10i;
2834 x2r = y9r - y11r;
2835 x2i = y9i - y11i;
2836 a[16] = x1r + x2r;
2837 a[17] = x1i + x2i;
2838 a[18] = x1r - x2r;
2839 a[19] = x1i - x2i;
2840 x1r = y8r - y10r;
2841 x1i = y8i - y10i;
2842 x2r = y9r + y11r;
2843 x2i = y9i + y11i;
2844 a[20] = x1r - x2i;
2845 a[21] = x1i + x2r;
2846 a[22] = x1r + x2i;
2847 a[23] = x1i - x2r;
2848 x1r = y12r - y14i;
2849 x1i = y12i + y14r;
2850 x0r = y13r + y15i;
2851 x0i = y13i - y15r;
2852 x2r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2853 x2i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2854 a[24] = x1r + x2r;
2855 a[25] = x1i + x2i;
2856 a[26] = x1r - x2r;
2857 a[27] = x1i - x2i;
2858 x1r = y12r + y14i;
2859 x1i = y12i - y14r;
2860 x0r = y13r - y15i;
2861 x0i = y13i + y15r;
2862 x2r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2863 x2i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2864 a[28] = x1r - x2i;
2865 a[29] = x1i + x2r;
2866 a[30] = x1r + x2i;
2867 a[31] = x1i - x2r;
2868 }
2869
2870
cftf081(PICOFFTSG_FFTTYPE * a)2871 void cftf081(PICOFFTSG_FFTTYPE *a)
2872 {
2873 PICOFFTSG_FFTTYPE wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i,
2874 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i,
2875 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
2876
2877 wn4r = WR5000;
2878 x0r = a[0] + a[8];
2879 x0i = a[1] + a[9];
2880 x1r = a[0] - a[8];
2881 x1i = a[1] - a[9];
2882 x2r = a[4] + a[12];
2883 x2i = a[5] + a[13];
2884 x3r = a[4] - a[12];
2885 x3i = a[5] - a[13];
2886 y0r = x0r + x2r;
2887 y0i = x0i + x2i;
2888 y2r = x0r - x2r;
2889 y2i = x0i - x2i;
2890 y1r = x1r - x3i;
2891 y1i = x1i + x3r;
2892 y3r = x1r + x3i;
2893 y3i = x1i - x3r;
2894 x0r = a[2] + a[10];
2895 x0i = a[3] + a[11];
2896 x1r = a[2] - a[10];
2897 x1i = a[3] - a[11];
2898 x2r = a[6] + a[14];
2899 x2i = a[7] + a[15];
2900 x3r = a[6] - a[14];
2901 x3i = a[7] - a[15];
2902 y4r = x0r + x2r;
2903 y4i = x0i + x2i;
2904 y6r = x0r - x2r;
2905 y6i = x0i - x2i;
2906 x0r = x1r - x3i;
2907 x0i = x1i + x3r;
2908 x2r = x1r + x3i;
2909 x2i = x1i - x3r;
2910 y5r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2911 y5i = picofftsg_mult_w_a(wn4r, (x0r + x0i));
2912 y7r = picofftsg_mult_w_a(wn4r, (x2r - x2i));
2913 y7i = picofftsg_mult_w_a(wn4r, (x2r + x2i));
2914 a[8] = y1r + y5r;
2915 a[9] = y1i + y5i;
2916 a[10] = y1r - y5r;
2917 a[11] = y1i - y5i;
2918 a[12] = y3r - y7i;
2919 a[13] = y3i + y7r;
2920 a[14] = y3r + y7i;
2921 a[15] = y3i - y7r;
2922 a[0] = y0r + y4r;
2923 a[1] = y0i + y4i;
2924 a[2] = y0r - y4r;
2925 a[3] = y0i - y4i;
2926 a[4] = y2r - y6i;
2927 a[5] = y2i + y6r;
2928 a[6] = y2r + y6i;
2929 a[7] = y2i - y6r;
2930 }
2931
2932
cftf082(PICOFFTSG_FFTTYPE * a)2933 void cftf082(PICOFFTSG_FFTTYPE *a)
2934 {
2935 PICOFFTSG_FFTTYPE wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i,
2936 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i,
2937 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
2938
2939 wn4r = WR5000;
2940 wk1r = WR2500;
2941 wk1i = WI2500;
2942 y0r = a[0] - a[9];
2943 y0i = a[1] + a[8];
2944 y1r = a[0] + a[9];
2945 y1i = a[1] - a[8];
2946 x0r = a[4] - a[13];
2947 x0i = a[5] + a[12];
2948 y2r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2949 y2i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2950 x0r = a[4] + a[13];
2951 x0i = a[5] - a[12];
2952 y3r = picofftsg_mult_w_a(wn4r, (x0r - x0i));
2953 y3i = picofftsg_mult_w_a(wn4r, (x0i + x0r));
2954 x0r = a[2] - a[11];
2955 x0i = a[3] + a[10];
2956 y4r = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
2957 y4i = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
2958 x0r = a[2] + a[11];
2959 x0i = a[3] - a[10];
2960 y5r = Mult_W_W(wk1i, x0r) - Mult_W_W(wk1r, x0i);
2961 y5i = Mult_W_W(wk1i, x0i) + Mult_W_W(wk1r, x0r);
2962 x0r = a[6] - a[15];
2963 x0i = a[7] + a[14];
2964 y6r = Mult_W_W(wk1i, x0r) - Mult_W_W(wk1r, x0i);
2965 y6i = Mult_W_W(wk1i, x0i) + Mult_W_W(wk1r, x0r);
2966 x0r = a[6] + a[15];
2967 x0i = a[7] - a[14];
2968 y7r = Mult_W_W(wk1r, x0r) - Mult_W_W(wk1i, x0i);
2969 y7i = Mult_W_W(wk1r, x0i) + Mult_W_W(wk1i, x0r);
2970 x0r = y0r + y2r;
2971 x0i = y0i + y2i;
2972 x1r = y4r + y6r;
2973 x1i = y4i + y6i;
2974 a[0] = x0r + x1r;
2975 a[1] = x0i + x1i;
2976 a[2] = x0r - x1r;
2977 a[3] = x0i - x1i;
2978 x0r = y0r - y2r;
2979 x0i = y0i - y2i;
2980 x1r = y4r - y6r;
2981 x1i = y4i - y6i;
2982 a[4] = x0r - x1i;
2983 a[5] = x0i + x1r;
2984 a[6] = x0r + x1i;
2985 a[7] = x0i - x1r;
2986 x0r = y1r - y3i;
2987 x0i = y1i + y3r;
2988 x1r = y5r - y7r;
2989 x1i = y5i - y7i;
2990 a[8] = x0r + x1r;
2991 a[9] = x0i + x1i;
2992 a[10] = x0r - x1r;
2993 a[11] = x0i - x1i;
2994 x0r = y1r + y3i;
2995 x0i = y1i - y3r;
2996 x1r = y5r + y7r;
2997 x1i = y5i + y7i;
2998 a[12] = x0r - x1i;
2999 a[13] = x0i + x1r;
3000 a[14] = x0r + x1i;
3001 a[15] = x0i - x1r;
3002 }
3003
3004
cftf040(PICOFFTSG_FFTTYPE * a)3005 void cftf040(PICOFFTSG_FFTTYPE *a)
3006 {
3007 PICOFFTSG_FFTTYPE x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
3008
3009 x0r = a[0] + a[4];
3010 x0i = a[1] + a[5];
3011 x1r = a[0] - a[4];
3012 x1i = a[1] - a[5];
3013 x2r = a[2] + a[6];
3014 x2i = a[3] + a[7];
3015 x3r = a[2] - a[6];
3016 x3i = a[3] - a[7];
3017 a[0] = x0r + x2r;
3018 a[1] = x0i + x2i;
3019 a[2] = x1r - x3i;
3020 a[3] = x1i + x3r;
3021 a[4] = x0r - x2r;
3022 a[5] = x0i - x2i;
3023 a[6] = x1r + x3i;
3024 a[7] = x1i - x3r;
3025 }
3026
3027
cftb040(PICOFFTSG_FFTTYPE * a)3028 void cftb040(PICOFFTSG_FFTTYPE *a)
3029 {
3030 PICOFFTSG_FFTTYPE x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
3031
3032 x0r = a[0] + a[4];
3033 x0i = a[1] + a[5];
3034 x1r = a[0] - a[4];
3035 x1i = a[1] - a[5];
3036 x2r = a[2] + a[6];
3037 x2i = a[3] + a[7];
3038 x3r = a[2] - a[6];
3039 x3i = a[3] - a[7];
3040 a[0] = x0r + x2r;
3041 a[1] = x0i + x2i;
3042 a[2] = x1r + x3i;
3043 a[3] = x1i - x3r;
3044 a[4] = x0r - x2r;
3045 a[5] = x0i - x2i;
3046 a[6] = x1r - x3i;
3047 a[7] = x1i + x3r;
3048 }
3049
3050
cftx020(PICOFFTSG_FFTTYPE * a)3051 void cftx020(PICOFFTSG_FFTTYPE *a)
3052 {
3053 PICOFFTSG_FFTTYPE x0r, x0i;
3054
3055 x0r = a[0] - a[2];
3056 x0i = a[1] - a[3];
3057 a[0] += a[2];
3058 a[1] += a[3];
3059 a[2] = x0r;
3060 a[3] = x0i;
3061 }
3062
3063
rftfsub(picoos_int32 n,PICOFFTSG_FFTTYPE * a)3064 void rftfsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
3065 {
3066 picoos_int32 i, i0, j, k;
3067 PICOFFTSG_FFTTYPE w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi;
3068
3069 wkr = 0;
3070 wki = 0;
3071
3072 switch (n) {
3073 case 8 :
3074 wdi=(PICOFFTSG_FFTTYPE)(0.353553414345*PICODSP_WGT_SHIFT); wdr=(PICOFFTSG_FFTTYPE)(0.146446630359*PICODSP_WGT_SHIFT);
3075 w1r=(PICOFFTSG_FFTTYPE)(0.707106709480*PICODSP_WGT_SHIFT); w1i=(PICOFFTSG_FFTTYPE)(0.707106828690*PICODSP_WGT_SHIFT);
3076 ss =(PICOFFTSG_FFTTYPE)(1.414213657379*PICODSP_WGT_SHIFT); break;
3077 case 16 :
3078 wdi=(PICOFFTSG_FFTTYPE)(0.191341713071*PICODSP_WGT_SHIFT); wdr=(PICOFFTSG_FFTTYPE)(0.038060232997*PICODSP_WGT_SHIFT);
3079 w1r=(PICOFFTSG_FFTTYPE)(0.923879504204*PICODSP_WGT_SHIFT); w1i=(PICOFFTSG_FFTTYPE)(0.382683426142*PICODSP_WGT_SHIFT);
3080 ss =(PICOFFTSG_FFTTYPE)(0.765366852283*PICODSP_WGT_SHIFT); break;
3081 case 32 :
3082 wdi=(PICOFFTSG_FFTTYPE)(0.097545161843*PICODSP_WGT_SHIFT); wdr=(PICOFFTSG_FFTTYPE)(0.009607359767*PICODSP_WGT_SHIFT);
3083 w1r=(PICOFFTSG_FFTTYPE)(0.980785250664*PICODSP_WGT_SHIFT); w1i=(PICOFFTSG_FFTTYPE)(0.195090323687*PICODSP_WGT_SHIFT);
3084 ss =(PICOFFTSG_FFTTYPE)(0.390180647373*PICODSP_WGT_SHIFT); break;
3085 case 64 :
3086 wdi=(PICOFFTSG_FFTTYPE)(0.049008570611*PICODSP_WGT_SHIFT); wdr=(PICOFFTSG_FFTTYPE)(0.002407636726*PICODSP_WGT_SHIFT);
3087 w1r=(PICOFFTSG_FFTTYPE)(0.995184719563*PICODSP_WGT_SHIFT); w1i=(PICOFFTSG_FFTTYPE)(0.098017141223*PICODSP_WGT_SHIFT);
3088 ss =(PICOFFTSG_FFTTYPE)(0.196034282446*PICODSP_WGT_SHIFT); break;
3089 default :
3090 wdr = 0; wdi = 0; ss = 0;
3091 break;
3092 }
3093
3094 i = n >> 1;
3095 for (;;) {
3096 i0 = i - RDFT_LOOP_DIV_4;
3097 if (i0 < 4) {
3098 i0 = 4;
3099 }
3100 for (j = i - 4; j >= i0; j -= 4) {
3101 k = n - j;
3102 xr = a[j + 2] - a[k - 2];
3103 xi = a[j + 3] + a[k - 1];
3104 yr = Mult_W_W(wdr, xr) - Mult_W_W(wdi, xi);
3105 yi = Mult_W_W(wdr, xi) + Mult_W_W(wdi, xr);
3106 a[j + 2] -= yr;
3107 a[j + 3] -= yi;
3108 a[k - 2] += yr;
3109 a[k - 1] -= yi;
3110 wkr += Mult_W_W(ss, wdi);
3111 wki += picofftsg_mult_w_w(ss, (PICOFFTSG_WGT_SHIFT2 - wdr));
3112 xr = a[j] - a[k];
3113 xi = a[j + 1] + a[k + 1];
3114 yr = Mult_W_W(wkr, xr) - Mult_W_W(wki, xi);
3115 yi = Mult_W_W(wkr, xi) + Mult_W_W(wki, xr);
3116 a[j] -= yr;
3117 a[j + 1] -= yi;
3118 a[k] += yr;
3119 a[k + 1] -= yi;
3120 wdr += Mult_W_W(ss, wki);
3121 wdi += picofftsg_mult_w_w(ss, (PICOFFTSG_WGT_SHIFT2 - wkr));
3122 }
3123 if (i0 == 4) {
3124 break;
3125 }
3126 }
3127
3128 xr = a[2] - a[n - 2];
3129 xi = a[3] + a[n - 1];
3130 yr = Mult_W_W(wdr, xr) - Mult_W_W(wdi, xi);
3131 yi = Mult_W_W(wdr, xi) + Mult_W_W(wdi, xr);
3132
3133 a[2] -= yr;
3134 a[3] -= yi;
3135 a[n - 2] += yr;
3136 a[n - 1] -= yi;
3137
3138
3139 }
3140
3141
rftbsub(picoos_int32 n,PICOFFTSG_FFTTYPE * a)3142 void rftbsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
3143 {
3144 picoos_int32 i, i0, j, k;
3145 PICOFFTSG_FFTTYPE w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi;
3146 wkr = 0;
3147 wki = 0;
3148 wdi=(PICOFFTSG_FFTTYPE)(0.012270614505*PICODSP_WGT_SHIFT);
3149 wdr=(PICOFFTSG_FFTTYPE)(0.000150590655*PICODSP_WGT_SHIFT);
3150 w1r=(PICOFFTSG_FFTTYPE)(0.999698817730*PICODSP_WGT_SHIFT);
3151 w1i=(PICOFFTSG_FFTTYPE)(0.024541229010*PICODSP_WGT_SHIFT);
3152 ss=(PICOFFTSG_FFTTYPE)(0.049082458019*PICODSP_WGT_SHIFT);
3153
3154 i = n >> 1;
3155 for (;;) {
3156 i0 = i - RDFT_LOOP_DIV4;
3157 if (i0 < 4) {
3158 i0 = 4;
3159 }
3160 for (j = i - 4; j >= i0; j -= 4) {
3161 k = n - j;
3162 xr = a[j + 2] - a[k - 2];
3163 xi = a[j + 3] + a[k - 1];
3164 yr = Mult_W_W(wdr, xr) + Mult_W_W(wdi, xi);
3165 yi = Mult_W_W(wdr, xi) - Mult_W_W(wdi, xr);
3166 a[j + 2] -= yr;
3167 a[j + 3] -= yi;
3168 a[k - 2] += yr;
3169 a[k - 1] -= yi;
3170 wkr += Mult_W_W(ss, wdi);
3171 wki += picofftsg_mult_w_w(ss, (PICOFFTSG_WGT_SHIFT2 - wdr));
3172 xr = a[j] - a[k];
3173 xi = a[j + 1] + a[k + 1];
3174 yr = Mult_W_W(wkr, xr) + Mult_W_W(wki, xi);
3175 yi = Mult_W_W(wkr, xi) - Mult_W_W(wki, xr);
3176 a[j] -= yr;
3177 a[j + 1] -= yi;
3178 a[k] += yr;
3179 a[k + 1] -= yi;
3180 wdr += Mult_W_W(ss, wki);
3181 wdi += picofftsg_mult_w_w(ss, (PICOFFTSG_WGT_SHIFT2 - wkr));
3182 }
3183 if (i0 == 4) {
3184 break;
3185 }
3186 }
3187 xr = a[2] - a[n - 2];
3188 xi = a[3] + a[n - 1];
3189 yr = Mult_W_W(wdr, xr) + Mult_W_W(wdi, xi);
3190 yi = Mult_W_W(wdr, xi) - Mult_W_W(wdi, xr);
3191 a[2] -= yr;
3192 a[3] -= yi;
3193 a[n - 2] += yr;
3194 a[n - 1] -= yi;
3195 }
3196
3197
dctsub(picoos_int32 n,PICOFFTSG_FFTTYPE * a)3198 void dctsub(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
3199 {
3200 picoos_int32 i, i0, j, k, m;
3201 PICOFFTSG_FFTTYPE w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi;
3202 wkr = (PICOFFTSG_FFTTYPE)(0.5*PICODSP_WGT_SHIFT);
3203 wki = (PICOFFTSG_FFTTYPE)(0.5*PICODSP_WGT_SHIFT);
3204
3205 switch (n) {
3206 case 8 : wdi=(PICOFFTSG_FFTTYPE)(0.587937772274*PICODSP_WGT_SHIFT);
3207 wdr=(PICOFFTSG_FFTTYPE)(0.392847478390*PICODSP_WGT_SHIFT); w1r=(PICOFFTSG_FFTTYPE)(0.980785250664*PICODSP_WGT_SHIFT);
3208 w1i=(PICOFFTSG_FFTTYPE)(0.195090323687*PICODSP_WGT_SHIFT); ss =(PICOFFTSG_FFTTYPE)(0.390180647373*PICODSP_WGT_SHIFT); break;
3209 case 16 : wdi=(PICOFFTSG_FFTTYPE)(0.546600937843*PICODSP_WGT_SHIFT);
3210 wdr=(PICOFFTSG_FFTTYPE)(0.448583781719*PICODSP_WGT_SHIFT); w1r=(PICOFFTSG_FFTTYPE)(0.995184719563*PICODSP_WGT_SHIFT);
3211 w1i=(PICOFFTSG_FFTTYPE)(0.098017141223*PICODSP_WGT_SHIFT); ss =(PICOFFTSG_FFTTYPE)(0.196034282446*PICODSP_WGT_SHIFT); break;
3212 case 32 : wdi=(PICOFFTSG_FFTTYPE)(0.523931562901*PICODSP_WGT_SHIFT);
3213 wdr=(PICOFFTSG_FFTTYPE)(0.474863886833*PICODSP_WGT_SHIFT); w1r=(PICOFFTSG_FFTTYPE)(0.998795449734*PICODSP_WGT_SHIFT);
3214 w1i=(PICOFFTSG_FFTTYPE)(0.049067676067*PICODSP_WGT_SHIFT); ss =(PICOFFTSG_FFTTYPE)(0.098135352135*PICODSP_WGT_SHIFT); break;
3215 case 64 : wdi=(PICOFFTSG_FFTTYPE)(0.512120008469*PICODSP_WGT_SHIFT);
3216 wdr=(PICOFFTSG_FFTTYPE)(0.487578809261*PICODSP_WGT_SHIFT); w1r=(PICOFFTSG_FFTTYPE)(0.999698817730*PICODSP_WGT_SHIFT);
3217 w1i=(PICOFFTSG_FFTTYPE)(0.024541229010*PICODSP_WGT_SHIFT); ss =(PICOFFTSG_FFTTYPE)(0.049082458019*PICODSP_WGT_SHIFT); break;
3218 default:
3219 wdr = 0; wdi = 0; ss = 0; break;
3220 }
3221
3222 m = n >> 1;
3223 i = 0;
3224 for (;;) {
3225 i0 = i + DCST_LOOP_DIV2;
3226 if (i0 > m - 2) {
3227 i0 = m - 2;
3228 }
3229 for (j = i + 2; j <= i0; j += 2) {
3230 k = n - j;
3231 xr = picofftsg_mult_w_a(wdi, a[j - 1]) - picofftsg_mult_w_a(wdr, a[k + 1]);
3232 xi = picofftsg_mult_w_a(wdr, a[j - 1]) + picofftsg_mult_w_a(wdi, a[k + 1]);
3233 wkr -= Mult_W_W(ss, wdi);
3234 wki += Mult_W_W(ss, wdr);
3235 yr = Mult_W_W(wki, a[j]) - Mult_W_W(wkr, a[k]);
3236 yi = Mult_W_W(wkr, a[j]) + Mult_W_W(wki, a[k]);
3237 wdr -= Mult_W_W(ss, wki);
3238 wdi += Mult_W_W(ss, wkr);
3239 a[k + 1] = xr;
3240 a[k] = yr;
3241 a[j - 1] = xi;
3242 a[j] = yi;
3243 }
3244 if (i0 == m - 2) {
3245 break;
3246 }
3247 }
3248 xr = picofftsg_mult_w_a(wdi, a[m - 1]) - picofftsg_mult_w_a(wdr, a[m + 1]);
3249 a[m - 1] = picofftsg_mult_w_a(wdr, a[m - 1]) + picofftsg_mult_w_a(wdi, a[m + 1]);
3250 a[m + 1] = xr;
3251 a[m] = Mult_W_W(WR5000, a[m]);
3252 }
3253
3254
dctsub4(picoos_int32 n,PICOFFTSG_FFTTYPE * a)3255 void dctsub4(picoos_int32 n, PICOFFTSG_FFTTYPE *a)
3256 {
3257 picoos_int32 m;
3258 PICOFFTSG_FFTTYPE wki, wdr, wdi, xr;
3259
3260 wki = WR5000;
3261 m = n >> 1;
3262 if (m == 2) {
3263 wdr = Mult_W_W(wki, WI2500);
3264 wdi = Mult_W_W(wki, WR2500);
3265 xr = Mult_W_W(wdi, a[1]) - Mult_W_W(wdr, a[3]);
3266 a[1] = Mult_W_W(wdr, a[1]) + Mult_W_W(wdi, a[3]);
3267 a[3] = xr;
3268 }
3269 a[m] = Mult_W_W(wki, a[m]);
3270 }
3271
3272 #ifdef __cplusplus
3273 }
3274 #endif
3275