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