c语言傅里叶函数的运用 傅里叶变换编程实现( 三 )


上式其实表示的是连续傅里叶变换的逆变换,即将时间域的函数f(t)表示为频率域的函数F(ω)的积分 。反过来,其正变换恰好是将频率域的函数F(ω)表示为时间域的函数f(t)的积分形式 。一般可称函数f(t)为原函数,而称函数F(ω)为傅里叶变换的像函数,原函数和像函数构成一个傅立叶变换对(transform pair) 。
一种对连续傅里叶变换的推广称为分数傅里叶变换(Fractional Fourier Transform) 。
当f(t)为奇函数(或偶函数)时,其余弦(或正弦)分量将消亡,而可以称这时的变换为余弦转换(cosine transform) 或 正弦转换(sine transform).
另一个值得注意的性质是,当f(t) 为纯实函数时,F(?6?1ω) = F(ω)*成立.
傅里叶级数
主条目:傅里叶级数
连续形式的傅里叶变换其实是傅里叶级数的推广,因为积分其实是一种极限形式的求和算子而已 。对于周期函数,其傅里叶级数是存在的:
f(x) = \sum_{n=-\infty}^{\infty} F_n \,e^ ,
其中Fn 为复振幅 。对于实值函数,函数的傅里叶级数可以写成:
f(x) = \fraca_0 + \sum_{n=1}^\infty\left[a_n\cos(nx)+b_n\sin(nx)\right],
其中an和bn是实频率分量的振幅 。
离散时间傅里叶变换
主条目:离散时间傅里叶变换
离散傅里叶变换是离散时间傅里叶变换(DTFT)的特例(有时作为后者的近似) 。DTFT在时域上离散,在频域上则是周期的 。DTFT可以被看作是傅里叶级数的逆 。
如何用C语言或汇编语言实现FFT(快速傅里叶)变换,并写出C语言或汇编代码,万分感谢 。float ar[1024],ai[1024];/* 原始数据实部c语言傅里叶函数的运用,虚部 */
float a[2050];
voidfft(int nn) /* nn数据长度 */
{
int n1,n2,i,j,k,l,m,s,l1;
float t1,t2,x,y;
float w1,w2,u1,u2,z;
float fsin[10]={0.000000,1.000000,0.707107,0.3826834,0.1950903,0.09801713,0.04906767,0.02454123,0.01227154,0.00613588,};
float fcos[10]={-1.000000,0.000000,0.7071068,0.9238796,0.9807853,0.99518472,0.99879545,0.9996988,0.9999247,0.9999812,};
switch(nn)
{
case 1024:s=10; break;
case 512:s=9;break;
case 256:s=8;break;
}
n1=nn/2;n2=nn-1;
j=1;
for(i=1;i=nn;i++)
{
a[2*i]=ar[i-1];
a[2*i+1]=ai[i-1];
}
for(l=1;ln2;l++)
{
if(lj)
{
t1=a[2*j];
t2=a[2*j+1];
a[2*j]=a[2*l];
a[2*j+1]=a[2*l+1];
a[2*l]=t1;
a[2*l+1]=t2;
}
k=n1;
while (kj)
{
j=j-k;
k=k/2;
}
j=j+k;
}
【c语言傅里叶函数的运用 傅里叶变换编程实现】for(i=1;i=s;i++)
{
u1=1;
u2=0;
m=(1i);
k=m1;
w1=fcos[i-1];
w2=-fsin[i-1];
for(j=1;j=k;j++)
{
for(l=j;lnn;l=l+m)
{
l1=l+k;
t1=a[2*l1]*u1-a[2*l1+1]*u2;
t2=a[2*l1]*u2+a[2*l1+1]*u1;
a[2*l1]=a[2*l]-t1;
a[2*l1+1]=a[2*l+1]-t2;
a[2*l]=a[2*l]+t1;
a[2*l+1]=a[2*l+1]+t2;
}
z=u1*w1-u2*w2;
u2=u1*w2+u2*w1;
u1=z;
}
}
for(i=1;i=nn/2;i++)
{
ar[i]=4*a[2*i+2]/nn; /* 实部 */
ai[i]=-4*a[2*i+3]/nn; /* 虚部 */
a[i]=4*sqrt(ar[i]*ar[i]+ai[i]*ai[i]); /* 幅值 */
}
}
关于c语言傅里叶函数的运用和傅里叶变换编程实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

推荐阅读