谁有傅立叶变换的原程序,急需!(100分)

  • 主题发起人 主题发起人 lwlnic
  • 开始时间 开始时间
L

lwlnic

Unregistered / Unconfirmed
GUEST, unregistred user!
首先,请斑竹原谅,我不知该把这个问题放到那里,所以放到这儿了。
本人做毕业设计需要用到正反傅立叶变换,当然要快速变换的啦!那位高手编过这种变换,请给我一个答复。谢谢!
 
到深度历险上去载一个,
我也可以发给你几个。
urus@163.net
 
无论你有C,PASCAL语言编写的都可以。深度历险上的哪个地方?
 
深度历险上的函数部分!
 
呵呵,那到底是个什么东西?
 
urus,我看了你邮寄来的程序,谢谢。
但是有个问题:输入一个数组,进行傅立叶变换后,进行
反傅立叶变换,与输入的不相同了。而用matlab提供的
函数进行变换,输入某个数组,正反傅立叶变换后,得到
相同的结果。
 
FFT还得要有个反变换的程序才可!
 
Jams,你说的不错,正反变换只是有个标志不同:-1,1。
 
我以前用过,好象可以的,但现在想不清了。
好象是要假设虚数部分为零才行。
对了,我用的是fft.zip包里的,这个最快。
不知你用的是哪个包里的
 
这三个原程序我都看过了,都是不行的。结果都与MATLAB算得不同,更别说反变换回原来的同一个数组。
 
以下的傅立叶变换很好用的:l=0为正傅立叶变换l=1为逆傅立叶变换。
Fourier(double pr [ ],do
uble pi [ ], int n, int k,do
uble fr [ ],do
uble fi [ ], int l, int il)
{
int it,m,is,i,j,nv,l0;
do
uble 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]);
pr=p-q;
pi=s-p-q;
}
for (it=0;
it<=n-2;
it=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-1;
i++)
{ fr=fr/(1.0*n);
fi=fi/(1.0*n);
}
if (il!=0)
for (i=0;
i<=n-1;
i++)
{ pr=sqrt(fr*fr+fi*fi);
if (fabs(fr)<0.000001*fabs(fi))
{ if ((fi*fr)>0) pi=90.0;
else
pi=-90.0;
}
else
pi=atan(fi/fr)*360.0/6.283185306;
}
return;
}
 
多人接受答案了。
 
有谐波分析的程序吗?
请给我发几个。最近深度历险上不去了。
谢谢
 
后退
顶部