傅立叶变化无法确切地告诉我们每种频率的谐振成分随时间演化的振动情况,只有全时域的信息

回答: 10Q ABCmarketreflections2010-02-14 14:21:29

离散傅立叶变化:DFT
傅立叶分析的基本概念是用一系列的正弦、余弦函数作为级数来展开任意周期函数,或者利用傅立叶变换将一个非周期函数作时频转换:





这相当于将一个非周期的信号分解为无数个不同频率的谐振子振动的叠加。信号既可以在时域表示(以时间为自变量),也可以在频域表示(以频率为自变量),两者通过上面的傅立叶积分公式联系起来。


在应用中,接触到的往往是非周期信号,原则上应该使用上面的积分表达式来实现从时域到频域的变换。但是由于硬件对数据的采集以及运算都是离散的,因此实际中使用的是DFT(离散傅里叶变换)。


假定我们通过AD卡采集了N个数据,对应于(n=0,1,2,…,N-1)。DFT算法假定在这N个值之外的数据均为0,用对这N个点求和来代替积分,有:





这样就基本实现了从时域到频域的变化,当然,还不完整,要想得到具体的频率值,我们还需要知道AD卡的采样频率,或者是采集这N个点所用的时间。

作为练习,请尝试利用求和近似的方法将积分公式改写成DFT的级数式。假定采集花去的总时间为T,请给出的相应频率


傅立叶变化的时频转换的特性在物理学中有着广泛的应用,尤其在电子散射、光学散射、量子物理以及固体物理中关于晶格的处理等方面起着极为重要的作用。而在工程应用中,离散傅立叶变化更是信号处理最为基本的工具。因此,掌握傅立叶分析,无论对于理论物理的学习或者是实验数据信号的处理,都是十分必要的。关于傅立叶变化的一些特性,比如时频不确定性,卷积公式等可以参考有关书籍(数学物理方法),这里我们主要还是介绍在信号处理中傅氏变换的使用。


FFT(快速傅立叶变换)
在实用中,往往需要对很长的数据组进行离散傅立叶变换。直接使用DFT算法,效率低下,需时很长。一般采用FFT的方法,其具体算法比较复杂,有兴趣可以参看有关编程算法的书籍。这里仅是指出,FFT算法在运算效率上大大超过DFT,尤其是当数组长度为时,最为明显。其变换结果有一个显著的特点,即关于中点对称,因此如果自行编程fft,有无对称性是一个重要的衡量对错的标准。当然,实用中我们只要取一半的输出结果即可。


在matlab中,fft算法可以直接用函数“fft”来实现,其结果是一个对称的复数数组,如下图:




练习:
(1)请使用square命令产生一列方波,然后用fft转换为频域信号,并作出频率-强度图与频率-相角图。

(2)改变方波的宽度(不是频率),观察不同宽度的方波的频率图。

(3)尝试使用一些非周期函数,比如一条直线(垂直为delta函数,水平为常数函数),用fft来观察频率-强度图形。试总结一下,对于非周期函数,在时域中的平缓程度与在频域中的平缓程度有什么关系?


逆变换
前面介绍了傅里叶变换使时域信号变换为频域信号。当我们需要将一张频谱图(频率—振幅平方)变换为时域图时,需要用到傅立叶逆变换,在matlab中,其指令为ifft。对同一个数组,连续使用fft与ifft,可以完整地得到原数组(没有虚部)。而一般使用fft或ifft,新数组必定是个复数数组。除此之外,ifft与fft的结果是以点数为坐标的,想得到相应的时间(频率)的话,必须要注意坐标的变化。

时频局域化
傅立叶变化虽然是十分重要的信号处理工具,但仍然有令人遗憾的缺陷,即时频不局域。这导致了加窗变换、小波变换方法的产生。尤其是小波变换,近年来十分热门,其在量子力学中的应用也开始受到热切的关注。

所谓傅立叶变化的时频不局域,是指如果要得到频域的信息,比如频谱图,必须对全时域所有的信号作积分变换,即我们无法知道某个频率的谐振子在某一段时间内的振幅是如何变换的。傅立叶变化无法确切地告诉我们每种频率的谐振成分随时间演化的振动情况,只有全时域的信息,这对于很多情况下的分析是不够的,因此发展了所谓的加窗变换。其基本想法是抽取某一段时间的信号,进行放大,然后再和其他时段的信号放在一起做傅立叶变换,得出的信号可以一定程度上反映某频率的谐振子在该段时间之内的变化。下一节中,将会进一步介绍加窗变换。至于小波变换,要求的数学比较复杂,有兴趣的话可以查阅一些工程应用中的小波变换方法(matlab中有专门的wavelet工具箱)

请您先登陆,再发跟帖!