我的吉他调音器有问题。我正在使用自相关算法来查找声音频率。它几乎可以工作。问题始于300hz以上的高频。有时我在演奏E4(329hz)弦时不确定是329hz还是109hz,我认为是次谐波问题。现在我在问如何消除那些次谐波?有什么花招吗?

这是我的自相关代码:

for (int i = 0; i < length; i++) {
    double diff = 0;
    for (int j = 0; j < length; j++) {
        diff += Mathf.Abs (buffer [j] - buffer [i + j]);
    }

    double dx = prevDiff - diff;

    if (dx < 0 && prevDx > 0) {

        if (diff < (0.3 * maxDiff)) {

            if (sampleLen == 0)
            {
                sampleLen = i - 1;
            }
        }
    }

    prevDx = dx;
    prevDiff = diff;
    maxDiff = Mathf.Max ((float)diff, (float)maxDiff);
}

最佳答案

这是相对于不变音调的标准 Octave 音阶不确定性问题。如果一个周期与固定信号中的下一个周期紧密匹配,则N个周期也将与下一个N个周期紧密匹配,因此在频率音调和/或 Octave 音阶下降的几倍处会导致几乎相同的自相关。即使人类可能听不到任何音高差异,噪声量的轻微变化也可能导致一个音高倍数的相关性更好或更差。

要“修复”此问题,必须从许多几乎相同的相关峰中选择一个。您可以通过使用完全相同的自相关加权一个峰值候选者比另一个峰值候选者更有可能进行加权。例如,在选择较低的峰之前,您可能要求较低的自相关峰候选者比任何表示较高频率倍数的峰至少高x%,其中x%可能由实验确定(例如,在人类盲测之​​前多少面板实际上会听到较低的音调)。该值可能随乐器或音色的类型以及所演奏的 Octave 而变化。

另一个技巧是查看声音的谐波演变,因为大弦上的低音符的泛音衰减可能不同于高弦或音符的谐波。

10-08 04:42