我已经实现了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
包含特定窗口大小的音频数据。
如您所见,随着数据大小(窗口大小)的增加,此函数会变得更慢。
请告诉我是否有更快的差异函数替代方案。我想朝着正确的方向前进。
我对信号处理很陌生,非常感谢您的帮助。
好吧,Yin 论文描述了我们可以使用公式 7 代替公式 6。 公式 7 可以使用 FFT 得出,速度要快得多。
在线简单搜索提供了大量实现此目的的实现示例。
可以在 here 找到由名为 JorenSix 的用户完成的 JAVA 实现。 JorenSix,如果您正在阅读本文,谢谢您。