void FFT(double *pr,double *pi,int n,int k,double *fr,double *fi,int l,int il)
{ //pr 原始序列实部
//pi 原始序列虚部 . 本程序中原始序列虚部都为0
//n FFT的长度
//k k=log2(n)
//fr 变换后的实部
//fi 变换后的虚部
//l,il标志 一般正变换为,0,0,反变换为 1,0
int it,m,is,i,j,nv,l0;
double p,q,s,vr,vi,poddr,poddi;
for(it=0;it<n;it++)
{
m = it;
is = 0;
for(i=0;i<k;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;i++)
{
p = pr[i-1]*pr[1];
q = pi[i-1]*pi[1];
s = (pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
pr[i] = p-q;
pi[i] = s-p-q;
}
for(it=0;it<n-1;it+=2)
{
vr = fr[it];
vi = fi[it];
fr[it] = vr+fr[it+1];
fi[it] = vi+fi[it+1];
fr[it+1] = vr - fr[it+1];
fi[it+1] = vi - fi[it+1];
}
m = n/2;nv = 2;
for(l0 = k-2;l0>=0;l0--)
{
m = m/2;
nv = 2*nv;
for(it=0;it<=(m-1)*nv;it = it + nv)
for(j=0;j<=(nv/2)-1;j++)
{
p = pr[m*j]*fr[it+j+nv/2];
q = pi[m*j]*fi[it+j+nv/2];
s = pr[m*j]+pi[m*j];
s = s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
poddr = p - q;
poddi = s - p - q;
fr[it+j+nv/2] = fr[it+j] - poddr;
fi[it+j+nv/2] = fi[it+j] - poddi;
fr[it+j] = fr[it+j] + poddr;
fi[it+j] = fi[it+j] + poddi;
}
}
if(l!=0)
{
for(i=0;i<n;i++)
{
fr[i] = fr[i]/(1.0*n);
fi[i] = fi[i]/(1.0*n);
}
}
if(il !=0)
{
for(i=0;i<n;i++)
{
pr[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
}
}
}
这是我在网上下的FFT算法,
能不能帮我注释一下,每段大概的意思
因为我不懂这个算法,实在是看不懂
谢谢各位了
实在是急
{ //pr 原始序列实部
//pi 原始序列虚部 . 本程序中原始序列虚部都为0
//n FFT的长度
//k k=log2(n)
//fr 变换后的实部
//fi 变换后的虚部
//l,il标志 一般正变换为,0,0,反变换为 1,0
int it,m,is,i,j,nv,l0;
double p,q,s,vr,vi,poddr,poddi;
for(it=0;it<n;it++)
{
m = it;
is = 0;
for(i=0;i<k;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;i++)
{
p = pr[i-1]*pr[1];
q = pi[i-1]*pi[1];
s = (pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
pr[i] = p-q;
pi[i] = s-p-q;
}
for(it=0;it<n-1;it+=2)
{
vr = fr[it];
vi = fi[it];
fr[it] = vr+fr[it+1];
fi[it] = vi+fi[it+1];
fr[it+1] = vr - fr[it+1];
fi[it+1] = vi - fi[it+1];
}
m = n/2;nv = 2;
for(l0 = k-2;l0>=0;l0--)
{
m = m/2;
nv = 2*nv;
for(it=0;it<=(m-1)*nv;it = it + nv)
for(j=0;j<=(nv/2)-1;j++)
{
p = pr[m*j]*fr[it+j+nv/2];
q = pi[m*j]*fi[it+j+nv/2];
s = pr[m*j]+pi[m*j];
s = s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
poddr = p - q;
poddi = s - p - q;
fr[it+j+nv/2] = fr[it+j] - poddr;
fi[it+j+nv/2] = fi[it+j] - poddi;
fr[it+j] = fr[it+j] + poddr;
fi[it+j] = fi[it+j] + poddi;
}
}
if(l!=0)
{
for(i=0;i<n;i++)
{
fr[i] = fr[i]/(1.0*n);
fi[i] = fi[i]/(1.0*n);
}
}
if(il !=0)
{
for(i=0;i<n;i++)
{
pr[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
}
}
}
这是我在网上下的FFT算法,
能不能帮我注释一下,每段大概的意思
因为我不懂这个算法,实在是看不懂
谢谢各位了
实在是急
解决方案 »
- SDI中TreeCtrl的问题
- 请教一个获取文件图标的问题
- 怎么在listctrl中动态的加入不定数目的带图标的item
- StretchBlt使用过程中出现的诡异的问题;
- 请问各位老大怎么获取硬件信息?
- (高分求助)怎么改变滚动条的小方块长短????是滚动条控件
- 大家,一定看过windows操作系统右下角的调整时间日期的程序,我也想要一个象他一样的输入时间和日期spinedit控件
- 在ocx中如何使用一个ActiveX,不算使用IMPORT,还有没有别的方法呢?(大送100分)
- 急急急急!哪位朋友有《Visual C++高级界面特效制作百例》这本书的电子版的!
- 寻找windows ce 的开发工具
- 用((CFrameWnd*)AfxGetApp()->m_pMainWnd)和AfxGetMainWnd() 获得的CMainFrame指针什么不同吗 怎么我在程序中获取的指针值都不一样
- 帮忙解释一段简单的程序
典型fft分形
写清楚估计得十大几页
不会又是毕业设计吧