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

标签 python signal-processing fft frequency-analysis noise-reduction

我目前正在大学做一个项目,我正在使用 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? , 那里似乎有非常不同的意见。

如果它是相关的,我可以发布我的代码片段——尽管在同学剽窃的情况下,我会谨慎地提出太多。

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

提前致谢

最佳答案

你好像问了很多问题。让我先回答您的第一个问题:

Well, how to calculate the level of uncertainty in the height of the peaks (their relative harmonic amplitudes) when accounting for background noise.

您会期望声音线性求和(达到一阶近似值)。自然而然的做法是只记录背景,然后测量背景中谐波的平均振幅和标准差。

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

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

那么,现在开始第二个问题

What dB threshold I should use when classifying what is a harmonic peak and what is attributable to noise (should I discount a peak lower than the maximum backgound (~28000dB) or the mean (~15000) or perhaps twice one of these values)?

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

第三部分:

Also, to take account of the noise introduced by background, is it legitimate to subtract the value in FFT bin n for the background, from FFT bin n for my instrument recording?

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

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

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

关于python - 使用 FFT Python 从音频信号中去除背景噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10176604/

相关文章:

c++ - 将 24 位有符号整数信号转换为 16 位有符号整数信号

计算功率谱密度

python - (215 :Assertion failed) type == CV_32FC1 || type == CV_32FC2 || type == CV_64FC1 || type == CV_64FC2 in function 'dft'

python - 如何获得非均匀 DFFT 的频率?

c++ - 预测 FFT 的拖尾

python - distutils/pip 中的可选依赖项

python - 如何从内存中删除多个 Pandas (python)数据帧以节省 RAM?

javascript - 如何在Selenium中获取JS生成的文本?

python - 如何提高读取文件程序的运行时性能

python - 如何使用python计算周期数