1 | /********************************************************************
|
---|
2 | * *
|
---|
3 | * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
---|
4 | * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
---|
5 | * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
---|
6 | * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
---|
7 | * *
|
---|
8 | * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
---|
9 | * by the Xiph.Org Foundation https://xiph.org/ *
|
---|
10 | * *
|
---|
11 | ********************************************************************
|
---|
12 |
|
---|
13 | function: *unnormalized* fft transform
|
---|
14 |
|
---|
15 | ********************************************************************/
|
---|
16 |
|
---|
17 | /* FFT implementation from OggSquish, minus cosine transforms,
|
---|
18 | * minus all but radix 2/4 case. In Vorbis we only need this
|
---|
19 | * cut-down version.
|
---|
20 | *
|
---|
21 | * To do more than just power-of-two sized vectors, see the full
|
---|
22 | * version I wrote for NetLib.
|
---|
23 | *
|
---|
24 | * Note that the packing is a little strange; rather than the FFT r/i
|
---|
25 | * packing following R_0, I_n, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1,
|
---|
26 | * it follows R_0, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, I_n like the
|
---|
27 | * FORTRAN version
|
---|
28 | */
|
---|
29 |
|
---|
30 | #include <stdlib.h>
|
---|
31 | #include <string.h>
|
---|
32 | #include <math.h>
|
---|
33 | #include "smallft.h"
|
---|
34 | #include "os.h"
|
---|
35 | #include "misc.h"
|
---|
36 |
|
---|
37 | static void drfti1(int n, float *wa, int *ifac){
|
---|
38 | static int ntryh[4] = { 4,2,3,5 };
|
---|
39 | static float tpi = 6.28318530717958648f;
|
---|
40 | float arg,argh,argld,fi;
|
---|
41 | int ntry=0,i,j=-1;
|
---|
42 | int k1, l1, l2, ib;
|
---|
43 | int ld, ii, ip, is, nq, nr;
|
---|
44 | int ido, ipm, nfm1;
|
---|
45 | int nl=n;
|
---|
46 | int nf=0;
|
---|
47 |
|
---|
48 | L101:
|
---|
49 | j++;
|
---|
50 | if (j < 4)
|
---|
51 | ntry=ntryh[j];
|
---|
52 | else
|
---|
53 | ntry+=2;
|
---|
54 |
|
---|
55 | L104:
|
---|
56 | nq=nl/ntry;
|
---|
57 | nr=nl-ntry*nq;
|
---|
58 | if (nr!=0) goto L101;
|
---|
59 |
|
---|
60 | nf++;
|
---|
61 | ifac[nf+1]=ntry;
|
---|
62 | nl=nq;
|
---|
63 | if(ntry!=2)goto L107;
|
---|
64 | if(nf==1)goto L107;
|
---|
65 |
|
---|
66 | for (i=1;i<nf;i++){
|
---|
67 | ib=nf-i+1;
|
---|
68 | ifac[ib+1]=ifac[ib];
|
---|
69 | }
|
---|
70 | ifac[2] = 2;
|
---|
71 |
|
---|
72 | L107:
|
---|
73 | if(nl!=1)goto L104;
|
---|
74 | ifac[0]=n;
|
---|
75 | ifac[1]=nf;
|
---|
76 | argh=tpi/n;
|
---|
77 | is=0;
|
---|
78 | nfm1=nf-1;
|
---|
79 | l1=1;
|
---|
80 |
|
---|
81 | if(nfm1==0)return;
|
---|
82 |
|
---|
83 | for (k1=0;k1<nfm1;k1++){
|
---|
84 | ip=ifac[k1+2];
|
---|
85 | ld=0;
|
---|
86 | l2=l1*ip;
|
---|
87 | ido=n/l2;
|
---|
88 | ipm=ip-1;
|
---|
89 |
|
---|
90 | for (j=0;j<ipm;j++){
|
---|
91 | ld+=l1;
|
---|
92 | i=is;
|
---|
93 | argld=(float)ld*argh;
|
---|
94 | fi=0.f;
|
---|
95 | for (ii=2;ii<ido;ii+=2){
|
---|
96 | fi+=1.f;
|
---|
97 | arg=fi*argld;
|
---|
98 | wa[i++]=cos(arg);
|
---|
99 | wa[i++]=sin(arg);
|
---|
100 | }
|
---|
101 | is+=ido;
|
---|
102 | }
|
---|
103 | l1=l2;
|
---|
104 | }
|
---|
105 | }
|
---|
106 |
|
---|
107 | static void fdrffti(int n, float *wsave, int *ifac){
|
---|
108 |
|
---|
109 | if (n == 1) return;
|
---|
110 | drfti1(n, wsave+n, ifac);
|
---|
111 | }
|
---|
112 |
|
---|
113 | static void dradf2(int ido,int l1,float *cc,float *ch,float *wa1){
|
---|
114 | int i,k;
|
---|
115 | float ti2,tr2;
|
---|
116 | int t0,t1,t2,t3,t4,t5,t6;
|
---|
117 |
|
---|
118 | t1=0;
|
---|
119 | t0=(t2=l1*ido);
|
---|
120 | t3=ido<<1;
|
---|
121 | for(k=0;k<l1;k++){
|
---|
122 | ch[t1<<1]=cc[t1]+cc[t2];
|
---|
123 | ch[(t1<<1)+t3-1]=cc[t1]-cc[t2];
|
---|
124 | t1+=ido;
|
---|
125 | t2+=ido;
|
---|
126 | }
|
---|
127 |
|
---|
128 | if(ido<2)return;
|
---|
129 | if(ido==2)goto L105;
|
---|
130 |
|
---|
131 | t1=0;
|
---|
132 | t2=t0;
|
---|
133 | for(k=0;k<l1;k++){
|
---|
134 | t3=t2;
|
---|
135 | t4=(t1<<1)+(ido<<1);
|
---|
136 | t5=t1;
|
---|
137 | t6=t1+t1;
|
---|
138 | for(i=2;i<ido;i+=2){
|
---|
139 | t3+=2;
|
---|
140 | t4-=2;
|
---|
141 | t5+=2;
|
---|
142 | t6+=2;
|
---|
143 | tr2=wa1[i-2]*cc[t3-1]+wa1[i-1]*cc[t3];
|
---|
144 | ti2=wa1[i-2]*cc[t3]-wa1[i-1]*cc[t3-1];
|
---|
145 | ch[t6]=cc[t5]+ti2;
|
---|
146 | ch[t4]=ti2-cc[t5];
|
---|
147 | ch[t6-1]=cc[t5-1]+tr2;
|
---|
148 | ch[t4-1]=cc[t5-1]-tr2;
|
---|
149 | }
|
---|
150 | t1+=ido;
|
---|
151 | t2+=ido;
|
---|
152 | }
|
---|
153 |
|
---|
154 | if(ido%2==1)return;
|
---|
155 |
|
---|
156 | L105:
|
---|
157 | t3=(t2=(t1=ido)-1);
|
---|
158 | t2+=t0;
|
---|
159 | for(k=0;k<l1;k++){
|
---|
160 | ch[t1]=-cc[t2];
|
---|
161 | ch[t1-1]=cc[t3];
|
---|
162 | t1+=ido<<1;
|
---|
163 | t2+=ido;
|
---|
164 | t3+=ido;
|
---|
165 | }
|
---|
166 | }
|
---|
167 |
|
---|
168 | static void dradf4(int ido,int l1,float *cc,float *ch,float *wa1,
|
---|
169 | float *wa2,float *wa3){
|
---|
170 | static float hsqt2 = .70710678118654752f;
|
---|
171 | int i,k,t0,t1,t2,t3,t4,t5,t6;
|
---|
172 | float ci2,ci3,ci4,cr2,cr3,cr4,ti1,ti2,ti3,ti4,tr1,tr2,tr3,tr4;
|
---|
173 | t0=l1*ido;
|
---|
174 |
|
---|
175 | t1=t0;
|
---|
176 | t4=t1<<1;
|
---|
177 | t2=t1+(t1<<1);
|
---|
178 | t3=0;
|
---|
179 |
|
---|
180 | for(k=0;k<l1;k++){
|
---|
181 | tr1=cc[t1]+cc[t2];
|
---|
182 | tr2=cc[t3]+cc[t4];
|
---|
183 |
|
---|
184 | ch[t5=t3<<2]=tr1+tr2;
|
---|
185 | ch[(ido<<2)+t5-1]=tr2-tr1;
|
---|
186 | ch[(t5+=(ido<<1))-1]=cc[t3]-cc[t4];
|
---|
187 | ch[t5]=cc[t2]-cc[t1];
|
---|
188 |
|
---|
189 | t1+=ido;
|
---|
190 | t2+=ido;
|
---|
191 | t3+=ido;
|
---|
192 | t4+=ido;
|
---|
193 | }
|
---|
194 |
|
---|
195 | if(ido<2)return;
|
---|
196 | if(ido==2)goto L105;
|
---|
197 |
|
---|
198 |
|
---|
199 | t1=0;
|
---|
200 | for(k=0;k<l1;k++){
|
---|
201 | t2=t1;
|
---|
202 | t4=t1<<2;
|
---|
203 | t5=(t6=ido<<1)+t4;
|
---|
204 | for(i=2;i<ido;i+=2){
|
---|
205 | t3=(t2+=2);
|
---|
206 | t4+=2;
|
---|
207 | t5-=2;
|
---|
208 |
|
---|
209 | t3+=t0;
|
---|
210 | cr2=wa1[i-2]*cc[t3-1]+wa1[i-1]*cc[t3];
|
---|
211 | ci2=wa1[i-2]*cc[t3]-wa1[i-1]*cc[t3-1];
|
---|
212 | t3+=t0;
|
---|
213 | cr3=wa2[i-2]*cc[t3-1]+wa2[i-1]*cc[t3];
|
---|
214 | ci3=wa2[i-2]*cc[t3]-wa2[i-1]*cc[t3-1];
|
---|
215 | t3+=t0;
|
---|
216 | cr4=wa3[i-2]*cc[t3-1]+wa3[i-1]*cc[t3];
|
---|
217 | ci4=wa3[i-2]*cc[t3]-wa3[i-1]*cc[t3-1];
|
---|
218 |
|
---|
219 | tr1=cr2+cr4;
|
---|
220 | tr4=cr4-cr2;
|
---|
221 | ti1=ci2+ci4;
|
---|
222 | ti4=ci2-ci4;
|
---|
223 |
|
---|
224 | ti2=cc[t2]+ci3;
|
---|
225 | ti3=cc[t2]-ci3;
|
---|
226 | tr2=cc[t2-1]+cr3;
|
---|
227 | tr3=cc[t2-1]-cr3;
|
---|
228 |
|
---|
229 | ch[t4-1]=tr1+tr2;
|
---|
230 | ch[t4]=ti1+ti2;
|
---|
231 |
|
---|
232 | ch[t5-1]=tr3-ti4;
|
---|
233 | ch[t5]=tr4-ti3;
|
---|
234 |
|
---|
235 | ch[t4+t6-1]=ti4+tr3;
|
---|
236 | ch[t4+t6]=tr4+ti3;
|
---|
237 |
|
---|
238 | ch[t5+t6-1]=tr2-tr1;
|
---|
239 | ch[t5+t6]=ti1-ti2;
|
---|
240 | }
|
---|
241 | t1+=ido;
|
---|
242 | }
|
---|
243 | if(ido&1)return;
|
---|
244 |
|
---|
245 | L105:
|
---|
246 |
|
---|
247 | t2=(t1=t0+ido-1)+(t0<<1);
|
---|
248 | t3=ido<<2;
|
---|
249 | t4=ido;
|
---|
250 | t5=ido<<1;
|
---|
251 | t6=ido;
|
---|
252 |
|
---|
253 | for(k=0;k<l1;k++){
|
---|
254 | ti1=-hsqt2*(cc[t1]+cc[t2]);
|
---|
255 | tr1=hsqt2*(cc[t1]-cc[t2]);
|
---|
256 |
|
---|
257 | ch[t4-1]=tr1+cc[t6-1];
|
---|
258 | ch[t4+t5-1]=cc[t6-1]-tr1;
|
---|
259 |
|
---|
260 | ch[t4]=ti1-cc[t1+t0];
|
---|
261 | ch[t4+t5]=ti1+cc[t1+t0];
|
---|
262 |
|
---|
263 | t1+=ido;
|
---|
264 | t2+=ido;
|
---|
265 | t4+=t3;
|
---|
266 | t6+=ido;
|
---|
267 | }
|
---|
268 | }
|
---|
269 |
|
---|
270 | static void dradfg(int ido,int ip,int l1,int idl1,float *cc,float *c1,
|
---|
271 | float *c2,float *ch,float *ch2,float *wa){
|
---|
272 |
|
---|
273 | static float tpi=6.283185307179586f;
|
---|
274 | int idij,ipph,i,j,k,l,ic,ik,is;
|
---|
275 | int t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
|
---|
276 | float dc2,ai1,ai2,ar1,ar2,ds2;
|
---|
277 | int nbd;
|
---|
278 | float dcp,arg,dsp,ar1h,ar2h;
|
---|
279 | int idp2,ipp2;
|
---|
280 |
|
---|
281 | arg=tpi/(float)ip;
|
---|
282 | dcp=cos(arg);
|
---|
283 | dsp=sin(arg);
|
---|
284 | ipph=(ip+1)>>1;
|
---|
285 | ipp2=ip;
|
---|
286 | idp2=ido;
|
---|
287 | nbd=(ido-1)>>1;
|
---|
288 | t0=l1*ido;
|
---|
289 | t10=ip*ido;
|
---|
290 |
|
---|
291 | if(ido==1)goto L119;
|
---|
292 | for(ik=0;ik<idl1;ik++)ch2[ik]=c2[ik];
|
---|
293 |
|
---|
294 | t1=0;
|
---|
295 | for(j=1;j<ip;j++){
|
---|
296 | t1+=t0;
|
---|
297 | t2=t1;
|
---|
298 | for(k=0;k<l1;k++){
|
---|
299 | ch[t2]=c1[t2];
|
---|
300 | t2+=ido;
|
---|
301 | }
|
---|
302 | }
|
---|
303 |
|
---|
304 | is=-ido;
|
---|
305 | t1=0;
|
---|
306 | if(nbd>l1){
|
---|
307 | for(j=1;j<ip;j++){
|
---|
308 | t1+=t0;
|
---|
309 | is+=ido;
|
---|
310 | t2= -ido+t1;
|
---|
311 | for(k=0;k<l1;k++){
|
---|
312 | idij=is-1;
|
---|
313 | t2+=ido;
|
---|
314 | t3=t2;
|
---|
315 | for(i=2;i<ido;i+=2){
|
---|
316 | idij+=2;
|
---|
317 | t3+=2;
|
---|
318 | ch[t3-1]=wa[idij-1]*c1[t3-1]+wa[idij]*c1[t3];
|
---|
319 | ch[t3]=wa[idij-1]*c1[t3]-wa[idij]*c1[t3-1];
|
---|
320 | }
|
---|
321 | }
|
---|
322 | }
|
---|
323 | }else{
|
---|
324 |
|
---|
325 | for(j=1;j<ip;j++){
|
---|
326 | is+=ido;
|
---|
327 | idij=is-1;
|
---|
328 | t1+=t0;
|
---|
329 | t2=t1;
|
---|
330 | for(i=2;i<ido;i+=2){
|
---|
331 | idij+=2;
|
---|
332 | t2+=2;
|
---|
333 | t3=t2;
|
---|
334 | for(k=0;k<l1;k++){
|
---|
335 | ch[t3-1]=wa[idij-1]*c1[t3-1]+wa[idij]*c1[t3];
|
---|
336 | ch[t3]=wa[idij-1]*c1[t3]-wa[idij]*c1[t3-1];
|
---|
337 | t3+=ido;
|
---|
338 | }
|
---|
339 | }
|
---|
340 | }
|
---|
341 | }
|
---|
342 |
|
---|
343 | t1=0;
|
---|
344 | t2=ipp2*t0;
|
---|
345 | if(nbd<l1){
|
---|
346 | for(j=1;j<ipph;j++){
|
---|
347 | t1+=t0;
|
---|
348 | t2-=t0;
|
---|
349 | t3=t1;
|
---|
350 | t4=t2;
|
---|
351 | for(i=2;i<ido;i+=2){
|
---|
352 | t3+=2;
|
---|
353 | t4+=2;
|
---|
354 | t5=t3-ido;
|
---|
355 | t6=t4-ido;
|
---|
356 | for(k=0;k<l1;k++){
|
---|
357 | t5+=ido;
|
---|
358 | t6+=ido;
|
---|
359 | c1[t5-1]=ch[t5-1]+ch[t6-1];
|
---|
360 | c1[t6-1]=ch[t5]-ch[t6];
|
---|
361 | c1[t5]=ch[t5]+ch[t6];
|
---|
362 | c1[t6]=ch[t6-1]-ch[t5-1];
|
---|
363 | }
|
---|
364 | }
|
---|
365 | }
|
---|
366 | }else{
|
---|
367 | for(j=1;j<ipph;j++){
|
---|
368 | t1+=t0;
|
---|
369 | t2-=t0;
|
---|
370 | t3=t1;
|
---|
371 | t4=t2;
|
---|
372 | for(k=0;k<l1;k++){
|
---|
373 | t5=t3;
|
---|
374 | t6=t4;
|
---|
375 | for(i=2;i<ido;i+=2){
|
---|
376 | t5+=2;
|
---|
377 | t6+=2;
|
---|
378 | c1[t5-1]=ch[t5-1]+ch[t6-1];
|
---|
379 | c1[t6-1]=ch[t5]-ch[t6];
|
---|
380 | c1[t5]=ch[t5]+ch[t6];
|
---|
381 | c1[t6]=ch[t6-1]-ch[t5-1];
|
---|
382 | }
|
---|
383 | t3+=ido;
|
---|
384 | t4+=ido;
|
---|
385 | }
|
---|
386 | }
|
---|
387 | }
|
---|
388 |
|
---|
389 | L119:
|
---|
390 | for(ik=0;ik<idl1;ik++)c2[ik]=ch2[ik];
|
---|
391 |
|
---|
392 | t1=0;
|
---|
393 | t2=ipp2*idl1;
|
---|
394 | for(j=1;j<ipph;j++){
|
---|
395 | t1+=t0;
|
---|
396 | t2-=t0;
|
---|
397 | t3=t1-ido;
|
---|
398 | t4=t2-ido;
|
---|
399 | for(k=0;k<l1;k++){
|
---|
400 | t3+=ido;
|
---|
401 | t4+=ido;
|
---|
402 | c1[t3]=ch[t3]+ch[t4];
|
---|
403 | c1[t4]=ch[t4]-ch[t3];
|
---|
404 | }
|
---|
405 | }
|
---|
406 |
|
---|
407 | ar1=1.f;
|
---|
408 | ai1=0.f;
|
---|
409 | t1=0;
|
---|
410 | t2=ipp2*idl1;
|
---|
411 | t3=(ip-1)*idl1;
|
---|
412 | for(l=1;l<ipph;l++){
|
---|
413 | t1+=idl1;
|
---|
414 | t2-=idl1;
|
---|
415 | ar1h=dcp*ar1-dsp*ai1;
|
---|
416 | ai1=dcp*ai1+dsp*ar1;
|
---|
417 | ar1=ar1h;
|
---|
418 | t4=t1;
|
---|
419 | t5=t2;
|
---|
420 | t6=t3;
|
---|
421 | t7=idl1;
|
---|
422 |
|
---|
423 | for(ik=0;ik<idl1;ik++){
|
---|
424 | ch2[t4++]=c2[ik]+ar1*c2[t7++];
|
---|
425 | ch2[t5++]=ai1*c2[t6++];
|
---|
426 | }
|
---|
427 |
|
---|
428 | dc2=ar1;
|
---|
429 | ds2=ai1;
|
---|
430 | ar2=ar1;
|
---|
431 | ai2=ai1;
|
---|
432 |
|
---|
433 | t4=idl1;
|
---|
434 | t5=(ipp2-1)*idl1;
|
---|
435 | for(j=2;j<ipph;j++){
|
---|
436 | t4+=idl1;
|
---|
437 | t5-=idl1;
|
---|
438 |
|
---|
439 | ar2h=dc2*ar2-ds2*ai2;
|
---|
440 | ai2=dc2*ai2+ds2*ar2;
|
---|
441 | ar2=ar2h;
|
---|
442 |
|
---|
443 | t6=t1;
|
---|
444 | t7=t2;
|
---|
445 | t8=t4;
|
---|
446 | t9=t5;
|
---|
447 | for(ik=0;ik<idl1;ik++){
|
---|
448 | ch2[t6++]+=ar2*c2[t8++];
|
---|
449 | ch2[t7++]+=ai2*c2[t9++];
|
---|
450 | }
|
---|
451 | }
|
---|
452 | }
|
---|
453 |
|
---|
454 | t1=0;
|
---|
455 | for(j=1;j<ipph;j++){
|
---|
456 | t1+=idl1;
|
---|
457 | t2=t1;
|
---|
458 | for(ik=0;ik<idl1;ik++)ch2[ik]+=c2[t2++];
|
---|
459 | }
|
---|
460 |
|
---|
461 | if(ido<l1)goto L132;
|
---|
462 |
|
---|
463 | t1=0;
|
---|
464 | t2=0;
|
---|
465 | for(k=0;k<l1;k++){
|
---|
466 | t3=t1;
|
---|
467 | t4=t2;
|
---|
468 | for(i=0;i<ido;i++)cc[t4++]=ch[t3++];
|
---|
469 | t1+=ido;
|
---|
470 | t2+=t10;
|
---|
471 | }
|
---|
472 |
|
---|
473 | goto L135;
|
---|
474 |
|
---|
475 | L132:
|
---|
476 | for(i=0;i<ido;i++){
|
---|
477 | t1=i;
|
---|
478 | t2=i;
|
---|
479 | for(k=0;k<l1;k++){
|
---|
480 | cc[t2]=ch[t1];
|
---|
481 | t1+=ido;
|
---|
482 | t2+=t10;
|
---|
483 | }
|
---|
484 | }
|
---|
485 |
|
---|
486 | L135:
|
---|
487 | t1=0;
|
---|
488 | t2=ido<<1;
|
---|
489 | t3=0;
|
---|
490 | t4=ipp2*t0;
|
---|
491 | for(j=1;j<ipph;j++){
|
---|
492 |
|
---|
493 | t1+=t2;
|
---|
494 | t3+=t0;
|
---|
495 | t4-=t0;
|
---|
496 |
|
---|
497 | t5=t1;
|
---|
498 | t6=t3;
|
---|
499 | t7=t4;
|
---|
500 |
|
---|
501 | for(k=0;k<l1;k++){
|
---|
502 | cc[t5-1]=ch[t6];
|
---|
503 | cc[t5]=ch[t7];
|
---|
504 | t5+=t10;
|
---|
505 | t6+=ido;
|
---|
506 | t7+=ido;
|
---|
507 | }
|
---|
508 | }
|
---|
509 |
|
---|
510 | if(ido==1)return;
|
---|
511 | if(nbd<l1)goto L141;
|
---|
512 |
|
---|
513 | t1=-ido;
|
---|
514 | t3=0;
|
---|
515 | t4=0;
|
---|
516 | t5=ipp2*t0;
|
---|
517 | for(j=1;j<ipph;j++){
|
---|
518 | t1+=t2;
|
---|
519 | t3+=t2;
|
---|
520 | t4+=t0;
|
---|
521 | t5-=t0;
|
---|
522 | t6=t1;
|
---|
523 | t7=t3;
|
---|
524 | t8=t4;
|
---|
525 | t9=t5;
|
---|
526 | for(k=0;k<l1;k++){
|
---|
527 | for(i=2;i<ido;i+=2){
|
---|
528 | ic=idp2-i;
|
---|
529 | cc[i+t7-1]=ch[i+t8-1]+ch[i+t9-1];
|
---|
530 | cc[ic+t6-1]=ch[i+t8-1]-ch[i+t9-1];
|
---|
531 | cc[i+t7]=ch[i+t8]+ch[i+t9];
|
---|
532 | cc[ic+t6]=ch[i+t9]-ch[i+t8];
|
---|
533 | }
|
---|
534 | t6+=t10;
|
---|
535 | t7+=t10;
|
---|
536 | t8+=ido;
|
---|
537 | t9+=ido;
|
---|
538 | }
|
---|
539 | }
|
---|
540 | return;
|
---|
541 |
|
---|
542 | L141:
|
---|
543 |
|
---|
544 | t1=-ido;
|
---|
545 | t3=0;
|
---|
546 | t4=0;
|
---|
547 | t5=ipp2*t0;
|
---|
548 | for(j=1;j<ipph;j++){
|
---|
549 | t1+=t2;
|
---|
550 | t3+=t2;
|
---|
551 | t4+=t0;
|
---|
552 | t5-=t0;
|
---|
553 | for(i=2;i<ido;i+=2){
|
---|
554 | t6=idp2+t1-i;
|
---|
555 | t7=i+t3;
|
---|
556 | t8=i+t4;
|
---|
557 | t9=i+t5;
|
---|
558 | for(k=0;k<l1;k++){
|
---|
559 | cc[t7-1]=ch[t8-1]+ch[t9-1];
|
---|
560 | cc[t6-1]=ch[t8-1]-ch[t9-1];
|
---|
561 | cc[t7]=ch[t8]+ch[t9];
|
---|
562 | cc[t6]=ch[t9]-ch[t8];
|
---|
563 | t6+=t10;
|
---|
564 | t7+=t10;
|
---|
565 | t8+=ido;
|
---|
566 | t9+=ido;
|
---|
567 | }
|
---|
568 | }
|
---|
569 | }
|
---|
570 | }
|
---|
571 |
|
---|
572 | static void drftf1(int n,float *c,float *ch,float *wa,int *ifac){
|
---|
573 | int i,k1,l1,l2;
|
---|
574 | int na,kh,nf;
|
---|
575 | int ip,iw,ido,idl1,ix2,ix3;
|
---|
576 |
|
---|
577 | nf=ifac[1];
|
---|
578 | na=1;
|
---|
579 | l2=n;
|
---|
580 | iw=n;
|
---|
581 |
|
---|
582 | for(k1=0;k1<nf;k1++){
|
---|
583 | kh=nf-k1;
|
---|
584 | ip=ifac[kh+1];
|
---|
585 | l1=l2/ip;
|
---|
586 | ido=n/l2;
|
---|
587 | idl1=ido*l1;
|
---|
588 | iw-=(ip-1)*ido;
|
---|
589 | na=1-na;
|
---|
590 |
|
---|
591 | if(ip!=4)goto L102;
|
---|
592 |
|
---|
593 | ix2=iw+ido;
|
---|
594 | ix3=ix2+ido;
|
---|
595 | if(na!=0)
|
---|
596 | dradf4(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1);
|
---|
597 | else
|
---|
598 | dradf4(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1);
|
---|
599 | goto L110;
|
---|
600 |
|
---|
601 | L102:
|
---|
602 | if(ip!=2)goto L104;
|
---|
603 | if(na!=0)goto L103;
|
---|
604 |
|
---|
605 | dradf2(ido,l1,c,ch,wa+iw-1);
|
---|
606 | goto L110;
|
---|
607 |
|
---|
608 | L103:
|
---|
609 | dradf2(ido,l1,ch,c,wa+iw-1);
|
---|
610 | goto L110;
|
---|
611 |
|
---|
612 | L104:
|
---|
613 | if(ido==1)na=1-na;
|
---|
614 | if(na!=0)goto L109;
|
---|
615 |
|
---|
616 | dradfg(ido,ip,l1,idl1,c,c,c,ch,ch,wa+iw-1);
|
---|
617 | na=1;
|
---|
618 | goto L110;
|
---|
619 |
|
---|
620 | L109:
|
---|
621 | dradfg(ido,ip,l1,idl1,ch,ch,ch,c,c,wa+iw-1);
|
---|
622 | na=0;
|
---|
623 |
|
---|
624 | L110:
|
---|
625 | l2=l1;
|
---|
626 | }
|
---|
627 |
|
---|
628 | if(na==1)return;
|
---|
629 |
|
---|
630 | for(i=0;i<n;i++)c[i]=ch[i];
|
---|
631 | }
|
---|
632 |
|
---|
633 | static void dradb2(int ido,int l1,float *cc,float *ch,float *wa1){
|
---|
634 | int i,k,t0,t1,t2,t3,t4,t5,t6;
|
---|
635 | float ti2,tr2;
|
---|
636 |
|
---|
637 | t0=l1*ido;
|
---|
638 |
|
---|
639 | t1=0;
|
---|
640 | t2=0;
|
---|
641 | t3=(ido<<1)-1;
|
---|
642 | for(k=0;k<l1;k++){
|
---|
643 | ch[t1]=cc[t2]+cc[t3+t2];
|
---|
644 | ch[t1+t0]=cc[t2]-cc[t3+t2];
|
---|
645 | t2=(t1+=ido)<<1;
|
---|
646 | }
|
---|
647 |
|
---|
648 | if(ido<2)return;
|
---|
649 | if(ido==2)goto L105;
|
---|
650 |
|
---|
651 | t1=0;
|
---|
652 | t2=0;
|
---|
653 | for(k=0;k<l1;k++){
|
---|
654 | t3=t1;
|
---|
655 | t5=(t4=t2)+(ido<<1);
|
---|
656 | t6=t0+t1;
|
---|
657 | for(i=2;i<ido;i+=2){
|
---|
658 | t3+=2;
|
---|
659 | t4+=2;
|
---|
660 | t5-=2;
|
---|
661 | t6+=2;
|
---|
662 | ch[t3-1]=cc[t4-1]+cc[t5-1];
|
---|
663 | tr2=cc[t4-1]-cc[t5-1];
|
---|
664 | ch[t3]=cc[t4]-cc[t5];
|
---|
665 | ti2=cc[t4]+cc[t5];
|
---|
666 | ch[t6-1]=wa1[i-2]*tr2-wa1[i-1]*ti2;
|
---|
667 | ch[t6]=wa1[i-2]*ti2+wa1[i-1]*tr2;
|
---|
668 | }
|
---|
669 | t2=(t1+=ido)<<1;
|
---|
670 | }
|
---|
671 |
|
---|
672 | if(ido%2==1)return;
|
---|
673 |
|
---|
674 | L105:
|
---|
675 | t1=ido-1;
|
---|
676 | t2=ido-1;
|
---|
677 | for(k=0;k<l1;k++){
|
---|
678 | ch[t1]=cc[t2]+cc[t2];
|
---|
679 | ch[t1+t0]=-(cc[t2+1]+cc[t2+1]);
|
---|
680 | t1+=ido;
|
---|
681 | t2+=ido<<1;
|
---|
682 | }
|
---|
683 | }
|
---|
684 |
|
---|
685 | static void dradb3(int ido,int l1,float *cc,float *ch,float *wa1,
|
---|
686 | float *wa2){
|
---|
687 | static float taur = -.5f;
|
---|
688 | static float taui = .8660254037844386f;
|
---|
689 | int i,k,t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
|
---|
690 | float ci2,ci3,di2,di3,cr2,cr3,dr2,dr3,ti2,tr2;
|
---|
691 | t0=l1*ido;
|
---|
692 |
|
---|
693 | t1=0;
|
---|
694 | t2=t0<<1;
|
---|
695 | t3=ido<<1;
|
---|
696 | t4=ido+(ido<<1);
|
---|
697 | t5=0;
|
---|
698 | for(k=0;k<l1;k++){
|
---|
699 | tr2=cc[t3-1]+cc[t3-1];
|
---|
700 | cr2=cc[t5]+(taur*tr2);
|
---|
701 | ch[t1]=cc[t5]+tr2;
|
---|
702 | ci3=taui*(cc[t3]+cc[t3]);
|
---|
703 | ch[t1+t0]=cr2-ci3;
|
---|
704 | ch[t1+t2]=cr2+ci3;
|
---|
705 | t1+=ido;
|
---|
706 | t3+=t4;
|
---|
707 | t5+=t4;
|
---|
708 | }
|
---|
709 |
|
---|
710 | if(ido==1)return;
|
---|
711 |
|
---|
712 | t1=0;
|
---|
713 | t3=ido<<1;
|
---|
714 | for(k=0;k<l1;k++){
|
---|
715 | t7=t1+(t1<<1);
|
---|
716 | t6=(t5=t7+t3);
|
---|
717 | t8=t1;
|
---|
718 | t10=(t9=t1+t0)+t0;
|
---|
719 |
|
---|
720 | for(i=2;i<ido;i+=2){
|
---|
721 | t5+=2;
|
---|
722 | t6-=2;
|
---|
723 | t7+=2;
|
---|
724 | t8+=2;
|
---|
725 | t9+=2;
|
---|
726 | t10+=2;
|
---|
727 | tr2=cc[t5-1]+cc[t6-1];
|
---|
728 | cr2=cc[t7-1]+(taur*tr2);
|
---|
729 | ch[t8-1]=cc[t7-1]+tr2;
|
---|
730 | ti2=cc[t5]-cc[t6];
|
---|
731 | ci2=cc[t7]+(taur*ti2);
|
---|
732 | ch[t8]=cc[t7]+ti2;
|
---|
733 | cr3=taui*(cc[t5-1]-cc[t6-1]);
|
---|
734 | ci3=taui*(cc[t5]+cc[t6]);
|
---|
735 | dr2=cr2-ci3;
|
---|
736 | dr3=cr2+ci3;
|
---|
737 | di2=ci2+cr3;
|
---|
738 | di3=ci2-cr3;
|
---|
739 | ch[t9-1]=wa1[i-2]*dr2-wa1[i-1]*di2;
|
---|
740 | ch[t9]=wa1[i-2]*di2+wa1[i-1]*dr2;
|
---|
741 | ch[t10-1]=wa2[i-2]*dr3-wa2[i-1]*di3;
|
---|
742 | ch[t10]=wa2[i-2]*di3+wa2[i-1]*dr3;
|
---|
743 | }
|
---|
744 | t1+=ido;
|
---|
745 | }
|
---|
746 | }
|
---|
747 |
|
---|
748 | static void dradb4(int ido,int l1,float *cc,float *ch,float *wa1,
|
---|
749 | float *wa2,float *wa3){
|
---|
750 | static float sqrt2=1.414213562373095f;
|
---|
751 | int i,k,t0,t1,t2,t3,t4,t5,t6,t7,t8;
|
---|
752 | float ci2,ci3,ci4,cr2,cr3,cr4,ti1,ti2,ti3,ti4,tr1,tr2,tr3,tr4;
|
---|
753 | t0=l1*ido;
|
---|
754 |
|
---|
755 | t1=0;
|
---|
756 | t2=ido<<2;
|
---|
757 | t3=0;
|
---|
758 | t6=ido<<1;
|
---|
759 | for(k=0;k<l1;k++){
|
---|
760 | t4=t3+t6;
|
---|
761 | t5=t1;
|
---|
762 | tr3=cc[t4-1]+cc[t4-1];
|
---|
763 | tr4=cc[t4]+cc[t4];
|
---|
764 | tr1=cc[t3]-cc[(t4+=t6)-1];
|
---|
765 | tr2=cc[t3]+cc[t4-1];
|
---|
766 | ch[t5]=tr2+tr3;
|
---|
767 | ch[t5+=t0]=tr1-tr4;
|
---|
768 | ch[t5+=t0]=tr2-tr3;
|
---|
769 | ch[t5+=t0]=tr1+tr4;
|
---|
770 | t1+=ido;
|
---|
771 | t3+=t2;
|
---|
772 | }
|
---|
773 |
|
---|
774 | if(ido<2)return;
|
---|
775 | if(ido==2)goto L105;
|
---|
776 |
|
---|
777 | t1=0;
|
---|
778 | for(k=0;k<l1;k++){
|
---|
779 | t5=(t4=(t3=(t2=t1<<2)+t6))+t6;
|
---|
780 | t7=t1;
|
---|
781 | for(i=2;i<ido;i+=2){
|
---|
782 | t2+=2;
|
---|
783 | t3+=2;
|
---|
784 | t4-=2;
|
---|
785 | t5-=2;
|
---|
786 | t7+=2;
|
---|
787 | ti1=cc[t2]+cc[t5];
|
---|
788 | ti2=cc[t2]-cc[t5];
|
---|
789 | ti3=cc[t3]-cc[t4];
|
---|
790 | tr4=cc[t3]+cc[t4];
|
---|
791 | tr1=cc[t2-1]-cc[t5-1];
|
---|
792 | tr2=cc[t2-1]+cc[t5-1];
|
---|
793 | ti4=cc[t3-1]-cc[t4-1];
|
---|
794 | tr3=cc[t3-1]+cc[t4-1];
|
---|
795 | ch[t7-1]=tr2+tr3;
|
---|
796 | cr3=tr2-tr3;
|
---|
797 | ch[t7]=ti2+ti3;
|
---|
798 | ci3=ti2-ti3;
|
---|
799 | cr2=tr1-tr4;
|
---|
800 | cr4=tr1+tr4;
|
---|
801 | ci2=ti1+ti4;
|
---|
802 | ci4=ti1-ti4;
|
---|
803 |
|
---|
804 | ch[(t8=t7+t0)-1]=wa1[i-2]*cr2-wa1[i-1]*ci2;
|
---|
805 | ch[t8]=wa1[i-2]*ci2+wa1[i-1]*cr2;
|
---|
806 | ch[(t8+=t0)-1]=wa2[i-2]*cr3-wa2[i-1]*ci3;
|
---|
807 | ch[t8]=wa2[i-2]*ci3+wa2[i-1]*cr3;
|
---|
808 | ch[(t8+=t0)-1]=wa3[i-2]*cr4-wa3[i-1]*ci4;
|
---|
809 | ch[t8]=wa3[i-2]*ci4+wa3[i-1]*cr4;
|
---|
810 | }
|
---|
811 | t1+=ido;
|
---|
812 | }
|
---|
813 |
|
---|
814 | if(ido%2 == 1)return;
|
---|
815 |
|
---|
816 | L105:
|
---|
817 |
|
---|
818 | t1=ido;
|
---|
819 | t2=ido<<2;
|
---|
820 | t3=ido-1;
|
---|
821 | t4=ido+(ido<<1);
|
---|
822 | for(k=0;k<l1;k++){
|
---|
823 | t5=t3;
|
---|
824 | ti1=cc[t1]+cc[t4];
|
---|
825 | ti2=cc[t4]-cc[t1];
|
---|
826 | tr1=cc[t1-1]-cc[t4-1];
|
---|
827 | tr2=cc[t1-1]+cc[t4-1];
|
---|
828 | ch[t5]=tr2+tr2;
|
---|
829 | ch[t5+=t0]=sqrt2*(tr1-ti1);
|
---|
830 | ch[t5+=t0]=ti2+ti2;
|
---|
831 | ch[t5+=t0]=-sqrt2*(tr1+ti1);
|
---|
832 |
|
---|
833 | t3+=ido;
|
---|
834 | t1+=t2;
|
---|
835 | t4+=t2;
|
---|
836 | }
|
---|
837 | }
|
---|
838 |
|
---|
839 | static void dradbg(int ido,int ip,int l1,int idl1,float *cc,float *c1,
|
---|
840 | float *c2,float *ch,float *ch2,float *wa){
|
---|
841 | static float tpi=6.283185307179586f;
|
---|
842 | int idij,ipph,i,j,k,l,ik,is,t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,
|
---|
843 | t11,t12;
|
---|
844 | float dc2,ai1,ai2,ar1,ar2,ds2;
|
---|
845 | int nbd;
|
---|
846 | float dcp,arg,dsp,ar1h,ar2h;
|
---|
847 | int ipp2;
|
---|
848 |
|
---|
849 | t10=ip*ido;
|
---|
850 | t0=l1*ido;
|
---|
851 | arg=tpi/(float)ip;
|
---|
852 | dcp=cos(arg);
|
---|
853 | dsp=sin(arg);
|
---|
854 | nbd=(ido-1)>>1;
|
---|
855 | ipp2=ip;
|
---|
856 | ipph=(ip+1)>>1;
|
---|
857 | if(ido<l1)goto L103;
|
---|
858 |
|
---|
859 | t1=0;
|
---|
860 | t2=0;
|
---|
861 | for(k=0;k<l1;k++){
|
---|
862 | t3=t1;
|
---|
863 | t4=t2;
|
---|
864 | for(i=0;i<ido;i++){
|
---|
865 | ch[t3]=cc[t4];
|
---|
866 | t3++;
|
---|
867 | t4++;
|
---|
868 | }
|
---|
869 | t1+=ido;
|
---|
870 | t2+=t10;
|
---|
871 | }
|
---|
872 | goto L106;
|
---|
873 |
|
---|
874 | L103:
|
---|
875 | t1=0;
|
---|
876 | for(i=0;i<ido;i++){
|
---|
877 | t2=t1;
|
---|
878 | t3=t1;
|
---|
879 | for(k=0;k<l1;k++){
|
---|
880 | ch[t2]=cc[t3];
|
---|
881 | t2+=ido;
|
---|
882 | t3+=t10;
|
---|
883 | }
|
---|
884 | t1++;
|
---|
885 | }
|
---|
886 |
|
---|
887 | L106:
|
---|
888 | t1=0;
|
---|
889 | t2=ipp2*t0;
|
---|
890 | t7=(t5=ido<<1);
|
---|
891 | for(j=1;j<ipph;j++){
|
---|
892 | t1+=t0;
|
---|
893 | t2-=t0;
|
---|
894 | t3=t1;
|
---|
895 | t4=t2;
|
---|
896 | t6=t5;
|
---|
897 | for(k=0;k<l1;k++){
|
---|
898 | ch[t3]=cc[t6-1]+cc[t6-1];
|
---|
899 | ch[t4]=cc[t6]+cc[t6];
|
---|
900 | t3+=ido;
|
---|
901 | t4+=ido;
|
---|
902 | t6+=t10;
|
---|
903 | }
|
---|
904 | t5+=t7;
|
---|
905 | }
|
---|
906 |
|
---|
907 | if (ido == 1)goto L116;
|
---|
908 | if(nbd<l1)goto L112;
|
---|
909 |
|
---|
910 | t1=0;
|
---|
911 | t2=ipp2*t0;
|
---|
912 | t7=0;
|
---|
913 | for(j=1;j<ipph;j++){
|
---|
914 | t1+=t0;
|
---|
915 | t2-=t0;
|
---|
916 | t3=t1;
|
---|
917 | t4=t2;
|
---|
918 |
|
---|
919 | t7+=(ido<<1);
|
---|
920 | t8=t7;
|
---|
921 | for(k=0;k<l1;k++){
|
---|
922 | t5=t3;
|
---|
923 | t6=t4;
|
---|
924 | t9=t8;
|
---|
925 | t11=t8;
|
---|
926 | for(i=2;i<ido;i+=2){
|
---|
927 | t5+=2;
|
---|
928 | t6+=2;
|
---|
929 | t9+=2;
|
---|
930 | t11-=2;
|
---|
931 | ch[t5-1]=cc[t9-1]+cc[t11-1];
|
---|
932 | ch[t6-1]=cc[t9-1]-cc[t11-1];
|
---|
933 | ch[t5]=cc[t9]-cc[t11];
|
---|
934 | ch[t6]=cc[t9]+cc[t11];
|
---|
935 | }
|
---|
936 | t3+=ido;
|
---|
937 | t4+=ido;
|
---|
938 | t8+=t10;
|
---|
939 | }
|
---|
940 | }
|
---|
941 | goto L116;
|
---|
942 |
|
---|
943 | L112:
|
---|
944 | t1=0;
|
---|
945 | t2=ipp2*t0;
|
---|
946 | t7=0;
|
---|
947 | for(j=1;j<ipph;j++){
|
---|
948 | t1+=t0;
|
---|
949 | t2-=t0;
|
---|
950 | t3=t1;
|
---|
951 | t4=t2;
|
---|
952 | t7+=(ido<<1);
|
---|
953 | t8=t7;
|
---|
954 | t9=t7;
|
---|
955 | for(i=2;i<ido;i+=2){
|
---|
956 | t3+=2;
|
---|
957 | t4+=2;
|
---|
958 | t8+=2;
|
---|
959 | t9-=2;
|
---|
960 | t5=t3;
|
---|
961 | t6=t4;
|
---|
962 | t11=t8;
|
---|
963 | t12=t9;
|
---|
964 | for(k=0;k<l1;k++){
|
---|
965 | ch[t5-1]=cc[t11-1]+cc[t12-1];
|
---|
966 | ch[t6-1]=cc[t11-1]-cc[t12-1];
|
---|
967 | ch[t5]=cc[t11]-cc[t12];
|
---|
968 | ch[t6]=cc[t11]+cc[t12];
|
---|
969 | t5+=ido;
|
---|
970 | t6+=ido;
|
---|
971 | t11+=t10;
|
---|
972 | t12+=t10;
|
---|
973 | }
|
---|
974 | }
|
---|
975 | }
|
---|
976 |
|
---|
977 | L116:
|
---|
978 | ar1=1.f;
|
---|
979 | ai1=0.f;
|
---|
980 | t1=0;
|
---|
981 | t9=(t2=ipp2*idl1);
|
---|
982 | t3=(ip-1)*idl1;
|
---|
983 | for(l=1;l<ipph;l++){
|
---|
984 | t1+=idl1;
|
---|
985 | t2-=idl1;
|
---|
986 |
|
---|
987 | ar1h=dcp*ar1-dsp*ai1;
|
---|
988 | ai1=dcp*ai1+dsp*ar1;
|
---|
989 | ar1=ar1h;
|
---|
990 | t4=t1;
|
---|
991 | t5=t2;
|
---|
992 | t6=0;
|
---|
993 | t7=idl1;
|
---|
994 | t8=t3;
|
---|
995 | for(ik=0;ik<idl1;ik++){
|
---|
996 | c2[t4++]=ch2[t6++]+ar1*ch2[t7++];
|
---|
997 | c2[t5++]=ai1*ch2[t8++];
|
---|
998 | }
|
---|
999 | dc2=ar1;
|
---|
1000 | ds2=ai1;
|
---|
1001 | ar2=ar1;
|
---|
1002 | ai2=ai1;
|
---|
1003 |
|
---|
1004 | t6=idl1;
|
---|
1005 | t7=t9-idl1;
|
---|
1006 | for(j=2;j<ipph;j++){
|
---|
1007 | t6+=idl1;
|
---|
1008 | t7-=idl1;
|
---|
1009 | ar2h=dc2*ar2-ds2*ai2;
|
---|
1010 | ai2=dc2*ai2+ds2*ar2;
|
---|
1011 | ar2=ar2h;
|
---|
1012 | t4=t1;
|
---|
1013 | t5=t2;
|
---|
1014 | t11=t6;
|
---|
1015 | t12=t7;
|
---|
1016 | for(ik=0;ik<idl1;ik++){
|
---|
1017 | c2[t4++]+=ar2*ch2[t11++];
|
---|
1018 | c2[t5++]+=ai2*ch2[t12++];
|
---|
1019 | }
|
---|
1020 | }
|
---|
1021 | }
|
---|
1022 |
|
---|
1023 | t1=0;
|
---|
1024 | for(j=1;j<ipph;j++){
|
---|
1025 | t1+=idl1;
|
---|
1026 | t2=t1;
|
---|
1027 | for(ik=0;ik<idl1;ik++)ch2[ik]+=ch2[t2++];
|
---|
1028 | }
|
---|
1029 |
|
---|
1030 | t1=0;
|
---|
1031 | t2=ipp2*t0;
|
---|
1032 | for(j=1;j<ipph;j++){
|
---|
1033 | t1+=t0;
|
---|
1034 | t2-=t0;
|
---|
1035 | t3=t1;
|
---|
1036 | t4=t2;
|
---|
1037 | for(k=0;k<l1;k++){
|
---|
1038 | ch[t3]=c1[t3]-c1[t4];
|
---|
1039 | ch[t4]=c1[t3]+c1[t4];
|
---|
1040 | t3+=ido;
|
---|
1041 | t4+=ido;
|
---|
1042 | }
|
---|
1043 | }
|
---|
1044 |
|
---|
1045 | if(ido==1)goto L132;
|
---|
1046 | if(nbd<l1)goto L128;
|
---|
1047 |
|
---|
1048 | t1=0;
|
---|
1049 | t2=ipp2*t0;
|
---|
1050 | for(j=1;j<ipph;j++){
|
---|
1051 | t1+=t0;
|
---|
1052 | t2-=t0;
|
---|
1053 | t3=t1;
|
---|
1054 | t4=t2;
|
---|
1055 | for(k=0;k<l1;k++){
|
---|
1056 | t5=t3;
|
---|
1057 | t6=t4;
|
---|
1058 | for(i=2;i<ido;i+=2){
|
---|
1059 | t5+=2;
|
---|
1060 | t6+=2;
|
---|
1061 | ch[t5-1]=c1[t5-1]-c1[t6];
|
---|
1062 | ch[t6-1]=c1[t5-1]+c1[t6];
|
---|
1063 | ch[t5]=c1[t5]+c1[t6-1];
|
---|
1064 | ch[t6]=c1[t5]-c1[t6-1];
|
---|
1065 | }
|
---|
1066 | t3+=ido;
|
---|
1067 | t4+=ido;
|
---|
1068 | }
|
---|
1069 | }
|
---|
1070 | goto L132;
|
---|
1071 |
|
---|
1072 | L128:
|
---|
1073 | t1=0;
|
---|
1074 | t2=ipp2*t0;
|
---|
1075 | for(j=1;j<ipph;j++){
|
---|
1076 | t1+=t0;
|
---|
1077 | t2-=t0;
|
---|
1078 | t3=t1;
|
---|
1079 | t4=t2;
|
---|
1080 | for(i=2;i<ido;i+=2){
|
---|
1081 | t3+=2;
|
---|
1082 | t4+=2;
|
---|
1083 | t5=t3;
|
---|
1084 | t6=t4;
|
---|
1085 | for(k=0;k<l1;k++){
|
---|
1086 | ch[t5-1]=c1[t5-1]-c1[t6];
|
---|
1087 | ch[t6-1]=c1[t5-1]+c1[t6];
|
---|
1088 | ch[t5]=c1[t5]+c1[t6-1];
|
---|
1089 | ch[t6]=c1[t5]-c1[t6-1];
|
---|
1090 | t5+=ido;
|
---|
1091 | t6+=ido;
|
---|
1092 | }
|
---|
1093 | }
|
---|
1094 | }
|
---|
1095 |
|
---|
1096 | L132:
|
---|
1097 | if(ido==1)return;
|
---|
1098 |
|
---|
1099 | for(ik=0;ik<idl1;ik++)c2[ik]=ch2[ik];
|
---|
1100 |
|
---|
1101 | t1=0;
|
---|
1102 | for(j=1;j<ip;j++){
|
---|
1103 | t2=(t1+=t0);
|
---|
1104 | for(k=0;k<l1;k++){
|
---|
1105 | c1[t2]=ch[t2];
|
---|
1106 | t2+=ido;
|
---|
1107 | }
|
---|
1108 | }
|
---|
1109 |
|
---|
1110 | if(nbd>l1)goto L139;
|
---|
1111 |
|
---|
1112 | is= -ido-1;
|
---|
1113 | t1=0;
|
---|
1114 | for(j=1;j<ip;j++){
|
---|
1115 | is+=ido;
|
---|
1116 | t1+=t0;
|
---|
1117 | idij=is;
|
---|
1118 | t2=t1;
|
---|
1119 | for(i=2;i<ido;i+=2){
|
---|
1120 | t2+=2;
|
---|
1121 | idij+=2;
|
---|
1122 | t3=t2;
|
---|
1123 | for(k=0;k<l1;k++){
|
---|
1124 | c1[t3-1]=wa[idij-1]*ch[t3-1]-wa[idij]*ch[t3];
|
---|
1125 | c1[t3]=wa[idij-1]*ch[t3]+wa[idij]*ch[t3-1];
|
---|
1126 | t3+=ido;
|
---|
1127 | }
|
---|
1128 | }
|
---|
1129 | }
|
---|
1130 | return;
|
---|
1131 |
|
---|
1132 | L139:
|
---|
1133 | is= -ido-1;
|
---|
1134 | t1=0;
|
---|
1135 | for(j=1;j<ip;j++){
|
---|
1136 | is+=ido;
|
---|
1137 | t1+=t0;
|
---|
1138 | t2=t1;
|
---|
1139 | for(k=0;k<l1;k++){
|
---|
1140 | idij=is;
|
---|
1141 | t3=t2;
|
---|
1142 | for(i=2;i<ido;i+=2){
|
---|
1143 | idij+=2;
|
---|
1144 | t3+=2;
|
---|
1145 | c1[t3-1]=wa[idij-1]*ch[t3-1]-wa[idij]*ch[t3];
|
---|
1146 | c1[t3]=wa[idij-1]*ch[t3]+wa[idij]*ch[t3-1];
|
---|
1147 | }
|
---|
1148 | t2+=ido;
|
---|
1149 | }
|
---|
1150 | }
|
---|
1151 | }
|
---|
1152 |
|
---|
1153 | static void drftb1(int n, float *c, float *ch, float *wa, int *ifac){
|
---|
1154 | int i,k1,l1,l2;
|
---|
1155 | int na;
|
---|
1156 | int nf,ip,iw,ix2,ix3,ido,idl1;
|
---|
1157 |
|
---|
1158 | nf=ifac[1];
|
---|
1159 | na=0;
|
---|
1160 | l1=1;
|
---|
1161 | iw=1;
|
---|
1162 |
|
---|
1163 | for(k1=0;k1<nf;k1++){
|
---|
1164 | ip=ifac[k1 + 2];
|
---|
1165 | l2=ip*l1;
|
---|
1166 | ido=n/l2;
|
---|
1167 | idl1=ido*l1;
|
---|
1168 | if(ip!=4)goto L103;
|
---|
1169 | ix2=iw+ido;
|
---|
1170 | ix3=ix2+ido;
|
---|
1171 |
|
---|
1172 | if(na!=0)
|
---|
1173 | dradb4(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1);
|
---|
1174 | else
|
---|
1175 | dradb4(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1);
|
---|
1176 | na=1-na;
|
---|
1177 | goto L115;
|
---|
1178 |
|
---|
1179 | L103:
|
---|
1180 | if(ip!=2)goto L106;
|
---|
1181 |
|
---|
1182 | if(na!=0)
|
---|
1183 | dradb2(ido,l1,ch,c,wa+iw-1);
|
---|
1184 | else
|
---|
1185 | dradb2(ido,l1,c,ch,wa+iw-1);
|
---|
1186 | na=1-na;
|
---|
1187 | goto L115;
|
---|
1188 |
|
---|
1189 | L106:
|
---|
1190 | if(ip!=3)goto L109;
|
---|
1191 |
|
---|
1192 | ix2=iw+ido;
|
---|
1193 | if(na!=0)
|
---|
1194 | dradb3(ido,l1,ch,c,wa+iw-1,wa+ix2-1);
|
---|
1195 | else
|
---|
1196 | dradb3(ido,l1,c,ch,wa+iw-1,wa+ix2-1);
|
---|
1197 | na=1-na;
|
---|
1198 | goto L115;
|
---|
1199 |
|
---|
1200 | L109:
|
---|
1201 | /* The radix five case can be translated later..... */
|
---|
1202 | /* if(ip!=5)goto L112;
|
---|
1203 |
|
---|
1204 | ix2=iw+ido;
|
---|
1205 | ix3=ix2+ido;
|
---|
1206 | ix4=ix3+ido;
|
---|
1207 | if(na!=0)
|
---|
1208 | dradb5(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1,wa+ix4-1);
|
---|
1209 | else
|
---|
1210 | dradb5(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1,wa+ix4-1);
|
---|
1211 | na=1-na;
|
---|
1212 | goto L115;
|
---|
1213 |
|
---|
1214 | L112:*/
|
---|
1215 | if(na!=0)
|
---|
1216 | dradbg(ido,ip,l1,idl1,ch,ch,ch,c,c,wa+iw-1);
|
---|
1217 | else
|
---|
1218 | dradbg(ido,ip,l1,idl1,c,c,c,ch,ch,wa+iw-1);
|
---|
1219 | if(ido==1)na=1-na;
|
---|
1220 |
|
---|
1221 | L115:
|
---|
1222 | l1=l2;
|
---|
1223 | iw+=(ip-1)*ido;
|
---|
1224 | }
|
---|
1225 |
|
---|
1226 | if(na==0)return;
|
---|
1227 |
|
---|
1228 | for(i=0;i<n;i++)c[i]=ch[i];
|
---|
1229 | }
|
---|
1230 |
|
---|
1231 | void drft_forward(drft_lookup *l,float *data){
|
---|
1232 | if(l->n==1)return;
|
---|
1233 | drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache);
|
---|
1234 | }
|
---|
1235 |
|
---|
1236 | void drft_backward(drft_lookup *l,float *data){
|
---|
1237 | if (l->n==1)return;
|
---|
1238 | drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache);
|
---|
1239 | }
|
---|
1240 |
|
---|
1241 | void drft_init(drft_lookup *l,int n){
|
---|
1242 | l->n=n;
|
---|
1243 | l->trigcache=_ogg_calloc(3*n,sizeof(*l->trigcache));
|
---|
1244 | l->splitcache=_ogg_calloc(32,sizeof(*l->splitcache));
|
---|
1245 | fdrffti(n, l->trigcache, l->splitcache);
|
---|
1246 | }
|
---|
1247 |
|
---|
1248 | void drft_clear(drft_lookup *l){
|
---|
1249 | if(l){
|
---|
1250 | if(l->trigcache)_ogg_free(l->trigcache);
|
---|
1251 | if(l->splitcache)_ogg_free(l->splitcache);
|
---|
1252 | memset(l,0,sizeof(*l));
|
---|
1253 | }
|
---|
1254 | }
|
---|