原创 C语言里傅立叶变换

2015-5-12 16:05 2741 23 6 分类: 处理器与DSP

#include<stdio.h>

#include<math.h>
classcomplex//
定义一个类,实现复数的所有操作
{
doubleReal,Image;//
实部与虚部
public:
complex(doubler="0",doublei="0"){Real=r;Image=i;}
doubleGetR(){returnReal;}//
取出实部
doubleGetI(){returnImage;}//
取出虚部
complexoperator+(complex&);//
复数加法
complexoperator-(complex&);//
复数减法
complexoperator*(complex&);//
复数乘法
voidoperator=(complex&);//
复数赋值
};
complexcomplex::operator+(complex&c)//
复数加法
{
complext;
t.Real=Real+c.Real;
t.Image=Image+c.Image;
returnt;
}
complexcomplex::operator-(complex&c)//
复数减法
{
complext;
t.Real=Real-c.Real;
t.Image=Image-c.Image;
returnt;
}
complexcomplex::operator*(complex&c)//
复数乘法
{
complext;
t.Real=Real*c.Real-Image*c.Image;
t.Image=Real*c.Image+Image*c.Real;
returnt;
}
voidcomplex::operator=(complex&c)//
复数赋值
{
Real=c.Real;
Image=c.Image;
}
voidfft(complexa[],intlength,intjishu)//
实现fft的函数
{
constdoublePI="3".141592653589793;
complexu,Wn,t;
inti,j,k,m,kind,distance,other;
doubletmp;
for(i=0;i<length;i++)//
实现倒叙排列
{
k="i";
j=0;
for(m=0;m<jishu;m++)
{
j="j"*2+k%2;
k/=2;
}
if(i<j)
{
t="a";
a=a[j];
a[j]=t;
}
}
for(m=1;m<=jishu;m++)//
m级蝶形运算,总级数为jishu
{
kind=(int)pow(2,m-1);//
m级有2^(m-1)种蝶形运算
distance=2*kind;//
同种蝶形结相邻距离为2^m
u=complex(1,0);//
旋转因子初始值为1
tmp=PI/kind;
Wn=complex(cos(tmp),-sin(tmp));//
旋转因子Wn
for(j=0;j<kind;j++)//
每种蝶形运算的起始点为j,共有kind
{
for(i=j;i<length;i+=distance)//
同种蝶形运算
{
other=i+kind;//
蝶形运算的两个因子对应单元下标的距离为2^(m-1)
t=a[other]*u;//
蝶形运算的乘积项
a[other]=a-t;//
蝶形运算
a=a+t;//
蝶形运算
}
u="u"*Wn;//
修改旋转因子,多乘一个基本DFT因子WN
}
}
}
voidmain(void)
{
doublea,b;
complexx[8];//
此程序以8点序列测试
printf("8
点序列:\n");
for(inti="0";i<8;i++)//
初始化并输出原始序列
{
x=complex(i,i+1);
printf("x(%d)=%lf+%lfi\n",i+1,x.GetR(),x.GetI());
}
fft(x,8,3);//
调用fft函数
printf("fft
变换的结果为:\n");
for(i=0;i<8;i++)//
输出结果
printf("X(%d)=%lf+%lfi\n",i+1,x.GetR(),x.GetI());
}


文章评论1条评论)

登录后参与讨论

roumao_411466022 2016-6-13 16:11

mark.
相关推荐阅读
用户1831175 2015-05-12 16:17
深入浅出的学习傅里叶变换
学习傅里叶变换需要面对大量的数学公式,数学功底较差的同学听到傅里叶变换就头疼。事实上,许多数学功底好的数字信号处理专业的同学也不一定理解傅里叶变换的真实含义,不能做到学以致用!  事实上,傅里叶变换的...
用户1831175 2015-05-12 16:13
multisim 傅立叶分析
傅立叶分析是一种分析复杂周期性信号的方法。它将非正弦周期信号分解为一系列正弦波、余弦波和直流分量之和。傅立叶分析以图表或图形方式给出信号电压分量的幅值频谱和相位频谱。傅立叶分析同时也计算了信号的总谐波...
用户1831175 2015-05-12 16:12
图像的傅里叶变换
傅里叶变换是将时域信号分解为不同频率的正弦和/余弦和的形式。傅里叶变换是数字图像处理技术的基础,其通过在时空域和频率域来回切换图像,对图像的信息特征进行提取和分析。详见附件!...
用户1831175 2015-05-12 15:56
为什么要进行傅里叶变换?(必看)
一、傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让人很难能够从感性上得到理解,...
用户1831175 2015-05-12 15:39
傅立叶变换的物理意义
傅立叶变换(动画演示)1、为什么要进行傅里叶变换,其物理意义是什么?傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的...
我要评论
1
23
关闭 站长推荐上一条 /2 下一条