Yin algorithm(Pitch detection) - 差分函数的替代

小星 编程 65

我已经实现了 Yin Algorithm检测音高。

我的问题是差分函数(等式 6)的性能

差分函数:

static std::vector<double> difference(const std::vector<double> &data)
{
    int index, tau;
    double delta;
    int yin_buffer_size = signed(data.size() / 2);
    std::vector<double> yin_buffer(yin_buffer_size, 0.0);

    for (tau = 1; tau < yin_buffer_size; tau++) {
        for (index = 0; index < yin_buffer_size; index++) {
            delta = data[index] - data[index + tau];
            yin_buffer[tau] += delta * delta;
        }
    }
    return yin_buffer;
}

其中 data 包含特定窗口大小的音频数据。

如您所见,随着数据大小(窗口大小)的增加,此函数变慢。

如果有更快的差分函数替代方法,请告诉我。我想朝着正确的方向前进。

我对信号处理很陌生,非常感谢您的帮助。

回复

共1条回复 我来回复
  • 编程小能手
    编程小能手
    来自于宇宙以外的编程小能手~
    评论

    好的,Yin 论文描述了我们可以使用方程式 7 而不是方程式 6。 公式 7 可以使用更快的 FFT 得到。

    一个简单的在线搜索提供了许多实现示例。

    可以找到 JAVA 中的实现 here由名为 JorenSix 的用户完成。 JorenSix,如果您正在阅读本文,谢谢。

    2025-04-13 15:07:00 1条评论