Copyright (C) 2014, Taras Kovrijenko
Полное или частичное копирование текста допускается только с письменного разрешения автора.
ВСТУПЛЕНИЕ
Думаю, вы когда-нибудь сталкивались с очень тихими музыкальными треками, скорее всего это или старые записи, или записи классической инструментальной музыки. Но в любом случае у вас скорей всего возникало желание каким-то образом поднять их громкость. И здесь определенно надо внести ясность — что такое громкость в случае цифрового представления сигнала, что такое амплитуда колебаний, воспринимаемая громкость, и как эти параметры взаимосвязаны. Именно об этом мы и поговорим в данной статье.
1. О цифровом представлении сигналов
Надо понимать, что цифровое представление накладывает на сигнал определенные ограничения, т. к. в цифровом мире нет ничего непрерывного, все значения дискретны и заданы с определенной точностью.
Итак, цифровой сигнал, в отличие от аналогового, не является непрерывным, а состоит из отдельных значений (отсчетов, семплов), которые расположены через строго установленные промежутки времени (количество отсчетов в секунду — это частота дискретизации, или частота семплирования). Кроме того, уровень семплов тоже задается с определенной точностью (ведь в цифровом мире существуют только дискретные значения), которая зависит от разрядности или глубины квантования по уровню. Например, для сигнала с 16-битным квантованием по уровню каждый семпл может занимать только один из 216 = 65536 уровней. В итоге мы имеем как бы координатную сетку и можем описать сигнал заданной продолжительности вполне конечным числом битов ( n= <�частота дискретизации, Гц или 1/c> * <�глубина квантования, бит> * <�количество каналов> * <�продолжительность, с> ). Подробно о цифровом представлении сигнала советую почитать в статье Цифровой звук — обо всём по-порядку.
Так вот, об ограничениях. Частота дискретизации накладывает ограничение на максимальную передаваемую частоту сигнала (частота дискретизации/2), а глубина квантования... нет, не на громкость. В цифровом сигнале нет понятия громкости, есть только относительный уровень сигнала, но об этом чуть позже. Давайте взглянем на график:
Из курса физики мы помним, что колебания — это изменение определенной величины со временем относительно положения равновесия. На графике мы видим изображение синусоидального сигнала, который представлен в цифровом виде с глубиной квантования 16 бит и частотой дискретизации 44100 Гц. Итак, фактически мы имеем отсчеты расположенные через каждые 1/44100=22,6 мкс (по оси абсцисс у нас время, по оси ординат — уровень), каждый из которых занимает один из уровней от -32768 до +32767. 0 — положение равновесия. Как мы видим, уровень сигнала колеблется относительно этого самого нулевого положения равновесия с максимальной амплитудой. Надо четко понимать, что данная амплитуда колебаний в 65535 уровней является максимальной, и нет никаких уровней выше 32767 или ниже -32768. Такой максимальный уровень сигнала указывается как 0 dBFS (Full Scale - полная шкала), если сигнал имеет такой пиковый уровень, то увеличить его громкость без потерь (не изменяя форму сигнала) невозможно. Более низкие уровни сигнала указываются как -1 dBFS, -2 dBFS - и т.д., пока позволяет разрядность. Реальный же уровень громкости, который рассчитывается как 20log(P/Pmin), где P и Pmin — текущий и минимально воспринимаемый человеком уровни звукового давления соответственно будет зависеть от уровня аналогового сигнала на выходе ЦАП и последующего усиления, а также от характеристик звуковоспроизводящей аппаратуры (например, звуковых колонок). Но надо понимать, что уровень цифрового сигнала и сигнала на выходе - строго пропорциональны. А так как децибел - величина относительная, то усиление в дБ имеет свойство аддитивности. Проще говоря, изменение уровня цифрового сигнала на 1 dB в ту или иную сторону приведет к такому же изменению звукового давления (нелинейность усилительных элементов, динамиков, среды и пр. не учитываем).
Очень важно понимать, что в цифровом сигнале отсчет ведется от максимального уровня. Иначе и быть не может. Например, рассчитаем динамический диапазон 16-битного сигнала: 20*log(216)=96,33 dB и для 24-битного сигнала: 20*log(224)=144,49 dB . Но это ведь не значит, что если сигнал преобразовать из 24-битного в 16-битный, он станет тише на 48 dB? Конечно нет. Так вот, в обоих случаях сигнал с максимальным уровнем ( 0 dBFS) после цифро-аналогового преобразования будет иметь одинаковую громкость, но в первом случае уровень шумов квантования (причиной которых служит погрешность в уровне семплов) будет на 48 dB выше, а следовательно динамический диапазон (разность между самым тихим и самым громким звуком) для 24-битного аудио будет на 48 dB больше. Т.е. в 24-битном представлении можно описать сигнал с уровнем, скажем, -148 dBFS, а в 16-битном - нет.
Но тут стоит упомянуть такое явление как постоянная составляющая. Если в сигнале присутствует постоянная составляющая, положение равновесия (для симметричного относительно оси X сигнала) будет смещено по оси Y. Например, у нас есть 16-битный сигнал с амплитудой -6dB. Это значит, что:
20log(x)=96,33-6=90,33 (где x - амплитуда колебаний в "уровнях")
x=10^(90,33/20)=32847 уровней
Если это синусоидальный сигнал и он колеблется относительно нулевого положения, то мы запросто можем усилить его (путем "растяжения" по оси Y) в 2 раза, что соответствует усилению на эти самые 6 dB - получим 0 dBFS:
А теперь посмотрите, как выглядит исходный сигнал смещенный на 10000 уровней:
Как видно, теперь мы не сможем увеличить амплитуду вдвое, т.к. в таком случае уровень части семплов должен будет выйти за допустимые пределы (от -32768 до +32767), и тогда возникнут срезы:
К счастью, удаление постоянной составляющей обычно не составляет труда (для этого существуют специальные обработчики), к тому же встречается она не так часто.
Итак, какие выводы из всего этого можно сделать: усиление громкости трека с помощью пиковой нормализации возможно только в том случае, если самый высокий уровень семпла в композиции меньше максимально допустимого. Обратите внимание - значение уровня надо сравнивать по модулю, т.е. если в аудио есть семпл с уровнем -30000 и 29000, то пиковым будет именно первый (т.к. масштабирование при нормализации выполняется симметрично относительно оси X) и амплитуду колебаний можно будет увеличить на 2*2768 уровней (почти 0.9 dB).
2. Что мы слышим?
А теперь немного психоакустики. Как известно, чувствительность человеческого уха к разным частотам далеко не одинакова и даже в пределах наиболее слышимого диапазона колеблется примерно на 20 dB, в чем Вы можете убедиться сами, ознакомившись с кривыми равной громкости:
Кривые соединяют точки соответствующие одинаковому уровню воспринимаемой громкости, которая измеряется в фонах, при чем опорным является соответствие 60 дБ = 60 фон на частоте 1 кГц. Кроме того, из того факта, что кривая не одна, следует, что чувствительность уха зависит не только от частоты, но и от уровня звукового давления (хоть и не так значительно) - т.е. мы имеем двойную зависимость. Но нас пока интересует именно зависимость от частоты.
Итак, надо понимать: чистый тон частотой 50 Гц, который оказывает уровень звукового давления в 60 dB будет для человека звучать на 20 дБ тише, чем тон частотой 1 кГц оказывающий такое же звуковое давление. Т.е. нельзя судить о воспринимаемой громкости только лишь по уровню звукового давления. А т.к. уровень звукового давления у нас напрямую зависит от амплитуды колебаний цифрового сигнала, то и по его уровню тоже судить нельзя.
Для расчета воспринимаемой громкости заданных музыкальных фрагментов существуют специальные алгоритмы, которые, используя т.н. психоакустическую модель, способны учитывать особенности человеческого слуха.
3. О методах анализа и регулировки громкости
Для регулировки громкости существует два варианта:
1. Пиковая нормализация.
2. Компрессия.
Для анализа воспринимаемой громкости используются специальные алгоритмы, берущие в расчет те самые кривые равной громкости.
Рассмотрим реализацию обеих задач (анализа громкости и пиковой нормализации) на примере распространенной технологии ReplayGain.
3.1 ReplayGain
Суть технологии: музыкальные треки сканируются, в итоге для каждого трека вычисляются два значения:
Track Peak - уровень пикового семпла (семпла с максимальным уровнем). Обратите внимание: за единицу берется полная шкала (100%). Т.е. для обычных треков (несжатых или сжатых lossless кодеками) получим значения от 0.000000 до 1.000000. Для lossy треков (MP3, AAC etc) уровень семплов вполне может превышать единицу, так как у них внутреннее представление данных - с плавающей точкой.
Track Gain - коррекция громкости необходимая для получения некоторого целевого уровня воспринимаемой громкости. Фактически сканер анализирует RMS уровень для трека прошедшего фильтрацию (эквализация в соответствии с кривыми равной громкости), и сравнивает его значение с целевым, разница между ними - и есть нужное усиление. Целевое же значение рассчитывается так: берется розовый шум с RMS уровнем -14 dB (за 0 dB берется RMS уровень синусоиды с максимальной амплитудой), его АЧХ корректируется (опять же, в соответствии с кривой равной громкости), затем измеряется результирующий RMS уровень. Стандартная целевая громкость указана как 89 дБ, чтоб было понятно, откуда это значение: в соответствии с рекомендациями SMPTE, розовый шум с RMS уровнем -20 dB (опять же, относительно синусоиды с максимальным уровнем) на откалиброванной звуковоспроизводящей аппаратуре должен соответствовать уровню звукового давления в 83 dBSPL. Следовательно, -14 dBFS, которые используются в ReplayGain, на этом оборудовании будут соответствовать звуковому давлению в 89 dBSPL.
Дополнительно, если указано, рассчитываются значения Album Peak и Album Gain - максимальный семпл для альбома и коррекция громкости рассчитанная исходя из средней громкости по всему альбому.
Что мы можем сделать с громкостью, зная эти величины? Ну, прежде всего, можно максимизировать уровень, "растянув" сигнал на всю шкалу. Сделать это очень просто: надо разделить единицу на уровень пикового семпла, а затем умножить уровень каждого семпла на полученную величину (естественно, вручную это делать не придется - всё делает программа). Например, если мы имеем трек с пиковым уровнем 0.500000, получим коэффициент K=1/0.5=2, т.е. фактически мы растянем наш сигнал по вертикали (увеличим его амплитуду) в два раза, что, напомню, соответствует усилению в 6 dB:
Если же мы имеем сигнал с пиковым уровнем 1.250000 (а такой сигнал после преобразования в формат с фиксированной точкой будет содержать срезы), то чтобы вписать его в шкалу, надо уровень каждого семпла умножить на 0.8 (соответствует уменьшению амплитуды примерно на 2 dB).
Всё это касалось изменения громкости в пределах трека, но у нас еще есть значения параметров для альбома. C пиковой нормализацией тут ситуация аналогичная, просто все треки альбома как бы объединяются в один, и над ними производятся те же действия. Например, вот так выглядит огибающая "Маленькой ночной серенады" Моцарта (4 части) в Sound Forge:
В данном случае усиление при пиковой нормализации до 0dBFS составит 1.8 dB.
Но на самом деле здесь мы немного ушли от реального положения вещей. ReplayGain в действительности умеет лишь следующее:
1. Предотвращать клиппинг (выполнять пиковую нормализацию до 0 dBFS тех треков/альбомов, у которых уровень пикового семпла выше единицы).
2. Выполнять усиление на определенную величину (в dB). При этом предварительный анализ треков не требуется.
3. Выполнять усиление трека/альбома до заданной средней воспринимаемой громкости (целевое значение по умолчанию - 89 dB, но его можно увеличивать/уменьшать в пределах +/-20dB).
4. Выполнять усиление трека/альбома до заданной средней воспринимаемой громкости и, если в результате уровень пикового семпла выходит за допустимые пределы, подгонять уровень до 0 dBFS (полная шкала).
Т.е., если вам нужно достичь максимальной громкости для трека или альбома без каких-либо потерь, придется пойти на трюк - установить целевой уровень громкости на максимум (109 dB) и включить усиление с предотвращением клиппинга. Таким образом усиливаться будут практически все треки, точнее, те, громкость которых ниже 109 дБ. А так как громкость большинства композиций лежит в пределах 80-96 дБ, мы получим усиление на 13-29 дБ, что практически всегда будет приводить к превышению уровня (если быть точным, для треков с пиковым уровнем больше 0.035481), а так как включено предотвращение клиппинга, то и к нормализации под 0 dBFS.
3.1.1 ReplayGain и foobar2000
Теперь самое интересное - конкретика. Итак, есть трек или целый альбом, который, на ваш взгляд, играет слишком тихо и который требуется усилить. Первое что надо сделать - проанализировать его и определить пиковые уровни.
Для этого нам понадобится плеер foobar2000 установленный в режиме Full или Normal. Добавьте треки альбома в плейлист, потом выделите их, нажмите правой кнопкой мыши и выберите ReplayGain->Scan selection as a single album. По завершении сканирования отобразится окно с результатами:
Прежде всего взглянем на столбец Track Peak - он отображает пиковые уровни для каждого трека (напомню: 1.000000 эквивалентно 100% шкалы). Треки, пиковый уровень которых меньше единицы, можно усилить (аналогично примеру приведенному в начале). Кроме того, был рассчитан пиковый уровень альбома (фактически это максимальный уровень среди треков альбома) - это делается для того чтобы можно было нормализовать до максимума весь альбом, при этом не потеряв разницы в громкости между отдельными его треками (особенно это важно для non-stop компиляций).
В столбце Track Gain указана коррекция громкости необходимая для получения некоторого целевого уровня воспринимаемой громкости.
Соответствующие столбцы Album Gain и Track Gain отображают аналогичную информацию, но для треков объединенных в одно целое - в альбом (мы выбрали сканирование треков как одного альбома).
Нажмите кнопку Update File Tags - данные запишутся в теги файлов. Теперь перейдем к настройкам плеера - File->Preferences->Playback
При настройках как на скриншоте будет выполняться пиковая нормализация большинства альбомов под 0 dBFS (будет выполняться усиление на 20 dB всего альбома, а потом понижение громкости до установки пикового семпла на максимально допустимый уровень). Это самый правильный и беспотерьный способ повышения громкости - мы сохраняем баланс громкости между участками всего альбома, т.е. совершенно не изменяем форму сигнала.
Тоже самое можно сделать и в пределах каждого трека - установить Source: Track. И все треки будут усилены до максимальной громкости (усиление зависит от пикового уровня каждого трека)
Но ведь бывают случаи, когда надо добиться одинаковой громкости для треков или альбомов (например, чтобы при смене трека, не приходилось вручную понижать громкость) - именно для этого технология ReplayGain и создавалась. Итак, если Вам необходимо получить одинаковую среднюю воспринимаемую громкость для отдельных треков, всё что требуется - это выбрать Source: Track или Album, установить целевой уровень громкости (по умолчанию - 89 dBSPL, читайте выше) и выбрать один из режимов - apply gain или apply gain and prevent clipping according to peak. В первом случае уровень сигнала будет просто увеличиваться на величину из поля Track Gain в тегах (см. результаты сканирования). Но ведь при этом уровень некоторых семплов может выйти за максимально допустимый - ведь так же? Это так потому, что, опять же, нет прямой зависимости между пиковым уровнем и уровнем громкости (воспринимаемой в т.ч.) - трек с одним всплеском под 0 дБ вполне может в среднем звучать тише, чем другой с постоянным уровнем -6 dBFS. Что же делать? Первый вариант - понизить целевую громкость. Большинство музыкальных треков, если их привести к стандартной громкости 89 dBSPL не дадут срезов, но как быть с другими треками? Так вот, для этого существует тот самый режим apply gain and prevent clipping according to peak (который мы уже использовали для максимизации громкости) - все треки, уровень семплов в которых не вышел за предельный после усиления, так и останутся усиленными, остальные же будут нормализованы под 0 dBFS. И вот здесь уже может возникнуть дисбаланс громкости - ведь во втором случае треки не будут усилены до нужной громкости. И здесь на помощь приходит компрессия.
3.2 Компрессия
Кстати, не стоит путать lossy компрессию (сжатие с потерями) с компрессией динамического диапазона - это совершенно разные вещи (но ничто не мешает маркетологам из Creative манипулировать этими понятиями к одним при рекламе своего X-Fi Crystalizer).
Значит, вспомним, что у нас произошло. Есть некоторый сигнал, который необходимо усилить на заданную величину (в dB), но вот беда - при этом некоторые его части выходят за допустимые границы. Если усиление всё-таки необходимо совершить, здесь без жертв не обойдется. Выполняется оно вот как. Весь сигнал делится на отрезки (обычно это доли секунды), затем каждый из них усиливается на заданную величину, а те участки, которые после этого выходят за максимум - понижаются до максимально допустимого уровня - 0 dBFS. Естественно, тут уже меняется форма сигнала, но при небольшой разнице между усилением отдельных участков (а это зависит от разницы их уровней и величины целевого усиления), на слух искажение сигнала может быть и незаметно. Давайте ближе посмотрим, как это выглядит. Пусть нам надо усилить сигнал на 8 dB.
На графике синим изображен оригинальный сигнал продолжительностью 14 мс с пиковым уровнем -6 dBFS. Зеленым - этот же сигнал максимизированный путем пиковой нормализации (усиление на 6 dB). Результат аналогичный режиму apply gain and prevent clipping - на 8 дБ усилить нельзя, усиливаем на столько, насколько можно. Здесь сигнал разбит на два фрагмента по 7 мс. Алгоритм следующий: усиление первого фрагмента на 8 дБ, анализ пикового уровня - максимальный уровень не превышен (т.к. исходный уровень первого фрагмента -8.3 dBFS), усиливаем второй фрагмент, анализируем - превышение допустимого уровня на 3.2 dB (исходный уровень -4.8 dBFS), значит понижаем уровень на 3.2 dB - до 0 dBFS. Результат - одни фрагменты усилены, другие - нет. В данном случае перепад громкости между двумя соседними фрагментами - 3.2 дБ, что может быть ощутимо. При меньшем целевом усилении перепад был бы меньше.3.2.1 Компрессия в foobar2000
А теперь - как это работает в foobar2000. Если подумать, то компрессия - это усиление + ограничитель (лимитер). Усиление у нас выполняет ReplayGain. а для ограничения будем пользоваться встроенным в плеер Advanced Limiter'ом:
Данный обработчик делает именно то что нам нужно - динамически понижает громкость фрагментов с уровнем выходящим за допустимые пределы.
Итак, установив Source: Track, Processing: Apply gain и включив Advanced Limiter DSP, мы получим равный уровень громкости для воспроизводимых треков (если они проанализированы сканером) и никаких срезов. Можно поэкспериментировать с целевым уровнем громкости - повысить его. Но при этом советую включить пикметр (View->Visualizations->Peak Meter) и следить, чтобы сигнал не слишком часто достигал 0 dBFS, т.к. это в большинстве случаев свидетельствует о работе ограничителя - желательно, чтобы имелся определенный динамический диапазон, в пределах которого изменялась бы громкость фрагментов. Впрочем, это всё запросто регулируется на слух.
Кстати, можно просто усиливать громкость всего и вся на заданную величину - для этого установите source: none и задайте усилением ползунком Without RG Info.
ВЫВОДЫ
На самом деле здесь я рассмотрел только основы. Алгоритмов нормализации, максимизации, компрессии, ограничения - очень много. Кстати, для компрессии могу посоветовать VST iZotope Ozone - у него очень продвинутый алгоритм ограничения, который позволяет получить значительное усиление воспринимаемой громкости практически без слышимых искажений.
В общем, экспериментируйте. Но главное - не увлекайтесь слишком компрессией (как большинство современных студий) - она действительно портит звук и делает записи совершенно невыразительными. И еще - все манипуляции с громкостью надо делать "на лету", т.е. во время воспроизведения, при этом сохраняя исходный материал нетронутым (этому принципу следует ReplayGain - в файлах хранится только информация об уровнях, сами же аудиоданные изменению не подвергаются). Это очень важное правило, не забывайте его.
Информация от спонсора
Real Transit: узнайте о выходе новейшей майнинг фермы Antminer s11 первым. Real Transit работает напрямую с производителем и не завышает цены. Подробнее можно почитать здесь https://realtransit.ru/blog/antminer-s11.