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

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

我的经验观察到的结果:


对于较高的音调,结果最差,如果基数高于A6左右,我只会得到垃圾数据。
即使在非常高的音调下,FFT也能正常工作,(好吧,我的意思是它的峰值显示的是基波或它的谐波之一,但没有垃圾。
如果我降低考虑HPS的谐波数量,则垃圾会减少,但这使我们很难区分基波和谐波。谐波。

这是我的算法:

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

任何帮助,不胜感激!

更新1:所以,还有一些我想补充的内容:


我正在记录的采样率为44100 Hz
我观察到这种行为几乎看不到吉他,但在数码钢琴上非常明显(对于相同的演奏音符)

这是我的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;
}




评论

您的采样率是多少?在ADC之前,您已经获得了哪种抗混叠滤波器?

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

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

#1 楼

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

评论


$ \ begingroup $
我以44100 Hz的频率进行录音,但是您的回答仍然让我考虑了一下。可能与它有关,我应该根据在原始FFT中发现的峰值确定在hp中考虑多少谐波。我观察到的另一件事是,弦乐器比起我的电子钢琴,效果更好,这可能是因为谐波在钢琴的情况下是一周吗?
$ \ endgroup $
–华伦丁·拉杜(Valentin Radu)
2011年11月3日13:37

$ \ begingroup $
@mindnoise:弓弦乐器是和声的,而弹拨或敲击的弦乐器具有en.wikipedia.org/wiki/Inharmonicity。不确定这是否是问题的一部分
$ \ endgroup $
– Endolith
2011年11月3日13:56

$ \ begingroup $
@endolith可能尤其是因为:“弦线的弹性越小(即,弦线越短,越粗和越硬),它们表现出的不和谐性就越大。”而我恰恰得到那些类型的字符串错误(高音)。实际上,当发生错误时,基本原理始终是FFT中最强的频率,因此它肯定与谐波或hps算法有关,但是我不确定为什么在1500 hz的基础上得到20-50hz的垃圾。将发布hps算法。
$ \ endgroup $
–华伦丁·拉杜(Valentin Radu)
2011年11月3日14:36

$ \ begingroup $
@mindnoise:“不谐音在很大程度上影响钢琴的最低音和最高音。最低的弦(必须是最长的)受钢琴尺寸的限制最大。短钢琴的设计者被迫使用较粗的琴弦以增加质量密度,从而使其不和谐;最高的琴弦必须承受最大的张力,但也必须较细以降低质量密度。使用很短的弦,短的弦会产生不谐音。”
$ \ endgroup $
– Endolith
2011年11月3日15:08



#2 楼

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

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

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