基于FFT准确测量信号和噪声功率
1 FFT 频谱分析的频率分辨率和幅度精度
1.1 FFT频谱分析是周期信号谱分析的快速算法。如何统一分析结果的频谱幅度与已知信号的每个频率分量的幅度?
一般的,对实信号的FFT分析结果乘以因子2/N得到其实际频率功率。
这里有两个定义的问题,第一,分析是信号是实信号还是复信号,第二所求功率是其实际物理功率(无负频率))还是数学上定义的功率(包括负频率)。
首先摆出FFT的计算公式
计算的原理是原信号与不同频率的信号e-j2pi/N*kn的信号进行相关,相关的结果做为该频率2*pi/k分量的幅度,如两个信号频率完全相同,且初始相伴一致,认为完全相关,即该信号在该频率有能量存在,这时相关的结果为N,所以要得到其真实是幅度值要在相关结果的基础上再除以N。验证程序和结果如下,可以验证分析的正确性:
而在实际应用中不存在复信号,我们实际使用和分析的信号一般如表示为Acos(2*pi*f*t),我们认为A为其幅度,其频率为f;然而对于数学上的分析,其频率在+f和-f都存在分量,每个分量的幅度为A/2,因为Acos(2*pi*f*t)=A/2*e-j2*pi*f*t+A/2*ej2*pi*f*t,这也是FFT计算的结果。这是一个双边功率谱,若要得到单边功率谱的幅度,即我们假定的幅度A,需要乘以因子2.
1.2 FFT是对DTFT结果连续频率的再次采样,从而带来了栅栏效应,所得的频率是一个离散的频率。FFT是截取信号的一段进行处理的,相当于原信号时域上乘以一个窗函数,所以频率分析的结果为原信号的频谱卷积上窗函数的频率,由于有限长的窗函数频率上是无限长的,如下图所示,卷积的结果会造成原信号某个频率的能量分布在其它频率分量上,即频谱的泄漏。
即当信号频率f为fs/N*n<f<fs/N*(n+1)时,如果不存在能量泄漏只存在栅栏效应,FFT的结果上就无法观察到该频率分量。而是由于频率泄漏的缘故,我们可以f临近的单元上看到功率存在,借此估算原信号的频谱,所以此时的计算就会因为窗函数的不同和信号频率的不同产生较在的幅度测量差异。
如下图两个信号只有频率不同,都在同一个相信的频率间隔内,fs/N*n<f<fs/N*(n+1),都采用矩形窗,其它条件都相同的情况下,FFT的计算结果存在较大差异
这是因为矩形窗的主瓣较窄,由于频率不同卷积的结果漏泄在相邻单元上的功率就会差异较大。所以此时若采用主瓣较宽且平坦的窗函数如改善幅度精度。如下图采用了一个平顶窗后,仍分析上面例子中的信号频谱,得到了几乎相同的结果,大大提高了幅度精度。(采用不同的窗幅度要乘以一个不同的幅度修正因子)。
当然,在提高幅度的精度的同时,降低了频率分辨率,从上图观察到单一频率的能量泄漏到相邻的多个频率上,且幅度较大,频率分辨率比前一种方法恶化了。
1.3 如何同时提高频率分辨率和幅度精度
窗函数的主瓣越宽越平坦FFT后幅度的精度越高,相反其频率分辨率赵差,主瓣越窄其频率分辨率越高,但幅度有精度越差,这其实幅度的精度和频率的分辨率对于同一个窗函数来说是一对矛盾。实现方法如下:
① 设计两个窗,分别满足上面的两个条件,然后分别进行FFT计算。信号加两各种窗,作N点FFT变换,得频谱结果F1和F2,其中F1的幅度精度高,F2的频率分辨高。处理后的频谱初始化为F,对于所有的F(i)执行操作2,0<i<N-1;
② 判断F2(i)是否为其以为中心的5条谱线(会降低分辨率,值可作修改)的最大值, 是则F(i)=F1(i),否则F(i)=0或F(i)=F1(i)(视应用而定)。