Algorithm 调谐器的自相关试探法

Algorithm 调谐器的自相关试探法,algorithm,audio,signal-processing,pitch,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 brea

我对一些音频样本实现了一个简单的自相关例程,速率为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;
k=0到N-1 do的

对于n=0到n-1 do
如果(n+k)
我寻找r中的最大震级,确定距离它有多少个样本,然后计算频率

为了帮助调整调谐器的结果,我使用了一个循环缓冲区,每次都返回中间值

蛮力计算有点慢——有没有一种众所周知的更快的方法来计算

有时,调谐器并不像需要的那样精确。我可以在这里应用什么类型的启发式方法来帮助改进结果


有时候八度是不正确的——有没有办法更准确地掌握正确的八度呢?

我不完全理解这个问题,但我可以指出一个你可能会用到的技巧。你说你在寻找最大震级的样本。如果在其余计算中有用,则可以计算该采样数以获得子采样精度

假设样本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

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

  • 时域信号的FFT分析
  • 将复FFT输出转换为幅值和零相位(即功率谱)
  • 取逆FFT
这是因为时域中的自相关相当于频域中的功率谱


话虽如此,一般来说,简单的自相关并不是实现(精确)的好方法,因此您可能需要重新思考您的整个方法。

改进这种“强力”自相关方法的一个简单方法是限制k的范围,只搜索前一个平均周期附近的滞后(或基音周期),首先说+0.5个半音以内。如果你没有找到相关性,那么搜索一个稍宽的范围,比如说,大三分之一范围内的a,然后搜索一个更宽的范围,但在被调谐仪器的预期频率范围内

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


您将获得基音滞后(周期)和该滞后倍数的自相关峰值。您必须以某种方式消除这些次谐波(可能是仪器不可能实现的,或者是以前频率估计中不太可能出现的音调跳变)。

什么是*和•?乘法?卷积?点积?a[k]*b[k]是点积,而在求和中,a[n]•b[n+k]是乘法。很难选择一个答案,因为至少有两个答案是有用的。最终逆FFT的结果是否给出样本中的周期长度?否,IFFT的最终输出只是自相关-你仍然需要在这段时间内识别基音周期。我不确定我能在我的自相关算法中使用它。自相关不是寻找一个样本的最大值。关于短语“查找相关性”,我通常是在寻找“最大值”-也就是说,我实际上不会比较或测试最大和。使用您建议的修改,我是否会返回结果“max”>0。。。或者我需要一些逻辑来知道我从一个坏的相关性变为一个有效的相关性。例如,我是否希望确保我得到一个小于0的总和,然后寻找最大值,直到下一个值小于0,这样我就知道了?这是否有助于我决定是否需要尝试更广泛的范围?我想,从根本上说,是什么使相关性有效或无效?如果我只是寻找从“k”到“n”的最大值,其中k是我的5个半音,比我以前的频率少?