调谐器的自相关启发式算法

时间:2011-09-20 17:54:34

标签: algorithm audio signal-processing pitch

我针对某些音频样本实现了一个简单的自相关例程,速率为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不正确 - 有没有办法更准确地磨练正确的八度?

3 个答案:

答案 0 :(得分:4)

进行自相关的有效方法是使用FFT:

  • FFT时域信号
  • 将复数FFT输出转换为幅度和零相位(即功率谱)
  • 采取逆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半音内。如果没有找到相关性,则搜索范围稍宽的范围,例如,在一个主要的三分之一范围内,然后搜索更宽的范围,但在正在调整的仪器的预期频率范围内。

您可以通过使用更高的采样率来获得更高的频率分辨率(例如,如果需要,在自相关之前对数据进行上采样,并进行适当的滤波)。

您将获得音高滞后(周期)和该滞后的倍数的自相关峰值。你必须以某种方式消除那些分谐波(对于乐器来说可能是不可能的,或者可能是从之前的频率估计中不太可能的音调跳跃。)