2 fftpack.c : A set of FFT routines in C.
3 Algorithmically based on Fortran-77 FFTPACK by Paul N. Swarztrauber (Version 4, 1985).
7 /* isign is +1 for backward and -1 for forward transforms */
16 #define MAXFAC 13 /* maximum number of factors in factorization of n */
17 #define NSPECIAL 4 /* number of factors for which we have special-case routines */
19 /* ----------------------------------------------------------------------
20 passf2, passf3, passf4, passf5, passf. Complex FFT passes fwd and bwd.
21 ---------------------------------------------------------------------- */
23 static void passf2(int ido, int l1, const Treal cc[], Treal ch[], const Treal wa1[], int isign)
24 /* isign==+1 for backward transform */
29 for (k=0; k<l1; k++) {
32 ch[ah] = ref(cc,ac) + ref(cc,ac + ido);
33 ch[ah + ido*l1] = ref(cc,ac) - ref(cc,ac + ido);
34 ch[ah+1] = ref(cc,ac+1) + ref(cc,ac + ido + 1);
35 ch[ah + ido*l1 + 1] = ref(cc,ac+1) - ref(cc,ac + ido + 1);
38 for (k=0; k<l1; k++) {
39 for (i=0; i<ido-1; i+=2) {
42 ch[ah] = ref(cc,ac) + ref(cc,ac + ido);
43 tr2 = ref(cc,ac) - ref(cc,ac + ido);
44 ch[ah+1] = ref(cc,ac+1) + ref(cc,ac + 1 + ido);
45 ti2 = ref(cc,ac+1) - ref(cc,ac + 1 + ido);
46 ch[ah+l1*ido+1] = wa1[i]*ti2 + isign*wa1[i+1]*tr2;
47 ch[ah+l1*ido] = wa1[i]*tr2 - isign*wa1[i+1]*ti2;
54 static void passf3(int ido, int l1, const Treal cc[], Treal ch[],
55 const Treal wa1[], const Treal wa2[], int isign)
56 /* isign==+1 for backward transform */
58 static const Treal taur = -0.5;
59 static const Treal taui = 0.866025403784439;
61 Treal ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;
63 for (k=1; k<=l1; k++) {
65 tr2 = ref(cc,ac) + ref(cc,ac + ido);
66 cr2 = ref(cc,ac - ido) + taur*tr2;
68 ch[ah] = ref(cc,ac - ido) + tr2;
70 ti2 = ref(cc,ac + 1) + ref(cc,ac + ido + 1);
71 ci2 = ref(cc,ac - ido + 1) + taur*ti2;
72 ch[ah + 1] = ref(cc,ac - ido + 1) + ti2;
74 cr3 = isign*taui*(ref(cc,ac) - ref(cc,ac + ido));
75 ci3 = isign*taui*(ref(cc,ac + 1) - ref(cc,ac + ido + 1));
76 ch[ah + l1*ido] = cr2 - ci3;
77 ch[ah + 2*l1*ido] = cr2 + ci3;
78 ch[ah + l1*ido + 1] = ci2 + cr3;
79 ch[ah + 2*l1*ido + 1] = ci2 - cr3;
82 for (k=1; k<=l1; k++) {
83 for (i=0; i<ido-1; i+=2) {
84 ac = i + (3*k - 2)*ido;
85 tr2 = ref(cc,ac) + ref(cc,ac + ido);
86 cr2 = ref(cc,ac - ido) + taur*tr2;
88 ch[ah] = ref(cc,ac - ido) + tr2;
89 ti2 = ref(cc,ac + 1) + ref(cc,ac + ido + 1);
90 ci2 = ref(cc,ac - ido + 1) + taur*ti2;
91 ch[ah + 1] = ref(cc,ac - ido + 1) + ti2;
92 cr3 = isign*taui*(ref(cc,ac) - ref(cc,ac + ido));
93 ci3 = isign*taui*(ref(cc,ac + 1) - ref(cc,ac + ido + 1));
98 ch[ah + l1*ido + 1] = wa1[i]*di2 + isign*wa1[i+1]*dr2;
99 ch[ah + l1*ido] = wa1[i]*dr2 - isign*wa1[i+1]*di2;
100 ch[ah + 2*l1*ido + 1] = wa2[i]*di3 + isign*wa2[i+1]*dr3;
101 ch[ah + 2*l1*ido] = wa2[i]*dr3 - isign*wa2[i+1]*di3;
108 static void passf4(int ido, int l1, const Treal cc[], Treal ch[],
109 const Treal wa1[], const Treal wa2[], const Treal wa3[], int isign)
110 /* isign == -1 for forward transform and +1 for backward transform */
113 Treal ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
115 for (k=0; k<l1; k++) {
117 ti1 = ref(cc,ac) - ref(cc,ac + 2*ido);
118 ti2 = ref(cc,ac) + ref(cc,ac + 2*ido);
119 tr4 = ref(cc,ac + 3*ido) - ref(cc,ac + ido);
120 ti3 = ref(cc,ac + ido) + ref(cc,ac + 3*ido);
121 tr1 = ref(cc,ac - 1) - ref(cc,ac + 2*ido - 1);
122 tr2 = ref(cc,ac - 1) + ref(cc,ac + 2*ido - 1);
123 ti4 = ref(cc,ac + ido - 1) - ref(cc,ac + 3*ido - 1);
124 tr3 = ref(cc,ac + ido - 1) + ref(cc,ac + 3*ido - 1);
127 ch[ah + 2*l1*ido] = tr2 - tr3;
128 ch[ah + 1] = ti2 + ti3;
129 ch[ah + 2*l1*ido + 1] = ti2 - ti3;
130 ch[ah + l1*ido] = tr1 + isign*tr4;
131 ch[ah + 3*l1*ido] = tr1 - isign*tr4;
132 ch[ah + l1*ido + 1] = ti1 + isign*ti4;
133 ch[ah + 3*l1*ido + 1] = ti1 - isign*ti4;
136 for (k=0; k<l1; k++) {
137 for (i=0; i<ido-1; i+=2) {
138 ac = i + 1 + 4*k*ido;
139 ti1 = ref(cc,ac) - ref(cc,ac + 2*ido);
140 ti2 = ref(cc,ac) + ref(cc,ac + 2*ido);
141 ti3 = ref(cc,ac + ido) + ref(cc,ac + 3*ido);
142 tr4 = ref(cc,ac + 3*ido) - ref(cc,ac + ido);
143 tr1 = ref(cc,ac - 1) - ref(cc,ac + 2*ido - 1);
144 tr2 = ref(cc,ac - 1) + ref(cc,ac + 2*ido - 1);
145 ti4 = ref(cc,ac + ido - 1) - ref(cc,ac + 3*ido - 1);
146 tr3 = ref(cc,ac + ido - 1) + ref(cc,ac + 3*ido - 1);
150 ch[ah + 1] = ti2 + ti3;
152 cr2 = tr1 + isign*tr4;
153 cr4 = tr1 - isign*tr4;
154 ci2 = ti1 + isign*ti4;
155 ci4 = ti1 - isign*ti4;
156 ch[ah + l1*ido] = wa1[i]*cr2 - isign*wa1[i + 1]*ci2;
157 ch[ah + l1*ido + 1] = wa1[i]*ci2 + isign*wa1[i + 1]*cr2;
158 ch[ah + 2*l1*ido] = wa2[i]*cr3 - isign*wa2[i + 1]*ci3;
159 ch[ah + 2*l1*ido + 1] = wa2[i]*ci3 + isign*wa2[i + 1]*cr3;
160 ch[ah + 3*l1*ido] = wa3[i]*cr4 -isign*wa3[i + 1]*ci4;
161 ch[ah + 3*l1*ido + 1] = wa3[i]*ci4 + isign*wa3[i + 1]*cr4;
168 static void passf5(int ido, int l1, const Treal cc[], Treal ch[],
169 const Treal wa1[], const Treal wa2[], const Treal wa3[], const Treal wa4[], int isign)
170 /* isign == -1 for forward transform and +1 for backward transform */
172 static const Treal tr11 = 0.309016994374947;
173 static const Treal ti11 = 0.951056516295154;
174 static const Treal tr12 = -0.809016994374947;
175 static const Treal ti12 = 0.587785252292473;
177 Treal ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4, ti2, ti3,
178 ti4, ti5, dr3, dr4, dr5, dr2, tr2, tr3, tr4, tr5;
180 for (k = 1; k <= l1; ++k) {
181 ac = (5*k - 4)*ido + 1;
182 ti5 = ref(cc,ac) - ref(cc,ac + 3*ido);
183 ti2 = ref(cc,ac) + ref(cc,ac + 3*ido);
184 ti4 = ref(cc,ac + ido) - ref(cc,ac + 2*ido);
185 ti3 = ref(cc,ac + ido) + ref(cc,ac + 2*ido);
186 tr5 = ref(cc,ac - 1) - ref(cc,ac + 3*ido - 1);
187 tr2 = ref(cc,ac - 1) + ref(cc,ac + 3*ido - 1);
188 tr4 = ref(cc,ac + ido - 1) - ref(cc,ac + 2*ido - 1);
189 tr3 = ref(cc,ac + ido - 1) + ref(cc,ac + 2*ido - 1);
191 ch[ah] = ref(cc,ac - ido - 1) + tr2 + tr3;
192 ch[ah + 1] = ref(cc,ac - ido) + ti2 + ti3;
193 cr2 = ref(cc,ac - ido - 1) + tr11*tr2 + tr12*tr3;
194 ci2 = ref(cc,ac - ido) + tr11*ti2 + tr12*ti3;
195 cr3 = ref(cc,ac - ido - 1) + tr12*tr2 + tr11*tr3;
196 ci3 = ref(cc,ac - ido) + tr12*ti2 + tr11*ti3;
197 cr5 = isign*(ti11*tr5 + ti12*tr4);
198 ci5 = isign*(ti11*ti5 + ti12*ti4);
199 cr4 = isign*(ti12*tr5 - ti11*tr4);
200 ci4 = isign*(ti12*ti5 - ti11*ti4);
201 ch[ah + l1*ido] = cr2 - ci5;
202 ch[ah + 4*l1*ido] = cr2 + ci5;
203 ch[ah + l1*ido + 1] = ci2 + cr5;
204 ch[ah + 2*l1*ido + 1] = ci3 + cr4;
205 ch[ah + 2*l1*ido] = cr3 - ci4;
206 ch[ah + 3*l1*ido] = cr3 + ci4;
207 ch[ah + 3*l1*ido + 1] = ci3 - cr4;
208 ch[ah + 4*l1*ido + 1] = ci2 - cr5;
211 for (k=1; k<=l1; k++) {
212 for (i=0; i<ido-1; i+=2) {
213 ac = i + 1 + (k*5 - 4)*ido;
214 ti5 = ref(cc,ac) - ref(cc,ac + 3*ido);
215 ti2 = ref(cc,ac) + ref(cc,ac + 3*ido);
216 ti4 = ref(cc,ac + ido) - ref(cc,ac + 2*ido);
217 ti3 = ref(cc,ac + ido) + ref(cc,ac + 2*ido);
218 tr5 = ref(cc,ac - 1) - ref(cc,ac + 3*ido - 1);
219 tr2 = ref(cc,ac - 1) + ref(cc,ac + 3*ido - 1);
220 tr4 = ref(cc,ac + ido - 1) - ref(cc,ac + 2*ido - 1);
221 tr3 = ref(cc,ac + ido - 1) + ref(cc,ac + 2*ido - 1);
222 ah = i + (k - 1)*ido;
223 ch[ah] = ref(cc,ac - ido - 1) + tr2 + tr3;
224 ch[ah + 1] = ref(cc,ac - ido) + ti2 + ti3;
225 cr2 = ref(cc,ac - ido - 1) + tr11*tr2 + tr12*tr3;
227 ci2 = ref(cc,ac - ido) + tr11*ti2 + tr12*ti3;
228 cr3 = ref(cc,ac - ido - 1) + tr12*tr2 + tr11*tr3;
230 ci3 = ref(cc,ac - ido) + tr12*ti2 + tr11*ti3;
231 cr5 = isign*(ti11*tr5 + ti12*tr4);
232 ci5 = isign*(ti11*ti5 + ti12*ti4);
233 cr4 = isign*(ti12*tr5 - ti11*tr4);
234 ci4 = isign*(ti12*ti5 - ti11*ti4);
243 ch[ah + l1*ido] = wa1[i]*dr2 - isign*wa1[i+1]*di2;
244 ch[ah + l1*ido + 1] = wa1[i]*di2 + isign*wa1[i+1]*dr2;
245 ch[ah + 2*l1*ido] = wa2[i]*dr3 - isign*wa2[i+1]*di3;
246 ch[ah + 2*l1*ido + 1] = wa2[i]*di3 + isign*wa2[i+1]*dr3;
247 ch[ah + 3*l1*ido] = wa3[i]*dr4 - isign*wa3[i+1]*di4;
248 ch[ah + 3*l1*ido + 1] = wa3[i]*di4 + isign*wa3[i+1]*dr4;
249 ch[ah + 4*l1*ido] = wa4[i]*dr5 - isign*wa4[i+1]*di5;
250 ch[ah + 4*l1*ido + 1] = wa4[i]*di5 + isign*wa4[i+1]*dr5;
257 static void passf(int *nac, int ido, int ip, int l1, int idl1,
258 Treal cc[], Treal ch[],
259 const Treal wa[], int isign)
260 /* isign is -1 for forward transform and +1 for backward transform */
262 int idij, idlj, idot, ipph, i, j, k, l, jc, lc, ik, idj, idl, inc,idp;
270 for (j=1; j<ipph; j++) {
272 for (k=0; k<l1; k++) {
273 for (i=0; i<ido; i++) {
274 ch[i + (k + j*l1)*ido] =
275 ref(cc,i + (j + k*ip)*ido) + ref(cc,i + (jc + k*ip)*ido);
276 ch[i + (k + jc*l1)*ido] =
277 ref(cc,i + (j + k*ip)*ido) - ref(cc,i + (jc + k*ip)*ido);
282 for (i=0; i<ido; i++)
283 ch[i + k*ido] = ref(cc,i + k*ip*ido);
285 for (j=1; j<ipph; j++) {
287 for (i=0; i<ido; i++) {
288 for (k=0; k<l1; k++) {
289 ch[i + (k + j*l1)*ido] = ref(cc,i + (j + k*ip)*ido) + ref(cc,i + (jc + k*
291 ch[i + (k + jc*l1)*ido] = ref(cc,i + (j + k*ip)*ido) - ref(cc,i + (jc + k*
296 for (i=0; i<ido; i++)
298 ch[i + k*ido] = ref(cc,i + k*ip*ido);
303 for (l=1; l<ipph; l++) {
306 for (ik=0; ik<idl1; ik++) {
307 cc[ik + l*idl1] = ch[ik] + wa[idl - 2]*ch[ik + idl1];
308 cc[ik + lc*idl1] = isign*wa[idl-1]*ch[ik + (ip-1)*idl1];
312 for (j=2; j<ipph; j++) {
315 if (idlj > idp) idlj -= idp;
318 for (ik=0; ik<idl1; ik++) {
319 cc[ik + l*idl1] += war*ch[ik + j*idl1];
320 cc[ik + lc*idl1] += isign*wai*ch[ik + jc*idl1];
324 for (j=1; j<ipph; j++)
325 for (ik=0; ik<idl1; ik++)
326 ch[ik] += ch[ik + j*idl1];
327 for (j=1; j<ipph; j++) {
329 for (ik=1; ik<idl1; ik+=2) {
330 ch[ik - 1 + j*idl1] = cc[ik - 1 + j*idl1] - cc[ik + jc*idl1];
331 ch[ik - 1 + jc*idl1] = cc[ik - 1 + j*idl1] + cc[ik + jc*idl1];
332 ch[ik + j*idl1] = cc[ik + j*idl1] + cc[ik - 1 + jc*idl1];
333 ch[ik + jc*idl1] = cc[ik + j*idl1] - cc[ik - 1 + jc*idl1];
337 if (ido == 2) return;
339 for (ik=0; ik<idl1; ik++)
341 for (j=1; j<ip; j++) {
342 for (k=0; k<l1; k++) {
343 cc[(k + j*l1)*ido + 0] = ch[(k + j*l1)*ido + 0];
344 cc[(k + j*l1)*ido + 1] = ch[(k + j*l1)*ido + 1];
349 for (j=1; j<ip; j++) {
351 for (i=3; i<ido; i+=2) {
353 for (k=0; k<l1; k++) {
354 cc[i - 1 + (k + j*l1)*ido] =
355 wa[idij - 2]*ch[i - 1 + (k + j*l1)*ido] -
356 isign*wa[idij-1]*ch[i + (k + j*l1)*ido];
357 cc[i + (k + j*l1)*ido] =
358 wa[idij - 2]*ch[i + (k + j*l1)*ido] +
359 isign*wa[idij-1]*ch[i - 1 + (k + j*l1)*ido];
365 for (j=1; j<ip; j++) {
367 for (k = 0; k < l1; k++) {
369 for (i=3; i<ido; i+=2) {
371 cc[i - 1 + (k + j*l1)*ido] =
372 wa[idij - 2]*ch[i - 1 + (k + j*l1)*ido] -
373 isign*wa[idij-1]*ch[i + (k + j*l1)*ido];
374 cc[i + (k + j*l1)*ido] =
375 wa[idij - 2]*ch[i + (k + j*l1)*ido] +
376 isign*wa[idij-1]*ch[i - 1 + (k + j*l1)*ido];
384 /* ----------------------------------------------------------------------
385 radf2,radb2, radf3,radb3, radf4,radb4, radf5,radb5, radfg,radbg.
386 Treal FFT passes fwd and bwd.
387 ---------------------------------------------------------------------- */
389 static void radf2(int ido, int l1, const Treal cc[], Treal ch[], const Treal wa1[])
393 for (k=0; k<l1; k++) {
395 ref(cc,k*ido) + ref(cc,(k + l1)*ido);
396 ch[(2*k+1)*ido + ido-1] =
397 ref(cc,k*ido) - ref(cc,(k + l1)*ido);
401 for (k=0; k<l1; k++) {
402 for (i=2; i<ido; i+=2) {
404 tr2 = wa1[i - 2]*ref(cc, i-1 + (k + l1)*ido) + wa1[i - 1]*ref(cc, i + (k + l1)*ido);
405 ti2 = wa1[i - 2]*ref(cc, i + (k + l1)*ido) - wa1[i - 1]*ref(cc, i-1 + (k + l1)*ido);
406 ch[i + 2*k*ido] = ref(cc,i + k*ido) + ti2;
407 ch[ic + (2*k+1)*ido] = ti2 - ref(cc,i + k*ido);
408 ch[i - 1 + 2*k*ido] = ref(cc,i - 1 + k*ido) + tr2;
409 ch[ic - 1 + (2*k+1)*ido] = ref(cc,i - 1 + k*ido) - tr2;
412 if (ido % 2 == 1) return;
414 for (k=0; k<l1; k++) {
415 ch[(2*k+1)*ido] = -ref(cc,ido-1 + (k + l1)*ido);
416 ch[ido-1 + 2*k*ido] = ref(cc,ido-1 + k*ido);
421 static void radb2(int ido, int l1, const Treal cc[], Treal ch[], const Treal wa1[])
425 for (k=0; k<l1; k++) {
427 ref(cc,2*k*ido) + ref(cc,ido-1 + (2*k+1)*ido);
429 ref(cc,2*k*ido) - ref(cc,ido-1 + (2*k+1)*ido);
433 for (k = 0; k < l1; ++k) {
434 for (i = 2; i < ido; i += 2) {
437 ref(cc,i-1 + 2*k*ido) + ref(cc,ic-1 + (2*k+1)*ido);
438 tr2 = ref(cc,i-1 + 2*k*ido) - ref(cc,ic-1 + (2*k+1)*ido);
440 ref(cc,i + 2*k*ido) - ref(cc,ic + (2*k+1)*ido);
441 ti2 = ref(cc,i + (2*k)*ido) + ref(cc,ic + (2*k+1)*ido);
442 ch[i-1 + (k + l1)*ido] =
443 wa1[i - 2]*tr2 - wa1[i - 1]*ti2;
444 ch[i + (k + l1)*ido] =
445 wa1[i - 2]*ti2 + wa1[i - 1]*tr2;
448 if (ido % 2 == 1) return;
450 for (k = 0; k < l1; k++) {
451 ch[ido-1 + k*ido] = 2*ref(cc,ido-1 + 2*k*ido);
452 ch[ido-1 + (k + l1)*ido] = -2*ref(cc,(2*k+1)*ido);
457 static void radf3(int ido, int l1, const Treal cc[], Treal ch[],
458 const Treal wa1[], const Treal wa2[])
460 static const Treal taur = -0.5;
461 static const Treal taui = 0.866025403784439;
463 Treal ci2, di2, di3, cr2, dr2, dr3, ti2, ti3, tr2, tr3;
464 for (k=0; k<l1; k++) {
465 cr2 = ref(cc,(k + l1)*ido) + ref(cc,(k + 2*l1)*ido);
466 ch[3*k*ido] = ref(cc,k*ido) + cr2;
467 ch[(3*k+2)*ido] = taui*(ref(cc,(k + l1*2)*ido) - ref(cc,(k + l1)*ido));
468 ch[ido-1 + (3*k + 1)*ido] = ref(cc,k*ido) + taur*cr2;
470 if (ido == 1) return;
471 for (k=0; k<l1; k++) {
472 for (i=2; i<ido; i+=2) {
474 dr2 = wa1[i - 2]*ref(cc,i - 1 + (k + l1)*ido) +
475 wa1[i - 1]*ref(cc,i + (k + l1)*ido);
476 di2 = wa1[i - 2]*ref(cc,i + (k + l1)*ido) - wa1[i - 1]*ref(cc,i - 1 + (k + l1)*ido);
477 dr3 = wa2[i - 2]*ref(cc,i - 1 + (k + l1*2)*ido) + wa2[i - 1]*ref(cc,i + (k + l1*2)*ido);
478 di3 = wa2[i - 2]*ref(cc,i + (k + l1*2)*ido) - wa2[i - 1]*ref(cc,i - 1 + (k + l1*2)*ido);
481 ch[i - 1 + 3*k*ido] = ref(cc,i - 1 + k*ido) + cr2;
482 ch[i + 3*k*ido] = ref(cc,i + k*ido) + ci2;
483 tr2 = ref(cc,i - 1 + k*ido) + taur*cr2;
484 ti2 = ref(cc,i + k*ido) + taur*ci2;
485 tr3 = taui*(di2 - di3);
486 ti3 = taui*(dr3 - dr2);
487 ch[i - 1 + (3*k + 2)*ido] = tr2 + tr3;
488 ch[ic - 1 + (3*k + 1)*ido] = tr2 - tr3;
489 ch[i + (3*k + 2)*ido] = ti2 + ti3;
490 ch[ic + (3*k + 1)*ido] = ti3 - ti2;
496 static void radb3(int ido, int l1, const Treal cc[], Treal ch[],
497 const Treal wa1[], const Treal wa2[])
499 static const Treal taur = -0.5;
500 static const Treal taui = 0.866025403784439;
502 Treal ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;
503 for (k=0; k<l1; k++) {
504 tr2 = 2*ref(cc,ido-1 + (3*k + 1)*ido);
505 cr2 = ref(cc,3*k*ido) + taur*tr2;
506 ch[k*ido] = ref(cc,3*k*ido) + tr2;
507 ci3 = 2*taui*ref(cc,(3*k + 2)*ido);
508 ch[(k + l1)*ido] = cr2 - ci3;
509 ch[(k + 2*l1)*ido] = cr2 + ci3;
511 if (ido == 1) return;
512 for (k=0; k<l1; k++) {
513 for (i=2; i<ido; i+=2) {
515 tr2 = ref(cc,i - 1 + (3*k + 2)*ido) + ref(cc,ic - 1 + (3*k + 1)*ido);
516 cr2 = ref(cc,i - 1 + 3*k*ido) + taur*tr2;
517 ch[i - 1 + k*ido] = ref(cc,i - 1 + 3*k*ido) + tr2;
518 ti2 = ref(cc,i + (3*k + 2)*ido) - ref(cc,ic + (3*k + 1)*ido);
519 ci2 = ref(cc,i + 3*k*ido) + taur*ti2;
520 ch[i + k*ido] = ref(cc,i + 3*k*ido) + ti2;
521 cr3 = taui*(ref(cc,i - 1 + (3*k + 2)*ido) - ref(cc,ic - 1 + (3*k + 1)*ido));
522 ci3 = taui*(ref(cc,i + (3*k + 2)*ido) + ref(cc,ic + (3*k + 1)*ido));
527 ch[i - 1 + (k + l1)*ido] = wa1[i - 2]*dr2 - wa1[i - 1]*di2;
528 ch[i + (k + l1)*ido] = wa1[i - 2]*di2 + wa1[i - 1]*dr2;
529 ch[i - 1 + (k + 2*l1)*ido] = wa2[i - 2]*dr3 - wa2[i - 1]*di3;
530 ch[i + (k + 2*l1)*ido] = wa2[i - 2]*di3 + wa2[i - 1]*dr3;
536 static void radf4(int ido, int l1, const Treal cc[], Treal ch[],
537 const Treal wa1[], const Treal wa2[], const Treal wa3[])
539 static const Treal hsqt2 = 0.7071067811865475;
541 Treal ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
542 for (k=0; k<l1; k++) {
543 tr1 = ref(cc,(k + l1)*ido) + ref(cc,(k + 3*l1)*ido);
544 tr2 = ref(cc,k*ido) + ref(cc,(k + 2*l1)*ido);
545 ch[4*k*ido] = tr1 + tr2;
546 ch[ido-1 + (4*k + 3)*ido] = tr2 - tr1;
547 ch[ido-1 + (4*k + 1)*ido] = ref(cc,k*ido) - ref(cc,(k + 2*l1)*ido);
548 ch[(4*k + 2)*ido] = ref(cc,(k + 3*l1)*ido) - ref(cc,(k + l1)*ido);
552 for (k=0; k<l1; k++) {
553 for (i=2; i<ido; i += 2) {
555 cr2 = wa1[i - 2]*ref(cc,i - 1 + (k + l1)*ido) + wa1[i - 1]*ref(cc,i + (k + l1)*ido);
556 ci2 = wa1[i - 2]*ref(cc,i + (k + l1)*ido) - wa1[i - 1]*ref(cc,i - 1 + (k + l1)*ido);
557 cr3 = wa2[i - 2]*ref(cc,i - 1 + (k + 2*l1)*ido) + wa2[i - 1]*ref(cc,i + (k + 2*l1)*
559 ci3 = wa2[i - 2]*ref(cc,i + (k + 2*l1)*ido) - wa2[i - 1]*ref(cc,i - 1 + (k + 2*l1)*
561 cr4 = wa3[i - 2]*ref(cc,i - 1 + (k + 3*l1)*ido) + wa3[i - 1]*ref(cc,i + (k + 3*l1)*
563 ci4 = wa3[i - 2]*ref(cc,i + (k + 3*l1)*ido) - wa3[i - 1]*ref(cc,i - 1 + (k + 3*l1)*
569 ti2 = ref(cc,i + k*ido) + ci3;
570 ti3 = ref(cc,i + k*ido) - ci3;
571 tr2 = ref(cc,i - 1 + k*ido) + cr3;
572 tr3 = ref(cc,i - 1 + k*ido) - cr3;
573 ch[i - 1 + 4*k*ido] = tr1 + tr2;
574 ch[ic - 1 + (4*k + 3)*ido] = tr2 - tr1;
575 ch[i + 4*k*ido] = ti1 + ti2;
576 ch[ic + (4*k + 3)*ido] = ti1 - ti2;
577 ch[i - 1 + (4*k + 2)*ido] = ti4 + tr3;
578 ch[ic - 1 + (4*k + 1)*ido] = tr3 - ti4;
579 ch[i + (4*k + 2)*ido] = tr4 + ti3;
580 ch[ic + (4*k + 1)*ido] = tr4 - ti3;
583 if (ido % 2 == 1) return;
585 for (k=0; k<l1; k++) {
586 ti1 = -hsqt2*(ref(cc,ido-1 + (k + l1)*ido) + ref(cc,ido-1 + (k + 3*l1)*ido));
587 tr1 = hsqt2*(ref(cc,ido-1 + (k + l1)*ido) - ref(cc,ido-1 + (k + 3*l1)*ido));
588 ch[ido-1 + 4*k*ido] = tr1 + ref(cc,ido-1 + k*ido);
589 ch[ido-1 + (4*k + 2)*ido] = ref(cc,ido-1 + k*ido) - tr1;
590 ch[(4*k + 1)*ido] = ti1 - ref(cc,ido-1 + (k + 2*l1)*ido);
591 ch[(4*k + 3)*ido] = ti1 + ref(cc,ido-1 + (k + 2*l1)*ido);
596 static void radb4(int ido, int l1, const Treal cc[], Treal ch[],
597 const Treal wa1[], const Treal wa2[], const Treal wa3[])
599 static const Treal sqrt2 = 1.414213562373095;
601 Treal ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
602 for (k = 0; k < l1; k++) {
603 tr1 = ref(cc,4*k*ido) - ref(cc,ido-1 + (4*k + 3)*ido);
604 tr2 = ref(cc,4*k*ido) + ref(cc,ido-1 + (4*k + 3)*ido);
605 tr3 = ref(cc,ido-1 + (4*k + 1)*ido) + ref(cc,ido-1 + (4*k + 1)*ido);
606 tr4 = ref(cc,(4*k + 2)*ido) + ref(cc,(4*k + 2)*ido);
607 ch[k*ido] = tr2 + tr3;
608 ch[(k + l1)*ido] = tr1 - tr4;
609 ch[(k + 2*l1)*ido] = tr2 - tr3;
610 ch[(k + 3*l1)*ido] = tr1 + tr4;
614 for (k = 0; k < l1; ++k) {
615 for (i = 2; i < ido; i += 2) {
617 ti1 = ref(cc,i + 4*k*ido) + ref(cc,ic + (4*k + 3)*ido);
618 ti2 = ref(cc,i + 4*k*ido) - ref(cc,ic + (4*k + 3)*ido);
619 ti3 = ref(cc,i + (4*k + 2)*ido) - ref(cc,ic + (4*k + 1)*ido);
620 tr4 = ref(cc,i + (4*k + 2)*ido) + ref(cc,ic + (4*k + 1)*ido);
621 tr1 = ref(cc,i - 1 + 4*k*ido) - ref(cc,ic - 1 + (4*k + 3)*ido);
622 tr2 = ref(cc,i - 1 + 4*k*ido) + ref(cc,ic - 1 + (4*k + 3)*ido);
623 ti4 = ref(cc,i - 1 + (4*k + 2)*ido) - ref(cc,ic - 1 + (4*k + 1)*ido);
624 tr3 = ref(cc,i - 1 + (4*k + 2)*ido) + ref(cc,ic - 1 + (4*k + 1)*ido);
625 ch[i - 1 + k*ido] = tr2 + tr3;
627 ch[i + k*ido] = ti2 + ti3;
633 ch[i - 1 + (k + l1)*ido] = wa1[i - 2]*cr2 - wa1[i - 1]*ci2;
634 ch[i + (k + l1)*ido] = wa1[i - 2]*ci2 + wa1[i - 1]*cr2;
635 ch[i - 1 + (k + 2*l1)*ido] = wa2[i - 2]*cr3 - wa2[i - 1]*ci3;
636 ch[i + (k + 2*l1)*ido] = wa2[i - 2]*ci3 + wa2[i - 1]*cr3;
637 ch[i - 1 + (k + 3*l1)*ido] = wa3[i - 2]*cr4 - wa3[i - 1]*ci4;
638 ch[i + (k + 3*l1)*ido] = wa3[i - 2]*ci4 + wa3[i - 1]*cr4;
641 if (ido % 2 == 1) return;
643 for (k = 0; k < l1; k++) {
644 ti1 = ref(cc,(4*k + 1)*ido) + ref(cc,(4*k + 3)*ido);
645 ti2 = ref(cc,(4*k + 3)*ido) - ref(cc,(4*k + 1)*ido);
646 tr1 = ref(cc,ido-1 + 4*k*ido) - ref(cc,ido-1 + (4*k + 2)*ido);
647 tr2 = ref(cc,ido-1 + 4*k*ido) + ref(cc,ido-1 + (4*k + 2)*ido);
648 ch[ido-1 + k*ido] = tr2 + tr2;
649 ch[ido-1 + (k + l1)*ido] = sqrt2*(tr1 - ti1);
650 ch[ido-1 + (k + 2*l1)*ido] = ti2 + ti2;
651 ch[ido-1 + (k + 3*l1)*ido] = -sqrt2*(tr1 + ti1);
656 static void radf5(int ido, int l1, const Treal cc[], Treal ch[],
657 const Treal wa1[], const Treal wa2[], const Treal wa3[], const Treal wa4[])
659 static const Treal tr11 = 0.309016994374947;
660 static const Treal ti11 = 0.951056516295154;
661 static const Treal tr12 = -0.809016994374947;
662 static const Treal ti12 = 0.587785252292473;
664 Treal ci2, di2, ci4, ci5, di3, di4, di5, ci3, cr2, cr3, dr2, dr3, dr4, dr5,
665 cr5, cr4, ti2, ti3, ti5, ti4, tr2, tr3, tr4, tr5;
666 for (k = 0; k < l1; k++) {
667 cr2 = ref(cc,(k + 4*l1)*ido) + ref(cc,(k + l1)*ido);
668 ci5 = ref(cc,(k + 4*l1)*ido) - ref(cc,(k + l1)*ido);
669 cr3 = ref(cc,(k + 3*l1)*ido) + ref(cc,(k + 2*l1)*ido);
670 ci4 = ref(cc,(k + 3*l1)*ido) - ref(cc,(k + 2*l1)*ido);
671 ch[5*k*ido] = ref(cc,k*ido) + cr2 + cr3;
672 ch[ido-1 + (5*k + 1)*ido] = ref(cc,k*ido) + tr11*cr2 + tr12*cr3;
673 ch[(5*k + 2)*ido] = ti11*ci5 + ti12*ci4;
674 ch[ido-1 + (5*k + 3)*ido] = ref(cc,k*ido) + tr12*cr2 + tr11*cr3;
675 ch[(5*k + 4)*ido] = ti12*ci5 - ti11*ci4;
677 if (ido == 1) return;
678 for (k = 0; k < l1; ++k) {
679 for (i = 2; i < ido; i += 2) {
681 dr2 = wa1[i - 2]*ref(cc,i - 1 + (k + l1)*ido) + wa1[i - 1]*ref(cc,i + (k + l1)*ido);
682 di2 = wa1[i - 2]*ref(cc,i + (k + l1)*ido) - wa1[i - 1]*ref(cc,i - 1 + (k + l1)*ido);
683 dr3 = wa2[i - 2]*ref(cc,i - 1 + (k + 2*l1)*ido) + wa2[i - 1]*ref(cc,i + (k + 2*l1)*ido);
684 di3 = wa2[i - 2]*ref(cc,i + (k + 2*l1)*ido) - wa2[i - 1]*ref(cc,i - 1 + (k + 2*l1)*ido);
685 dr4 = wa3[i - 2]*ref(cc,i - 1 + (k + 3*l1)*ido) + wa3[i - 1]*ref(cc,i + (k + 3*l1)*ido);
686 di4 = wa3[i - 2]*ref(cc,i + (k + 3*l1)*ido) - wa3[i - 1]*ref(cc,i - 1 + (k + 3*l1)*ido);
687 dr5 = wa4[i - 2]*ref(cc,i - 1 + (k + 4*l1)*ido) + wa4[i - 1]*ref(cc,i + (k + 4*l1)*ido);
688 di5 = wa4[i - 2]*ref(cc,i + (k + 4*l1)*ido) - wa4[i - 1]*ref(cc,i - 1 + (k + 4*l1)*ido);
697 ch[i - 1 + 5*k*ido] = ref(cc,i - 1 + k*ido) + cr2 + cr3;
698 ch[i + 5*k*ido] = ref(cc,i + k*ido) + ci2 + ci3;
699 tr2 = ref(cc,i - 1 + k*ido) + tr11*cr2 + tr12*cr3;
700 ti2 = ref(cc,i + k*ido) + tr11*ci2 + tr12*ci3;
701 tr3 = ref(cc,i - 1 + k*ido) + tr12*cr2 + tr11*cr3;
702 ti3 = ref(cc,i + k*ido) + tr12*ci2 + tr11*ci3;
703 tr5 = ti11*cr5 + ti12*cr4;
704 ti5 = ti11*ci5 + ti12*ci4;
705 tr4 = ti12*cr5 - ti11*cr4;
706 ti4 = ti12*ci5 - ti11*ci4;
707 ch[i - 1 + (5*k + 2)*ido] = tr2 + tr5;
708 ch[ic - 1 + (5*k + 1)*ido] = tr2 - tr5;
709 ch[i + (5*k + 2)*ido] = ti2 + ti5;
710 ch[ic + (5*k + 1)*ido] = ti5 - ti2;
711 ch[i - 1 + (5*k + 4)*ido] = tr3 + tr4;
712 ch[ic - 1 + (5*k + 3)*ido] = tr3 - tr4;
713 ch[i + (5*k + 4)*ido] = ti3 + ti4;
714 ch[ic + (5*k + 3)*ido] = ti4 - ti3;
720 static void radb5(int ido, int l1, const Treal cc[], Treal ch[],
721 const Treal wa1[], const Treal wa2[], const Treal wa3[], const Treal wa4[])
723 static const Treal tr11 = 0.309016994374947;
724 static const Treal ti11 = 0.951056516295154;
725 static const Treal tr12 = -0.809016994374947;
726 static const Treal ti12 = 0.587785252292473;
728 Treal ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4, ti2, ti3,
729 ti4, ti5, dr3, dr4, dr5, dr2, tr2, tr3, tr4, tr5;
730 for (k = 0; k < l1; k++) {
731 ti5 = 2*ref(cc,(5*k + 2)*ido);
732 ti4 = 2*ref(cc,(5*k + 4)*ido);
733 tr2 = 2*ref(cc,ido-1 + (5*k + 1)*ido);
734 tr3 = 2*ref(cc,ido-1 + (5*k + 3)*ido);
735 ch[k*ido] = ref(cc,5*k*ido) + tr2 + tr3;
736 cr2 = ref(cc,5*k*ido) + tr11*tr2 + tr12*tr3;
737 cr3 = ref(cc,5*k*ido) + tr12*tr2 + tr11*tr3;
738 ci5 = ti11*ti5 + ti12*ti4;
739 ci4 = ti12*ti5 - ti11*ti4;
740 ch[(k + l1)*ido] = cr2 - ci5;
741 ch[(k + 2*l1)*ido] = cr3 - ci4;
742 ch[(k + 3*l1)*ido] = cr3 + ci4;
743 ch[(k + 4*l1)*ido] = cr2 + ci5;
745 if (ido == 1) return;
746 for (k = 0; k < l1; ++k) {
747 for (i = 2; i < ido; i += 2) {
749 ti5 = ref(cc,i + (5*k + 2)*ido) + ref(cc,ic + (5*k + 1)*ido);
750 ti2 = ref(cc,i + (5*k + 2)*ido) - ref(cc,ic + (5*k + 1)*ido);
751 ti4 = ref(cc,i + (5*k + 4)*ido) + ref(cc,ic + (5*k + 3)*ido);
752 ti3 = ref(cc,i + (5*k + 4)*ido) - ref(cc,ic + (5*k + 3)*ido);
753 tr5 = ref(cc,i - 1 + (5*k + 2)*ido) - ref(cc,ic - 1 + (5*k + 1)*ido);
754 tr2 = ref(cc,i - 1 + (5*k + 2)*ido) + ref(cc,ic - 1 + (5*k + 1)*ido);
755 tr4 = ref(cc,i - 1 + (5*k + 4)*ido) - ref(cc,ic - 1 + (5*k + 3)*ido);
756 tr3 = ref(cc,i - 1 + (5*k + 4)*ido) + ref(cc,ic - 1 + (5*k + 3)*ido);
757 ch[i - 1 + k*ido] = ref(cc,i - 1 + 5*k*ido) + tr2 + tr3;
758 ch[i + k*ido] = ref(cc,i + 5*k*ido) + ti2 + ti3;
759 cr2 = ref(cc,i - 1 + 5*k*ido) + tr11*tr2 + tr12*tr3;
761 ci2 = ref(cc,i + 5*k*ido) + tr11*ti2 + tr12*ti3;
762 cr3 = ref(cc,i - 1 + 5*k*ido) + tr12*tr2 + tr11*tr3;
764 ci3 = ref(cc,i + 5*k*ido) + tr12*ti2 + tr11*ti3;
765 cr5 = ti11*tr5 + ti12*tr4;
766 ci5 = ti11*ti5 + ti12*ti4;
767 cr4 = ti12*tr5 - ti11*tr4;
768 ci4 = ti12*ti5 - ti11*ti4;
777 ch[i - 1 + (k + l1)*ido] = wa1[i - 2]*dr2 - wa1[i - 1]*di2;
778 ch[i + (k + l1)*ido] = wa1[i - 2]*di2 + wa1[i - 1]*dr2;
779 ch[i - 1 + (k + 2*l1)*ido] = wa2[i - 2]*dr3 - wa2[i - 1]*di3;
780 ch[i + (k + 2*l1)*ido] = wa2[i - 2]*di3 + wa2[i - 1]*dr3;
781 ch[i - 1 + (k + 3*l1)*ido] = wa3[i - 2]*dr4 - wa3[i - 1]*di4;
782 ch[i + (k + 3*l1)*ido] = wa3[i - 2]*di4 + wa3[i - 1]*dr4;
783 ch[i - 1 + (k + 4*l1)*ido] = wa4[i - 2]*dr5 - wa4[i - 1]*di5;
784 ch[i + (k + 4*l1)*ido] = wa4[i - 2]*di5 + wa4[i - 1]*dr5;
790 static void radfg(int ido, int ip, int l1, int idl1,
791 Treal cc[], Treal ch[], const Treal wa[])
793 static const Treal twopi = 6.28318530717959;
794 int idij, ipph, i, j, k, l, j2, ic, jc, lc, ik, is, nbd;
795 Treal dc2, ai1, ai2, ar1, ar2, ds2, dcp, arg, dsp, ar1h, ar2h;
802 for (ik=0; ik<idl1; ik++) ch[ik] = cc[ik];
805 ch[(k + j*l1)*ido] = cc[(k + j*l1)*ido];
808 for (j=1; j<ip; j++) {
811 for (i=2; i<ido; i+=2) {
813 for (k=0; k<l1; k++) {
814 ch[i - 1 + (k + j*l1)*ido] =
815 wa[idij - 1]*cc[i - 1 + (k + j*l1)*ido] + wa[idij]*cc[i + (k + j*l1)*ido];
816 ch[i + (k + j*l1)*ido] =
817 wa[idij - 1]*cc[i + (k + j*l1)*ido] - wa[idij]*cc[i - 1 + (k + j*l1)*ido];
823 for (j=1; j<ip; j++) {
825 for (k=0; k<l1; k++) {
827 for (i=2; i<ido; i+=2) {
829 ch[i - 1 + (k + j*l1)*ido] =
830 wa[idij - 1]*cc[i - 1 + (k + j*l1)*ido] + wa[idij]*cc[i + (k + j*l1)*ido];
831 ch[i + (k + j*l1)*ido] =
832 wa[idij - 1]*cc[i + (k + j*l1)*ido] - wa[idij]*cc[i - 1 + (k + j*l1)*ido];
838 for (j=1; j<ipph; j++) {
840 for (k=0; k<l1; k++) {
841 for (i=2; i<ido; i+=2) {
842 cc[i - 1 + (k + j*l1)*ido] = ch[i - 1 + (k + j*l1)*ido] + ch[i - 1 + (k + jc*l1)*ido];
843 cc[i - 1 + (k + jc*l1)*ido] = ch[i + (k + j*l1)*ido] - ch[i + (k + jc*l1)*ido];
844 cc[i + (k + j*l1)*ido] = ch[i + (k + j*l1)*ido] + ch[i + (k + jc*l1)*ido];
845 cc[i + (k + jc*l1)*ido] = ch[i - 1 + (k + jc*l1)*ido] - ch[i - 1 + (k + j*l1)*ido];
850 for (j=1; j<ipph; j++) {
852 for (i=2; i<ido; i+=2) {
853 for (k=0; k<l1; k++) {
854 cc[i - 1 + (k + j*l1)*ido] =
855 ch[i - 1 + (k + j*l1)*ido] + ch[i - 1 + (k + jc*l1)*ido];
856 cc[i - 1 + (k + jc*l1)*ido] = ch[i + (k + j*l1)*ido] - ch[i + (k + jc*l1)*ido];
857 cc[i + (k + j*l1)*ido] = ch[i + (k + j*l1)*ido] + ch[i + (k + jc*l1)*ido];
858 cc[i + (k + jc*l1)*ido] = ch[i - 1 + (k + jc*l1)*ido] - ch[i - 1 + (k + j*l1)*ido];
863 } else { /* now ido == 1 */
864 for (ik=0; ik<idl1; ik++) cc[ik] = ch[ik];
866 for (j=1; j<ipph; j++) {
868 for (k=0; k<l1; k++) {
869 cc[(k + j*l1)*ido] = ch[(k + j*l1)*ido] + ch[(k + jc*l1)*ido];
870 cc[(k + jc*l1)*ido] = ch[(k + jc*l1)*ido] - ch[(k + j*l1)*ido];
876 for (l=1; l<ipph; l++) {
878 ar1h = dcp*ar1 - dsp*ai1;
879 ai1 = dcp*ai1 + dsp*ar1;
881 for (ik=0; ik<idl1; ik++) {
882 ch[ik + l*idl1] = cc[ik] + ar1*cc[ik + idl1];
883 ch[ik + lc*idl1] = ai1*cc[ik + (ip-1)*idl1];
889 for (j=2; j<ipph; j++) {
891 ar2h = dc2*ar2 - ds2*ai2;
892 ai2 = dc2*ai2 + ds2*ar2;
894 for (ik=0; ik<idl1; ik++) {
895 ch[ik + l*idl1] += ar2*cc[ik + j*idl1];
896 ch[ik + lc*idl1] += ai2*cc[ik + jc*idl1];
900 for (j=1; j<ipph; j++)
901 for (ik=0; ik<idl1; ik++)
902 ch[ik] += cc[ik + j*idl1];
905 for (k=0; k<l1; k++) {
906 for (i=0; i<ido; i++) {
907 ref(cc,i + k*ip*ido) = ch[i + k*ido];
911 for (i=0; i<ido; i++) {
912 for (k=0; k<l1; k++) {
913 ref(cc,i + k*ip*ido) = ch[i + k*ido];
917 for (j=1; j<ipph; j++) {
920 for (k=0; k<l1; k++) {
921 ref(cc,ido-1 + (j2 - 1 + k*ip)*ido) =
923 ref(cc,(j2 + k*ip)*ido) =
927 if (ido == 1) return;
929 for (j=1; j<ipph; j++) {
932 for (k=0; k<l1; k++) {
933 for (i=2; i<ido; i+=2) {
935 ref(cc,i - 1 + (j2 + k*ip)*ido) = ch[i - 1 + (k + j*l1)*ido] + ch[i - 1 + (k + jc*l1)*ido];
936 ref(cc,ic - 1 + (j2 - 1 + k*ip)*ido) = ch[i - 1 + (k + j*l1)*ido] - ch[i - 1 + (k + jc*l1)*ido];
937 ref(cc,i + (j2 + k*ip)*ido) = ch[i + (k + j*l1)*ido] + ch[i + (k + jc*l1)*ido];
938 ref(cc,ic + (j2 - 1 + k*ip)*ido) = ch[i + (k + jc*l1)*ido] - ch[i + (k + j*l1)*ido];
943 for (j=1; j<ipph; j++) {
946 for (i=2; i<ido; i+=2) {
948 for (k=0; k<l1; k++) {
949 ref(cc,i - 1 + (j2 + k*ip)*ido) = ch[i - 1 + (k + j*l1)*ido] + ch[i - 1 + (k + jc*l1)*ido];
950 ref(cc,ic - 1 + (j2 - 1 + k*ip)*ido) = ch[i - 1 + (k + j*l1)*ido] - ch[i - 1 + (k + jc*l1)*ido];
951 ref(cc,i + (j2 + k*ip)*ido) = ch[i + (k + j*l1)*ido] + ch[i + (k + jc*l1)*ido];
952 ref(cc,ic + (j2 - 1 + k*ip)*ido) = ch[i + (k + jc*l1)*ido] - ch[i + (k + j*l1)*ido];
960 static void radbg(int ido, int ip, int l1, int idl1,
961 Treal cc[], Treal ch[], const Treal wa[])
963 static const Treal twopi = 6.28318530717959;
964 int idij, ipph, i, j, k, l, j2, ic, jc, lc, ik, is;
965 Treal dc2, ai1, ai2, ar1, ar2, ds2;
967 Treal dcp, arg, dsp, ar1h, ar2h;
974 for (k=0; k<l1; k++) {
975 for (i=0; i<ido; i++) {
976 ch[i + k*ido] = ref(cc,i + k*ip*ido);
980 for (i=0; i<ido; i++) {
981 for (k=0; k<l1; k++) {
982 ch[i + k*ido] = ref(cc,i + k*ip*ido);
986 for (j=1; j<ipph; j++) {
989 for (k=0; k<l1; k++) {
990 ch[(k + j*l1)*ido] = ref(cc,ido-1 + (j2 - 1 + k*ip)*ido) + ref(cc,ido-1 + (j2 - 1 + k*ip)*
992 ch[(k + jc*l1)*ido] = ref(cc,(j2 + k*ip)*ido) + ref(cc,(j2 + k*ip)*ido);
998 for (j=1; j<ipph; j++) {
1000 for (k=0; k<l1; k++) {
1001 for (i=2; i<ido; i+=2) {
1003 ch[i - 1 + (k + j*l1)*ido] = ref(cc,i - 1 + (2*j + k*ip)*ido) + ref(cc,
1004 ic - 1 + (2*j - 1 + k*ip)*ido);
1005 ch[i - 1 + (k + jc*l1)*ido] = ref(cc,i - 1 + (2*j + k*ip)*ido) -
1006 ref(cc,ic - 1 + (2*j - 1 + k*ip)*ido);
1007 ch[i + (k + j*l1)*ido] = ref(cc,i + (2*j + k*ip)*ido) - ref(cc,ic
1008 + (2*j - 1 + k*ip)*ido);
1009 ch[i + (k + jc*l1)*ido] = ref(cc,i + (2*j + k*ip)*ido) + ref(cc,ic
1010 + (2*j - 1 + k*ip)*ido);
1015 for (j=1; j<ipph; j++) {
1017 for (i=2; i<ido; i+=2) {
1019 for (k=0; k<l1; k++) {
1020 ch[i - 1 + (k + j*l1)*ido] = ref(cc,i - 1 + (2*j + k*ip)*ido) + ref(cc,
1021 ic - 1 + (2*j - 1 + k*ip)*ido);
1022 ch[i - 1 + (k + jc*l1)*ido] = ref(cc,i - 1 + (2*j + k*ip)*ido) -
1023 ref(cc,ic - 1 + (2*j - 1 + k*ip)*ido);
1024 ch[i + (k + j*l1)*ido] = ref(cc,i + (2*j + k*ip)*ido) - ref(cc,ic
1025 + (2*j - 1 + k*ip)*ido);
1026 ch[i + (k + jc*l1)*ido] = ref(cc,i + (2*j + k*ip)*ido) + ref(cc,ic
1027 + (2*j - 1 + k*ip)*ido);
1036 for (l=1; l<ipph; l++) {
1038 ar1h = dcp*ar1 - dsp*ai1;
1039 ai1 = dcp*ai1 + dsp*ar1;
1041 for (ik=0; ik<idl1; ik++) {
1042 cc[ik + l*idl1] = ch[ik] + ar1*ch[ik + idl1];
1043 cc[ik + lc*idl1] = ai1*ch[ik + (ip-1)*idl1];
1049 for (j=2; j<ipph; j++) {
1051 ar2h = dc2*ar2 - ds2*ai2;
1052 ai2 = dc2*ai2 + ds2*ar2;
1054 for (ik=0; ik<idl1; ik++) {
1055 cc[ik + l*idl1] += ar2*ch[ik + j*idl1];
1056 cc[ik + lc*idl1] += ai2*ch[ik + jc*idl1];
1060 for (j=1; j<ipph; j++) {
1061 for (ik=0; ik<idl1; ik++) {
1062 ch[ik] += ch[ik + j*idl1];
1065 for (j=1; j<ipph; j++) {
1067 for (k=0; k<l1; k++) {
1068 ch[(k + j*l1)*ido] = cc[(k + j*l1)*ido] - cc[(k + jc*l1)*ido];
1069 ch[(k + jc*l1)*ido] = cc[(k + j*l1)*ido] + cc[(k + jc*l1)*ido];
1073 if (ido == 1) return;
1075 for (j=1; j<ipph; j++) {
1077 for (k=0; k<l1; k++) {
1078 for (i=2; i<ido; i+=2) {
1079 ch[i - 1 + (k + j*l1)*ido] = cc[i - 1 + (k + j*l1)*ido] - cc[i + (k + jc*l1)*ido];
1080 ch[i - 1 + (k + jc*l1)*ido] = cc[i - 1 + (k + j*l1)*ido] + cc[i + (k + jc*l1)*ido];
1081 ch[i + (k + j*l1)*ido] = cc[i + (k + j*l1)*ido] + cc[i - 1 + (k + jc*l1)*ido];
1082 ch[i + (k + jc*l1)*ido] = cc[i + (k + j*l1)*ido] - cc[i - 1 + (k + jc*l1)*ido];
1087 for (j=1; j<ipph; j++) {
1089 for (i=2; i<ido; i+=2) {
1090 for (k=0; k<l1; k++) {
1091 ch[i - 1 + (k + j*l1)*ido] = cc[i - 1 + (k + j*l1)*ido] - cc[i + (k + jc*l1)*ido];
1092 ch[i - 1 + (k + jc*l1)*ido] = cc[i - 1 + (k + j *l1)*ido] + cc[i + (k + jc*l1)*ido];
1093 ch[i + (k + j*l1)*ido] = cc[i + (k + j*l1)*ido] + cc[i - 1 + (k + jc*l1)*ido];
1094 ch[i + (k + jc*l1)*ido] = cc[i + (k + j*l1)*ido] - cc[i - 1 + (k + jc*l1)*ido];
1099 for (ik=0; ik<idl1; ik++) cc[ik] = ch[ik];
1100 for (j=1; j<ip; j++)
1101 for (k=0; k<l1; k++)
1102 cc[(k + j*l1)*ido] = ch[(k + j*l1)*ido];
1105 for (j=1; j<ip; j++) {
1108 for (i=2; i<ido; i+=2) {
1110 for (k=0; k<l1; k++) {
1111 cc[i - 1 + (k + j*l1)*ido] = wa[idij - 1]*ch[i - 1 + (k + j*l1)*ido] - wa[idij]*
1112 ch[i + (k + j*l1)*ido];
1113 cc[i + (k + j*l1)*ido] = wa[idij - 1]*ch[i + (k + j*l1)*ido] + wa[idij]*ch[i - 1 + (k + j*l1)*ido];
1119 for (j=1; j<ip; j++) {
1121 for (k=0; k<l1; k++) {
1123 for (i=2; i<ido; i+=2) {
1125 cc[i - 1 + (k + j*l1)*ido] = wa[idij-1]*ch[i - 1 + (k + j*l1)*ido] - wa[idij]*
1126 ch[i + (k + j*l1)*ido];
1127 cc[i + (k + j*l1)*ido] = wa[idij-1]*ch[i + (k + j*l1)*ido] + wa[idij]*ch[i - 1 + (k + j*l1)*ido];
1134 /* ----------------------------------------------------------------------
1135 cfftf1, cfftf, cfftb, cffti1, cffti. Complex FFTs.
1136 ---------------------------------------------------------------------- */
1138 void fftpack_cfftf1(int n, Treal c[], Treal ch[], const Treal wa[], const int ifac[MAXFAC+2], int isign)
1142 int na, nf, ip, iw, ix2, ix3, ix4, nac, ido, idl1;
1143 Treal *cinput, *coutput;
1148 for (k1=2; k1<=nf+1; k1++) {
1165 passf4(idot, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3], isign);
1169 passf2(idot, l1, cinput, coutput, &wa[iw], isign);
1174 passf3(idot, l1, cinput, coutput, &wa[iw], &wa[ix2], isign);
1181 passf5(idot, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
1185 passf(&nac, idot, ip, l1, idl1, cinput, coutput, &wa[iw], isign);
1186 if (nac != 0) na = !na;
1189 iw += (ip - 1)*idot;
1191 if (na == 0) return;
1192 for (i=0; i<2*n; i++) c[i] = ch[i];
1196 static void factorize(int n, int ifac[MAXFAC+2], const int ntryh[NSPECIAL])
1197 /* Factorize n in factors in ntryh and rest. On exit,
1198 ifac[0] contains n and ifac[1] contains number of factors,
1199 the factors start from ifac[2]. */
1201 int ntry=3, i, j=0, ib, nf=0, nl=n, nq, nr;
1211 if (nr != 0) goto startloop;
1213 ifac[nf + 1] = ntry;
1215 if (ntry == 2 && nf != 1) {
1216 for (i=2; i<=nf; i++) {
1218 ifac[ib + 1] = ifac[ib];
1228 void fftpack_cffti1(int n, Treal wa[], int ifac[MAXFAC+2])
1230 static const Treal twopi = 6.28318530717959;
1231 Treal arg, argh, argld, fi;
1237 static const int ntryh[NSPECIAL] = {
1238 3,4,2,5 }; /* Do not change the order of these. */
1240 factorize(n,ifac,ntryh);
1242 argh = twopi/(Treal)n;
1245 for (k1=1; k1<=nf; k1++) {
1250 idot = ido + ido + 2;
1252 for (j=1; j<=ipm; j++) {
1259 for (ii=4; ii<=idot; ii+=2) {
1275 /* ----------------------------------------------------------------------
1276 rfftf1, rfftb1, rfftf, rfftb, rffti1, rffti. Treal FFTs.
1277 ---------------------------------------------------------------------- */
1279 void fftpack_rfftf1(int n, Treal c[], Treal ch[], const Treal wa[], const int ifac[MAXFAC+2])
1282 int k1, l1, l2, na, kh, nf, ip, iw, ix2, ix3, ix4, ido, idl1;
1283 Treal *cinput, *coutput;
1288 for (k1 = 1; k1 <= nf; ++k1) {
1307 radf4(ido, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3]);
1310 radf2(ido, l1, cinput, coutput, &wa[iw]);
1314 radf3(ido, l1, cinput, coutput, &wa[iw], &wa[ix2]);
1320 radf5(ido, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4]);
1326 radfg(ido, ip, l1, idl1, c, ch, &wa[iw]);
1329 radfg(ido, ip, l1, idl1, ch, c, &wa[iw]);
1335 if (na == 1) return;
1336 for (i = 0; i < n; i++) c[i] = ch[i];
1340 void fftpack_rfftb1(int n, Treal c[], Treal ch[], const Treal wa[], const int ifac[MAXFAC+2])
1343 int k1, l1, l2, na, nf, ip, iw, ix2, ix3, ix4, ido, idl1;
1344 Treal *cinput, *coutput;
1349 for (k1=1; k1<=nf; k1++) {
1365 radb4(ido, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3]);
1369 radb2(ido, l1, cinput, coutput, &wa[iw]);
1374 radb3(ido, l1, cinput, coutput, &wa[iw], &wa[ix2]);
1381 radb5(ido, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4]);
1385 radbg(ido, ip, l1, idl1, cinput, coutput, &wa[iw]);
1386 if (ido == 1) na = !na;
1391 if (na == 0) return;
1392 for (i=0; i<n; i++) c[i] = ch[i];
1396 void fftpack_rffti1(int n, Treal wa[], int ifac[MAXFAC+2])
1398 static const Treal twopi = 6.28318530717959;
1399 Treal arg, argh, argld, fi;
1402 int ld, ii, nf, ip, is;
1404 static const int ntryh[NSPECIAL] = {
1405 4,2,3,5 }; /* Do not change the order of these. */
1406 factorize(n,ifac,ntryh);
1412 if (nfm1 == 0) return;
1413 for (k1 = 1; k1 <= nfm1; k1++) {
1419 for (j = 1; j <= ipm; ++j) {
1422 argld = (Treal) ld*argh;
1424 for (ii = 3; ii <= ido; ii += 2) {
1428 wa[i - 2] = cos(arg);
1429 wa[i - 1] = sin(arg);