Yin算法(音高检测) - 差异函数的替代

时间:2018-05-30 13:33:13

标签: c++ algorithm audio signal-processing audio-processing

我已实施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 个答案:

答案 0 :(得分:0)

好的,尹纸描述我们可以使用等式7而不是等式6。 使用FFT可以得到等式7,速度更快。

在线进行简单搜索提供了大量实现示例。

JAVA中的实现可以由名为JorenSix的用户完成here。 JorenSix,如果你正在读这篇文章,谢谢。