Есть ли программа, которая может определить максимальную высоту звука в аудиофайле?

14

Существует ли программа для Windows, которая может определить «максимальную частоту звуковой волны», найденную в аудиофайле (например, в mp3-файле)?

Например, он должен иметь возможность проанализировать файл Dog-Whistle-0 и определить, что самая высокая частота, найденная в файле, составляет примерно ~ 12000 Гц.

Также он должен уметь анализировать Piano.mp3 и определять самую высокую ноту.

Pacerier
источник

Ответы:

13

R кроссплатформенный и бесплатный / с открытым исходным кодом.

Загрузите его и загрузите tuneRи seewaveбиблиотеки (установить их с помощью менеджера пакетов , если еще не установлен).

library(tuneR)
library(seewave)

Затем загрузите файл MP3 или WAV:

w = readMP3("dog-whistle-0.mp3")
w = readWave("dog-whistle-0.wav")

Теперь давайте построим спектр и его пики:

fpeaks(meanspec(w), nmax=1)

Результат:

Численный результат:

fpeaks(meanspec(w), nmax=1, plot=FALSE)
12.05859

Вышеуказанное работает только с не музыкальными данными. Анализируя музыкальные частоты, вы обнаружите, что самые высокие частоты всегда будут около 12-20 кГц, в зависимости от используемого инструмента (ов). Однако эта самая высокая частота не даст вам оценку проигрываемой ноты, так как музыкальная нота, когда ее исполняет инструмент, будет состоять из нескольких частот.

Это так называемый «тембр» инструмента, и вы обнаружите, что А при 440 Гц для флейты будет включать в себя различные частотные компоненты по сравнению с А, играемым на электрогитаре.

Лучше всего провести анализ доминирующей частоты, посмотрев на пики частоты в скользящих временных окнах, и проверить, где находится самый высокий из них.

Там нет такой вещи, как «частота со временем», хотя. Вы можете построить только среднюю (или доминирующую) частоту за определенные скользящие временные окна . Seewave предлагает довольно много функций, касающихся выбора окон времени, но это довольно сложно.

Вы могли бы использовать

s = specprop(meanspec(w, from=10, to=11)) 

чтобы получить свойства спектра от 10 до 11 секунд, а затем вызвать s$centroidили s$meanполучить центроид или средние частоты этого конкретного временного окна (хотя 1 секунда достаточно велика для анализа звука).

Если ваш файл Wave использует выборку 44,1 кГц, вы можете уменьшить частоту дискретизации, чтобы уменьшить вычислительные затраты, например до 16 кГц.

w = downsample(w, 16000)

Но помните, что согласно теореме Найквиста максимальная частота, которая может быть представлена ​​в настоящее время, составляет 8 кГц.

Вы также можете найти программное обеспечение для определения высоты тона. Как этот , который требует MATLAB, хотя.

slhck
источник
Кстати fpeaks, знаете ли вы, есть ли функция, которая отображает график частоты в зависимости от времени?
Pacerier
Смотрите мое обновление. Это не так тривиально. Я не слишком много работал со звуком, чтобы знать, есть ли что-нибудь лучше, извините.
slhck
8

Вы пробовали Audacity ? Это бесплатный инструмент , который имеет некоторые довольно сложные инструменты анализа, в том числе спектра Plot команды доступны из Analyze -> Участок спектра ... .

Скриншот

Обратите внимание, что с версией файла MP3 получаются разные результаты по сравнению с версией WAV, поскольку сжатие MP3 изменило форму волны и привело к появлению артефактов / псевдонимов.

Изменить: те звуковые файлы, на которые вы ссылаетесь, не являются хорошими примерами для этого. Файлы с более высокой частотой сэмплируются только при частоте 44,1 кГц, которая адаптирована для человеческого слуха (максимум около 20 кГц). Вы не можете представлять ультразвуковые частоты без увеличения частоты дискретизации.

Джеймс П
источник
Хм, похоже, он не работает с файлом Piano.mp3 . Для меня это показывает 10121 Гц (D # 9) screenshoot.me/uZZ2N0 , но это очень маловероятно, потому что самая большая клавиша на пианино - C8 (4186 Гц). Я что-то делаю неправильно?
Pacerier
3
@Pacerier Нет, но вы немного изменили свой вопрос. Образец собачьего свистка легко идентифицировать, потому что частота с самым высоким пиком в спектре также является самой высокой частотой и в то же время доминирующей нотой. Для музыки самая высокая частота не обязательно является самой высокой нотой, поскольку музыкальная нота, которую играет инструмент, состоит из нескольких частот.
slhck
@slhck Ic, я думал, что мы могли бы угадать ноту, если бы у нас была частота, похоже, что это не так просто ...
Pacerier
@Pacerier: если вы установите для параметра Size более высокое значение, я думаю, что оно может дать более точные результаты и устранить некоторые гармоники.
Джеймс П
2
@Pacerier Нет, это действительно не так просто. Для определения высоты тона требуется сначала преобразовать сигнал в частотный спектр (быстрое преобразование Фурье), затем применить фильтры (в основном, нижних частот) и еще один раунд фильтров. Если вы не найдете инструмент, который отслеживает высоту звука с течением времени, то, что вы ищете, действительно будет трудным. Вы можете посмотреть на инструменты коррекции голоса, такие как Melodyne .
slhck