В этом примере показано, как использовать инструменты Audio Toolbox™ для измерения громкости, диапазона громкости и значения true-peak. В нем также показано, как нормализовать звук в соответствии со стандартом EBU R 128.
Нормализация громкости традиционно выполнялась путем просмотра измерений пикового сигнала. Однако этот способ имел тот недостаток, что чрезмерно сжатый звук может проходить порог уровня сигнала, но все же быть очень громким для прослушивания. Результатом стала громкая война, где записи имели тенденцию быть громче, чем раньше, и непоследовательны по жанрам.
Современное решение войны громкости заключается в измерении воспринимаемой громкости в сочетании с измерением уровня истинного пика. Для стандартизации измерений громкости на основе мощности звукового сигнала разработаны международные стандарты, такие как ITU BS.1770-4, EBU R 128 и ATSC A/85. Многие страны уже приняли законы о соблюдении стандартов вещания на громком уровне.
В этом примере измеряются громкость и дополнительные параметры как для автономных (файловых), так и для прямых (потоковых) аудиосигналов. Вы также видите способы нормализации звука, чтобы он соответствовал целевым уровням.
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 открывает пользовательский интерфейс, который отображает все измерения, связанные с громкостью, по мере выполнения моделирования.
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)
Как видно на UI, громкость аудиопотока явно выше порога -23 LUFS. Максимальный уровень истинного пика -0,3 дБТП также превышает пороговое значение -1 дБТП, заданное блоком EBU R 128. Нормализация громкости прямого аудиопотока сложнее, чем нормализация громкости файла. Один из способов помочь получить значение громкости близко к целевому порогу - использовать автоматический контроллер усиления (АРУ). В следующем коде используется аудиопример. Система AGC стремится нормализовать мощность звукового сигнала до -23 дБ. АРУ оценивает мощность звукового сигнала, рассматривая предыдущие 400 мс, которые представляют собой размер окна, используемый для вычисления сиюминутной громкости. В этом примере используются два измерителя громкости - один для входа в АРУ и один для выхода из АРУ. ПИ для двух измерителей громкости могут запускаться в одном и том же месте на экране, поэтому вам придется переместить один в сторону, чтобы сравнить измеренную громкость до и после АРУ.
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. В некоторых случаях максимальное значение истинного пика остается выше -1 дБТП, хотя громкость находится на уровне -23 LUFS или ниже. Для таких сценариев можно передать звук через limiter.