Как узнать частоту звука из файла .WAV в Java

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

Я ищу способ распознать частоту звука музыкальной гаммы (например, A4 = 440 Гц), записанного в файле .wav. Я много читал о БПФ, но было высказано предположение, что частоты в музыкальной гамме не соответствуют БПФ.

Я также слышал о DTFT. Что я должен использовать, чтобы распознать частоту из звукового файла?


person Michaello    schedule 08.10.2020    source источник
comment
Вы можете использовать преобразование Фурье с дискретным временем. Если ваш файл WAV состоит из одной частоты, вы получите один пик. Если ваш файл WAV состоит из партитуры, вы получите несколько пиков, по одному для каждой проигрываемой ноты.   -  person Gilbert Le Blanc    schedule 08.10.2020
comment
Фактически, вы, вероятно, получите несколько пиков даже для одной музыкальной ноты, если только это не инструмент, генерирующий чистые синусоидальные волны. Вам, вероятно, потребуется найти основную частоту на выходе ДПФ.   -  person Kevin Boone    schedule 08.10.2020
comment
Обратите внимание, что проигрыватель Java-FX обеспечит спектральный анализ аудиосигнала. Когда я отказался от Java Sound как ненадежного (для разных платформ и версий) и начал использовать проигрыватель Java-FX, я был рад, что смог заменить трассировку звуковой волны спектром.   -  person Andrew Thompson    schedule 09.10.2020


Ответы (1)


Из вашего вопроса я понимаю, что вы хотите распознать музыкальную ноту/ы, которые инструмент играет в файле wav. Если это так, для этого есть несколько алгоритмов, и вы всегда можете обучить нейронную сеть этому.
Вот некоторые важные моменты, которые следует учитывать:

  1. Любой инструмент (то же самое относится и к музыкальным звукам, воспроизводимым человеческим голосом) имеет свой особый цвет при воспроизведении ноты. Этот цвет называется тембром (https://en.wikipedia.org/wiki/Timbre ) и состоит из гармонических и негармонических частот, окружающих частоту, которую вы психоакустически воспринимаете, слушая эту конкретную ноту. Вот почему вы не можете просто искать пик БПФ, чтобы обнаружить музыкальную ноту, и это также причина, по которой фортепиано звучит иначе, чем гитара при воспроизведении одной и той же ноты.

  2. Анализ аудиосигнала часто выполняется путем оконной обработки сигнала и вычисления ДПФ оконной части сигнала. Затем каждое окно будет генерировать свой собственный спектр, и из анализа каждого отдельного спектра и/или анализа того, как они взаимодействуют, вы (или, например, ваша CNN) получите свои выводы/результаты. Этот процесс обработки сигнала и вычисления ДПФ дает спектрограмму (https://en.wikipedia.org/wiki/Spectrogram#:%7E: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
person Tomas Agustin Gonzalez Orlando    schedule 14.10.2020
comment
Спасибо за этот ответ. Какой алгоритм я должен использовать для распознавания нот в аккорде? - person Michaello; 18.10.2020
comment
@Michaello Рад, что смог помочь. Ответ на этот вопрос обсуждается на stackoverflow.com/q/4337487/12561086. - person Tomas Agustin Gonzalez Orlando; 19.10.2020