音高检测中的谐波产品频谱限制


10

我已经使用HPS制作了音高检测算法,但遇到了问题。我是信号处理的初学者,这个站点以前曾帮助过我,所以我应该问一下。

对于更高的音调( eg. >C6:1046.50hz),我开始从HPS获取垃圾数据。音调越高,我得到的垃圾越多(“垃圾”是指既不是倍频程误差也不是谐波的频率,大约在1Hz-20Hz)

我的经验观察到:

  1. 如果基音高于A6左右,则结果对于更高的音调是最差的,我只会得到垃圾数据。

  2. 即使在非常高的音调下,FFT也能正常工作(按我的意思是,它的峰值显示的是基波或谐波之一,但没有垃圾)

  3. 如果我降低了考虑使用HPS的谐波数量,垃圾将减少,但是这使得区分基波和谐波变得更加困难。

这是我的算法:

->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS

任何帮助表示赞赏!

更新1:因此,我还要添加一些其他内容:

  1. 我记录的采样率为44100 Hz
  2. 我观察到这种行为在吉他上几乎看不到,但在数码钢琴上却很明显(对于相同的演奏音符)
  3. 这是我的hps算法,也许经验丰富的人可以发现问题。

    int hps(float* spectrum, int spectrumSize, int harmonics) {
    
    int i, j, maxSearchIndex, maxBin;
    maxSearchIndex = spectrumSize/harmonics;
    
    maxBin = 1;
    for (j=1; j<=maxSearchIndex; j++) {
        for (i=1; i<=harmonics; i++) { 
            spectrum[j] *= spectrum[j*i];
        }
        if (spectrum[j] > spectrum[maxBin]) {
            maxBin = j;
        }
    }
    
    // Fixing octave too high errors    
    int correctMaxBin = 1;
    int maxsearch = maxBin * 3 / 4;
    for (i=2; i<maxsearch; i++) {
        if (spectrum[i] > spectrum[correctMaxBin]) {
            correctMaxBin = i;
        }
    }
    if (abs(correctMaxBin * 2 - maxBin) < 4) {
        if (spectrum[correctMaxBin]/spectrum[maxBin] > 0.2) {
            maxBin = correctMaxBin;
        }
    }
    
    return maxBin;
    }
    

1
您的采样率是多少?在ADC之前获得了什么抗混叠滤波器?
Martin Thompson

我的录音采样率为44100 Hz,对不起,我之前没有提到。
Valentin Radu

1.您需要绘制HPS计算中使用的中间光谱和乘积,并查看从何处获得错误的值。2.吉他和钢琴不和谐,会导致峰不完全对齐。不确定会产生多大的影响,但是HPS假设完全是谐波频谱。
endlith 2012年

Answers:


3

在这些较高音调下,信号中谐波分量可能太少。HPS算法非常简单,并且依靠那些高次谐波来不断叠加,直到基本原理从背景中消失为止。当然,我们应该怀疑,您的采样率是多少?如果是8000 Hz,那么只有3个1000 Hz音调的谐波存在余地...


我正在以44100 Hz的频率录制,但是您的回答仍然让我考虑了一下。可能与它有关,我应该根据在原始FFT中发现的峰值来决定要在hp中考虑多少谐波。我观察到的另一件事是,弦乐器比起我的电子钢琴,效果更好,这可能是因为谐波在钢琴的情况下是一周吗?
Valentin Radu

@mindnoise:弓弦乐器是和声的,而弹拨或敲击的弦乐器具有en.wikipedia.org/wiki/Inharmonicity。不知道这是否是问题的一部分
Endolith

@endolith可能尤其是因为:“弦线的弹性越小(即,弦线越短,越粗和越硬),它们表现出的不和谐就越多。” 并且我得到的正是这些类型的字符串错误(高音)。实际上,当发生错误时,基波始终是FFT中最强的频率,因此它肯定与谐波或hps算法有关,但是我不确定为什么在1500 hz的基波中会得到20-50hz的垃圾。将发布hps算法。
Valentin Radu

1
@mindnoise:“不谐音在很大程度上影响钢琴的最低音和最高音...最低的弦(必须是最长的)受钢琴尺寸的限制最大。短钢琴的设计师被迫使用较粗的琴弦会增加质量密度,从而使琴弦不和谐;最高的琴弦必须承受最大的张力,但也必须较细以降低质量密度;有限的钢材强度迫使钢琴设计者必须使用非常短的琴弦短波长的弦会产生不谐音。”
endlith 2011年

2

对于某些乐器,产生的有效谐波的数量可能会在不同的音高范围内变化。一些物理乐器的最低音和最高音的部分可能表现出更大的不谐音。对于非常高的音符,可以在Fs / 2以下的抗混叠滤波器截止以下容纳的谐波数量肯定会更少。您的HPS音调估算器mdy希望考虑这些因素。

某些乐器的起音瞬变可能会产生噪声的非谐谱带,该谱带可能与某些音高或其重要谐波的HPS搜索区域重叠。

如果音频ADC之前的低通滤波器没有足够好的阻带衰减,则非常高的频率的泛音可能甚至会包裹在Fs / 2周围。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.