Ограничитель динамического диапазона
limiter Система object™ выполняет ограничение динамического диапазона кирпичной стены независимо по каждому входному каналу. Динамическое ограничение диапазона подавляет громкость громких звуков, которые пересекают заданный порог. Для получения плавной кривой усиления используется заданное время атаки и освобождения. Свойства limiter Системный объект определяет тип ограничения динамического диапазона.

Для выполнения динамического ограничения дальности:
Создать limiter и задайте его свойства.
Вызовите объект с аргументами, как если бы это была функция.
Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.
dRL = limiter создает объект System, dRL, которая выполняет ограничение динамического диапазона кирпичной стены независимо по каждому входному каналу.
dRL = limiter( устанавливает для свойства Threshold значение thresholdValue)thresholdValue.
dRL = limiter(___, задает каждое свойство Name,Value)Name к указанному Value. Неопределенные свойства имеют значения по умолчанию.
dRL = limiter('AttackTime',0.01,'SampleRate',16000) создает объект System, dRLс временем атаки 10 мс и частотой дискретизации 16 кГц.Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.
Если свойство настраивается, его значение можно изменить в любое время.
Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.
Threshold - Порог работы (дБ)–10 (по умолчанию) | вещественный скалярПорог операции в дБ, заданный как действительный скаляр.
Порог работы - это уровень, выше которого коэффициент усиления применяется к входному сигналу.
Настраиваемый: Да
Типы данных: single | double
KneeWidth - Ширина колена (дБ)0 (по умолчанию) | вещественный скалярШирина колена в дБ, заданная как действительный скаляр, больший или равный 0.
Ширина колена - переходная область в характеристике ограничителя.
Для характеристик мягкого колена область перехода определяется соотношением
W2) 2 (2 × W)
для диапазона T |) ≤W.
y - выходной уровень в дБ.
x - входной уровень в дБ.
T - пороговое значение в дБ.
W - ширина колена в дБ.
Настраиваемый: Да
Типы данных: single | double
AttackTime - Время (а) атаки0 (по умолчанию) | вещественный скалярВремя атаки в секундах, указанное как действительный скаляр, больший или равный 0.
Время атаки - это время, в течение которого коэффициент усиления ограничителя увеличивается с 10% до 90% от его конечного значения, когда входной сигнал выходит за пороговое значение.
Настраиваемый: Да
Типы данных: single | double
ReleaseTime - Время (а) освобождения0.2 (по умолчанию) | вещественный скалярВремя освобождения в секундах, указанное как действительный скаляр, больший или равный 0.
Время освобождения - это время, в течение которого коэффициент усиления ограничителя падает с 90% до 10% от его конечного значения, когда входной сигнал выходит за пороговое значение.
Настраиваемый: Да
Типы данных: single | double
MakeUpGainMode - Режим усиления подпитки'Property' (по умолчанию) | 'Auto'Режим усиления подпитки, указанный как 'Auto' или 'Property'.
'Auto' - Коэффициент подпитки применяется на выходе ограничителя динамического диапазона таким образом, что установившийся вход 0 дБ имеет выход 0 дБ.
'Property' -- Коэффициент усиления макияжа устанавливается равным значению, указанному в свойстве MakeUpGain.
Настраиваемый: Нет
Типы данных: char | string
MakeUpGain - Коэффициент усиления подпитки (дБ)0 (по умолчанию) | вещественный скалярКоэффициент усиления в дБ, определяемый как действительный скаляр.
Усиление подпитки компенсирует усиление, потерянное во время ограничения. Применяется на выходе ограничителя динамического диапазона.
Настраиваемый: Да
Чтобы включить это свойство, задайте для параметра MakeUpGainMode значение 'Property'.
Типы данных: single | double
SampleRate - Частота входных выборок (Гц)44100 (по умолчанию) | положительный скалярЧастота входных выборок в Гц, заданная как положительный скаляр.
Настраиваемый: Да
Типы данных: single | double
EnableSidechain - Включить ввод боковой цепиfalse (по умолчанию) | trueВключить ввод боковой цепочки, указанный как true или false. Это свойство определяет количество доступных входных данных в limiter объект.
false - Вход боковой цепочки отключен, и limiter объект принимает один ввод: audioIn данные должны быть ограничены.
true - Вход Sidechain включен, и limiter объект принимает два входа: audioIn данные, подлежащие ограничению, и входные данные боковой цепочки, используемые для вычисления ограничителя gain.
Тип данных боковой цепочки и длина (кадра) должны совпадать с audioIn.
Количество каналов ввода боковой цепи должно быть равно количеству каналов audioIn или быть равным единице. Если количество боковых каналов равно единице, gain вычисленный на основе этого канала применяется ко всем каналам audioIn. Если количество боковых каналов равно количеству каналов в audioIn, gain вычисленный для каждого бокового канала применяется к соответствующему каналу audioIn.
Настраиваемый: Нет
audioIn - Вход звука в ограничительВход звука в ограничитель, заданный как матрица. Столбцы матрицы обрабатываются как независимые аудиоканалы.
Типы данных: single | double
audioOut - Аудиовыход от ограничителяАудиовыход ограничителя, возвращаемый в виде матрицы того же размера, что и audioIn.
Типы данных: single | double
gain - Коэффициент усиления, применяемый ограничителем (дБ)Коэффициент усиления, применяемый ограничителем, возвращаемый в виде матрицы того же размера, что и audioIn.
Типы данных: single | double
Чтобы использовать функцию объекта, укажите объект System в качестве первого входного аргумента. Например, для освобождения системных ресурсов объекта System с именем obj, используйте следующий синтаксис:
release(obj)
limitervisualize | Визуализация статической характеристики контроллера динамического диапазона |
createAudioPluginClass | Создать класс аудиоплагинов, реализующий функциональность объекта System |
parameterTuner | Настройка параметров объекта во время потоковой передачи |
configureMIDI | Настройка соединений MIDI между аудиообъектом и контроллером MIDI |
disconnectMIDI | Отключить элементы управления MIDI от аудиообъекта |
getMIDIConnections | Получение MIDI-соединений аудиообъекта |
createAudioPluginClass и configureMIDI функции отображают настраиваемые свойства limiter Системный объект для пользовательских параметров:
| Собственность | Диапазон | Отображение | Единица |
|---|---|---|---|
Threshold | [–50, 0] | линейный | dB |
KneeWidth | [0, 20] | линейный | dB |
AttackTime | [0, 4] | линейный | секунды |
ReleaseTime | [0, 4] | линейный | секунды |
MakeUpGain (доступно при установке MakeUpGainMode кому 'Property') | [–10, 24] | линейный | dB |
Используйте динамическое ограничение диапазона для подавления громкости громких звуков.
Настройка dsp.AudioFileReader и audioDeviceWriter objects™ системы.
frameLength = 1024; fileReader = dsp.AudioFileReader( ... 'Filename','RockDrums-44p1-stereo-11secs.mp3', ... 'SamplesPerFrame',frameLength); deviceWriter = audioDeviceWriter( ... 'SampleRate',fileReader.SampleRate);
Настройка limiter иметь порог -15 дБ, время атаки 0,005 секунды и время высвобождения 0,1 секунды. Установите коэффициент усиления до 0 дБ (по умолчанию). Чтобы задать это значение, установите режим усиления подпитки на 'Property' но не указывайте MakeUpGain собственность. Используйте частоту дискретизации устройства чтения аудиофайлов.
dRL = limiter(-15, ... 'AttackTime',0.005, ... 'ReleaseTime',0.1, ... 'MakeUpGainMode','Property', ... 'SampleRate',fileReader.SampleRate);
Настройте область времени для визуализации исходного сигнала и ограниченного сигнала.
scope = timescope( ... 'SampleRate',fileReader.SampleRate, ... 'TimeSpanOverrunAction','Scroll', ... 'TimeSpanSource','property',... 'TimeSpan',1, ... 'BufferLength',44100*4, ... 'YLimits',[-1 1], ... 'ShowGrid',true, ... 'LayoutDimensions',[2,1], ... 'NumInputPorts',2, ... 'ShowLegend',true, ... 'Title',['Original vs. Limited Audio (top)' ... ' and Limiter Gain in dB (bottom)']);
Воспроизвести обработанный звук и визуализировать его в области.
while ~isDone(fileReader) x = fileReader(); [y,g] = dRL(x); deviceWriter(y); x1 = x(:,1); y1 = y(:,1); g1 = g(:,1); scope([x1,y1],g1); end release(fileReader) release(dRL) release(deviceWriter) release(scope)

