一般来说,FFT的数据点个数为以2为基数的整数次方(采用以2为基的FFT算法,可以提升运算性能),但是并没有要求FFT的数据点个数一定为2的n次方。
因此针对数据点数不是以2为基数的整数次方,有两种处理方法:①在原始数据开头或者末尾补零,将数据补到以2为基数的整数次方;②采用以任意数为基数的FFT算法。
那接下来就两种处理方法进行说明,分析优点与缺点。
举例:假设输入一个信号,可以看出该信号中包含了两个不同频率的余弦信号,
,
。假设采样频率
。
1. 不补零FFT
如果采1000个点,那么时域信号的时长就为,如下图左所示。直接对1000个点进行FFT,不进行补零操作,就可得到如下图右所示。
由上图可知,频谱点较为稀疏 ,在1MHz附近根本无法将1 MHz 和1.05 MHz 的两个频率分开。这是由于频率分辨率不够。那么,如何提高频率分辨率呢?
频率分辨率分为两种,一种是波形分辨率,另外一种为视觉分辨率(FFT分辨率)
①波形分辨率:由原始数据的时间长度决定
②视觉分辨率(FFT分辨率):由采样频率和参与FFT的数据点数决定
注意:当不进行补零操作时,上述两种分辨率是相等的,如下公式所示。
2. 补零FFT
在上述1000个数据点个数的基础上补零至7000个,那么该信号如下图左所示。那么进行补零后的FFT结果如下图右所示。
由上图可知,频谱点密集了,但是还是无法把在1MHz附近的1 MHz 和1.05 MHz 的两个频率分开。这是因为波形分辨率为100kHz(),大于1 MHz 和1.05 MHz之间距离的50kHz,且波形分辨率只与原始数据的时长T有关,与参与FFT的数据点数无关,因此补多少零都无用。
但是补零的频谱图相比于不补零的频谱图,其频域曲线更加光滑,即增加另外一个分辨率,即FFT分辨率。因此“时域补零相当于频域插值”,时域补零相当于在频域增加了插值点数。
3. 增加采样数据点数不补零
因此为了进一步区分1MHz附近的1 MHz 和1.05 MHz 的两个频率,需要改变原始数据的时长T。在采样频率不变()的情况下,如果采7000个点,那么时域信号的时长就为
,如下图左所示。对其进行FFT处理后得到的结果为下图右所示。
波形分辨率为:,小于1 MHz 和1.05 MHz之间距离的50kHz,因此可以区分两者。
解决了区分两种频率的问题,又出现了一个新的问题。
上图中可以清晰地看出,1MHz对于的幅值为1,与原始信号中该频率成分的幅值一致,但是1.05MHz对应的幅值和原始信号的幅值不一致,明显低于1,但是其周边的点却有较大的幅值,这就是频谱泄露。
4. 增加采样数据点数并补零
频谱泄露: 因为数据点的个数,使得在1MHz处有谱线存在,而在1.05MHz处却没有,使得测量结果偏离实际值,同时在实际频率点的能量分散在两侧的其他频率点上,并出现一些幅值较小的假谱。
因此,我们需要设法让谱线同时经过1MHz和1.05MHz,找到两者的公约数,1MHz=80×12.5kHz;1.05MHz=84×12.5kHz,为两个频率的公约数。FFT分辨率为 ,因此进行补零操作,在原始数据7000个的基础上补零至8000个数据点数,如下图左所示。对其FFT后,结果如下图右所示。
这时 1MHz和1.05MHz 对应的幅值都为1,与原始信号一致。这也是一种补零操作带来的好处影响。
5. 进一步增加采样数据点数不补零
上图中会有一些旁瓣出现,这是因为补零影响了原始信号,如果,直接采8000个点作为原始数据,如下图左所示。 FFT结果为如下图右所示。