我针对某些音频样本实现了一个简单的自相关例程,速率为44100.0,块大小为2048.
我遵循的通用公式如下:
r[k] = a[k] * b[k] = ∑ a[n] • b[n + k]
我已经在一个暴力嵌套循环中实现了它,如下所示:
for k = 0 to N-1 do
for n = 0 to N-1 do
if (n+k) < N
then r[k] := r[k] + a(n)a(n+k)
else
break;
end for n;
end for k;
我查找r中的最大幅度并确定它的样本量并计算频率。
为了帮助缓和调谐器的结果,我使用循环缓冲区并每次返回中位数。
蛮力计算有点慢 - 有一种众所周知的,更快的方法吗?
有时候,调谐器并不像所需的那么准确。我可以在这里应用什么类型的启发式方法来帮助改进结果?
有时OCTAVE不正确 - 有没有办法更准确地磨练正确的八度?
答案 0 :(得分:4)
进行自相关的有效方法是使用FFT:
这是有效的,因为时域中的自相关等效于频域中的功率谱。
话虽如此,裸骨自相关并不是一般实现(准确)pitch detection的好方法,所以你可能想重新考虑整个方法。
答案 1 :(得分:0)
我不完全理解这个问题,但我可以指出一个你可以使用的技巧。你说你找的是最大幅度的样本。如果它在其余计算中很有用,则可以计算该样本编号以进行子采样精度。
假设样品5的峰值为0.9,相邻样品的峰值为0.1和0.8。实际峰值可能介于样本5和样本6之间。
(0.1 * 4 + 0.9 * 5 + 0.8 * 6) / (0.1 + 0.9 + 0.8) = 5.39
答案 2 :(得分:0)
改进这种“强力”自相关方法的一种简单方法是限制k的范围,并且仅搜索前一平均周期附近的滞后(或音高周期),例如首先在+ -0.5半音内。如果没有找到相关性,则搜索范围稍宽的范围,例如,在一个主要的三分之一范围内,然后搜索更宽的范围,但在正在调整的仪器的预期频率范围内。
您可以通过使用更高的采样率来获得更高的频率分辨率(例如,如果需要,在自相关之前对数据进行上采样,并进行适当的滤波)。
您将获得音高滞后(周期)和该滞后的倍数的自相关峰值。你必须以某种方式消除那些分谐波(对于乐器来说可能是不可能的,或者可能是从之前的频率估计中不太可能的音调跳跃。)