我已实施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
包含特定窗口大小的音频数据。
正如您所看到的,当您增加数据大小(窗口大小)时,此函数会变慢。
如果有更快的差异功能替代,请告诉我。我想朝着正确的方向前进。
我对信号处理很陌生,非常感谢你的帮助。
答案 0 :(得分:0)
好的,尹纸描述我们可以使用等式7而不是等式6。 使用FFT可以得到等式7,速度更快。
在线进行简单搜索提供了大量实现示例。
JAVA中的实现可以由名为JorenSix的用户完成here。 JorenSix,如果你正在读这篇文章,谢谢。