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

问题描述 投票:0回答:1

我已经实现了Yin算法来检测音高。

我的问题是差分函数的性能(方程 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
包含特定窗口大小的音频数据。

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

请告诉我是否有更快的差异函数替代方案。我想朝着正确的方向前进。

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

c++ algorithm audio signal-processing audio-processing
1个回答
0
投票

好吧,Yin 论文描述了我们可以使用公式 7 代替公式 6。 公式 7 可以使用 FFT 得出,速度要快得多。

在线简单搜索提供了大量实现此目的的实现示例。

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

© www.soinside.com 2019 - 2024. All rights reserved.