使用 STFT 过滤

信息处理 fft 过滤器 过滤器设计 信号分析 stft
2022-02-13 09:17:15

为了处理音频文件,我成功地实现了一个 STFT(+inverseSTFT,具有完美的原始信号重建、重叠添加等)。

使用这个 STFT / iSTFT 框架,我已经测试过:

  • 通过噪声模板的频谱减法工作的基本“降噪”算法 -> 效果非常好!

  • 通过将最低 bin 归零来进行高通滤波(或者,更好的想法:将这些最低 bin 乘以平滑窗口,如 Hann)。它有效(过滤对我的耳朵很好),但频谱图不是我想要的:

在此处输入图像描述

我更喜欢(对于低频0hz-300hz)类似的东西:

在此处输入图像描述

为了进行良好的高通滤波,我应该在 STFT 阵列中做什么?(即在低频中有一个干净的频谱图,就像这里的第二张图片)

PS:这是我在 Python 中使用的 STFT 方案:http: //pastebin.com/MdycVLQk

3个回答

您所指的技术是高级技术,通常称为“通过 STFT-masking 去噪”。

首先,您创建一个 STFT 矩阵,并使用您选择的任何权重来掩盖其模数(即 STFT 矩阵的绝对大小)。您可以选择二进制掩码(将您不想要的时频分格归零,同时保留您想要的时频分格),或者您可以执行软掩码,其中权重不是二进制的,但遵循一些与您在时频平面中的数据。

接下来,您应用逆 STFT,这可以通过查找时域信号的最小二乘估计来完成,这将在您执行掩蔽后给出修改后的(复数)STFT。(请参阅此处的这篇论文以及Griffin 和 Lin 的公式 6,了解通过时频 bin 归零对 STFT 逆变换进行最小二乘处理)。(在您的 STFT 反演中,您还必须确保求和帧之间的窗口系数之和相加为单位,因此在 STFT 分析中经常使用半周期 sin 窗口,重叠率为 50%。这不是然而,唯一的解决方案)。

因此,在其最简单的化身中,滤除 STFT 域中的高频分量意味着只需将这些 STFT bin 设置为零,然后应用最小二乘优化算法重新合成您的时域向量。(同样,如果你想做一个高,你可以在矩阵的低频带中消除或轻轻改变 STFT 系数)。请注意,如果您使用 Griffin 论文,则 LSE 将是 ISTFT 固有的。

您需要分析频域修改的脉冲响应(将其视为滤波器),并确保重叠的长度(使用重叠保存/添加)至少与此脉冲响应的重要部分一样长(以上您想要的噪音水平)。这可能需要更长的 FFT,或使用更宽的“更软”过渡带(或两者)进行频域修改。

您不能仅将 STFT 帧与您的滤波器响应相乘并反转傅立叶变换以获得滤波信号。频域中的任何乘法都是时域中的卷积。并且您使用的频率响应具有与之相关的特定时域内核。当您像这样进行卷积时,该内核将在两个帧边界处环绕,因为 FFT 卷积本质上是圆形的。特别是像高通这样的陡峭滤波器将对样本产生相当长的影响,并引入您所看到的伪影。

解决方案是使用重叠添加或重叠保存卷积方案,将循环卷积变为线性卷积。