Ограничитель динамического диапазона - особый тип компрессора динамического диапазона. В ограничителях уровень выше операционного порога жестко ограничен. В простейшей реализации ограничителя эффект эквивалентен отсечению звука. В компрессорах уровень выше эксплуатационного порога понижается с использованием заданной степени сжатия. Использование коэффициента сжатия приводит к более плавному обработанному сигналу.
Сравнение ограничителя и компрессора, применяемых к синусоиде
Создать limiter object™ системы и compressor Системный объект. Установите AttackTime и ReleaseTime свойства обоих объектов обнуляются. Создание audioOscillator Системный объект для генерации синусоиды с Frequency установить в значение 5 и Amplitude установить в значение 0.1.
dRL = limiter('AttackTime',0,'ReleaseTime',0); dRC = compressor('AttackTime',0,'ReleaseTime',0); osc = audioOscillator('Frequency',5,'Amplitude',0.1);
Создайте область времени для визуализации сгенерированной синусоиды и обработанной синусоиды.
scope = timescope( ... 'SampleRate',osc.SampleRate, ... 'TimeSpanSource','Property','TimeSpan',2, ... 'BufferLength',osc.SampleRate*4, ... 'TimeSpanOverrunAction','Scroll', ... 'ShowGrid',true, ... 'LayoutDimensions',[2 1], ... 'NumInputPorts',2); scope.ActiveDisplay = 1; scope.Title = 'Original Signal vs. Limited Signal'; scope.YLimits = [-1,1]; scope.ActiveDisplay = 2; scope.Title = 'Original Signal vs. Compressed Signal'; scope.YLimits = [-1,1];
В контуре аудиопотока визуализируйте исходную синусоиду и синусоиду, обработанные ограничителем и компрессором. Увеличьте амплитуду исходной синусоиды, чтобы проиллюстрировать эффект.
while osc.Amplitude < 0.75 x = osc(); xLimited = dRL(x); xCompressed = dRC(x); scope([x xLimited],[x xCompressed]); osc.Amplitude = osc.Amplitude + 0.0002; end release(scope)

