我目前正致力于我的第四年项目(计算机科学),该项目涉及音乐的自动转录 - >乐谱。我现在在Matlab中这样做,但是必须在某个阶段转换为java。
我的问题: 我让我的程序返回纯正弦音的正确音符,我现在遇到了从自然乐器演奏的音符中检索基频的问题。对于某些音符,代表音符基础的峰值似乎完全没有。例如,当我从车库带播放G3音符时,它显示为G4,因为我的情节中只出现了第1,第3,第5和第7次谐波。我试图添加图像,但这是我的第一篇文章,它不允许我。任何指向正确方向的人都会非常感激。
答案 0 :(得分:17)
这并不罕见。对于男性的声音,大弦乐器以及许多其他音调声源来说,基本的缺失或几乎是如此。
这使得仅使用FFT峰值结果在确定来自实际乐器的音符方面极差,而不是正弦波函数发生器。这是因为音高与峰值频谱频率不同。音高是一种心理声学感知现象。这就是你需要阅读的内容。有很多关于这个问题的研究论文。
所以你需要看一组完全不同的算法。尝试使用cepstrums(倒频谱分析),谐波产品频谱,自相关和类似(AMDF,ASDF等滞后),RAPT(用于音高跟踪的鲁棒算法),YAAPT等。
补充:我写了更详细的explanation of pitched sounds with missing fundamentals in a blog post。
答案 1 :(得分:1)
乐器音符的基频相对于谐波(也称为泛音)衰减并不罕见,在某些情况下,基频幅度可能远低于泛音的幅度。 / p>
看一下播放G3音符的真正的巴松管(不是合成的巴松管)的频率/幅度图。观察相对于一次谐波的衰减基波(196.39 Hz)。但同时也观察到所有整数倍谐波都可见到10次谐波。实际上,存在更多的谐波,但在这个线性幅度图上看不到它们。
在你的情况下,你的G3音符的频谱仅显示第1,第3,第5和第7次谐波的另外一个事实表明出现了问题。您的测试声音似乎是合成的,因此问题可能与声音合成的方式有关。
真实乐器的光谱通常显示基频和许多整数倍谐波,如1,2,3等,如上所示。对于大多数乐器上播放的大多数音符,谐波通常远高于6KHz。
看一下播放G3音符的真正的巴松管(不是合成巴松管)的频率/分贝标记图。观察到总共存在37个整数倍谐波,直到它们在-104 dB附近的噪声层消失。
您可以收听这个巴松管样本,并在此处查看其频谱: Bassoon musical instrument spectrum
另请阅读analytical approaches to autonomous musical transcription
上的详细信息答案 2 :(得分:0)
您是否尝试通过频谱图(MATLAB中的功能频谱图)运行它以确定发生了什么?
我不知道你使用什么算法,没有那些信息,我们不能说出了什么问题。让我震惊的是你的第二个三次谐波(图中的第二个峰值)远大于你的二次谐波(图中的第一个峰值)。
您确定所有采样权利都是正确的:即您的DFT频率最高只有采样频率的一半(正负频率范围)?另外:你如何抑制信号的任何瞬态部分?
答案 3 :(得分:0)
您在2f,4f,6f和8f处看到峰值的事实强烈暗示您的输入数据实际上是您认为的高度,或者您错误解释了结果的频率范围。如果你只是错过了基频,你也会看到3f,5f和7f。
建议: