MATLAB - FFT中缺失的基频

10
我目前正在进行我的大四项目(计算机科学),其中涉及将音乐自动转录为乐谱。我目前在Matlab中进行,但最终必须转换为Java。
我的问题是: 当涉及到从演奏的乐器中检索基频时,我的程序返回了纯正弦波音调的正确音符,但是遇到某些音符时,代表音符基频的峰值似乎完全缺失。例如,当我从garageband播放G3音符时,它显示为G4,因为图中只显示了1、3、5和7次谐波。我尝试添加图片,但由于这是我的第一篇帖子,所以不允许。非常感谢任何指向正确方向的指针。

很遗憾图片出了问题。看到你所看到的东西会对我们帮助很大。 - xscott
第一谐波就是基频。你确定这是你的意思吗? - Oliver Charlesworth
1
是的,我确定它没有给我基频,它给我的第一个峰值是在392Hz处,而我给它的是196Hz的G3。我还为我的项目创建了一个网站,在这里我发布了一篇博客文章,标题图像设置为我的绘图,希望这可以帮助:http://csserver.ucd.ie/~djones/Project_Site/Blog/Entries/2010/11/19_Problem_Confirmation__Missing_Fundamental.html - Joneser
1
你确定你信任GarageBand吗?看起来你在392处有一个带谐波的音符。也许你选择的乐器自动升了一个八度? - xscott
2
是的,我认为这可能与GarageBand合成音符的方式有关,我可以尝试在自己的乐器上录制一些音符并测试它们。我向我的程序输入了一个由C3-E3-G3组成的三个音符序列,其中C和G的最高峰位于第二个位置,而E的最高峰则位于第一个位置。但所有音符都缺少实际音符的基音,因此返回的是C4-E4-G4。我只需要确保我的乐器调音准确即可。如果您有任何其他想法,那就太好了。另外,如果您需要其他图表,请告诉我。 - Joneser
音乐器乐中的谐波系列;音高检测算法,谐波积谱。 - rwong
4个回答

17

这种情况非常普遍,男性声音、大型弦乐器和许多其他音高源通常缺少或几乎没有基频。

因此,仅使用FFT峰值结果极不适合确定实际音乐乐器中的音符,而不是正弦波函数发生器。这是因为音高与峰值谱频率不同。音高是一种心理声学知觉现象。所以你需要阅读相关资料。有很多研究论文就这个主题。

因此,您需要查看完全不同的算法。尝试倒谱(cepstral analysis)、谐波积累谱、自相关和类似的算法(AMDF、ASDF等滞后)、RAPT(Robust Algorithm for Pitch Tracking)、YAAPT等。

补充:我在博客文章中写了一个更详细的解释关于缺失基频的音高


2
谢谢,一些算法实现起来有多容易?我已经进行了两个月的项目,如果必须更改,这将对我的进展造成巨大打击。 - Joneser
1
非常好的回答!选择正确的算法将取决于另一个因素,您是否打算转录单音乐曲?还是您也想写多声部音乐? - Nemeth

1
这并不是什么稀奇的事情,对于乐器音符的基频相对于谐波(也称为泛音)被衰减是很常见的现象,在某些情况下,基频幅度可能远低于谐波幅度。看一下这个真正的巴松管(不是合成的巴松管)演奏G3音符的频率/幅度图。观察到相对于第一个谐波,基频(196.39 Hz)被衰减了。但是请注意,所有整数倍的谐波都可见,直到第10个谐波。实际上,许多更高的谐波存在,但在这个线性幅度图上不可见。

BassoonG3frequencyMagnitude

在您的情况下,您的G3音符频谱仅显示第1、3、5和7个谐波的附加事实表明存在问题。您的测试声音似乎是合成的,因此问题可能出在声音的合成方式上。
真正的乐器典型的频谱显示基频以及许多整数倍谐波,例如1、2、3等等,如上所示。并且大多数乐器演奏的大多数音符的谐波通常延伸到6KHz以上。
看一下这个真正的巴松管(不是合成巴松管)演奏G3音符的频率/分贝幅度图。请注意,共有37个整数倍谐波存在,直到它们在接近-104 dB的噪声楼层处消失。

BassoonG3frequencyDecibelMagnitude

你可以在这里听取巴松管示例,并查看其频谱: 巴松管乐器频谱 此外,阅读有关自主音乐转录分析方法的详细文章: 自主音乐转录的分析方法

0

如果你在2f、4f、6f和8f处看到峰值,这强烈暗示你的输入数据实际上比你想象的高一个八度,或者你误解了结果的频率刻度。如果你只是错过了基频,你也会看到3f、5f和7f。

建议:

  • 在进行傅里叶变换之前绘制输入数据。你应该能够眼测出主导项的频率。
  • 听一下GarageBand产生的音符。它是在中央C的上方还是下方?
  • 确保你理解图表上频率刻度的值来自哪里。

0
你尝试通过光谱图(MATLAB中的函数光谱图)运行它来确定发生了什么吗?
没有算法信息,我们无法确定出错原因。让我担心的是,你的第二个三次谐波(图中第二个峰)比第二个谐波(图中第一个峰)大得多。
你确定采样都正确吗:即你的DFT只有半个采样频率(正负频率范围)的频率?另外:你如何抑制信号的瞬态部分?

1
你确定你的采样都正确吗:即你的DFT只有频率到采样频率的一半(正负频率范围)?当我绘制频率分bin与功率的图时,我在范围的开头有许多峰值,但我也在范围的末尾有一些峰值,我只考虑了第一组峰值,那么你是说我需要处理两端的峰值才能得到准确的f0值?如果有人可以给我投票,这样我就有10个声望,然后我就可以发布图片了。 - Joneser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接