/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ /* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk<ymnk@jcraft.com> * * Many thanks to * Monty <monty@xiph.org> and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package sound.jcraft.jorbis; class Drft{ int n; float[] trigcache; int[] splitcache; void backward(float[] data){ if(n==1) return; drftb1(n, data, trigcache, trigcache, n, splitcache); } void init(int n){ this.n=n; trigcache=new float[3*n]; splitcache=new int[32]; fdrffti(n, trigcache, splitcache); } void clear(){ if(trigcache!=null) trigcache=null; if(splitcache!=null) splitcache=null; } static int[] ntryh= {4, 2, 3, 5}; static float tpi=6.28318530717958647692528676655900577f; static float hsqt2=.70710678118654752440084436210485f; static float taui=.86602540378443864676372317075293618f; static float taur=-.5f; static float sqrt2=1.4142135623730950488016887242097f; static void drfti1(int n, float[] wa, int index, int[] ifac){ float arg, argh, argld, fi; int ntry=0, i, j=-1; int k1, l1, l2, ib; int ld, ii, ip, is, nq, nr; int ido, ipm, nfm1; int nl=n; int nf=0; int state=101; loop: while(true){ switch(state){ case 101: j++; if(j<4) ntry=ntryh[j]; else ntry+=2; case 104: nq=nl/ntry; nr=nl-ntry*nq; if(nr!=0){ state=101; break; } nf++; ifac[nf+1]=ntry; nl=nq; if(ntry!=2){ state=107; break; } if(nf==1){ state=107; break; } for(i=1; i<nf; i++){ ib=nf-i+1; ifac[ib+1]=ifac[ib]; } ifac[2]=2; case 107: if(nl!=1){ state=104; break; } ifac[0]=n; ifac[1]=nf; argh=tpi/n; is=0; nfm1=nf-1; l1=1; if(nfm1==0) return; for(k1=0; k1<nfm1; k1++){ ip=ifac[k1+2]; ld=0; l2=l1*ip; ido=n/l2; ipm=ip-1; for(j=0; j<ipm; j++){ ld+=l1; i=is; argld=(float)ld*argh; fi=0.f; for(ii=2; ii<ido; ii+=2){ fi+=1.f; arg=fi*argld; wa[index+i++]=(float)Math.cos(arg); wa[index+i++]=(float)Math.sin(arg); } is+=ido; } l1=l2; } break loop; } } } static void fdrffti(int n, float[] wsave, int[] ifac){ if(n==1) return; drfti1(n, wsave, n, ifac); } static void dradf2(int ido, int l1, float[] cc, float[] ch, float[] wa1, int index){ int i, k; float ti2, tr2; int t0, t1, t2, t3, t4, t5, t6; t1=0; t0=(t2=l1*ido); t3=ido<<1; for(k=0; k<l1; k++){ ch[t1<<1]=cc[t1]+cc[t2]; ch[(t1<<1)+t3-1]=cc[t1]-cc[t2]; t1+=ido; t2+=ido; } if(ido<2) return; if(ido!=2){ t1=0; t2=t0; for(k=0; k<l1; k++){ t3=t2; t4=(t1<<1)+(ido<<1); t5=t1; t6=t1+t1; for(i=2; i<ido; i+=2){ t3+=2; t4-=2; t5+=2; t6+=2; tr2=wa1[index+i-2]*cc[t3-1]+wa1[index+i-1]*cc[t3]; ti2=wa1[index+i-2]*cc[t3]-wa1[index+i-1]*cc[t3-1]; ch[t6]=cc[t5]+ti2; ch[t4]=ti2-cc[t5]; ch[t6-1]=cc[t5-1]+tr2; ch[t4-1]=cc[t5-1]-tr2; } t1+=ido; t2+=ido; } if(ido%2==1) return; } t3=(t2=(t1=ido)-1); t2+=t0; for(k=0; k<l1; k++){ ch[t1]=-cc[t2]; ch[t1-1]=cc[t3]; t1+=ido<<1; t2+=ido; t3+=ido; } } static void dradf4(int ido, int l1, float[] cc, float[] ch, float[] wa1, int index1, float[] wa2, int index2, float[] wa3, int index3){ int i, k, t0, t1, t2, t3, t4, t5, t6; float ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4; t0=l1*ido; t1=t0; t4=t1<<1; t2=t1+(t1<<1); t3=0; for(k=0; k<l1; k++){ tr1=cc[t1]+cc[t2]; tr2=cc[t3]+cc[t4]; ch[t5=t3<<2]=tr1+tr2; ch[(ido<<2)+t5-1]=tr2-tr1; ch[(t5+=(ido<<1))-1]=cc[t3]-cc[t4]; ch[t5]=cc[t2]-cc[t1]; t1+=ido; t2+=ido; t3+=ido; t4+=ido; } if(ido<2) return; if(ido!=2){ t1=0; for(k=0; k<l1; k++){ t2=t1; t4=t1<<2; t5=(t6=ido<<1)+t4; for(i=2; i<ido; i+=2){ t3=(t2+=2); t4+=2; t5-=2; t3+=t0; cr2=wa1[index1+i-2]*cc[t3-1]+wa1[index1+i-1]*cc[t3]; ci2=wa1[index1+i-2]*cc[t3]-wa1[index1+i-1]*cc[t3-1]; t3+=t0; cr3=wa2[index2+i-2]*cc[t3-1]+wa2[index2+i-1]*cc[t3]; ci3=wa2[index2+i-2]*cc[t3]-wa2[index2+i-1]*cc[t3-1]; t3+=t0; cr4=wa3[index3+i-2]*cc[t3-1]+wa3[index3+i-1]*cc[t3]; ci4=wa3[index3+i-2]*cc[t3]-wa3[index3+i-1]*cc[t3-1]; tr1=cr2+cr4; tr4=cr4-cr2; ti1=ci2+ci4; ti4=ci2-ci4; ti2=cc[t2]+ci3; ti3=cc[t2]-ci3; tr2=cc[t2-1]+cr3; tr3=cc[t2-1]-cr3; ch[t4-1]=tr1+tr2; ch[t4]=ti1+ti2; ch[t5-1]=tr3-ti4; ch[t5]=tr4-ti3; ch[t4+t6-1]=ti4+tr3; ch[t4+t6]=tr4+ti3; ch[t5+t6-1]=tr2-tr1; ch[t5+t6]=ti1-ti2; } t1+=ido; } if((ido&1)!=0) return; } t2=(t1=t0+ido-1)+(t0<<1); t3=ido<<2; t4=ido; t5=ido<<1; t6=ido; for(k=0; k<l1; k++){ ti1=-hsqt2*(cc[t1]+cc[t2]); tr1=hsqt2*(cc[t1]-cc[t2]); ch[t4-1]=tr1+cc[t6-1]; ch[t4+t5-1]=cc[t6-1]-tr1; ch[t4]=ti1-cc[t1+t0]; ch[t4+t5]=ti1+cc[t1+t0]; t1+=ido; t2+=ido; t4+=t3; t6+=ido; } } static void dradfg(int ido, int ip, int l1, int idl1, float[] cc, float[] c1, float[] c2, float[] ch, float[] ch2, float[] wa, int index){ int idij, ipph, i, j, k, l, ic, ik, is; int t0, t1, t2=0, t3, t4, t5, t6, t7, t8, t9, t10; float dc2, ai1, ai2, ar1, ar2, ds2; int nbd; float dcp=0, arg, dsp=0, ar1h, ar2h; int idp2, ipp2; arg=tpi/(float)ip; dcp=(float)Math.cos(arg); dsp=(float)Math.sin(arg); ipph=(ip+1)>>1; ipp2=ip; idp2=ido; nbd=(ido-1)>>1; t0=l1*ido; t10=ip*ido; int state=100; loop: while(true){ switch(state){ case 101: if(ido==1){ state=119; break; } for(ik=0; ik<idl1; ik++) ch2[ik]=c2[ik]; t1=0; for(j=1; j<ip; j++){ t1+=t0; t2=t1; for(k=0; k<l1; k++){ ch[t2]=c1[t2]; t2+=ido; } } is=-ido; t1=0; if(nbd>l1){ for(j=1; j<ip; j++){ t1+=t0; is+=ido; t2=-ido+t1; for(k=0; k<l1; k++){ idij=is-1; t2+=ido; t3=t2; for(i=2; i<ido; i+=2){ idij+=2; t3+=2; ch[t3-1]=wa[index+idij-1]*c1[t3-1]+wa[index+idij]*c1[t3]; ch[t3]=wa[index+idij-1]*c1[t3]-wa[index+idij]*c1[t3-1]; } } } } else{ for(j=1; j<ip; j++){ is+=ido; idij=is-1; t1+=t0; t2=t1; for(i=2; i<ido; i+=2){ idij+=2; t2+=2; t3=t2; for(k=0; k<l1; k++){ ch[t3-1]=wa[index+idij-1]*c1[t3-1]+wa[index+idij]*c1[t3]; ch[t3]=wa[index+idij-1]*c1[t3]-wa[index+idij]*c1[t3-1]; t3+=ido; } } } } t1=0; t2=ipp2*t0; if(nbd<l1){ for(j=1; j<ipph; j++){ t1+=t0; t2-=t0; t3=t1; t4=t2; for(i=2; i<ido; i+=2){ t3+=2; t4+=2; t5=t3-ido; t6=t4-ido; for(k=0; k<l1; k++){ t5+=ido; t6+=ido; c1[t5-1]=ch[t5-1]+ch[t6-1]; c1[t6-1]=ch[t5]-ch[t6]; c1[t5]=ch[t5]+ch[t6]; c1[t6]=ch[t6-1]-ch[t5-1]; } } } } else{ for(j=1; j<ipph; j++){ t1+=t0; t2-=t0; t3=t1; t4=t2; for(k=0; k<l1; k++){ t5=t3; t6=t4; for(i=2; i<ido; i+=2){ t5+=2; t6+=2; c1[t5-1]=ch[t5-1]+ch[t6-1]; c1[t6-1]=ch[t5]-ch[t6]; c1[t5]=ch[t5]+ch[t6]; c1[t6]=ch[t6-1]-ch[t5-1]; } t3+=ido; t4+=ido; } } } case 119: for(ik=0; ik<idl1; ik++) c2[ik]=ch2[ik]; t1=0; t2=ipp2*idl1; for(j=1; j<ipph; j++){ t1+=t0; t2-=t0; t3=t1-ido; t4=t2-ido; for(k=0; k<l1; k++){ t3+=ido; t4+=ido; c1[t3]=ch[t3]+ch[t4]; c1[t4]=ch[t4]-ch[t3]; } } ar1=1.f; ai1=0.f; t1=0; t2=ipp2*idl1; t3=(ip-1)*idl1; for(l=1; l<ipph; l++){ t1+=idl1; t2-=idl1; ar1h=dcp*ar1-dsp*ai1; ai1=dcp*ai1+dsp*ar1; ar1=ar1h; t4=t1; t5=t2; t6=t3; t7=idl1; for(ik=0; ik<idl1; ik++){ ch2[t4++]=c2[ik]+ar1*c2[t7++]; ch2[t5++]=ai1*c2[t6++]; } dc2=ar1; ds2=ai1; ar2=ar1; ai2=ai1; t4=idl1; t5=(ipp2-1)*idl1; for(j=2; j<ipph; j++){ t4+=idl1; t5-=idl1; ar2h=dc2*ar2-ds2*ai2; ai2=dc2*ai2+ds2*ar2; ar2=ar2h; t6=t1; t7=t2; t8=t4; t9=t5; for(ik=0; ik<idl1; ik++){ ch2[t6++]+=ar2*c2[t8++]; ch2[t7++]+=ai2*c2[t9++]; } } } t1=0; for(j=1; j<ipph; j++){ t1+=idl1; t2=t1; for(ik=0; ik<idl1; ik++) ch2[ik]+=c2[t2++]; } if(ido<l1){ state=132; break; } t1=0; t2=0; for(k=0; k<l1; k++){ t3=t1; t4=t2; for(i=0; i<ido; i++) cc[t4++]=ch[t3++]; t1+=ido; t2+=t10; } state=135; break; case 132: for(i=0; i<ido; i++){ t1=i; t2=i; for(k=0; k<l1; k++){ cc[t2]=ch[t1]; t1+=ido; t2+=t10; } } case 135: t1=0; t2=ido<<1; t3=0; t4=ipp2*t0; for(j=1; j<ipph; j++){ t1+=t2; t3+=t0; t4-=t0; t5=t1; t6=t3; t7=t4; for(k=0; k<l1; k++){ cc[t5-1]=ch[t6]; cc[t5]=ch[t7]; t5+=t10; t6+=ido; t7+=ido; } } if(ido==1) return; if(nbd<l1){ state=141; break; } t1=-ido; t3=0; t4=0; t5=ipp2*t0; for(j=1; j<ipph; j++){ t1+=t2; t3+=t2; t4+=t0; t5-=t0; t6=t1; t7=t3; t8=t4; t9=t5; for(k=0; k<l1; k++){ for(i=2; i<ido; i+=2){ ic=idp2-i; cc[i+t7-1]=ch[i+t8-1]+ch[i+t9-1]; cc[ic+t6-1]=ch[i+t8-1]-ch[i+t9-1]; cc[i+t7]=ch[i+t8]+ch[i+t9]; cc[ic+t6]=ch[i+t9]-ch[i+t8]; } t6+=t10; t7+=t10; t8+=ido; t9+=ido; } } return; case 141: t1=-ido; t3=0; t4=0; t5=ipp2*t0; for(j=1; j<ipph; j++){ t1+=t2; t3+=t2; t4+=t0; t5-=t0; for(i=2; i<ido; i+=2){ t6=idp2+t1-i; t7=i+t3; t8=i+t4; t9=i+t5; for(k=0; k<l1; k++){ cc[t7-1]=ch[t8-1]+ch[t9-1]; cc[t6-1]=ch[t8-1]-ch[t9-1]; cc[t7]=ch[t8]+ch[t9]; cc[t6]=ch[t9]-ch[t8]; t6+=t10; t7+=t10; t8+=ido; t9+=ido; } } } break loop; } } } static void drftf1(int n, float[] c, float[] ch, float[] wa, int[] ifac){ int i, k1, l1, l2; int na, kh, nf; int ip, iw, ido, idl1, ix2, ix3; nf=ifac[1]; na=1; l2=n; iw=n; for(k1=0; k1<nf; k1++){ kh=nf-k1; ip=ifac[kh+1]; l1=l2/ip; ido=n/l2; idl1=ido*l1; iw-=(ip-1)*ido; na=1-na; int state=100; loop: while(true){ switch(state){ case 100: if(ip!=4){ state=102; break; } ix2=iw+ido; ix3=ix2+ido; if(na!=0) dradf4(ido, l1, ch, c, wa, iw-1, wa, ix2-1, wa, ix3-1); else dradf4(ido, l1, c, ch, wa, iw-1, wa, ix2-1, wa, ix3-1); state=110; break; case 102: if(ip!=2){ state=104; break; } if(na!=0){ state=103; break; } dradf2(ido, l1, c, ch, wa, iw-1); state=110; break; case 103: dradf2(ido, l1, ch, c, wa, iw-1); case 104: if(ido==1) na=1-na; if(na!=0){ state=109; break; } dradfg(ido, ip, l1, idl1, c, c, c, ch, ch, wa, iw-1); na=1; state=110; break; case 109: dradfg(ido, ip, l1, idl1, ch, ch, ch, c, c, wa, iw-1); na=0; case 110: l2=l1; break loop; } } } if(na==1) return; for(i=0; i<n; i++) c[i]=ch[i]; } static void dradb2(int ido, int l1, float[] cc, float[] ch, float[] wa1, int index){ int i, k, t0, t1, t2, t3, t4, t5, t6; float ti2, tr2; t0=l1*ido; t1=0; t2=0; t3=(ido<<1)-1; for(k=0; k<l1; k++){ ch[t1]=cc[t2]+cc[t3+t2]; ch[t1+t0]=cc[t2]-cc[t3+t2]; t2=(t1+=ido)<<1; } if(ido<2) return; if(ido!=2){ t1=0; t2=0; for(k=0; k<l1; k++){ t3=t1; t5=(t4=t2)+(ido<<1); t6=t0+t1; for(i=2; i<ido; i+=2){ t3+=2; t4+=2; t5-=2; t6+=2; ch[t3-1]=cc[t4-1]+cc[t5-1]; tr2=cc[t4-1]-cc[t5-1]; ch[t3]=cc[t4]-cc[t5]; ti2=cc[t4]+cc[t5]; ch[t6-1]=wa1[index+i-2]*tr2-wa1[index+i-1]*ti2; ch[t6]=wa1[index+i-2]*ti2+wa1[index+i-1]*tr2; } t2=(t1+=ido)<<1; } if((ido%2)==1) return; } t1=ido-1; t2=ido-1; for(k=0; k<l1; k++){ ch[t1]=cc[t2]+cc[t2]; ch[t1+t0]=-(cc[t2+1]+cc[t2+1]); t1+=ido; t2+=ido<<1; } } static void dradb3(int ido, int l1, float[] cc, float[] ch, float[] wa1, int index1, float[] wa2, int index2){ int i, k, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10; float ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2; t0=l1*ido; t1=0; t2=t0<<1; t3=ido<<1; t4=ido+(ido<<1); t5=0; for(k=0; k<l1; k++){ tr2=cc[t3-1]+cc[t3-1]; cr2=cc[t5]+(taur*tr2); ch[t1]=cc[t5]+tr2; ci3=taui*(cc[t3]+cc[t3]); ch[t1+t0]=cr2-ci3; ch[t1+t2]=cr2+ci3; t1+=ido; t3+=t4; t5+=t4; } if(ido==1) return; t1=0; t3=ido<<1; for(k=0; k<l1; k++){ t7=t1+(t1<<1); t6=(t5=t7+t3); t8=t1; t10=(t9=t1+t0)+t0; for(i=2; i<ido; i+=2){ t5+=2; t6-=2; t7+=2; t8+=2; t9+=2; t10+=2; tr2=cc[t5-1]+cc[t6-1]; cr2=cc[t7-1]+(taur*tr2); ch[t8-1]=cc[t7-1]+tr2; ti2=cc[t5]-cc[t6]; ci2=cc[t7]+(taur*ti2); ch[t8]=cc[t7]+ti2; cr3=taui*(cc[t5-1]-cc[t6-1]); ci3=taui*(cc[t5]+cc[t6]); dr2=cr2-ci3; dr3=cr2+ci3; di2=ci2+cr3; di3=ci2-cr3; ch[t9-1]=wa1[index1+i-2]*dr2-wa1[index1+i-1]*di2; ch[t9]=wa1[index1+i-2]*di2+wa1[index1+i-1]*dr2; ch[t10-1]=wa2[index2+i-2]*dr3-wa2[index2+i-1]*di3; ch[t10]=wa2[index2+i-2]*di3+wa2[index2+i-1]*dr3; } t1+=ido; } } static void dradb4(int ido, int l1, float[] cc, float[] ch, float[] wa1, int index1, float[] wa2, int index2, float[] wa3, int index3){ int i, k, t0, t1, t2, t3, t4, t5, t6, t7, t8; float ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4; t0=l1*ido; t1=0; t2=ido<<2; t3=0; t6=ido<<1; for(k=0; k<l1; k++){ t4=t3+t6; t5=t1; tr3=cc[t4-1]+cc[t4-1]; tr4=cc[t4]+cc[t4]; tr1=cc[t3]-cc[(t4+=t6)-1]; tr2=cc[t3]+cc[t4-1]; ch[t5]=tr2+tr3; ch[t5+=t0]=tr1-tr4; ch[t5+=t0]=tr2-tr3; ch[t5+=t0]=tr1+tr4; t1+=ido; t3+=t2; } if(ido<2) return; if(ido!=2){ t1=0; for(k=0; k<l1; k++){ t5=(t4=(t3=(t2=t1<<2)+t6))+t6; t7=t1; for(i=2; i<ido; i+=2){ t2+=2; t3+=2; t4-=2; t5-=2; t7+=2; ti1=cc[t2]+cc[t5]; ti2=cc[t2]-cc[t5]; ti3=cc[t3]-cc[t4]; tr4=cc[t3]+cc[t4]; tr1=cc[t2-1]-cc[t5-1]; tr2=cc[t2-1]+cc[t5-1]; ti4=cc[t3-1]-cc[t4-1]; tr3=cc[t3-1]+cc[t4-1]; ch[t7-1]=tr2+tr3; cr3=tr2-tr3; ch[t7]=ti2+ti3; ci3=ti2-ti3; cr2=tr1-tr4; cr4=tr1+tr4; ci2=ti1+ti4; ci4=ti1-ti4; ch[(t8=t7+t0)-1]=wa1[index1+i-2]*cr2-wa1[index1+i-1]*ci2; ch[t8]=wa1[index1+i-2]*ci2+wa1[index1+i-1]*cr2; ch[(t8+=t0)-1]=wa2[index2+i-2]*cr3-wa2[index2+i-1]*ci3; ch[t8]=wa2[index2+i-2]*ci3+wa2[index2+i-1]*cr3; ch[(t8+=t0)-1]=wa3[index3+i-2]*cr4-wa3[index3+i-1]*ci4; ch[t8]=wa3[index3+i-2]*ci4+wa3[index3+i-1]*cr4; } t1+=ido; } if(ido%2==1) return; } t1=ido; t2=ido<<2; t3=ido-1; t4=ido+(ido<<1); for(k=0; k<l1; k++){ t5=t3; ti1=cc[t1]+cc[t4]; ti2=cc[t4]-cc[t1]; tr1=cc[t1-1]-cc[t4-1]; tr2=cc[t1-1]+cc[t4-1]; ch[t5]=tr2+tr2; ch[t5+=t0]=sqrt2*(tr1-ti1); ch[t5+=t0]=ti2+ti2; ch[t5+=t0]=-sqrt2*(tr1+ti1); t3+=ido; t1+=t2; t4+=t2; } } static void dradbg(int ido, int ip, int l1, int idl1, float[] cc, float[] c1, float[] c2, float[] ch, float[] ch2, float[] wa, int index){ int idij, ipph=0, i, j, k, l, ik, is, t0=0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10=0, t11, t12; float dc2, ai1, ai2, ar1, ar2, ds2; int nbd=0; float dcp=0, arg, dsp=0, ar1h, ar2h; int ipp2=0; int state=100; loop: while(true){ switch(state){ case 100: t10=ip*ido; t0=l1*ido; arg=tpi/(float)ip; dcp=(float)Math.cos(arg); dsp=(float)Math.sin(arg); nbd=(ido-1)>>>1; ipp2=ip; ipph=(ip+1)>>>1; if(ido<l1){ state=103; break; } t1=0; t2=0; for(k=0; k<l1; k++){ t3=t1; t4=t2; for(i=0; i<ido; i++){ ch[t3]=cc[t4]; t3++; t4++; } t1+=ido; t2+=t10; } state=106; break; case 103: t1=0; for(i=0; i<ido; i++){ t2=t1; t3=t1; for(k=0; k<l1; k++){ ch[t2]=cc[t3]; t2+=ido; t3+=t10; } t1++; } case 106: t1=0; t2=ipp2*t0; t7=(t5=ido<<1); for(j=1; j<ipph; j++){ t1+=t0; t2-=t0; t3=t1; t4=t2; t6=t5; for(k=0; k<l1; k++){ ch[t3]=cc[t6-1]+cc[t6-1]; ch[t4]=cc[t6]+cc[t6]; t3+=ido; t4+=ido; t6+=t10; } t5+=t7; } if(ido==1){ state=116; break; } if(nbd<l1){ state=112; break; } t1=0; t2=ipp2*t0; t7=0; for(j=1; j<ipph; j++){ t1+=t0; t2-=t0; t3=t1; t4=t2; t7+=(ido<<1); t8=t7; for(k=0; k<l1; k++){ t5=t3; t6=t4; t9=t8; t11=t8; for(i=2; i<ido; i+=2){ t5+=2; t6+=2; t9+=2; t11-=2; ch[t5-1]=cc[t9-1]+cc[t11-1]; ch[t6-1]=cc[t9-1]-cc[t11-1]; ch[t5]=cc[t9]-cc[t11]; ch[t6]=cc[t9]+cc[t11]; } t3+=ido; t4+=ido; t8+=t10; } } state=116; break; case 112: t1=0; t2=ipp2*t0; t7=0; for(j=1; j<ipph; j++){ t1+=t0; t2-=t0; t3=t1; t4=t2; t7+=(ido<<1); t8=t7; t9=t7; for(i=2; i<ido; i+=2){ t3+=2; t4+=2; t8+=2; t9-=2; t5=t3; t6=t4; t11=t8; t12=t9; for(k=0; k<l1; k++){ ch[t5-1]=cc[t11-1]+cc[t12-1]; ch[t6-1]=cc[t11-1]-cc[t12-1]; ch[t5]=cc[t11]-cc[t12]; ch[t6]=cc[t11]+cc[t12]; t5+=ido; t6+=ido; t11+=t10; t12+=t10; } } } case 116: ar1=1.f; ai1=0.f; t1=0; t9=(t2=ipp2*idl1); t3=(ip-1)*idl1; for(l=1; l<ipph; l++){ t1+=idl1; t2-=idl1; ar1h=dcp*ar1-dsp*ai1; ai1=dcp*ai1+dsp*ar1; ar1=ar1h; t4=t1; t5=t2; t6=0; t7=idl1; t8=t3; for(ik=0; ik<idl1; ik++){ c2[t4++]=ch2[t6++]+ar1*ch2[t7++]; c2[t5++]=ai1*ch2[t8++]; } dc2=ar1; ds2=ai1; ar2=ar1; ai2=ai1; t6=idl1; t7=t9-idl1; for(j=2; j<ipph; j++){ t6+=idl1; t7-=idl1; ar2h=dc2*ar2-ds2*ai2; ai2=dc2*ai2+ds2*ar2; ar2=ar2h; t4=t1; t5=t2; t11=t6; t12=t7; for(ik=0; ik<idl1; ik++){ c2[t4++]+=ar2*ch2[t11++]; c2[t5++]+=ai2*ch2[t12++]; } } } t1=0; for(j=1; j<ipph; j++){ t1+=idl1; t2=t1; for(ik=0; ik<idl1; ik++) ch2[ik]+=ch2[t2++]; } t1=0; t2=ipp2*t0; for(j=1; j<ipph; j++){ t1+=t0; t2-=t0; t3=t1; t4=t2; for(k=0; k<l1; k++){ ch[t3]=c1[t3]-c1[t4]; ch[t4]=c1[t3]+c1[t4]; t3+=ido; t4+=ido; } } if(ido==1){ state=132; break; } if(nbd<l1){ state=128; break; } t1=0; t2=ipp2*t0; for(j=1; j<ipph; j++){ t1+=t0; t2-=t0; t3=t1; t4=t2; for(k=0; k<l1; k++){ t5=t3; t6=t4; for(i=2; i<ido; i+=2){ t5+=2; t6+=2; ch[t5-1]=c1[t5-1]-c1[t6]; ch[t6-1]=c1[t5-1]+c1[t6]; ch[t5]=c1[t5]+c1[t6-1]; ch[t6]=c1[t5]-c1[t6-1]; } t3+=ido; t4+=ido; } } state=132; break; case 128: t1=0; t2=ipp2*t0; for(j=1; j<ipph; j++){ t1+=t0; t2-=t0; t3=t1; t4=t2; for(i=2; i<ido; i+=2){ t3+=2; t4+=2; t5=t3; t6=t4; for(k=0; k<l1; k++){ ch[t5-1]=c1[t5-1]-c1[t6]; ch[t6-1]=c1[t5-1]+c1[t6]; ch[t5]=c1[t5]+c1[t6-1]; ch[t6]=c1[t5]-c1[t6-1]; t5+=ido; t6+=ido; } } } case 132: if(ido==1) return; for(ik=0; ik<idl1; ik++) c2[ik]=ch2[ik]; t1=0; for(j=1; j<ip; j++){ t2=(t1+=t0); for(k=0; k<l1; k++){ c1[t2]=ch[t2]; t2+=ido; } } if(nbd>l1){ state=139; break; } is=-ido-1; t1=0; for(j=1; j<ip; j++){ is+=ido; t1+=t0; idij=is; t2=t1; for(i=2; i<ido; i+=2){ t2+=2; idij+=2; t3=t2; for(k=0; k<l1; k++){ c1[t3-1]=wa[index+idij-1]*ch[t3-1]-wa[index+idij]*ch[t3]; c1[t3]=wa[index+idij-1]*ch[t3]+wa[index+idij]*ch[t3-1]; t3+=ido; } } } return; case 139: is=-ido-1; t1=0; for(j=1; j<ip; j++){ is+=ido; t1+=t0; t2=t1; for(k=0; k<l1; k++){ idij=is; t3=t2; for(i=2; i<ido; i+=2){ idij+=2; t3+=2; c1[t3-1]=wa[index+idij-1]*ch[t3-1]-wa[index+idij]*ch[t3]; c1[t3]=wa[index+idij-1]*ch[t3]+wa[index+idij]*ch[t3-1]; } t2+=ido; } } break loop; } } } static void drftb1(int n, float[] c, float[] ch, float[] wa, int index, int[] ifac){ int i, k1, l1, l2=0; int na; int nf, ip=0, iw, ix2, ix3, ido=0, idl1=0; nf=ifac[1]; na=0; l1=1; iw=1; for(k1=0; k1<nf; k1++){ int state=100; loop: while(true){ switch(state){ case 100: ip=ifac[k1+2]; l2=ip*l1; ido=n/l2; idl1=ido*l1; if(ip!=4){ state=103; break; } ix2=iw+ido; ix3=ix2+ido; if(na!=0) dradb4(ido, l1, ch, c, wa, index+iw-1, wa, index+ix2-1, wa, index +ix3-1); else dradb4(ido, l1, c, ch, wa, index+iw-1, wa, index+ix2-1, wa, index +ix3-1); na=1-na; state=115; break; case 103: if(ip!=2){ state=106; break; } if(na!=0) dradb2(ido, l1, ch, c, wa, index+iw-1); else dradb2(ido, l1, c, ch, wa, index+iw-1); na=1-na; state=115; break; case 106: if(ip!=3){ state=109; break; } ix2=iw+ido; if(na!=0) dradb3(ido, l1, ch, c, wa, index+iw-1, wa, index+ix2-1); else dradb3(ido, l1, c, ch, wa, index+iw-1, wa, index+ix2-1); na=1-na; state=115; break; case 109: if(na!=0) dradbg(ido, ip, l1, idl1, ch, ch, ch, c, c, wa, index+iw-1); else dradbg(ido, ip, l1, idl1, c, c, c, ch, ch, wa, index+iw-1); if(ido==1) na=1-na; case 115: l1=l2; iw+=(ip-1)*ido; break loop; } } } if(na==0) return; for(i=0; i<n; i++) c[i]=ch[i]; } }