【问题标题】:Autocorrelation algorithm fails in high frequencies自相关算法在高频下失败
【发布时间】:2016-05-23 19:35:25
【问题描述】:

我的吉他调音器有问题。我正在使用自相关算法来查找声音频率。它几乎可以工作。问题始于 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);
}

【问题讨论】:

  • 我认为找到声音的频率并不容易。自相关算法对于这项任务来说太天真了。即使使用傅里叶变换,有时也很难区分谐波。
  • 是的。这非常困难..我已经尝试解决这个问题一个月了..我也尝试过 FFT 但你猜怎么着..我在使用 FFT 时遇到低频问题 :D 也许我必须以某种方式使用这两种技术。
  • 从这个Wiki页面en.wikipedia.org/wiki/Pitch_detection_algorithm,据说“目前还没有一个理想的PDA”,所以你可能应该满足于只在某些情况下工作的东西......跨度>

标签: algorithm audio signal-processing frequency pitch


【解决方案1】:

这是关于不变音高的标准八度不确定性问题。如果一个周期与静止信号中的下一个周期紧密匹配,则 N 个周期也将与接下来的 N 个周期紧密匹配,从而在频率音高和/或八度音阶的几个约数处产生几乎相同的自相关。噪声量的微小变化可能会导致一个音高因数的相关性比另一个更好或更差,即使人类可能听不到任何音高差异。

要“解决”这个问题,您必须从许多几乎相同的相关峰中选择一个。您可以通过将具有完全相同自相关的一个峰值候选者加权为比另一个峰值候选者更可能来做到这一点。例如,在您选择较低的峰值之前,您可以要求较低的自相关峰值候选者至少比代表频率倍数的任何峰值高 x%,其中 x% 可能由实验确定(例如,在人类盲测之​​前多少面板实际上会听到较低的音调)。该值可能因乐器或音色的类型以及演奏的八度而异。

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

【讨论】:

    猜你喜欢
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2012-07-06
    相关资源
    最近更新 更多