Home | History | Annotate | Download | only in lib
      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 }
   1256