音频信号处理中的峰值分离与反卷积

3
我正在尝试开发一种算法,可以将音乐文件中的器乐音符分离出来。使用了C#和C++ DLL。我已经花费了相当长的时间来实现它。目前为止,我所做的是:
  1. 在PCM上执行专门的FFT(它在时间和频率域中都具有高分辨率)
  2. 对FFT bin进行滤波器计算以模拟人类听觉系统(心理声学模型)
  3. 通过峰值检测进行模式识别,以为某些机器学习内容提供输入数据(当前规划阶段)

在当前进展中,我使用了简单的方法“选择本地最大值”来检测峰值。粗略地说,如果f(x-1)< f(x)> f(x+1),其中f(x)的频率响应且x是频率索引,则检测为峰值。

但是我在这里遇到了一些问题。如果两个或更多信号在频率域中接近,此方法只会检测到一个峰值,而其他所有峰值则被隐藏。我在网上搜索了几天。有些东西叫做“峰纯度”,“峰分离”。要进行峰分离,有几种方法。它们实际上可以很好地分离峰值。以下是我在网上搜索到的一些图片。

separation1
(来源:chromatography-online.org)

separation2

我认为使用“去卷积”方法可能是这种情况下最好的方法。但是我不知道如何去卷积我的频谱,以及如何使用去卷积分离峰值。据我所知,去卷积不会直接给我多个峰值组件,就像上面的图片中看到的那样。我应该使用哪些滤波器函数?由于我缺乏数学技能,因此需要伪代码级别的帮助。欢迎任何其他建议 :)

1个回答

2
为了检测峰值,您可以依靠贝叶斯方法。
每个峰值P_i可以用高斯函数建模,其特征是其均值m_i和标准偏差sigma_i
F(x) ~ Sum_i {  1 / sigma_i / sqrt(2Pi) * exp(-(x - m_i)^2 / sigma_i^2) }

您所拥有的是某个 x_jF(x_j) 。您所需要的是每个 i(x_i, m_i) ,以最小化最小二乘距离:

(x_i, m_i) = argMin(Sum_j {(F(x_j) - Sum_i { 1 / sigma_i / sqrt(2Pi) * exp(-(x - m_i)^2 / sigma_i^2) })^2 })

这种方程可以通过非线性最小二乘求解器来解决。
祝好!

谢谢详细的解释,尽管我没有完全理解。我会寻找非线性最小二乘问题。这也可能是我的问题的好答案。 - Laie
到目前为止,我已经学习了最小二乘法。使用alglib,我成功地在示例数据集上进行了LS,但不知道如何将其应用于我的问题。我认为问题在于如何确定你提到的每个“i”。你能再帮我一些吗? - Laie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接