Анализ звука в файле WAV - PullRequest
       5

Анализ звука в файле WAV

4 голосов
/ 05 декабря 2011

Я пытаюсь проанализировать файл фильма, разделив его на снимки с камеры, а затем пытаюсь определить, какие снимки важнее других. Одним из факторов, которые я рассматриваю в качестве важного для кадра, является громкость звука во время этой части фильма. Для этого я анализирую соответствующий звуковой файл. У меня возникают проблемы с определением, насколько "громким" является выстрел, потому что я не думаю, что полностью понимаю, что представляют собой данные в файле WAV.

Я прочитал файл в аудио-буфер, используя метод, аналогичный описанному в в этом посте .

Уже разбив соответствующий видеофайл на кадры, я сейчас пытаюсь найти, какие кадры громче, чем другие, в файле WAV. Я пытаюсь сделать это, извлекая каждый образец в файл, как это:

double amplitude = (double)((audioData[i] & 0xff) | (audioData[i + 1] << 8));

Некоторые из других постов, которые я прочитал, по-видимому, указывают на то, что мне нужно применить быстрое преобразование Фурье к этим аудиоданным, чтобы получить амплитуду, что заставляет меня задуматься о том, какие значения, которые я извлек, на самом деле представляют. Что я делаю правильно? Мой формат звукового файла - 16-битный моно PCM с частотой дискретизации 22 050 Гц. Должен ли я что-то делать с этим значением 22 050 при попытке проанализировать объем файла? Другие посты предлагают использовать Root Mean Square для оценки громкости. Это требуется, или просто более точный способ сделать это?

Чем больше я смотрю на это, тем больше смущаюсь. Если бы кто-нибудь мог пролить свет на мои ошибки и недоразумения, я был бы очень признателен!

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

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

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

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

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

3 голосов
/ 05 декабря 2011

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

Тем не менее, есть несколько уточнений, которые могут повлиять или не повлиять на вашу задачу. Воспринимаемая громкость, амплитуда и акустическая мощность на самом деле связаны нелинейно, но пока вы только пытаетесь получить приблизительную оценку того, сколько «происходит» в звуковом сигнале, я сомневаюсь, что это актуально для вас , И, конечно, люди слышат разные частоты лучше или хуже - например, летучие мыши испускают ультразвуковые визги, которые будут для нас абсолютно оглушительными, но, к счастью, мы их вообще не слышим. Но опять же, я сомневаюсь, что это имеет отношение к вашей задаче, так как, например, частоты выше 22 кГц (или было 44 кГц? не знаю, какие именно) фактически не могут быть представлены в простом формате WAV.

...