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