limiter

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

Описание

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.

Тип данных боковой цепи и (система координат) длина должны совпасть с 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]линейныйдБ
KneeWidth[0, 20]линейныйдБ
AttackTime[0, 4]линейныйсекунды
ReleaseTime[0, 4]линейныйсекунды
MakeUpGain (доступный, когда вы устанавливаете MakeUpGainMode к 'Property')[–10, 24]линейныйдБ

Примеры

свернуть все

Используйте ограничение динамического диапазона, чтобы подавить объем громких звуков.

Настройте 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 объект. Используйте быстрый 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)

Алгоритмы

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

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

Ссылки

[1] Giannoulis, Димитриос, Михаэль Массберг и Джошуа Д. Рейсс. "Цифровой Проект Компрессора Динамического диапазона – Пример и Анализ". Журнал Общества звукоинженеров. Издание 60, Выпуск 6, 2012, стр 399–408.

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

Введенный в R2016a