为什么要了解加窗?
先扯远点讲。由于自己基础知识薄弱,导致我以前对行业内各种基础流程都是闭眼过。我的想法是,既然在几十年里大家都默认这么操作,那我的任务也不是在这种流程里挑刺,省下的脑筋可以用来研究这个阶段/时代该研究的东西。
我做实验也是,代码先跑起来看效果,如果效果不好那为什么还要花几天时间去了解它原理的实现?效果好了该写论文了,耐着性子多看几篇博客/论文也不是学不会。
整体来讲,这种想法弊大于利。利是过得开心,能够研究想研究的东西,还能发几篇论文;弊是对原理模棱两可。其实很多结论背后的思路想法是相似的,而自己只是在实验里机缘巧合学到了其中的一种,就沾沾自喜。而且,到了面试一问三不知的时候,总不能吹大牛说因为我get到了宇宙的真谛而不懂这个吧。
那么,为什么要了解加窗?
周五在看librosa的stft函数时,随手搜到了几篇讲窗函数的博客,发现加窗这个操作并不是因为要分帧。转念一想,分帧其实只要切片就行了。那么分帧后进行加窗这一步肯定是有其他原因的。
由于DFT/FFT会假设输入信号是某个周期信号在一整个周期内的截断,那么参照下图\(^{[1]}\),如果一个信号符合该假设(图上),那么它在时间上按周期拓展的信号会是连续的;如果不符合(图下),那么它的拓展就是不连续的,会产生其他的频率分量。
而且,如果只是截断而什么都不做,相当于是使用了矩形窗。可以参考下图\(^{[2]}\)里矩形窗和它的频谱,其特点是主瓣窄,旁瓣大,这些旁瓣会导致原信号在频域内存在频谱泄露:
使用其他的窗函数,会考虑到让被截断的信号在时域上的拓展更加平稳(时域上左右接近于0),同时尽量缩减旁瓣的幅度。
其他的参考文献
网络上有很多相关的问答,讲解的都很仔细,比如:
前面这两个给出了加窗与否对频域分析的影响。还可以看补零、频谱泄露、栅栏效应的关系?来了解相关的概念。
-
Zero-Padding of FFTs,这只是原文内的一节,它里面其他的讲解也是图文并茂的,很容易理解。
[1] The windowed DFT
[2] 有关信号处理中的窗函数