从信号 B 中消除信号 A

信息处理 过滤器 声音的 频谱 去噪 音频处理
2022-01-28 20:02:31

我有 2 个音频信号,在时域和频域中都可用:
A:噪声
B:噪声(A 有微小变化)+ 加性声音(C)

我想从 B 中消除信号 A,只留下 C。C
用于测试几乎为零,所以在从 B 中删除 A 之后,静音将是最好的。

我的信号可视化问题:
信号 A:
信号

信号 B: 在此处输入图像描述

现在我的问题是:
从 B 中消除 A 的最佳方法是什么?

我试图实现没有结果的功率谱减法,因为信号似乎不够相似,不能只减去它们。(或者我做错了,我这个案例只是告诉我这是否是最好的方法)

作为一个 C 的频谱就足够了,一个更图形化的方法可能会更好?为了平滑我的 fft 数据,计算功率谱(基本上是图片中的胆量)并减去它们以查看剩下的内容?(应该是C)?

附加问题:
如何在不“着色”声音的情况下改变频域信号的整体幅度?我尝试将所有实部和虚部乘以 x 但这会改变声音。

任何帮助表示赞赏!问候

2个回答

您正在绘制整个音频剪辑的 FFT 的事实让我认为您正在寻找错误的解决方案类别。从信号 A 和 B 的波形可以清楚地看出,您的噪声和信号不是静止的。如果您想使用频域降噪技术,在您的情况下,应该在较短的重叠窗口上完成,您可以假设信号和噪声的属性是固定的。您无法避免使用短期傅立叶变换

在这篇文章的其余部分,我会将符号切换为:

  • X原始(无噪声)信号
  • N噪声信号
  • Y=X+N你的观察,也就是说B.X是你想要恢复的,N在你的情况下是已知的(信号A)

大多数去噪方法具有相同的结构:得到一个 STFT 表示YN(矩阵Y(p,k)N(p,k), 在哪里p是帧索引和k频率仓索引),处理来自行的 FFT 帧对YN得到一个估计X^去噪信号频谱的切片,并使用它来构建应用于频域的滤波器/掩码Y,通过重叠相加执行到时域的转换。

我建议你尝试实现 Ephraim-Malah 算法,这是一种经典且经常被引用的“基线”去噪方法。它基于两个直观的技巧:

  • 估计 SNR 并在具有低 SNR 的段中衰减去噪滤波器的强度(这可以防止在信号接近噪声水平的区域出现许多伪影)。
  • 使用时间平滑(如果我们在一帧中具有高 SNR,则在下一帧中使滤波/减法更强,因为它也可能包含信号......)。

我找到了一组关于这个主题的相对独立的幻灯片——作者介绍了越来越复杂的去噪规则,从光谱减法到成熟的 Ephraim-Malah。他没有告诉您进行实际实施的唯一一件事是如何获得估算值S^x(p,k)- 因为你不观察X(p,k), 只是Y(p,k)N(p,k). 最简单的方法是从信号的功率谱中减去噪声的功率谱,并将结果为负的 STFT 单元归零:

S^x(p,k)={|Y(p,k)|2|N(p,k)|2when|Y(p,k)|2|N(p,k)|2>00otherwise

然后,您可以尝试幻灯片第 5 页和第 10 页上显示的过滤规则。

如果噪声信号 B 与信号 A 高度相关(意味着通过线性滤波相关),那么您可以使用自适应 FIR 滤波器从信号 B 中减去噪声并只留下 C。如果噪声不相关但只是具有相同的频谱和/或概率密度函数、谱减法或维纳滤波器(或两者的组合)是您的最佳选择。

与频域中的常数相乘应该可以工作。您必须确保将所有频率乘以相同的数字,即包括 DC、Nyquist 和负频率。如果您进行定点处理,您还需要注意溢出、削波和/或量化噪声。除此之外,在时域或频域中相乘并不重要。