Получение частоты звука

242
18 ноября 2017, 09:51

Вот у меня есть .3gpp файл, и я знаю путь к нему в виде String. Аудио дорожку надо разбить на несколько частей, и получить среднее значение частоты к каждой части. Было бы круто, если был метод на подобии int getFrequency(String path, int milliseconds), но точно такого метода я не нашел. Погуглив, я понял, что надо как-то декодировать аудио файл и сделать ряд вычислений, но непонятно каких вычислений и непонятно как декодировать аудио

Answer 1

Делается это так.

Сначала чуть-чуть теории

Звук в общем (и в частности музыкальный) это сложение разных частот (по научному гармоник) с разной амплитудой. Если грубо представить то это иллюстрируется картинкой типа:

Разбивка на частоты конкретного звука производится преобразованием Фурье - в вычислительном смысле это удобно делать т.н. быстрым преобразованием Фурье

В итоге мы получим табличку типа (*):

частота[i] -> амплитуда[i]
частота[i+1] -> амплитуда[i+1]
....

Далее вычисляем среднюю амплитуду то есть надо проинтегрировать табличку в слышимом диапазоне (от 20 гц. до 20 кгц) примерно так:

 сумма((частота[i+1]-частота[i])*амплитуда[i])/(20000-20)

Средняя громкость (пропорциональна логарифму амплитуды звука):

 сумма((частота[i+1]-частота[i])*log(амплитуда[i]))/(20000-20)

Средняя частота, это частота на которой интеграл:

 сумма((частота[i+1]-частота[i])*log(амплитуда[i]))

равен половине суммы за весь слышимый интервал. Иллюстрирует такая картинка:

Теперь конкретнее

В обычном аудио файле/треке данные звука хранятся в виде PCM (pulse code modulation) - то есть это развертка звука по амплитуде и времени.

Вам надо получить эти данные из трека. В обычном Java это можно получить через AudioInputStream, но в Android он не работает. К счастью есть такая библиотека RingDroid - откуда можно почерпнуть это тайное знание.

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

Как то так.

READ ALSO
Gradle com.bmuschko.tomcat plugin tomcatRun fails

Gradle com.bmuschko.tomcat plugin tomcatRun fails

После maven стал изучать gradle и столкнулся с проблемой, не получается сделать деплой проекта (gradle 43

343
Как сделать Page Control на android

Как сделать Page Control на android

Как создать PageControl хотя бы подобный тому что на картинке, а вообще надо сделать "ползунком"

227
Spring Mvc, jsp

Spring Mvc, jsp

Здравствуйте!

196
Как правильно инициализировать объект java?

Как правильно инициализировать объект java?

Можно ли так писать код? Будет ли утечка памяти и тд

174