2

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

4

3 回答 3

4

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

  • FFT 时域信号
  • 将复数 FFT 输出转换为幅度和零相位(即功率谱)
  • 采取逆FFT

这是有效的,因为时域中的自相关等效于频域中的功率谱。

话虽如此,一般来说,基本自相关并不是实现(准确)音高检测的好方法,因此您可能需要重新考虑您的整个方法。

于 2011-09-20T20:13:01.903 回答
0

改进这种“蛮力”自相关方法的一种简单方法是限制 k 的范围,并且仅搜索前一个平均周期附近的滞后(或音高周期),例如最初在 +-0.5 个半音内。如果您没有找到相关性,则搜索稍宽的范围,例如,在大三分之一内,然后搜索更宽的范围,但在被调谐乐器的预期频率范围内。

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

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

于 2011-09-21T20:06:57.853 回答
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
于 2011-09-20T19:16:07.120 回答