2

我做了很多谷歌搜索,但找不到一个关于如何确定 mp3 文件的音符的例子。

到目前为止,我已经阅读了一些关于 FFT(快速傅立叶变换)的内容,可以从中计算音频文件的音高,并根据音高符号导出音符。

但是后来我读到mp3 文件格式在时域中,由于有损压缩格式不包含频率分析所需的样本值……这是否意味着您必须将 mp3 转换为 wav文件以计算密钥?

我发现了几个用于视觉目的的实时音高检测示例,但不适用于分析整个 mp3 文件并输出音乐键。

我希望有人能指出我正确的方向。

谢谢。

4

1 回答 1

5

我创建了一个应用程序 PitchScope Player,它可以实时对 MP3 文件进行音高检测,其完整的源代码发布在 GitHub 上,但它是用 C++ 编写的。音高检测和音调检测,尤其是实时检测,要求极高,可能需要 C++ 的速度才能在此时执行。您刚刚开始探索一项非常困难的音频工程任务,并且确实需要首先了解我们如何感知“音高”、“谐波”是什么的物理学背景,并探索如何制作频率的选择- 原始信号的域变换(参见下面的维基百科链接)。

当在钢琴上按下一个键时,我们听到的不仅仅是一个声音振动频率,而是在不同数学相关频率上发生的多个声音振动的复合。这种不同频率的振动复合的元素被称为谐波或分音。例如,如果我们按下钢琴上的中间 C 键,复合谐波的各个频率将从 261.6 Hz 作为基频开始,523 Hz 将是 2 次谐波,785 Hz 将是 3 次谐波,1046 Hz 将是 4 次谐波等。后面的谐波是基频 261.6 Hz 的整数倍(例如:2 x 261.6 = 523、3 x 261.6 = 785、4 x 261.6 = 1046)。我们检测音高通过寻找在频率间隔中具有这种数学关系的谐波组。

我没有使用 FFT,而是使用修改后的对数 DFT 变换,以便其频率通道可以与音乐信号中谐波的位置对齐。对数 DFT 变换还在执行中提供了明显的速度优势。

一旦您检测到音乐信号中的多个音高,您就可以通过根据该音乐信号中的成员音符数量对 12 个不同的候选键进行评分来检测音乐键。我的另一个应用 PitchScope Navigator 也可以实时检测音调。

您可能想要获得一个 C++ 编译器并重新编译我的源代码,以便您可以逐步执行它以了解我的算法是如何工作的。它还将解码 MP3 文件。您还可以从网络上的许多地方下载该应用程序的可执行文件 PitchScope Player,以查看它在带有您选择的 MP3 文件的 Windows 机器上的执行情况。

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

下面是对数 DFT(由我的 C++ 软件创建)在复调 mp3 录音中吉他独奏 3 秒的图像。它显示了演奏独奏时吉他上各个音符的谐波如何出现。对于这个对数 DFT 上的每个音符,我们可以看到它的多个谐波垂直延伸,因为每个谐波将具有相同的时间宽度。 在此处输入图像描述

于 2016-09-10T18:02:43.453 回答