Нахождение «объема» .wav в данный момент времени - PullRequest
4 голосов
/ 27 ноября 2011

Я работаю над небольшим примером приложения для моего проекта четвертого года (занимающегося функционально-реактивным программированием).Идея состоит в том, чтобы создать простую программу, которая может воспроизводить файл .wav и затем отображать «подпрыгивающую» анимацию текущего объема воспроизводимой песни (как в программном обеспечении для записи звука).Я строю это в Scala, поэтому в основном смотрю на библиотеки Java и существующие решения.

В настоящее время мне удалось легко воспроизвести файл .wav, но я не могу достичь второй цели.По сути, есть ли способ, которым я могу декодировать файл .wav, чтобы я мог каким-то образом получить доступ к «тому» в любой момент времени?По объему я думаю, что я имею в виду его амплитуду, но я могу ошибаться по этому поводу - Высшая физика была некоторое время назад ....

Очевидно, я совсем не знаю об этом, поэтому было бы здорово, если быкто-то может направить меня в правильном направлении!

Ответы [ 2 ]

6 голосов
/ 27 ноября 2011

В файле wav данные в заданной точке потока являются объемом (смещенным на половину динамического диапазона). Другими словами, если вы знаете, какой тип файла WAV (например, 8 бит, моно), каждый байт представляет один образец. Если вы знаете частоту дискретизации (скажем, 44100 Гц), умножьте время на 44100, и это тот байт, на который вы хотите посмотреть.

Значением байта является объем (расстояние от середины. 0 и 255 - пики, 127 - ноль). Это предполагает, что кодирование не является мю-законным кодированием. Я нашел некоторую полезную информацию о том, как определить разницу или, что еще лучше, конвертировать между этими форматами здесь:

http://www.gnu.org/software/octave/doc/interpreter/Audio-Processing.html

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

5 голосов
/ 27 ноября 2011

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

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

Другим режимом измерения является среднеквадратическое значение, которое рассчитывается путем интегрирования по определенному временному окну (добавьте квадратные значения выборки, разделите на длину окна и возьмите квадратный корень, то есть среднеквадратичное среднеквадратичное значение).Это дает лучшее представление об «энергии» сигнала, которая движется более плавно, чем пиковые измерения, но не захватывает наблюдаемые максимальные значения.Этот режим иногда также называется VU meter .Вы можете аппроксимировать это с помощью своего рода запаздывающего (низкочастотного) фильтра, например, y[i] = y[i-1]*a + |x[i]|*(a-1), для некоторого значения 0 < a < 1

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

Три проекта, в которых я участвую, могут помочь вам:

  • ScalaAudioFile , который можно использовать для считывания примеров кадров из файла AIFF или WAVE
  • ScalaAudioWidgets , который является еще молодым и неполным проектом для предоставления некоторых виджетов аудиоприложений сверхуscala-swing, включая представление PPM - просто используйте скользящее окно и установите текущее пиковое значение окна (и, при необходимости, среднеквадратическое значение) с регулярным интервалом, и представление позаботится о времени удержания пика и падения
  • ( ScalaCollider , клиент для системы синтеза звука SuperCollider, которую вы можете использовать для воспроизведения звукового файла иизмерять пиковые и среднеквадратичные амплитуды в реальном времени.Последнее, вероятно, является излишним для вашего проекта и может повлечь за собой серьезное обучение, если вы никогда не слышали о SuperCollider.Преимущество заключается в том, что вам не нужно беспокоиться о синхронизации воспроизведения звука с дисплеем индикатора)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...