//a-长度为n+1的数组,返回时存放傅里叶级数系数ak //b-长度为n+1的数组,返回时存放傅里叶级数系数bk void kfour(double f[],int n,double a[],double b[]) { int i,j; double t,c,s,c1,s1,u1,u2,u0; t=6.283185306/(2.0*n+1.0); c=cos(t); s=sin(t); t=2.0/(2.0*n+1.0); c1=1.0; s1=0.0; for (i=0; i<=n; i++) { u1=0.0; u2=0.0; for (j=2*n; j>=1; j--) { u0=f[j]+2.0*c1*u1-u2; u2=u1; u1=u0; } a[i]=t*(f[0]+u1*c1-u2); b[i]=t*u1*s1; u0=c*c1-s*s1; s1=c*s1+s*c1; c1=u0; } return; }
//快速离散傅里叶变换(FFT) //pr-长度为n的数组,当l=0时,存放n个采样输入的实部,返回时存放离散傅里叶变换的模; // 当l=1时,存放傅里叶变换的n个实部,返回时存放逆傅里叶变换的模; //pi-长度为n的数组,当l=0时,存放n个采样输入的虚部,返回时存放离散傅里叶变换的幅角(单位为度); // 当l=1时,存放傅里叶变换的n个虚部,返回时存放逆傅里叶变换的幅角(单位为度); //n-整型变量,输入的点数 //k-整型变量,满足n=2^k //fr-长度为n的数组,当l=0时,返回时存放离散傅里叶变换的实部; // 当l=1时,返回时存放逆傅里叶变换的实部 //fi-长度为n的数组,当l=0时,返回时存放离散傅里叶变换的虚部; // 当l=1时,返回时存放逆傅里叶变换的虚部 //l-整型变量,l=1时,计算傅里叶变换,当l=0时,计算逆傅里叶变换 //il-整型变量,il=0时,表示不要求计算傅里叶变换或逆变换的模与幅角 // il=1时,表示要求计算傅里叶变换或逆变换的模与幅角 void kkfft(double pr[],double pi[],int n,int k,double fr[],double fi[],int l,int il) { int it,m,is,i,j,nv,l0; double p,q,s,vr,vi,poddr,poddi; for (it=0; it<=n-1; it++) { m=it; is=0; for (i=0; i<=k-1; i++) { j=m/2; is=2*is+(m-2*j); m=j; } fr[it]=pr[is]; fi[it]=pi[is]; } pr[0]=1.0; pi[0]=0.0; p=6.283185306/(1.0*n); pr[1]=cos(p); pi[1]=-sin(p); if (l!=0) pi[1]=-pi[1]; for (i=2; i<=n-1; i++) { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1]; s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
上一篇:在SPLUS中直接连接SQLSERVER 2005
下一篇:《雷神之锤III》里求平方根的函数
|