白话FFT频谱分析全流程(以工程使用的角度)之一:前言和窗函数

白话FFT频谱分析全流程(以工程使用的角度)之一:前言和窗函数

前言

又到了我们的白话时间,今天我们来讲讲频谱分析的流程。
我们先再看一遍文章的标题,这里并不重点给大家讲FFT的来历和计算机实现内部细节,毕竟网上已经一抓一大把
今天我们抛开FFT实现本身,以工程实际使用这种接地气的角度重点关注下FFT前的工作,FFT使用的要点和FFT后的注意事项,让大家看了都能去搭建一个频谱分析出来,可能比较适合非数学专业的同学

到这里有童鞋会说了,计算机做频谱分析不就是一个FFT转换吗,我找个FFT的函数不就结了,还有其它的骚操作吗?
不错,但不全对。这里面的确是FFT,但如果你只知道把数据经过FFT再画出来,那基本上你的频谱是不正确的。
因为,你可不要忘了前前后后还有各种窗函数,频谱取半,数据取模,恢复系数,不同相除系数呀,毕竟我们要的是数据的精准值,少做了一步数据肯定当场完蛋!
哈哈,坑就坑在这儿了,无论是书上还是网上,(到发稿前)我还没找到一个把整个流程掰开了揉碎了讲明白正确,给大家做参考的。

那我就做第一个吧,我们开始!

开始

大家先看看这张图,我们就围绕这个讲:
在这里插入图片描述

第一部分:窗函数

第一点:为什么要加窗函数?
一句话:通过选择正确的窗函数,减少频谱泄露,获得尽可能正确的数据。
看图,图里啥都有:

在这里插入图片描述
FFT变换只能对有限长度的时域数据进行变换,因此对时域信号进行了截断。
这样一截断就出事了:即使是周期信号,如果截断的时间长度不是周期的整数倍,那么截取后的信号将会存在频谱泄漏,本来单一频率的波分析出来变成了好多频率,准确性下降很大。
加窗主要是为了使时域信号似乎更好的满足FFT处理的周期性要求,减少泄漏。
在这里插入图片描述
可以看出,加了窗后信号的起始时刻和结束时刻幅值都为0,也就是说在这个时间长度内,信号为周期信号,但是只有一个周期。对这个信号做FFT分析,相比之前未加窗的频谱,泄漏已明显改善,但并未完全消除。
第二点:既然窗函数这么重要,那我们怎么加呢?上程序:

//i的范围为[0,N-1],包括0和N—1
//i为当前点位置,N为fft点数
double FFTWinFunc::Hanning_Win(int i ,int N)   //汉宁窗
{
     return (0.5-0.5*cos((2 * MATH_PI*i )/(N - 1)));
}

double FFTWinFunc::Hamming_Win(int i ,int N)   //海明窗
{
    return (0.54-0.46*cos((2 * MATH_PI*i )/(N - 1)));
}

double FFTWinFunc::Blackman_Win(int i ,int N)  //布莱克曼窗
{
    double cos_factor=(2 * MATH_PI*i )/(N - 1);
    return ( 0.50-0.50*cos(cos_factor)+0.08*cos(2*cos_factor) );
}

double FFTWinFunc::Flattop_Win(int i ,int N)   //平顶窗
{
 double cos_factor=(2 * MATH_PI*i )/(N - 1);
 return ( 1-1.93*cos(cos_factor)+1.29*cos(2*cos_factor)-0.388*cos(3*cos_factor)+0.0322*cos(4*cos_factor) )/4.634;
}

如果解释一下程序,就是:你采集了多少个数据点,就也得生成这么多数据点的窗函数,然后再一一对应相乘,
不明白的再看下上一副图片,也可以到最后看主程序!

第三点:不同的窗函数有不同的使用时机:
在这里插入图片描述
 
主瓣越宽,有效噪声带宽越宽,频率的分辨能力越差。主瓣越窄,频率分辨越准确。对于窗函数宽的主瓣而言,如果有邻近的小峰值频率,则越难辨别出来。但如果特别要求了幅值准确(比如选择了平顶窗,它的幅值误差只有0.1%),那么频率误差就会大,
正所谓鱼和熊掌不可兼得呀。

在这里插入图片描述
 
  1. 如果截断的信号仍为周期信号,则不存在泄漏,无需加窗,相当于加矩形窗;
  2. 如果信号是随机信号或者未知信号,或者有多个频率分量,测试关注的是频率点而非能量大小,建议选择汉宁窗;
  3. 对于校准目的,则要求幅值精确,平顶窗是个不错的选择;
  4. 如果同时要求幅值精度和频率精度,可选择凯塞窗;
  5. 如果检测两个频率相近、幅值不同的信号,建议用布莱克曼窗;
  6. 锤击法试验,力信号加力窗,响应可加指数窗。

扫描二维码关注公众号,回复: 10617913 查看本文章

窗函数到这里我们就讲完了,本文部分图片选自https://www.vfe.ac.cn/NewsDetail-2239.aspx,在此声明。
下一篇我们讲FFT和数据取半,求模~
欢迎大家关注,点赞哦,您的支持是我加速更新和为您写出更好文章的动力!

发布了39 篇原创文章 · 获赞 113 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/whstudio123/article/details/105134400