10

我目前正在从事我的第四年项目(计算机科学),该项目涉及音乐的自动转录 -> 乐谱。我目前正在 Matlab 中执行此操作,但必须在某个阶段将其转换为 java。

我的问题:我的程序返回了纯正弦音的正确音符,现在在从自然乐器演奏的音符中检索基频时遇到了问题。对于某些音符,代表音符基音的峰值似乎完全消失了。例如,当我从garageband 播放 G3 音符时,它显示为 G4,因为我的绘图中只出现了 1 次、3 次、5 次和 7 次谐波。我试图添加图像,但由于这是我的第一篇文章,它不允许我。任何指向正确方向的指针将不胜感激。

4

4 回答 4

17

这并不罕见。对于男声、大弦乐器和许多其他音高音源,基本音缺失或几乎缺失是很常见的。

这使得单独使用 FFT 峰值结果在确定实际乐器的音符方面非常差,与正弦波函数发生器相反。那是因为音高不同于峰值频谱频率。音高是一种心理声学的感知现象。所以这就是你需要阅读的内容。有大量关于该主题的研究论文。

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

补充:我在一篇博文中写了一个关于缺少基本知识的音高的更详细的解释。

于 2010-11-20T05:04:45.657 回答
1

乐器音符的基频相对于谐波(也称为泛音)衰减并不罕见,在某些情况下,基频幅度可能远低于泛音的幅度。

看看这个演奏 G3 音符的真实巴松管(不是合成巴松管)的频率/幅度图。观察相对于一次谐波的衰减基波 (196.39 Hz)。但也观察到所有整数倍谐波在 10 次谐波之前都是可见的。实际上,存在更多谐波,但在这个线性幅度图上看不到它们。

巴松G3频率幅度

在您的情况下,您的 G3 音符的频谱仅显示 1 次、3 次、5 次和 7 次谐波这一额外事实表明存在问题。您的测试声音似乎是合成的,因此问题可能出在声音的合成方式上。

如上所示,真实乐器的频谱通常显示基频和许多整数倍谐波,例如 1、2、3 等。对于在大多数乐器上演奏的大多数音符,谐波通常远高于 6KHz。

看看这个演奏 G3 音符的真实巴松管(不是合成巴松管)的频率/分贝幅度图。观察总共存在 37 个整数倍谐波,直到它们在接近 -104 dB 的本底噪声处消失。

巴松G3频率分贝幅度

您可以在此处收听此巴松管样本并查看其频谱: 巴松管乐器谱

另请阅读有关自主音乐转录的分析方法的详细文章

于 2013-02-08T21:20:36.150 回答
0

您是否尝试通过频谱图(MATLAB 中的函数频谱图)运行它来确定发生了什么?

我不知道你使用什么算法,没有这些信息,我们不能说出了什么问题。令我震惊的是,您的二次三次谐波(图中的第二个峰值)比您的二次谐波(图中的第一个峰值)大得多。

您确定您的所有采样都正确吗:即您的 DFT 仅具有高达采样频率一半的频率(正频率范围和负频率范围)?另外:您如何抑制信号的任何瞬态部分?

于 2010-11-19T23:10:47.013 回答
0

您在 2f、4f、6f 和 8f 看到峰值的事实强烈暗示您的输入数据实际上比您认为的高一个八度,或者您误解了结果的频率范围。如果您只是缺少基频,您也会看到 3f、5f 和 7f。

建议:

  • 在 FT 之前绘制输入数据。您应该能够观察主导词的频率。
  • 听garageband 制作的音符。是高于还是低于中间C?
  • 检查您是否了解绘图上频率刻度上的值来自何处。
于 2010-11-21T13:35:57.750 回答