exponenta event banner

ограничитель

Ограничитель динамического диапазона

Описание

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

Для выполнения динамического ограничения дальности:

  1. Создать limiter и задайте его свойства.

  2. Вызовите объект с аргументами, как если бы это была функция.

Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.

Создание

Описание

dRL = limiter создает объект System, dRL, которая выполняет ограничение динамического диапазона кирпичной стены независимо по каждому входному каналу.

dRL = limiter(thresholdValue) устанавливает для свойства Threshold значение thresholdValue.

пример

dRL = limiter(___,Name,Value) задает каждое свойство Name к указанному Value. Неопределенные свойства имеют значения по умолчанию.

Пример: dRL = limiter('AttackTime',0.01,'SampleRate',16000) создает объект System, dRLс временем атаки 10 мс и частотой дискретизации 16 кГц.

Свойства

развернуть все

Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.

Если свойство настраивается, его значение можно изменить в любое время.

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

Порог операции в дБ, заданный как действительный скаляр.

Порог работы - это уровень, выше которого коэффициент усиления применяется к входному сигналу.

Настраиваемый: Да

Типы данных: single | double

Ширина колена в дБ, заданная как действительный скаляр, больший или равный 0.

Ширина колена - переходная область в характеристике ограничителя.

Для характеристик мягкого колена область перехода определяется соотношением

y = x (x T + W2) 2 (2 × W)

для диапазона (2 × | x T |) ≤W.

  • y - выходной уровень в дБ.

  • x - входной уровень в дБ.

  • T - пороговое значение в дБ.

  • W - ширина колена в дБ.

Настраиваемый: Да

Типы данных: single | double

Время атаки в секундах, указанное как действительный скаляр, больший или равный 0.

Время атаки - это время, в течение которого коэффициент усиления ограничителя увеличивается с 10% до 90% от его конечного значения, когда входной сигнал выходит за пороговое значение.

Настраиваемый: Да

Типы данных: single | double

Время освобождения в секундах, указанное как действительный скаляр, больший или равный 0.

Время освобождения - это время, в течение которого коэффициент усиления ограничителя падает с 90% до 10% от его конечного значения, когда входной сигнал выходит за пороговое значение.

Настраиваемый: Да

Типы данных: single | double

Режим усиления подпитки, указанный как 'Auto' или 'Property'.

  • 'Auto' - Коэффициент подпитки применяется на выходе ограничителя динамического диапазона таким образом, что установившийся вход 0 дБ имеет выход 0 дБ.

  • 'Property' -- Коэффициент усиления макияжа устанавливается равным значению, указанному в свойстве MakeUpGain.

Настраиваемый: Нет

Типы данных: char | string

Коэффициент усиления в дБ, определяемый как действительный скаляр.

Усиление подпитки компенсирует усиление, потерянное во время ограничения. Применяется на выходе ограничителя динамического диапазона.

Настраиваемый: Да

Зависимости

Чтобы включить это свойство, задайте для параметра MakeUpGainMode значение 'Property'.

Типы данных: single | double

Частота входных выборок в Гц, заданная как положительный скаляр.

Настраиваемый: Да

Типы данных: single | double

Включить ввод боковой цепочки, указанный как true или false. Это свойство определяет количество доступных входных данных в limiter объект.

  • false - Вход боковой цепочки отключен, и limiter объект принимает один ввод: audioIn данные должны быть ограничены.

  • true - Вход Sidechain включен, и limiter объект принимает два входа: audioIn данные, подлежащие ограничению, и входные данные боковой цепочки, используемые для вычисления ограничителя gain.

Тип данных боковой цепочки и длина (кадра) должны совпадать с audioIn.

Количество каналов ввода боковой цепи должно быть равно количеству каналов audioIn или быть равным единице. Если количество боковых каналов равно единице, gain вычисленный на основе этого канала применяется ко всем каналам audioIn. Если количество боковых каналов равно количеству каналов в audioIn, gain вычисленный для каждого бокового канала применяется к соответствующему каналу audioIn.

Настраиваемый: Нет

Использование

Описание

пример

audioOut = dRL(audioIn)выполняет ограничение динамического диапазона по входному сигналу, audioInи возвращает ограниченный сигнал, audioOut. Тип ограничения динамического диапазона определяется алгоритмом и свойствами limiter Системный объект, dRL.

пример

[audioOut,gain] = dRL(audioIn)также возвращает примененное усиление в дБ при каждой входной выборке.

Входные аргументы

развернуть все

Вход звука в ограничитель, заданный как матрица. Столбцы матрицы обрабатываются как независимые аудиоканалы.

Типы данных: single | double

Выходные аргументы

развернуть все

Аудиовыход ограничителя, возвращаемый в виде матрицы того же размера, что и audioIn.

Типы данных: single | double

Коэффициент усиления, применяемый ограничителем, возвращаемый в виде матрицы того же размера, что и audioIn.

Типы данных: single | double

Функции объекта

Чтобы использовать функцию объекта, укажите объект System в качестве первого входного аргумента. Например, для освобождения системных ресурсов объекта System с именем obj, используйте следующий синтаксис:

release(obj)

развернуть все

visualizeВизуализация статической характеристики контроллера динамического диапазона
createAudioPluginClassСоздать класс аудиоплагинов, реализующий функциональность объекта System
parameterTunerНастройка параметров объекта во время потоковой передачи
configureMIDIНастройка соединений MIDI между аудиообъектом и контроллером MIDI
disconnectMIDIОтключить элементы управления MIDI от аудиообъекта
getMIDIConnectionsПолучение MIDI-соединений аудиообъекта
cloneСоздать повторяющийся объект System
isLockedОпределить, используется ли объект System
releaseДеблокирование ресурсов и разрешение изменений значений свойств объекта системы и входных признаков
resetСброс внутренних состояний объекта System
stepЗапустить алгоритм объекта System

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)

В цикле аудиопотока:

  1. Считывание в кадре звука из файла.

  2. Применить динамическое ограничение диапазона.

  3. Запишите кадр звука на аудиоустройство для прослушивания.

Во время потоковой передачи настройте параметры ограничителя динамического диапазона и прослушайте эффект.

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 Системный объект обрабатывает кадр сигнала по кадрам и элемент по элементам.

Ссылки

[1] Джаннулис, Димитриос, Майкл Массберг и Джошуа Д. Рейсс. «Проектирование цифрового компрессора динамического диапазона - учебное пособие и анализ». Журнал Общества аудиотехники. Том 60, выпуск 6, 2012, стр. 399-408.

Расширенные возможности

.
Представлен в R2016a