1 /* Copyright Takuya OOURA, 1996-2001.
3 You may use, copy, modify and distribute this code for any
4 purpose (include commercial use) and without fee. Please
5 refer to this package when you modify this code.
7 Package home: http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
9 Fast Fourier/Cosine/Sine Transform
11 data length :power of 2
17 cdft: Complex Discrete Fourier Transform
18 rdft: Real Discrete Fourier Transform
19 ddct: Discrete Cosine Transform
20 ddst: Discrete Sine Transform
21 dfct: Cosine Transform of RDFT (Real Symmetric DFT)
22 dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)
24 void cdft(int, int, double *, int *, double *);
25 void rdft(int, int, double *, int *, double *);
26 void ddct(int, int, double *, int *, double *);
27 void ddst(int, int, double *, int *, double *);
28 void dfct(int, double *, double *, int *, double *);
29 void dfst(int, double *, double *, int *, double *);
32 -------- Complex DFT (Discrete Fourier Transform) --------
35 X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n
37 X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n
38 (notes: sum_j=0^n-1 is a summation from j=0 to n-1)
41 ip[0] = 0; // first time only
42 cdft(2*n, 1, a, ip, w);
44 ip[0] = 0; // first time only
45 cdft(2*n, -1, a, ip, w);
47 2*n :data length (int)
48 n >= 1, n = power of 2
49 a[0...2*n-1] :input/output data (double *)
52 a[2*j+1] = Im(x[j]), 0<=j<n
55 a[2*k+1] = Im(X[k]), 0<=k<n
56 ip[0...*] :work area for bit reversal (int *)
57 length of ip >= 2+sqrt(n)
60 2+(1<<(int)(log(n+0.5)/log(2))/2).
61 ip[0],ip[1] are pointers of the cos/sin table.
62 w[0...n/2-1] :cos/sin table (double *)
63 w[],ip[] are initialized if ip[0] == 0.
66 cdft(2*n, -1, a, ip, w);
68 cdft(2*n, 1, a, ip, w);
69 for (j = 0; j <= 2 * n - 1; j++) {
75 -------- Real DFT / Inverse of Real DFT --------
78 R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2
79 I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2
80 <case2> IRDFT (excluding scale)
81 a[k] = (R[0] + R[n/2]*cos(pi*k))/2 +
82 sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) +
83 sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n
86 ip[0] = 0; // first time only
89 ip[0] = 0; // first time only
90 rdft(n, -1, a, ip, w);
93 n >= 2, n = power of 2
94 a[0...n-1] :input/output data (double *)
97 a[2*k] = R[k], 0<=k<n/2
98 a[2*k+1] = I[k], 0<k<n/2
102 a[2*j] = R[j], 0<=j<n/2
103 a[2*j+1] = I[j], 0<j<n/2
105 ip[0...*] :work area for bit reversal (int *)
106 length of ip >= 2+sqrt(n/2)
109 2+(1<<(int)(log(n/2+0.5)/log(2))/2).
110 ip[0],ip[1] are pointers of the cos/sin table.
111 w[0...n/2-1] :cos/sin table (double *)
112 w[],ip[] are initialized if ip[0] == 0.
115 rdft(n, 1, a, ip, w);
117 rdft(n, -1, a, ip, w);
118 for (j = 0; j <= n - 1; j++) {
124 -------- DCT (Discrete Cosine Transform) / Inverse of DCT --------
126 <case1> IDCT (excluding scale)
127 C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n
129 C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n
132 ip[0] = 0; // first time only
133 ddct(n, 1, a, ip, w);
135 ip[0] = 0; // first time only
136 ddct(n, -1, a, ip, w);
139 n >= 2, n = power of 2
140 a[0...n-1] :input/output data (double *)
143 ip[0...*] :work area for bit reversal (int *)
144 length of ip >= 2+sqrt(n/2)
147 2+(1<<(int)(log(n/2+0.5)/log(2))/2).
148 ip[0],ip[1] are pointers of the cos/sin table.
149 w[0...n*5/4-1] :cos/sin table (double *)
150 w[],ip[] are initialized if ip[0] == 0.
153 ddct(n, -1, a, ip, w);
156 ddct(n, 1, a, ip, w);
157 for (j = 0; j <= n - 1; j++) {
163 -------- DST (Discrete Sine Transform) / Inverse of DST --------
165 <case1> IDST (excluding scale)
166 S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n
168 S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n
171 ip[0] = 0; // first time only
172 ddst(n, 1, a, ip, w);
174 ip[0] = 0; // first time only
175 ddst(n, -1, a, ip, w);
178 n >= 2, n = power of 2
179 a[0...n-1] :input/output data (double *)
190 ip[0...*] :work area for bit reversal (int *)
191 length of ip >= 2+sqrt(n/2)
194 2+(1<<(int)(log(n/2+0.5)/log(2))/2).
195 ip[0],ip[1] are pointers of the cos/sin table.
196 w[0...n*5/4-1] :cos/sin table (double *)
197 w[],ip[] are initialized if ip[0] == 0.
200 ddst(n, -1, a, ip, w);
203 ddst(n, 1, a, ip, w);
204 for (j = 0; j <= n - 1; j++) {
210 -------- Cosine Transform of RDFT (Real Symmetric DFT) --------
212 C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n
214 ip[0] = 0; // first time only
215 dfct(n, a, t, ip, w);
217 n :data length - 1 (int)
218 n >= 2, n = power of 2
219 a[0...n] :input/output data (double *)
222 t[0...n/2] :work area (double *)
223 ip[0...*] :work area for bit reversal (int *)
224 length of ip >= 2+sqrt(n/4)
227 2+(1<<(int)(log(n/4+0.5)/log(2))/2).
228 ip[0],ip[1] are pointers of the cos/sin table.
229 w[0...n*5/8-1] :cos/sin table (double *)
230 w[],ip[] are initialized if ip[0] == 0.
235 dfct(n, a, t, ip, w);
239 dfct(n, a, t, ip, w);
240 for (j = 0; j <= n; j++) {
246 -------- Sine Transform of RDFT (Real Anti-symmetric DFT) --------
248 S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n
250 ip[0] = 0; // first time only
251 dfst(n, a, t, ip, w);
253 n :data length + 1 (int)
254 n >= 2, n = power of 2
255 a[0...n-1] :input/output data (double *)
258 (a[0] is used for work area)
259 t[0...n/2-1] :work area (double *)
260 ip[0...*] :work area for bit reversal (int *)
261 length of ip >= 2+sqrt(n/4)
264 2+(1<<(int)(log(n/4+0.5)/log(2))/2).
265 ip[0],ip[1] are pointers of the cos/sin table.
266 w[0...n*5/8-1] :cos/sin table (double *)
267 w[],ip[] are initialized if ip[0] == 0.
270 dfst(n, a, t, ip, w);
272 dfst(n, a, t, ip, w);
273 for (j = 1; j <= n - 1; j++) {
280 The cos/sin table is recalculated when the larger table required.
281 w[] and ip[] are compatible with all routines.
294 #define cdft lsx_cdft_f
295 #define rdft lsx_rdft_f
296 #define ddct lsx_ddct_f
297 #define ddst lsx_ddst_f
298 #define dfct lsx_dfct_f
299 #define dfst lsx_dfst_f
301 #define cdft lsx_cdft
302 #define rdft lsx_rdft
303 #define ddct lsx_ddct
304 #define ddst lsx_ddst
305 #define dfct lsx_dfct
306 #define dfst lsx_dfst
309 static void bitrv2conj(int n
, int *ip
, double *a
);
310 static void bitrv2(int n
, int *ip
, double *a
);
311 static void cft1st(int n
, double *a
, double const *w
);
312 static void cftbsub(int n
, double *a
, double const *w
);
313 static void cftfsub(int n
, double *a
, double const *w
);
314 static void cftmdl(int n
, int l
, double *a
, double const *w
);
315 static void dctsub(int n
, double *a
, int nc
, double const *c
);
316 static void dstsub(int n
, double *a
, int nc
, double const *c
);
317 static void makect(int nc
, int *ip
, double *c
);
318 static void makewt(int nw
, int *ip
, double *w
);
319 static void rftbsub(int n
, double *a
, int nc
, double const *c
);
320 static void rftfsub(int n
, double *a
, int nc
, double const *c
);
323 void cdft(int n
, int isgn
, double *a
, int *ip
, double *w
)
325 if (n
> (ip
[0] << 2)) {
326 makewt(n
>> 2, ip
, w
);
330 bitrv2(n
, ip
+ 2, a
);
333 bitrv2conj(n
, ip
+ 2, a
);
342 void rdft(int n
, int isgn
, double *a
, int *ip
, double *w
)
355 makect(nc
, ip
, w
+ nw
);
359 bitrv2(n
, ip
+ 2, a
);
361 rftfsub(n
, a
, nc
, w
+ nw
);
369 a
[1] = 0.5 * (a
[0] - a
[1]);
372 rftbsub(n
, a
, nc
, w
+ nw
);
373 bitrv2(n
, ip
+ 2, a
);
382 void ddct(int n
, int isgn
, double *a
, int *ip
, double *w
)
395 makect(nc
, ip
, w
+ nw
);
399 for (j
= n
- 2; j
>= 2; j
-= 2) {
400 a
[j
+ 1] = a
[j
] - a
[j
- 1];
406 rftbsub(n
, a
, nc
, w
+ nw
);
407 bitrv2(n
, ip
+ 2, a
);
413 dctsub(n
, a
, nc
, w
+ nw
);
416 bitrv2(n
, ip
+ 2, a
);
418 rftfsub(n
, a
, nc
, w
+ nw
);
424 for (j
= 2; j
< n
; j
+= 2) {
425 a
[j
- 1] = a
[j
] - a
[j
+ 1];
433 void ddst(int n
, int isgn
, double *a
, int *ip
, double *w
)
446 makect(nc
, ip
, w
+ nw
);
450 for (j
= n
- 2; j
>= 2; j
-= 2) {
451 a
[j
+ 1] = -a
[j
] - a
[j
- 1];
457 rftbsub(n
, a
, nc
, w
+ nw
);
458 bitrv2(n
, ip
+ 2, a
);
464 dstsub(n
, a
, nc
, w
+ nw
);
467 bitrv2(n
, ip
+ 2, a
);
469 rftfsub(n
, a
, nc
, w
+ nw
);
475 for (j
= 2; j
< n
; j
+= 2) {
476 a
[j
- 1] = -a
[j
] - a
[j
+ 1];
484 void dfct(int n
, double *a
, double *t
, int *ip
, double *w
)
486 int j
, k
, l
, m
, mh
, nw
, nc
;
487 double xr
, xi
, yr
, yi
;
497 makect(nc
, ip
, w
+ nw
);
507 for (j
= 1; j
< mh
; j
++) {
509 xr
= a
[j
] - a
[n
- j
];
510 xi
= a
[j
] + a
[n
- j
];
511 yr
= a
[k
] - a
[n
- k
];
512 yi
= a
[k
] + a
[n
- k
];
518 t
[mh
] = a
[mh
] + a
[n
- mh
];
520 dctsub(m
, a
, nc
, w
+ nw
);
522 bitrv2(m
, ip
+ 2, a
);
524 rftfsub(m
, a
, nc
, w
+ nw
);
528 a
[n
- 1] = a
[0] - a
[1];
530 for (j
= m
- 2; j
>= 2; j
-= 2) {
531 a
[2 * j
+ 1] = a
[j
] + a
[j
+ 1];
532 a
[2 * j
- 1] = a
[j
] - a
[j
+ 1];
537 dctsub(m
, t
, nc
, w
+ nw
);
539 bitrv2(m
, ip
+ 2, t
);
541 rftfsub(m
, t
, nc
, w
+ nw
);
545 a
[n
- l
] = t
[0] - t
[1];
548 for (j
= 2; j
< m
; j
+= 2) {
550 a
[k
- l
] = t
[j
] - t
[j
+ 1];
551 a
[k
+ l
] = t
[j
] + t
[j
+ 1];
555 for (j
= 0; j
< mh
; j
++) {
557 t
[j
] = t
[m
+ k
] - t
[m
+ j
];
558 t
[k
] = t
[m
+ k
] + t
[m
+ j
];
574 void dfst(int n
, double *a
, double *t
, int *ip
, double *w
)
576 int j
, k
, l
, m
, mh
, nw
, nc
;
577 double xr
, xi
, yr
, yi
;
587 makect(nc
, ip
, w
+ nw
);
592 for (j
= 1; j
< mh
; j
++) {
594 xr
= a
[j
] + a
[n
- j
];
595 xi
= a
[j
] - a
[n
- j
];
596 yr
= a
[k
] + a
[n
- k
];
597 yi
= a
[k
] - a
[n
- k
];
603 t
[0] = a
[mh
] - a
[n
- mh
];
606 dstsub(m
, a
, nc
, w
+ nw
);
608 bitrv2(m
, ip
+ 2, a
);
610 rftfsub(m
, a
, nc
, w
+ nw
);
614 a
[n
- 1] = a
[1] - a
[0];
616 for (j
= m
- 2; j
>= 2; j
-= 2) {
617 a
[2 * j
+ 1] = a
[j
] - a
[j
+ 1];
618 a
[2 * j
- 1] = -a
[j
] - a
[j
+ 1];
623 dstsub(m
, t
, nc
, w
+ nw
);
625 bitrv2(m
, ip
+ 2, t
);
627 rftfsub(m
, t
, nc
, w
+ nw
);
631 a
[n
- l
] = t
[1] - t
[0];
634 for (j
= 2; j
< m
; j
+= 2) {
636 a
[k
- l
] = -t
[j
] - t
[j
+ 1];
637 a
[k
+ l
] = t
[j
] - t
[j
+ 1];
641 for (j
= 1; j
< mh
; j
++) {
643 t
[j
] = t
[m
+ k
] + t
[m
+ j
];
644 t
[k
] = t
[m
+ k
] - t
[m
+ j
];
655 /* -------- initializing routines -------- */
658 static void makewt(int nw
, int *ip
, double *w
)
667 delta
= atan(1.0) / nwh
;
670 w
[nwh
] = cos(delta
* nwh
);
673 for (j
= 2; j
< nwh
; j
+= 2) {
681 bitrv2(nw
, ip
+ 2, w
);
687 static void makect(int nc
, int *ip
, double *c
)
695 delta
= atan(1.0) / nch
;
696 c
[0] = cos(delta
* nch
);
698 for (j
= 1; j
< nch
; j
++) {
699 c
[j
] = 0.5 * cos(delta
* j
);
700 c
[nc
- j
] = 0.5 * sin(delta
* j
);
706 /* -------- child routines -------- */
709 static void bitrv2(int n
, int *ip0
, double *a
)
711 int j
, j1
, k
, k1
, l
, m
, m2
, ip
[256];
712 double xr
, xi
, yr
, yi
;
718 while ((m
<< 3) < l
) {
720 for (j
= 0; j
< m
; j
++) {
721 ip
[m
+ j
] = ip
[j
] + l
;
727 for (k
= 0; k
< m
; k
++) {
728 for (j
= 0; j
< k
; j
++) {
770 j1
= 2 * k
+ m2
+ ip
[k
];
782 for (k
= 1; k
< m
; k
++) {
783 for (j
= 0; j
< k
; j
++) {
810 static void bitrv2conj(int n
, int *ip0
, double *a
)
812 int j
, j1
, k
, k1
, l
, m
, m2
, ip
[256];
813 double xr
, xi
, yr
, yi
;
819 while ((m
<< 3) < l
) {
821 for (j
= 0; j
< m
; j
++) {
822 ip
[m
+ j
] = ip
[j
] + l
;
828 for (k
= 0; k
< m
; k
++) {
829 for (j
= 0; j
< k
; j
++) {
872 a
[k1
+ 1] = -a
[k1
+ 1];
884 a
[k1
+ 1] = -a
[k1
+ 1];
888 a
[m2
+ 1] = -a
[m2
+ 1];
889 for (k
= 1; k
< m
; k
++) {
890 for (j
= 0; j
< k
; j
++) {
913 a
[k1
+ 1] = -a
[k1
+ 1];
914 a
[k1
+ m2
+ 1] = -a
[k1
+ m2
+ 1];
920 static void cftfsub(int n
, double *a
, double const *w
)
922 int j
, j1
, j2
, j3
, l
;
923 double x0r
, x0i
, x1r
, x1i
, x2r
, x2i
, x3r
, x3i
;
929 while ((l
<< 2) < n
) {
935 for (j
= 0; j
< l
; j
+= 2) {
940 x0i
= a
[j
+ 1] + a
[j1
+ 1];
942 x1i
= a
[j
+ 1] - a
[j1
+ 1];
944 x2i
= a
[j2
+ 1] + a
[j3
+ 1];
946 x3i
= a
[j2
+ 1] - a
[j3
+ 1];
948 a
[j
+ 1] = x0i
+ x2i
;
950 a
[j2
+ 1] = x0i
- x2i
;
952 a
[j1
+ 1] = x1i
+ x3r
;
954 a
[j3
+ 1] = x1i
- x3r
;
957 for (j
= 0; j
< l
; j
+= 2) {
960 x0i
= a
[j
+ 1] - a
[j1
+ 1];
962 a
[j
+ 1] += a
[j1
+ 1];
970 static void cftbsub(int n
, double *a
, double const *w
)
972 int j
, j1
, j2
, j3
, l
;
973 double x0r
, x0i
, x1r
, x1i
, x2r
, x2i
, x3r
, x3i
;
979 while ((l
<< 2) < n
) {
985 for (j
= 0; j
< l
; j
+= 2) {
990 x0i
= -a
[j
+ 1] - a
[j1
+ 1];
992 x1i
= -a
[j
+ 1] + a
[j1
+ 1];
994 x2i
= a
[j2
+ 1] + a
[j3
+ 1];
996 x3i
= a
[j2
+ 1] - a
[j3
+ 1];
998 a
[j
+ 1] = x0i
- x2i
;
1000 a
[j2
+ 1] = x0i
+ x2i
;
1002 a
[j1
+ 1] = x1i
- x3r
;
1004 a
[j3
+ 1] = x1i
+ x3r
;
1007 for (j
= 0; j
< l
; j
+= 2) {
1010 x0i
= -a
[j
+ 1] + a
[j1
+ 1];
1012 a
[j
+ 1] = -a
[j
+ 1] - a
[j1
+ 1];
1020 static void cft1st(int n
, double *a
, double const *w
)
1023 double wk1r
, wk1i
, wk2r
, wk2i
, wk3r
, wk3i
;
1024 double x0r
, x0i
, x1r
, x1i
, x2r
, x2i
, x3r
, x3i
;
1047 x2r
= a
[12] + a
[14];
1048 x2i
= a
[13] + a
[15];
1049 x3r
= a
[12] - a
[14];
1050 x3i
= a
[13] - a
[15];
1057 a
[10] = wk1r
* (x0r
- x0i
);
1058 a
[11] = wk1r
* (x0r
+ x0i
);
1061 a
[14] = wk1r
* (x0i
- x0r
);
1062 a
[15] = wk1r
* (x0i
+ x0r
);
1064 for (j
= 16; j
< n
; j
+= 16) {
1071 wk3r
= wk1r
- 2 * wk2i
* wk1i
;
1072 wk3i
= 2 * wk2i
* wk1r
- wk1i
;
1073 x0r
= a
[j
] + a
[j
+ 2];
1074 x0i
= a
[j
+ 1] + a
[j
+ 3];
1075 x1r
= a
[j
] - a
[j
+ 2];
1076 x1i
= a
[j
+ 1] - a
[j
+ 3];
1077 x2r
= a
[j
+ 4] + a
[j
+ 6];
1078 x2i
= a
[j
+ 5] + a
[j
+ 7];
1079 x3r
= a
[j
+ 4] - a
[j
+ 6];
1080 x3i
= a
[j
+ 5] - a
[j
+ 7];
1082 a
[j
+ 1] = x0i
+ x2i
;
1085 a
[j
+ 4] = wk2r
* x0r
- wk2i
* x0i
;
1086 a
[j
+ 5] = wk2r
* x0i
+ wk2i
* x0r
;
1089 a
[j
+ 2] = wk1r
* x0r
- wk1i
* x0i
;
1090 a
[j
+ 3] = wk1r
* x0i
+ wk1i
* x0r
;
1093 a
[j
+ 6] = wk3r
* x0r
- wk3i
* x0i
;
1094 a
[j
+ 7] = wk3r
* x0i
+ wk3i
* x0r
;
1097 wk3r
= wk1r
- 2 * wk2r
* wk1i
;
1098 wk3i
= 2 * wk2r
* wk1r
- wk1i
;
1099 x0r
= a
[j
+ 8] + a
[j
+ 10];
1100 x0i
= a
[j
+ 9] + a
[j
+ 11];
1101 x1r
= a
[j
+ 8] - a
[j
+ 10];
1102 x1i
= a
[j
+ 9] - a
[j
+ 11];
1103 x2r
= a
[j
+ 12] + a
[j
+ 14];
1104 x2i
= a
[j
+ 13] + a
[j
+ 15];
1105 x3r
= a
[j
+ 12] - a
[j
+ 14];
1106 x3i
= a
[j
+ 13] - a
[j
+ 15];
1107 a
[j
+ 8] = x0r
+ x2r
;
1108 a
[j
+ 9] = x0i
+ x2i
;
1111 a
[j
+ 12] = -wk2i
* x0r
- wk2r
* x0i
;
1112 a
[j
+ 13] = -wk2i
* x0i
+ wk2r
* x0r
;
1115 a
[j
+ 10] = wk1r
* x0r
- wk1i
* x0i
;
1116 a
[j
+ 11] = wk1r
* x0i
+ wk1i
* x0r
;
1119 a
[j
+ 14] = wk3r
* x0r
- wk3i
* x0i
;
1120 a
[j
+ 15] = wk3r
* x0i
+ wk3i
* x0r
;
1125 static void cftmdl(int n
, int l
, double *a
, double const *w
)
1127 int j
, j1
, j2
, j3
, k
, k1
, k2
, m
, m2
;
1128 double wk1r
, wk1i
, wk2r
, wk2i
, wk3r
, wk3i
;
1129 double x0r
, x0i
, x1r
, x1i
, x2r
, x2i
, x3r
, x3i
;
1132 for (j
= 0; j
< l
; j
+= 2) {
1137 x0i
= a
[j
+ 1] + a
[j1
+ 1];
1139 x1i
= a
[j
+ 1] - a
[j1
+ 1];
1140 x2r
= a
[j2
] + a
[j3
];
1141 x2i
= a
[j2
+ 1] + a
[j3
+ 1];
1142 x3r
= a
[j2
] - a
[j3
];
1143 x3i
= a
[j2
+ 1] - a
[j3
+ 1];
1145 a
[j
+ 1] = x0i
+ x2i
;
1147 a
[j2
+ 1] = x0i
- x2i
;
1149 a
[j1
+ 1] = x1i
+ x3r
;
1151 a
[j3
+ 1] = x1i
- x3r
;
1154 for (j
= m
; j
< l
+ m
; j
+= 2) {
1159 x0i
= a
[j
+ 1] + a
[j1
+ 1];
1161 x1i
= a
[j
+ 1] - a
[j1
+ 1];
1162 x2r
= a
[j2
] + a
[j3
];
1163 x2i
= a
[j2
+ 1] + a
[j3
+ 1];
1164 x3r
= a
[j2
] - a
[j3
];
1165 x3i
= a
[j2
+ 1] - a
[j3
+ 1];
1167 a
[j
+ 1] = x0i
+ x2i
;
1169 a
[j2
+ 1] = x0r
- x2r
;
1172 a
[j1
] = wk1r
* (x0r
- x0i
);
1173 a
[j1
+ 1] = wk1r
* (x0r
+ x0i
);
1176 a
[j3
] = wk1r
* (x0i
- x0r
);
1177 a
[j3
+ 1] = wk1r
* (x0i
+ x0r
);
1181 for (k
= m2
; k
< n
; k
+= m2
) {
1188 wk3r
= wk1r
- 2 * wk2i
* wk1i
;
1189 wk3i
= 2 * wk2i
* wk1r
- wk1i
;
1190 for (j
= k
; j
< l
+ k
; j
+= 2) {
1195 x0i
= a
[j
+ 1] + a
[j1
+ 1];
1197 x1i
= a
[j
+ 1] - a
[j1
+ 1];
1198 x2r
= a
[j2
] + a
[j3
];
1199 x2i
= a
[j2
+ 1] + a
[j3
+ 1];
1200 x3r
= a
[j2
] - a
[j3
];
1201 x3i
= a
[j2
+ 1] - a
[j3
+ 1];
1203 a
[j
+ 1] = x0i
+ x2i
;
1206 a
[j2
] = wk2r
* x0r
- wk2i
* x0i
;
1207 a
[j2
+ 1] = wk2r
* x0i
+ wk2i
* x0r
;
1210 a
[j1
] = wk1r
* x0r
- wk1i
* x0i
;
1211 a
[j1
+ 1] = wk1r
* x0i
+ wk1i
* x0r
;
1214 a
[j3
] = wk3r
* x0r
- wk3i
* x0i
;
1215 a
[j3
+ 1] = wk3r
* x0i
+ wk3i
* x0r
;
1219 wk3r
= wk1r
- 2 * wk2r
* wk1i
;
1220 wk3i
= 2 * wk2r
* wk1r
- wk1i
;
1221 for (j
= k
+ m
; j
< l
+ (k
+ m
); j
+= 2) {
1226 x0i
= a
[j
+ 1] + a
[j1
+ 1];
1228 x1i
= a
[j
+ 1] - a
[j1
+ 1];
1229 x2r
= a
[j2
] + a
[j3
];
1230 x2i
= a
[j2
+ 1] + a
[j3
+ 1];
1231 x3r
= a
[j2
] - a
[j3
];
1232 x3i
= a
[j2
+ 1] - a
[j3
+ 1];
1234 a
[j
+ 1] = x0i
+ x2i
;
1237 a
[j2
] = -wk2i
* x0r
- wk2r
* x0i
;
1238 a
[j2
+ 1] = -wk2i
* x0i
+ wk2r
* x0r
;
1241 a
[j1
] = wk1r
* x0r
- wk1i
* x0i
;
1242 a
[j1
+ 1] = wk1r
* x0i
+ wk1i
* x0r
;
1245 a
[j3
] = wk3r
* x0r
- wk3i
* x0i
;
1246 a
[j3
+ 1] = wk3r
* x0i
+ wk3i
* x0r
;
1252 static void rftfsub(int n
, double *a
, int nc
, double const *c
)
1254 int j
, k
, kk
, ks
, m
;
1255 double wkr
, wki
, xr
, xi
, yr
, yi
;
1260 for (j
= 2; j
< m
; j
+= 2) {
1263 wkr
= 0.5 - c
[nc
- kk
];
1266 xi
= a
[j
+ 1] + a
[k
+ 1];
1267 yr
= wkr
* xr
- wki
* xi
;
1268 yi
= wkr
* xi
+ wki
* xr
;
1277 static void rftbsub(int n
, double *a
, int nc
, double const *c
)
1279 int j
, k
, kk
, ks
, m
;
1280 double wkr
, wki
, xr
, xi
, yr
, yi
;
1286 for (j
= 2; j
< m
; j
+= 2) {
1289 wkr
= 0.5 - c
[nc
- kk
];
1292 xi
= a
[j
+ 1] + a
[k
+ 1];
1293 yr
= wkr
* xr
+ wki
* xi
;
1294 yi
= wkr
* xi
- wki
* xr
;
1296 a
[j
+ 1] = yi
- a
[j
+ 1];
1298 a
[k
+ 1] = yi
- a
[k
+ 1];
1300 a
[m
+ 1] = -a
[m
+ 1];
1304 static void dctsub(int n
, double *a
, int nc
, double const *c
)
1306 int j
, k
, kk
, ks
, m
;
1307 double wkr
, wki
, xr
;
1312 for (j
= 1; j
< m
; j
++) {
1315 wkr
= c
[kk
] - c
[nc
- kk
];
1316 wki
= c
[kk
] + c
[nc
- kk
];
1317 xr
= wki
* a
[j
] - wkr
* a
[k
];
1318 a
[j
] = wkr
* a
[j
] + wki
* a
[k
];
1325 static void dstsub(int n
, double *a
, int nc
, double const *c
)
1327 int j
, k
, kk
, ks
, m
;
1328 double wkr
, wki
, xr
;
1333 for (j
= 1; j
< m
; j
++) {
1336 wkr
= c
[kk
] - c
[nc
- kk
];
1337 wki
= c
[kk
] + c
[nc
- kk
];
1338 xr
= wki
* a
[k
] - wkr
* a
[j
];
1339 a
[k
] = wkr
* a
[k
] + wki
* a
[j
];