使用 FFT Python 从音频信号中去除背景噪声

Posted

技术标签:

【中文标题】使用 FFT Python 从音频信号中去除背景噪声【英文标题】:Background noise removal from audio signals using FFT Python 【发布时间】:2012-04-27 22:18:08 【问题描述】:

我目前正在大学做一个项目,我正在使用 python 区分不同乐器演奏相同音高的音符。

我使用连接到计算机的麦克风在不同的乐器上录制了各种音符。

我还记录了房间的背景。

到目前为止,我在不同仪器上绘制了不同音符的图,在 y 轴上,我的振幅以 dB 为单位:20*log10(|FFT(signal)|)

在 x 轴上我有 DFT 采样频率

一些谐波峰值足够小(或背景足够大),以至于噪声成为一个因素 - (不能发布图像,因为我是菜鸟!)我的问题是计算不确定性的水平考虑背景噪声时的峰高。

我的问题是:

那么,在考虑背景噪声时,如何计算峰高(它们的相对谐波幅度)的不确定性水平。

一些想法:

在分类什么是谐波峰值和什么可归因于噪声时,我应该使用什么 dB 阈值(我应该将低于最大背景 (~28000dB) 或平均值 (~15000) 的峰值打折,或者可能是其中之一的两倍值)?

另外,考虑到背景引入的噪声,从我的仪器记录的 FFT bin n 中减去背景的 FFT bin n 中的值是否合法?

我也看过这个帖子 how can the noise be removed from a recorded sound,using fft in MATLAB? ,那里似乎有很大不同的意见。

如果它是相关的,我可以发布我的代码片段——尽管在同学剽窃的情况下放太多了。

非常感谢对项目有帮助的文献链接。 (仍处于我以我能想到的各种方式绘制数据以寻找每种仪器的区别属性的阶段)。

提前致谢

【问题讨论】:

(如果你链接到图片我可以为你内联) 【参考方案1】:

你似乎问了很多问题。让我先回答你的第一个问题:

那么,如何计算高度的不确定性水平 考虑到峰值(它们的相对谐波幅度) 背景噪音。

您会期望声音以线性方式求和(达到一阶近似值)。很自然的做法是只对背景进行一些记录,然后测量背景中谐波的平均幅度和标准偏差。

例如,假设您正在查看 3 个谐波 - 20KHz、11KHz 和 33KHz。只记录一些背景,你会发现平均幅度为 1.3dB、2.2dB 和 2.3dB,标准偏差为 +/-0.1、+/-0.2 和 +/-0.4dB。您现在有一个不确定性估计值和一个要减去的平均背景谐波。

有更聪明的方法可以做到这一点,但这是一个开始。

那么,继续你的第二个问题

在分类什么是谐波时我应该使用什么 dB 阈值 峰值和噪声可归因于什么(我应该将峰值打折吗? 比最大背景 (~28000dB) 或平均值 (~15000) 或可能 这些值之一的两倍)?

如果一个峰值在平均值内 + 不确定性(一个或两个标准偏差,这实际上是任意的,取决于惯例),您可以说它很重要。例如,如果您发现 3KHz 的噪声水平为 1.2dB,不确定性为 +/- 0.3dB,并且您测量谐波为 1.3dB,不确定性(以相同方式测量)为 0.1dB,那么它并不重要。

现在是第三部分:

另外,考虑到背景引入的噪音,是 从 FFT bin n 中减去背景的值是合法的 FFT bin n 用于我的乐器录音?

是的(一般来说)。如果您真的想说服自己相信这一点,您可以 A)用求和波进行一些模拟并对其进行 FFT,B)做一个实验,与 A 或 C 中的相同)通过傅里叶变换的数学。

关于文学,我认为这取决于你具体做什么,如果你是物理专业的学生 Mary Boas 的“物理科学中的数学方法”很好地处理傅立叶变换,如果你是计算机科学家/工程师,您可能想要不同的东西。

如果您需要更多帮助,请告诉我。

【讨论】:

以上是关于使用 FFT Python 从音频信号中去除背景噪声的主要内容,如果未能解决你的问题,请参考以下文章

Python ifft

使用 scipy.fft 进行Fourier Transform:Python 信号处理

使用 scipy.fft 进行Fourier Transform:Python 信号处理

Java - 使用 FFT 查找音频信号的频率和幅度

信号去噪方法缺点

去除信号中的直流分量