В этом примере показано, как использовать инструменты из Audio Toolbox™ для измерения громкости, области значений громкости и истинно-пикового значения. Также показано, как нормализовать аудио для соответствия стандартным податливостям EBU R 128.
Нормализация объема традиционно выполнялась путем просмотра пиковых измерений сигнала. Однако этот способ имел недостаток, заключающийся в том, что чрезмерно сжатый звук мог пройти порог уровня сигнала, но все еще был очень громким. Результатом стала война громкости, где записи, как правило, были громче, чем раньше и непоследовательны по жанрам.
Современное решение войны громкости заключается в измерении воспринимаемой громкости в сочетании с измерением истинно пикового уровня. Международные стандарты, такие как BS.1770-4 ITU, EBU R 128 и A/85 ATSC, были разработаны для стандартизации измерений громкости на основе степени аудиосигнала. Многие страны уже приняли законы о податливости стандартов вещания на уровне громкости.
В этом примере вы измеряете громкость и дополнительные параметры как для автономных (на основе файлов), так и для live (потоковой) аудиосигналов. Вы также видите способы нормализации звука, чтобы соответствовать целевым уровням.
Audio Toolbox позволяет вам измерять громкость и связанные параметры в соответствии со стандартом EBU R 128. Этот стандарт определяет следующие меры громкости:
Сиюминутная громкость: Использует раздвижное окно длиной 400 мс.
Кратковременная громкость: Использует раздвижное окно длиной 3 с.
Интегрированная громкость: совокупная громкость от начала до конца.
Громкость области значений: Количественно определяет изменение громкости на макроскопическом временном шкале.
Истинно-пиковое значение: Пиковый уровень дискретизации интерполированного сигнала.
Более подробное описание этих параметров приведено в документации по стандарту EBU R 128.
Для случаев, когда у вас уже есть записанные аудио выборки, можно использовать integratedLoudness
функция для измерения громкости. Он возвращает интегрированную громкость, в модули LUFS, и громкость, в модули LU, области значений полного аудио файла.
[x, fs] = audioread('RockGuitar-16-44p1-stereo-72secs.wav'); [loudness, LRA] = integratedLoudness(x,fs); fprintf('Loudness before normalization: %.1f LUFS\n',loudness)
Loudness before normalization: -8.2 LUFS
EBU R 128 задает целевой уровень громкости -23 LUFS. Громкость аудио файла явно выше этого уровня. Для нормализации громкости можно использовать простую операцию снижения уровня.
target = -23;
gaindB = target - loudness;
gain = 10^(gaindB/20);
xn = x.*gain;
audiowrite('RockGuitar_normalized.wav',xn,fs)
Громкость нового аудио файла на целевом уровне.
[x, fs] = audioread('RockGuitar_normalized.wav'); loudness = integratedLoudness(x,fs); fprintf('Loudness after normalization: %.1f LUFS\n',loudness)
Loudness after normalization: -23.0 LUFS
Для передачи потокового аудио EBU R 128 задает сиюминутную и краткосрочную громкость. Можно использовать loudnessMeter
Системный объект для измерения сиюминутной громкости, кратковременной громкости, интегрированной громкости, области значений громкости и истинно-пикового значения живого аудиосигнала.
Во-первых, потоковая передача аудиосигнала на звуковую карту и измерение его громкости с помощью loudnessMeter
. The visualize
метод loudnessMeter
открывает пользовательский интерфейс (UI), который отображает все измерения, связанные с громкостью, когда симуляция прогрессирует.
reader = dsp.AudioFileReader('RockGuitar-16-44p1-stereo-72secs.wav', ... 'SamplesPerFrame',1024); fs = reader.SampleRate; inputLoudness = loudnessMeter('SampleRate',fs); player = audioDeviceWriter('SampleRate',fs); runningMax = dsp.MovingMaximum('SpecifyWindowLength',false); visualize(inputLoudness) while ~isDone(reader) audioIn = reader(); [loudness,~,~,~,tp] = inputLoudness(audioIn); maxTP = runningMax(tp); player(audioIn); end
fprintf('Max true-peak value before normalization: %.1f dBTP\n',maxTP(end))
Max true-peak value before normalization: -0.3 dBTP
release(reader) release(player)
Как видно на пользовательском интерфейсе, громкость аудиопотока явно выше порога -23 LUFS. Его максимальный истинно-пиковый уровень -0,3 dBTP также выше порога -1 dBTP, заданного EBU R 128. Нормализация громкости живого аудиопотока сложнее, чем нормализация громкости файла. Один из способов помочь получить значение громкости близкое к целевому порогу - использовать автоматический контроллер усиления (AGC). В следующем коде вы используете audioexample. Системный объект AGC для нормализации степени аудиосигнала до -23 дБ. AGC оценивает степень аудиосигнала, рассматривая предыдущие 400 мс, который является размером окна, используемым для вычисления мгновенной громкости. В этом примере используются два счетчика громкости - один для входов AGC и один для выходов AGC. Пользовательские интерфейсы для двух счетчиков громкости могут запускаться в том же месте на вашем экране, поэтому вам придется переместить один в сторону, чтобы сравнить измеренную громкость до и после AGC.
outputLoudness = loudnessMeter('SampleRate',fs); gainController = audioexample.AGC('DesiredOutputPower',-23, ... 'AveragingLength',0.4*fs,'MaxPowerGain',20); reset(inputLoudness) % Reuse the same loudness meter from before reset(runningMax) visualize(inputLoudness) visualize(outputLoudness) while ~isDone(reader) audioIn = reader(); loudnessBeforeNorm = inputLoudness(audioIn); [audioOut, gain] = gainController(audioIn); [loudnessAfterNorm,~,~,~,tp] = outputLoudness(audioOut); maxTP = runningMax(tp); player(audioOut); end
fprintf('Max true-peak value after normalization: %.1f dBTP\n',maxTP(end))
Max true-peak value after normalization: 8.3 dBTP
release(reader) release(player)
Использование AGC не только приблизило громкость аудио к цели -23 LUFS, но и получило максимальное значение true-peak ниже допустимого -1 dBTP. В некоторых случаях максимальное значение true-peak остается выше -1 dBTP, хотя громкость находится на уровне или ниже -23 LUFS. Для таких сценариев можно передать аудио через limiter
.