release(dRL) release(dRC) release(osc)
Сравнение ограничителя и компрессора, применяемых к звуковому сигналу
Сравните влияние ограничителей динамического диапазона и компрессоров на барабанную дорожку. Создать dsp.AudioFileReader Системный объект и audioDeviceWriter Системный объект для чтения звука из файла и записи на устройство вывода звука. Чтобы подчеркнуть эффект управления динамическим диапазоном, установите эксплуатационный порог ограничителя и компрессора на -20 дБ.
dRL.Threshold = -20; dRC.Threshold = -20; fileReader = dsp.AudioFileReader('FunkyDrums-44p1-stereo-25secs.mp3'); deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate);
Считывание последовательных кадров из аудиофайла в цикле. Прослушивание и сравнение влияния динамического ограничения диапазона и динамического сжатия диапазона на звуковой сигнал.
numFrames = 300;
fprintf('Now playing original signal...\n')Now playing original signal...
for i = 1:numFrames x = fileReader(); deviceWriter(x); end reset(fileReader); fprintf('Now playing limited signal...\n')
Now playing limited signal...
for i = 1:numFrames x = fileReader(); xLimited = dRL(x); deviceWriter(xLimited); end reset(fileReader); fprintf('Now playing compressed signal...\n')
Now playing compressed signal...
for i = 1:numFrames x = fileReader(); xCompressed = dRC(x); deviceWriter(xCompressed); end release(fileReader) release(deviceWriter) release(dRC) release(dRL)
Создать dsp.AudioFileReader для чтения в аудио покадровом режиме. Создать audioDeviceWriter для записи звука на звуковую карту. Создать limiter для обработки аудиоданных.
frameLength = 1024; fileReader = dsp.AudioFileReader('RockDrums-44p1-stereo-11secs.mp3', ... 'SamplesPerFrame',frameLength); deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate); dRL = limiter('SampleRate',fileReader.SampleRate);
Звонить parameterTuner открытие пользовательского интерфейса для настройки параметров ограничителя во время потоковой передачи.
parameterTuner(dRL)

