连续音符相同时的音高检测

信息处理 声音的 沥青
2022-02-24 10:11:48

我想用 C 编写一个微控制器,但我在问它的​​理论方面。我想我已经知道我将要做什么,但有一件事我不太明白。首先,我将使用吉他,因此有 82Hz-987Hz 的范围。所以粗略地说,我将对 1KHz 上的数据进行低通,“窗口化”它们并应用 FFT。据说,我会有一个很好的估计。

由于最高频率约为 1KHz,我决定采样率为 2KHz(尚未测试是否有效)。

假设我有一个 2 秒的曲目,每秒有 1 个音符。如果第一个音符是 C,我的结果将是第一秒的 2000 个 C 音符,对吗?我们可以说,每次有一个音符变化,就是当你识别一个音符时,所以如果第二个音符是 D,程序将识别 C,然后是 D(而不是 2000 次 C 和 2000 次 D)。我看到的问题是,如果第二个音符也是 C,我怎么知道确实有一个音符击中?

我相信我需要一个额外的步骤来完成这个过程,但我不太清楚那会是什么。可能是我必须走不同的路线..(如果是这种情况,只需提及方法,无需详细说明并浪费您的时间,我会阅读它)。

2个回答

通常,音符的信封会衰减。一个新的音符拨奏将开始(添加或替换)一个带有起音瞬态的新幅度包络。

因此,您可以在频谱频率分析中添加包络跟踪(这可能适合也可能不适合正确的音高估计)。

Hotpaw2 的回复解决了音符边界检测问题(包络跟踪是一种解决方案,虽然它们是更强大的解决方案,但请寻找“起始检测”)。关于您的计划的更多评论:

  • 以 2kHz 采样信号会导致比解决的问题更多的问题。来自吉他的信号不是纯正弦波,因此存在 1kHz 以上的谐波,如果没有正确过滤,会产生混叠。这将需要非常陡峭的抗混叠滤波器,具有非常窄的过渡带。

  • 您尚未解释您打算如何计算音高,但您的音高检测方法不太可能为每个输入样本产生结果。更有可能的是,您必须在获得音高估计的频率和该估计的准确度之间进行权衡(例如,通过选择 FFT 或自相关大小;或带通滤波器 Q 因子)。