我正在尝试开发一种算法来分离音乐文件中的乐器音符。使用 C#、C++ DLL。我花了很长时间来实现它。所以到目前为止我所做的是:
- 在 PCM 上执行专门的 FFT(它在时域和频域都提供高分辨率)
- FFT bin 上的滤波器组计算以模拟人类听觉系统(心理声学模型)
- 具有峰值检测的模式识别为某些机器学习提供输入数据(当前计划级别)
在目前的进展中,我用简单的方法“选择局部最大值”检测到峰值。粗略地说,如果 f(x-1) < f(x) > f(x+1) 则检测为峰值,其中 f(x) 的频率响应和 x 是频率指数。
但是我在这里遇到了一些问题。如果两个或多个信号在频域中接近,该方法只检测一个峰值,而其他所有信号都被隐藏。我在网上搜索了几天。有一种东西叫做“峰纯度”、“峰分离”。要进行峰分离,有几种方法。它们实际上很好地分离了峰。这是我用谷歌搜索的几张图片。
(来源:色谱在线.org)
我认为使用“反卷积”的方法最适合这种情况。但我不知道如何去卷积我的光谱,用去卷积分离峰。据我所知,反卷积不会直接给我如上图所示的多个峰分量。我应该使用哪些过滤功能?由于我缺乏数学技能,我需要伪代码级别的帮助。很高兴看到任何其他建议:)