快速傅里叶变换FFT结果的物理意义,附已验证C51,AVR单片机程序
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。
虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。
现在就根据实际经验来说说FFT结果的具体物理意义。一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此啰嗦了。
采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。 假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。
这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点〔除了第一个点直流分量之外〕的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量〔即0Hz〕,而最后一个点N的再下一个点〔实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后〕那么表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,那么可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,那么结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,那么结果可以分析到0.5Hz。如果要提高频率分辨力,那么必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。
假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点〔n≠1,且n //AT89C52
//#include //atmeg128 #include
/*********************************************************************
快速福利叶变换C函数
函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下局部不依
赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复
数〔输入实数是可令复数虚部为0〕,输出为经过FFT变换的自然顺序的
复数
使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的
应该为2的N次方,不满足此条件时应在后面补0 函数调用:FFT(s); 作 者:吉帅虎 时 间:2022-2-20 版 本:Ver1.0 参考文献:
**********************************************************************/
#include
struct compx {float real,imag;}; //定义一个复数结构 struct compx
s[FFT_N]; //FFT输入和输出:从S[1]开始存放,根据大小自己定义
/******************************************************************* 函数原型:struct compx EE(struct compx b1,struct compx b2)
include意思 函数功能:对两个复数进行乘法运算 输入参数:两个以联合体定义的复数a,b
输出参数:a和b的乘积,以联合体的形式输出
*******************************************************************/ struct compx EE(struct compx a,struct compx b) {
struct compx c;
c.al-a.imag*b.imag; c.al*b.imag+a.al; return(c); }
/***************************************************************** 函数原型:void FFT(struct compx *xin,int N)
函数功能:对输入的复数组进行快速傅里叶变换〔FFT〕 输入参数:*xin复数结构体组的首地址指针,struct型
*****************************************************************/ void FFT(struct compx *xin) {
int f,m,nv2,nm1,i,k,l,j=0; struct compx u,w,t;
nv2=FFT_N/2; //变址运算,即把自然顺序变成倒位序,采用雷德算法
nm1=FFT_N-1;
for(i=0;i
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论