Нормализация громкости в соответствии со стандартом EBU R 128

В этом примере показано, как использовать инструменты из Audio Toolbox™ для измерения громкости, области значений громкости и истинно-пикового значения. Также показано, как нормализовать аудио для соответствия стандартным податливостям EBU R 128.

Введение

Нормализация объема традиционно выполнялась путем просмотра пиковых измерений сигнала. Однако этот способ имел недостаток, заключающийся в том, что чрезмерно сжатый звук мог пройти порог уровня сигнала, но все еще был очень громким. Результатом стала война громкости, где записи, как правило, были громче, чем раньше и непоследовательны по жанрам.

Современное решение войны громкости заключается в измерении воспринимаемой громкости в сочетании с измерением истинно пикового уровня. Международные стандарты, такие как BS.1770-4 ITU, EBU R 128 и A/85 ATSC, были разработаны для стандартизации измерений громкости на основе степени аудиосигнала. Многие страны уже приняли законы о податливости стандартов вещания на уровне громкости.

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

Стандарт EBU R 128

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

Figure Loudness Meter contains objects of type uicontrol, uipanel.

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

Figure Loudness Meter contains objects of type uicontrol, uipanel.

Figure Loudness Meter contains objects of type uicontrol, uipanel.

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.