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