В цикле аудиопотока:
Считывание в кадре звука из файла.
Применить динамическое ограничение диапазона.
Запишите кадр звука на аудиоустройство для прослушивания.
Во время потоковой передачи настройте параметры ограничителя динамического диапазона и прослушайте эффект.
while ~isDone(fileReader) audioIn = fileReader(); audioOut = dRL(audioIn); deviceWriter(audioOut); drawnow limitrate % required to update parameter end
Рекомендуется деблокировать объекты после их завершения.
release(deviceWriter) release(fileReader) release(dRL)
Использовать вход EnableSidechain limiter объект для ограничения уровня амплитуды отдельного звукового сигнала. Сигнал боковой цепи управляет ограничением динамического диапазона входного звукового сигнала. Когда сигнал боковой цепи превышает порог ограничителя, ограничитель активирует и ограничивает амплитуду входного сигнала. Когда уровень сигнала боковой цепи падает ниже порогового значения, звуковой вход возвращается к своей исходной амплитуде. Подробное сравнение сжатия и ограничения динамического диапазона см. в разделе Сравнение ограничителя динамического диапазона и компрессора.
Подготовка аудиофайлов
В этом разделе выполняется повторная выборка и нулевая вставка речевого файла для использования в качестве входных данных EnableSidechain собственность вашего limiter объект.
Считывание звукового сигнала. Выполните его повторную выборку в соответствии с частотой дискретизации входного аудиосигнала (44,1 кГц).
targetFs = 44100;
[originalSpeech,originalFs] = audioread('Rainbow-16-8-mono-114secs.wav');
resampledSpeech = resample(originalSpeech,targetFs,originalFs);Установите начало повторно дискретизированного сигнала с нулями на 10 секунд. Это позволяет четко слышать входной аудиосигнал до применения какого-либо ограничения.
resampledSpeech = [zeros(10*targetFs,1);resampledSpeech];
Нормализуйте амплитуду, чтобы избежать потенциального отсечения.
resampledSpeech = resampledSpeech ./ max(resampledSpeech);
Запишите повторно дискретизированный, заполненный нулями и нормализованный сигнал боковой цепи в файл.
audiowrite('resampledSpeech.wav',resampledSpeech,targetFs);Создание аудиообъектов
Построить dsp.AudioFileReader объект для входных и боковых сигналов. Использование свойства ReadRange AudioFileReader, выберите второй стих входного сигнала и первые 26,5 секунд сигнала боковой цепи для воспроизведения. Чтобы разрешить скрипт работать бесконечно, измените playbackCount переменная из 1 кому Inf.
inputAudio = 'SoftGuitar-44p1_mono-10mins.ogg'; sidechainAudio = 'resampledSpeech.wav'; playbackCount = 1; inputAudioAFR = dsp.AudioFileReader(inputAudio,'PlayCount',playbackCount,'ReadRange',... [115*targetFs round(145.4*targetFs)]); sidechainAudioAFR = dsp.AudioFileReader(sidechainAudio,'PlayCount',playbackCount,... 'ReadRange',[1 round(26.5*targetFs)]);
Построить limiter объект. Используйте быстрое время ожидания и умеренно медленное время восстановления. Эти настройки идеально подходят для голосовой связи. Быстрое время атаки гарантирует, что входной звук будет ограничен почти сразу после того, как сигнал боковой цепи превысит порог ограничителя. Медленное время освобождения гарантирует, что ограничение входного звука продолжается через любые потенциальные короткие бесшумные области в сигнале боковой цепи.
iAmYourLimiter = limiter('EnableSidechain',true,... 'SampleRate',targetFs,... 'Threshold',-48,... 'AttackTime',0.01,... 'ReleaseTime',1.75);
Построение audioDeviceWriter объект для воспроизведения боковой цепи и входных сигналов.
afw = audioDeviceWriter;
Построить timescope обеспечение возможности просмотра несжатого входного сигнала, сигнала боковой цепи, а также сжатого входного сигнала.
scope = timescope('NumInputPorts',3,... 'SampleRate',targetFs,... 'TimeSpanSource','property',... 'TimeSpan',5,... 'TimeDisplayOffset',0,... 'LayoutDimensions',[3 1],... 'BufferLength',targetFs*15,... 'TimeSpanOverrunAction','Scroll',... 'YLimits',[-1 1],... 'ShowGrid',true,... 'Title','Original Input Audio - Guitar'); scope.ActiveDisplay = 2; scope.YLimits = [-1 1]; scope.Title = 'Sidechain Audio - Speech'; scope.ShowGrid = true; scope.ActiveDisplay = 3; scope.YLimits = [-1 1]; scope.ShowGrid = true; scope.Title = 'Dynamic Range Limited Input Audio - Guitar';
Создать цикл потоковой передачи звука
Считывайте в кадре аудио из входных и боковых сигналов. Обработка входных и боковых сигналов с помощью limiter объект. Воспроизведение обработанных аудиосигналов и отображение аудиоданных с помощью timescope объект.
Верхняя панель вашего timescope отображает необработанный входной аудиосигнал, а на средней панели - звуковой сигнал боковой цепи. На нижней панели отображается ограниченный входной звуковой сигнал. Обратите внимание, что амплитуды сигналов на верхней и нижней панелях идентичны до тех пор, пока не начнется сигнал боковой цепи. Как только сигнал боковой цепи активируется, амплитуда в нижней панели уменьшается. Как только сигнал боковой цепи заканчивается, амплитуда нижней панели возвращается к своему первоначальному уровню.
while ~isDone(inputAudioAFR) inputAudioFrame = inputAudioAFR(); sideChainAudioFrame = sidechainAudioAFR(); limiterOutput = iAmYourLimiter(inputAudioFrame,sideChainAudioFrame); afw(sideChainAudioFrame+limiterOutput); scope(inputAudioFrame,sideChainAudioFrame,limiterOutput); end
Освободите объекты.
release(inputAudioAFR) release(sidechainAudioAFR) release(iAmYourLimiter) release(afw) release(scope)

