limiter

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

Описание

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

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

  1. Создайте limiter Объекту и установите его свойства.

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

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

Создание

Описание

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

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

пример

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

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

Свойства

расширить все

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

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

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.

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

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

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

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

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

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

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

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

для области значений (2×|xT|)W.

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

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

  • T - порог в дБ.

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 'Property' - Коэффициент усиления устанавливается на значение, заданное в свойстве MakeUpGain.

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

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

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

Make-up gain компенсирует коэффициент усиления, потерянный во время ограничения. Оно применяется на выходе ограничителя динамической области значений.

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

Зависимости

Чтобы включить это свойство, установите MakeUpGainMode на 'Property'.

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

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

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

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

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

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

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

Тип данных sidechain и (система координат) должны быть такими же, как и 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

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

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

release(obj)

расширить все

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

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 объект для ограничения уровня амплитуды отдельного аудиосигнала. Боковой сигнал управляет ограничением динамической области значений входного аудиосигнала. Когда боковой сигнал превышает ограничитель Threshold, ограничитель активирует и ограничивает амплитуду входного сигнала. Когда уровень бокового сигнала падает ниже порога, звуковой вход возвращается к своей исходной амплитуде. Для подробного сравнения сжатия и ограничения динамической области значений смотрите Сравнение Ограничителя Динамической Области значений и Компрессора.

Подготовка аудио Файлов

В этом разделе вы повторно отобразите и обнулите речевой файл для использования в качестве входов в 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 объект. Используйте быстрый AttackTime, и умеренно медленный ReleaseTime. Эти настройки идеально подходят для работы с голосовой связью. Быстрое время атаки гарантирует, что входной аудио ограничивается почти сразу после того, как боковой сигнал превышает порог ограничителя. Медленный релиз время гарантирует, что ограничение на вход аудио длится через любые потенциальные короткие тихие области в боковом сигнале.

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)

Алгоритмы

расширить все

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

Ссылки

[1] Джаннулис, Димитриос, Майкл Массберг и Джошуа Д. Рейсс. Digital Dynamic Range Compressor Design -- A Tutorial and Analysis (неопр.) (недоступное руководство). Журнал Общества Аудиотехники. Том 60, Выпуск 6, 2012, стр. 399-408.

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

.
Введенный в R2016a