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

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

Введение

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

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

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

Стандарт 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. 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. UIs для двух метров громкости может запуститься в том же местоположении на вашем экране, таким образом, необходимо будет переместить тот в сторону, чтобы сравнить измеренную громкость до и после 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, но это также получило максимальное истинное пиковое значение ниже позволенного-1 dBTP. В некоторых случаях максимальное истинное пиковое значение остается выше-1 dBTP несмотря на то, что громкость в или ниже-23 LUFS. Для таких сценариев можно передать аудио через limiter.