【问题标题】:How to recognize the sound frequency from a .WAV file in Java如何从 Java 中的 .WAV 文件中识别声音频率
【发布时间】:2021-01-23 08:30:48
【问题描述】:
AudioInputStream stream = AudioSystem.getAudioInputStream(new File("file_a4.wav"));

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

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

【问题讨论】:

  • 您可以使用Discrete-time Fourier transform。如果您的 WAV 文件包含一个频率,您将获得一个峰值。如果您的 WAV 文件包含乐谱,您将获得多个峰值,每个音符对应一个正在播放的音符。
  • 事实上,即使是一个音符,你也可能会得到多个峰值,除非它是一种产生纯正弦波的乐器。您可能需要从 DFT 输出中搜索出基频。
  • 请注意,Java-FX 的播放器会提供音频信号的频谱分析。当我放弃 Java Sound 不可靠(跨平台和版本)并开始使用 Java-FX 播放器时,很高兴我可以用频谱替换声波轨迹。

标签: java javasound frequency-analysis


【解决方案1】:

我从您的问题中了解到,您想识别乐器在 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 文件中单个音符的简单算法。您将能够在互联网和许多其他地方找到这些算法的实现。和弦产生的音符检测更复杂,但可以通过其他算法或神经网络来完成。

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

【讨论】:

  • 感谢您的回答。我应该使用哪种算法来识别和弦中的音符?
  • @Michaello 很高兴我能帮上忙。该问题的答案在stackoverflow.com/q/4337487/12561086 上讨论
猜你喜欢
  • 2017-11-03
  • 2021-01-19
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多