zenilib  0.5.3.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
smallft.c
Go to the documentation of this file.
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 
1233  if(l->n==1)return;
1234  drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache);
1235 }
1236 
1238  if (l->n==1)return;
1239  drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache);
1240 }
1241 
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 
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 }
static void dradfg(int ido, int ip, int l1, int idl1, float *cc, float *c1, float *c2, float *ch, float *ch2, float *wa)
Definition: smallft.c:271
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
Definition: glew.h:11582
static void dradb2(int ido, int l1, float *cc, float *ch, float *wa1)
Definition: smallft.c:634
static void dradb3(int ido, int l1, float *cc, float *ch, float *wa1, float *wa2)
Definition: smallft.c:686
int * splitcache
Definition: smallft.h:26
static void dradf4(int ido, int l1, float *cc, float *ch, float *wa1, float *wa2, float *wa3)
Definition: smallft.c:169
static void drftb1(int n, float *c, float *ch, float *wa, int *ifac)
Definition: smallft.c:1154
t2
Definition: e_log.c:151
int32_t k
Definition: e_log.c:102
GLclampd n
Definition: glew.h:7287
int32_t j
Definition: e_log.c:102
#define memset
Definition: SDL_malloc.c:633
#define _ogg_free
Definition: os_types.h:25
void drft_init(drft_lookup *l, int n)
Definition: smallft.c:1242
static void dradf2(int ido, int l1, float *cc, float *ch, float *wa1)
Definition: smallft.c:114
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
Definition: glew.h:11582
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl2ext.h:848
void drft_backward(drft_lookup *l, float *data)
Definition: smallft.c:1237
const GLfloat * c
Definition: glew.h:14913
static void dradb4(int ido, int l1, float *cc, float *ch, float *wa1, float *wa2, float *wa3)
Definition: smallft.c:749
double sin(double x)
Definition: s_sin.c:56
static void fdrffti(int n, float *wsave, int *ifac)
Definition: smallft.c:108
GLdouble l
Definition: glew.h:8383
void drft_clear(drft_lookup *l)
Definition: smallft.c:1249
static void dradbg(int ido, int ip, int l1, int idl1, float *cc, float *c1, float *c2, float *ch, float *ch2, float *wa)
Definition: smallft.c:840
#define _ogg_calloc
Definition: os_types.h:23
static void drftf1(int n, float *c, float *ch, float *wa, int *ifac)
Definition: smallft.c:573
int i
Definition: pngrutil.c:1377
double cos(double x)
Definition: s_cos.c:56
float * trigcache
Definition: smallft.h:25
static void drfti1(int n, float *wa, int *ifac)
Definition: smallft.c:38
void drft_forward(drft_lookup *l, float *data)
Definition: smallft.c:1232