limiter Системный объект обрабатывает кадр сигнала по кадрам и элемент по элементам.

N-точечный сигнал x [n] преобразуется в децибелы:
| x [n] |
xdB [n] проходит через компьютер усиления. Компьютер усиления использует статические характеристические свойства ограничителя динамического диапазона для усиления кирпичной стены, которое выше порогового значения.
Если указано мягкое колено, компьютер усиления имеет следующую статическую характеристику:
(T + W2) TxdB > (T + W2),
где T - порог, а W - ширина колена.
Если указано жесткое колено, компьютер усиления имеет следующую статическую характеристику:
={xdBxdB<TTxdB≥T
Вычисленный коэффициент усиления, gc [n], вычисляется как
xdB [n].
gc [n] сглаживается с использованием указанной атаки и времени выпуска:
[n], gc [n] > gs [n − 1]
Коэффициент времени атаки, αА, рассчитывается как
× TA).
Коэффициент времени высвобождения, αR, рассчитывается как
× TR).
TA
- период времени атаки, указанный AttackTime собственность. TR
- период времени деблокирования, указанный ReleaseTime собственность. Fs - входная частота дискретизации, определяемая SampleRate собственность.
Если MakeUpGainMode установлено значение по умолчанию 'Auto'вычисляется как отрицательное значение вычисленного коэффициента усиления для входного сигнала 0 дБ:
xsc 'xdB = 0
При установившемся входе 0 дБ эта конфигурация достигает установившегося выхода 0 дБ. Прирост подпитки определяется Threshold и KneeWidth свойства. Это не зависит от входного сигнала.
Коэффициент усиления, M, добавляется к сглаженному коэффициенту усиления, gs [n]:
n] + M
Вычисленный коэффициент усиления в дБ, gm [n], преобразуется в линейную область:
20).
Выход ограничителя динамического диапазона задается как
glin [n].
[1] Джаннулис, Димитриос, Майкл Массберг и Джошуа Д. Рейсс. «Проектирование цифрового компрессора динамического диапазона - учебное пособие и анализ». Журнал Общества аудиотехники. Том 60, выпуск 6, 2012, стр. 399-408.
Примечания и ограничения по использованию:
Системные объекты в генерации кода MATLAB (кодер MATLAB)
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.