Получение громкости трека с RMS

15

Я пытаюсь вычислить громкость звуковой дорожки, которую я сохранил в буфере. Буфер содержит данные PCM о сигнале, и я хочу узнать, насколько он «громкий», используя Root Mean Squared. Я предполагаю, что могу сделать это во временной области вместо того, чтобы переключаться в частотную область. Каким будет псевдокод для этого?

Буду ли я просто производить выборку в течение одной секунды (аудио [0] - аудио [44099], аудио [44099] - аудио [88199] и т. Д.) И вычислять среднеквадратичное значение этих значений? Так, например, я бы сделал это:

рMSзнак равноаудио[0]2+аудио[1]2+аудио[2]2,,,,,аудио[44099]244100

за каждую секунду?

XSL
источник
1
В приведенном выше выражении отсутствует скобка - я бы добавил ее сам, но, по-видимому, правки должны содержать не менее 6 символов ...
Paul R
3
@PaulR - Вы можете добавить, <!-- html comment -->чтобы обойти ограничение символов в редком случае, когда в идеальном посте есть крошечная, но очень важная ошибка. Эта необходимость возникает очень редко: обычно требуется сделать более 6 символов улучшения. Например, когда отсутствуют скобки, то, как правило , лучше использовать \sqrt{}и \frac{}{}конструкцию в TeX.
Кевин Вермеер
1
@Kevin: спасибо за совет - я буду использовать ваши предложения HTML-комментариев в будущем.
Пол Р
@PaulR - это обсуждалось ранее: ограничение является преднамеренным, разработанным для предотвращения неполного или бессмысленного редактирования (см. Защиту здесь ), но имеет своих противников (см. Обсуждение здесь ).
Кевин Вермеер
4
Обратите внимание, что RMS сама по себе не говорит вам громкость. Чрезвычайно низкие или высокие частоты звучат ниже по громкости, чем 3 кГц того же среднеквадратичного значения. A-взвешивающий фильтр даст вам более точную оценку. gist.github.com/148112
эндолиты

Ответы:

12

Другое дело, что значение RMS не очень хорошо коррелирует с воспринимаемой громкостью. Возможно, вы захотите назвать это уровнем или громкостью. Существует нечто, называемое равными контурами громкости, которое количественно определяет, насколько чувствительно ухо к одной частоте по сравнению с другой частотой, см. Статью в Википедии . Эти кривые зависят от уровня. Например, ухо очень чувствительно к тону 1 кГц по сравнению с тоном 100 Гц, как показано на этом изображении (горизонтальная ось - это частота в Гц):

контуры ровной громкости

Одна из относительно простых вещей, которые вы можете сделать, - это отфильтровать данные PCM с помощью инвертированной кривой равной громкости. Или вы можете применить стандартное взвешивание A, см. Статью Wikipedia Weighting Filter . Затем вы можете вычислить среднеквадратичное значение выходного сигнала взвешенного фильтра равной громкости.

niaren
источник
Мне неясно, как перейти от кода квестонера к этому. Пример вопроса - суммирование квадратов аудиосэмплов. Ответ говорит о применении фильтра к частотам, поэтому кажется, что «фильтровать данные PCM с помощью инвертированной кривой равной громкости» недостаточно. Сначала вы должны получить значение для каждой частоты, затем вы можете понять, как правильно применить кривую? Но это большой шаг вперед.
человек
@gman Идея состоит в том, чтобы предварительно обработать звук с помощью фильтра, а затем использовать результат, как в вопросе (вычисление RMS). Я не уверен на 100%, что вы имеете в виду. Вы не знаете, как сделать фильтрацию или, возможно, дизайн фильтра?
niaren