FFT结果的物理意义

图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对 于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。傅立叶变换在实际中有很是明显的物理意义,设f是一个能量有限的模拟信号,则其傅立叶变换就表示f的谱。从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为灰度分布函数。


算法

    这样经过观察傅立叶变换后的频谱图,也叫功率图,咱们首先就能够看出,图像的能量分布,若是频谱图中暗的点数更多,那么实际图像是比较柔和的(由于各点与 邻域差别都不大,梯度相对较小),反之,若是频谱图中亮的点数多,那么实际图像必定是尖锐的,边界分明且边界两边像素差别较大的。对 频谱移频到原点之后,能够看出图像的频率分布是以原点为圆心,对称分布的。将频谱移频到圆心除了能够清晰地看出图像频率分布之外,还有一个好处,它能够分 离出有周期性规律的干扰信号,好比正弦干扰,一副带有正弦干扰,移频到原点的频谱图上能够看出除了中心之外还存在以某一点为中心,对称分布的亮点集合,这 个集合就是干扰噪音产生的,这时能够很直观的经过在该位置放置带阻滤波器消除干扰。另外我还想说明如下几点: 数组


一、图像通过二维傅立叶变换后,其变换系数矩阵代表: 
函数

若变换矩阵Fn原点设在中心,其频谱能量集中分布在变换系数短阵的中心附近(图中阴影区)。若所用的二维傅立叶变换矩阵Fn的原点设在左上角,那么图像信号能量将集中在系数矩阵的四个角上。这是由二维傅立叶变换自己性质决定的。同时也代表一股图像能量集中低频区域。 spa


2 、变换以后的图像在原点平移以前四角是低频,最亮,平移以后中间部分是低频,最亮,亮度大说明低频的能量大(幅角比较大)。


从计算机处理精度上就不难理解,一个长度为N的信号,最多只能有N/2+1个不一样频率,再多的频率就超过了计算机所能所处理的精度范围)


X[]数组又分两种,一种是表示余弦波的不一样频率幅度值:Re X[],另外一种是表示正弦波的不一样频率幅度值:Im X[],Re是实数(Real)的意思,Im是虚数(Imagine)的意思,采用复数的表示方法把正余弦波组合起来进行表示,但这里咱们不考虑复数的其 它做用,只记住是一种组合方法而已,目的是为了便于表达(在后面咱们会知道,复数形式的傅立叶变换长度是N,而不是N/2+1)。


用Matlab实现快速傅立叶变换


    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。若是要提升频率分辨力,则必须增长采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。 
blog

    假设FFT以后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就能够 计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An /N*cos(2*pi*Fn*t+Pn)。对于n=1点的信号,是直流份量,幅度即为A1/N。因为FFT结果的对称性,一般咱们只使用前半部分的结果,即小于采样频率一半的结果。 数学



    下面以一个实际的信号来作说明。假设咱们有一个信号,它含有2V的直流份量,频率为50Hz、相位为-30度、幅度为3V的交流信号,以及一个频率 (f0)为75Hz、相位为90度、幅度为1.5V的交流信号。用数学表达式就是以下:S=2+3*cos(2*pi*50*t- pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)。式中cos参数为弧度,因此-30度和90度要分别换算成弧度。咱们 以256Hz的采样率对这个信号进行采样,总共采样256点。按照咱们上面的分析,Fn=(n-1)*Fs/N,咱们能够知道,每两个点之间的间距就是 1Hz,第n个点的频率就是n-1。咱们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各 点应该接近0。实际状况如何呢?咱们来看看FFT的结果的模值如图所示。


it


                      图1 FFT结果
原理


从图中咱们能够看到,在第1点、第51点和第76点附近有比较大的值。咱们分别将这三个点附近的数据拿上来细看: 
1点: 512+0i 
2点: -2.6195E-14 - 1.4162E-13i 
3点: -2.8586E-14 - 1.1898E-13i 
50点:-6.2076E-13 - 2.1713E-12i 
51点:332.55 - 192i 
52点:-1.6707E-12 - 1.5241E-12i 
75点:-2.2199E-13 -1.0076E-12i 
76点:3.4315E-12 + 192i 
77点:-3.0263E-14 +7.5609E-13i 
很明显,1点、51点、76点的值都比较大,它附近的点值都很小,能够认为是0,即在那些频率点上的信号幅度为0。接着,咱们来计算各点的幅度值。分别计算这三个点的模值,结果以下: 
1点: 512 
51点:384 
76点:192 
按照公式,能够计算出直流份量为:512/N=512/256=2;50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;75Hz信号的幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来的幅度是正确的。 
而后再来计算相位信息。直流信号没有相位可言,不用管它。先计算50Hz信号的相位,atan2(-192, 332.55)=-0.5236,结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。再计算75Hz信号的相 位,atan2(192, 3.4315E-12)=1.5708弧度,换算成角度就是180*1.5708/pi=90.0002。可见,相位也是对的。根据FFT结果以及上面的 分析计算,咱们就能够写出信号的表达式了,它就是咱们开始提供的信号。


总结:假设采样频率为Fs,采样点数为N,作FFT以后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对 应该频率下的信号的幅度(对于直流信号是除以N);该点的相位便是对应该频率下的信号的相位。相位的计算可用函数atan2(b,a)计算。 atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。要精确到xHz,则须要采样长度为1/x秒的信号,并作FFT。要提升频率分 辨率,就须要增长采样点数,这在一些实际的应用中是不现实的,须要在较短的时间内完成分析。解决这个问题的方法有频率细分法,比较简单的方法是采样比较短 时间的信号,而后在后面补充必定数量的0,使其长度达到须要的点数,再作FFT,这在必定程度上可以提升频率分辨力。具体的频率细分法可参考相关文献.
方法




PS:这里解释下前面讲的假设原始信号的峰值为A,那么FFT的结果的每一个点(除了第一个点直流份量以外)的模值就是A的N/2倍。而第一个点就是直流份量,它的模值就是直流份量的N倍。这句话应该仅仅对sin,cos函数有效吧。若是时域上为x(n)=1,0<=n<=6,其余n均为0,16点fft显然不知足这个条件。im


   而对于cos函数,拿他举得例子看S(n)=2+3*cos(2*pi*50*n- pi*30/180)+1.5*cos(2*pi*75*n+pi*90/180)以256Hz的采样率对这个信号进行采样,总共采样256点。按照咱们 上面的分析,Fn=(n-1)*Fs/N,咱们能够知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。咱们的信号有3个频率:0Hz、 50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0。实际状况如何呢?

更具DFT的公式:


由于采样频率为256hz,

因此x(n)=s(n/256)=2+3*cos(2*pi*50*n/256-pi*30/180)+1.5*cos(2*pi*75*n/256+pi*90/180)

将x(n)带入,化简得:


最后利用正交原理,当k=0时,后面两项都等于0,X(0)=2*256=512;

    当k=50,第一和第三项为0,中间不为0,X(50)=3*1/2*256*e(-j*π/6),模值|X(50)|=384;

  当K=75,同理,模值|X(75)|=192;

(matlab中下标是从1开始的,因此K的取值向后延一位,即K=1,51,76)这与实验出来的结果是一致的。

相关文章
相关标签/搜索