📄 smallft.c
字号:
for(i=0;i<n;i++)c[i]=ch[i];}static void dradb2(int ido,int l1,float *cc,float *ch,float *wa1){ 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)goto L105; 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[i-2]*tr2-wa1[i-1]*ti2; ch[t6]=wa1[i-2]*ti2+wa1[i-1]*tr2; } t2=(t1+=ido)<<1; } if(ido%2==1)return;L105: 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, float *wa2){ static float taur = -.5f; static float taui = .8660254037844386f; 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[i-2]*dr2-wa1[i-1]*di2; ch[t9]=wa1[i-2]*di2+wa1[i-1]*dr2; ch[t10-1]=wa2[i-2]*dr3-wa2[i-1]*di3; ch[t10]=wa2[i-2]*di3+wa2[i-1]*dr3; } t1+=ido; }}static void dradb4(int ido,int l1,float *cc,float *ch,float *wa1, float *wa2,float *wa3){ static float sqrt2=1.414213562373095f; 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)goto L105; 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[i-2]*cr2-wa1[i-1]*ci2; ch[t8]=wa1[i-2]*ci2+wa1[i-1]*cr2; ch[(t8+=t0)-1]=wa2[i-2]*cr3-wa2[i-1]*ci3; ch[t8]=wa2[i-2]*ci3+wa2[i-1]*cr3; ch[(t8+=t0)-1]=wa3[i-2]*cr4-wa3[i-1]*ci4; ch[t8]=wa3[i-2]*ci4+wa3[i-1]*cr4; } t1+=ido; } if(ido%2 == 1)return; L105: 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){ static float tpi=6.283185307179586f; int idij,ipph,i,j,k,l,ik,is,t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10, t11,t12; float dc2,ai1,ai2,ar1,ar2,ds2; int nbd; float dcp,arg,dsp,ar1h,ar2h; int ipp2; t10=ip*ido; t0=l1*ido; arg=tpi/(float)ip; dcp=cos(arg); dsp=sin(arg); nbd=(ido-1)>>1; ipp2=ip; ipph=(ip+1)>>1; if(ido<l1)goto L103; 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; } goto L106; L103: 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++; } L106: 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)goto L116; if(nbd<l1)goto L112; 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; } } goto L116; L112: 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; } } }L116: 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)goto L132; if(nbd<l1)goto L128; 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; } } goto L132; L128: 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; } } }L132: 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)goto L139; 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[idij-1]*ch[t3-1]-wa[idij]*ch[t3]; c1[t3]=wa[idij-1]*ch[t3]+wa[idij]*ch[t3-1]; t3+=ido; } } } return; L139: 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[idij-1]*ch[t3-1]-wa[idij]*ch[t3]; c1[t3]=wa[idij-1]*ch[t3]+wa[idij]*ch[t3-1]; } t2+=ido; } }}static void drftb1(int n, float *c, float *ch, float *wa, int *ifac){ int i,k1,l1,l2; int na; int nf,ip,iw,ix2,ix3,ido,idl1; nf=ifac[1]; na=0; l1=1; iw=1; for(k1=0;k1<nf;k1++){ ip=ifac[k1 + 2]; l2=ip*l1; ido=n/l2; idl1=ido*l1; if(ip!=4)goto L103; ix2=iw+ido; ix3=ix2+ido; if(na!=0) dradb4(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1); else dradb4(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1); na=1-na; goto L115; L103: if(ip!=2)goto L106; if(na!=0) dradb2(ido,l1,ch,c,wa+iw-1); else dradb2(ido,l1,c,ch,wa+iw-1); na=1-na; goto L115; L106: if(ip!=3)goto L109; ix2=iw+ido; if(na!=0) dradb3(ido,l1,ch,c,wa+iw-1,wa+ix2-1); else dradb3(ido,l1,c,ch,wa+iw-1,wa+ix2-1); na=1-na; goto L115; L109:/* The radix five case can be translated later..... *//* if(ip!=5)goto L112; ix2=iw+ido; ix3=ix2+ido; ix4=ix3+ido; if(na!=0) dradb5(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1,wa+ix4-1); else dradb5(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1,wa+ix4-1); na=1-na; goto L115; L112:*/ if(na!=0) dradbg(ido,ip,l1,idl1,ch,ch,ch,c,c,wa+iw-1); else dradbg(ido,ip,l1,idl1,c,c,c,ch,ch,wa+iw-1); if(ido==1)na=1-na; L115: l1=l2; iw+=(ip-1)*ido; } if(na==0)return; for(i=0;i<n;i++)c[i]=ch[i];}void spx_drft_forward(struct drft_lookup *l,float *data){ if(l->n==1)return; drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache);}void spx_drft_backward(struct drft_lookup *l,float *data){ if (l->n==1)return; drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache);}void spx_drft_init(struct drft_lookup *l,int n){ l->n=n; l->trigcache=(float*)speex_alloc(3*n*sizeof(*l->trigcache)); l->splitcache=(int*)speex_alloc(32*sizeof(*l->splitcache)); fdrffti(n, l->trigcache, l->splitcache);}void spx_drft_clear(struct drft_lookup *l){ if(l) { if(l->trigcache) speex_free(l->trigcache); if(l->splitcache) speex_free(l->splitcache); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -