从 MP3 文件中提取频率数据

信息处理 频域 mp3
2022-02-06 14:46:57

我想对音频数据进行频率分析,基本上是试图通过算法找出歌曲中的音符。标准方法是将 MP3 解码为 PCM 数据并通过 FFT 运行。但是,中间 C 附近的音符需要太高的精度才能使 FFT 正常工作。由于 MP3 已经具有小时间增量的频率信息,它是否 a) 足够精确以识别大约 2 - 5 Hz 内的频率,并且 b) 是否有任何代码可以方便地做到这一点?大多数代码(不出所料)似乎将其转换为时域,但我只想拥有频率数据。

1个回答

MP3 编码器处理 576 个时域样本的批次,并将它们转换为 576 个频域样本。这意味着您获得的频率分辨率为fsample576,无论您的采样率是多少。

但是请注意,在通常的采样率下它有多短,例如 44.1 kHz:那是 13.something 毫秒。这很有意义——由激发的弦、膜或空气体积产生的频率在激发后随时间变化。

所以,不,你的方法行不通:这个分辨率不能解决你的 2 Hz!

此外,不通过 MP3 路由并直接对音频信号进行 FFT 处理也无法正常工作:

要在线性频率变换中获得 2 Hz 的分辨率,无论您如何操作,都需要 1/2 秒的音频!

算一下:如果您的采样率为 44.1 kHz,并且想要解析 2 Hz,则需要转换 44.1 kHz / 2 Hz = 22050 个样本。这些需要 22050 / 44.1 kHz = 1/2 秒才能以该采样率累积。其他速率也一样,因为等式中的采样率

Trecording=fsamplefresolutionfsample

总是取消。

现在,您会注意到很少会出现持续半秒的纯音符。

此外,正如我试图在评论中解释的那样:

你假设演奏一个音符会以单一频率插入能量是错误的。

演奏一个音符的乐器不会产生单一的音调,而是由变化的包络抑制的多个谐波的混合,随着时间的推移,频率也会发生漂移。这真的不像你可以进入 FFT 并说,“好吧,这是这个和那个和弦演奏,很容易看到”。

事情变得更加复杂,因为您说您想检测和弦中演奏的音符:由于各个振荡元素(例如吉他弦)机械耦合,您通常会得到更多的频率分量和改变的时间行为。