关于MATLAB FFT频谱泄露和加窗

我们分析的信号,如果只含整数次谐波的话,用FFT分析信号的频谱和相位是非常准确的,如果信号含有确定的间谐波,比如信号含有60HZ和65HZ的频率,那我们也可以准确的分析出信号的频谱和相位,我们只要用矩形窗截取10个周波的信号就可以分析出50HZ/10=5HZ以及5HZ的整数倍的信号的频谱和相位了,分析的相位和频谱都是非常准确的!如果我们需要分析的信号含有不确定的间谐波,比如我们根本不知道信号含有什么样的间谐波,那么此时用FFT分析,必然会有频谱泄露!那么怎么样才能减少频谱泄露呢(注意:这种情况下我们只能减少频谱泄露,而基本上不可能完全消除频谱泄露)?

我们可以有两种方法:方法一:增加采样的长度,方法二:加窗函数。

 
增加采样长度可以分析出更多频率的信号,可以减少频谱泄露,不过增加采样长度必然会对数据处理的实时性造成影响! 理想的窗函数是主瓣很窄,旁瓣衰减很快,矩形窗的主瓣很窄,但是旁瓣衰减却很慢,hanning窗、hamming窗、blackman窗等的旁瓣衰减有了明显的改进,但是主瓣却宽了很多,大概是矩形窗主瓣的二倍,blackman窗的主瓣还要宽,这就造成了信号频谱的频率识别率很低! 什么叫频率识别率呢?简单举个例子解释一下:比如说我取十个周波(请注意:这里我用十个周波举例子是为了便于计算,实际中我们是不取10个周波的,因为基2的FFT运算要求取样点数是2的整数倍整数次幂,我们实际操作是取4、8或者16个周波等2的整数次幂),我用一个含有25HZ间谐波的信号做分析,那么我加hamming窗和hanning窗以后,在20HZ和30HZ处的频率点上都将有幅值,而且有趣的是:我们将20HZ、25HZ和30HZ频率点处的幅值相加以后基本上接近与信号在25HZ处的真实幅值(这一点我还没搞清楚,是否隐含什么关系),并且在频谱上看到的25HZ处的幅值要小于实际信号在25HZ处的幅值,所以我们要对加窗后的FFT变换的幅值要乘以一个恢复系数,不同窗的恢复系数也是不同,矩形窗的是1,hanning窗的是2,hamming窗的好像是1.84左右吧(不好意思,记不清了,大家可以在网上查到)!这样我们在分析25HZ频率点处的幅值时,对于20HZ和30HZ频率点处的幅值都是不可信的,所以我们至少要求20HZ和30HZ附近是不能有信号的,这样频率分辨率相对来说是不是就降低了?因为20HZ和30HZ是不能用的!(哈哈,语言组织能力差了点,有什么不严谨的地方大家包含啊)!

大家可想而知,如果我的原始信号在20HZ和30HZ处本来就都有幅值,那么20HZ和30HZ处的频率也将反过来影响25HZ处的信号,这样测出来的幅值误差将会很大,所以我们在加窗时由一个要求:那就是谐波和间谐波,以及间谐波与间谐波之间要相隔较远,我觉得,至少要相隔2条谱线以上我们才能获得较高精度的幅值!blackman窗要求相隔的谱线还要多!这是因为blackman窗的主瓣还要宽!

所以对于加窗函数我们要权衡利弊,根据具体需要来选择!


MATLAB中FFT结果的物理意义

  采样得到的数字信号,就可以做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<=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结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。

你可能感兴趣的:(关于MATLAB FFT频谱泄露和加窗)