如何从Java中的.WAV文件识别声音频率

问题描述

AudioInputStream stream = AudioSystem.getAudioInputStream(new File("file_a4.wav"));

我正在寻找一种方法来识别记录在.wav文件中的音阶声音的频率(例如A4 = 440 Hz)。我已经阅读了很多有关FFT的文章,但有人建议音阶上的频率与FFT不匹配。

我也听说过DTFT。我应该使用什么来识别声音文件中的频率?

解决方法

我从您的问题中了解到,您想识别乐器在wav文件中正在演奏的音符。如果是这种情况,那么有几种算法可以做到这一点,您也可以随时训练神经网络来做到这一点。
需要考虑的一些重要事项是:

  1. 任何一种乐器(由人声产生的音乐声音也会发生这种情况)在产生音符时具有其自己的特定“颜色”。这种颜色称为音色(https://en.wikipedia.org/wiki/Timbre),由谐波和非谐频率组成,这些频率围绕您在听特定音符时心理听觉所感知的频率。这就是为什么您不能只寻找FFT的峰值来检测音符的原因,这也是为什么弹奏相同音符时钢琴的声音与吉他声音不同的原因。

  2. 通常通过对信号加窗并计算信号加窗部分的DFT来进行音频信号的分析。然后,每个窗口都会产生自己的光谱,它来自对每个光谱的分析和/或对它们之间相互作用的分析,您(例如您的CNN)将获得您的结论/结果。窗口化信号并计算DFT的过程会产生一个频谱图(https://en.wikipedia.org/wiki/Spectrogram#:~:text=A%20spectrogram%20is%20a%20visual,sonographs%2C%20voiceprints%2C%20or%20voicegrams.

简短介绍之后,下面是一些用于识别wav文件中单个音符的简单算法。您将能够在Internet上以及其他许多网络上找到这些算法的实现。对和弦产生的音符的检测更为复杂,但可以使用其他算法或神经网络来完成。

  1. 关于使用自相关分析进行音高检测:https://ieeexplore.ieee.org/document/1162905
  2. YIN算法:http://audition.ens.fr/adc/pdf/2002_JASA_YIN.pdf

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...