我已经针对一些音频样本实现了一个简单的自相关例程,速率为 44100.0, block 大小为 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 音阶不正确 - 有没有办法更准确地磨练正确的 Octave 音阶?
最佳答案
进行自相关的有效方法是使用 FFT:
- 对时域信号进行 FFT
- 将复数 FFT 输出转换为幅度和零相位(即功率谱)
- 进行逆 FFT
这是可行的,因为时域中的自相关相当于频域中的功率谱。
话虽如此,简单的自相关并不是实现(准确)的好方法pitch detection一般来说,因此您可能需要重新考虑您的整个方法。
关于algorithm - 调谐器的自相关启发法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7489531/