compressor

Компрессор динамической области значений

Описание

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

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

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

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

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

Создание

Описание

dRC = compressor создает Системный объект, dRC, который выполняет динамическое сжатие области значений независимо по каждому входному каналу с течением времени.

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

dRC = compressor(thresholdValue,ratioValue) устанавливает свойство Ratio на ratioValue.

пример

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

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

Свойства

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

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

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

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

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

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

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

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

Степень сжатия, заданная как действительный скаляр, больший или равный 1.

Compression ratio является отношением вход/выход для сигналов, которые перерегулируют порог операции.

Принимая характеристику жесткого колена и установившийся вход, такой что x [n] дБ > Threshold, степень сжатия определяется как R=(x[n]T)(y[n]T).

  • R - коэффициент сжатия.

  • x [n] является входным сигналом в дБ.

  • y [n] является выходом сигналом в дБ.

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

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

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

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

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

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

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

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

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

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

  • R - коэффициент сжатия.

  • 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. Это свойство определяет количество доступных входов на compressor объект.

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

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

Тип данных sidechain и (система координат) должны быть такими же, как и audioIn.

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

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

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

Описание

пример

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

пример

[audioOut,gain] = dRC(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 функции сопоставляют настраиваемые свойства compressor Системный объект по пользовательским параметрам:

СвойствоОбласть значенийОтображениеМодуль
Threshold[–50, 0]линейныйdB
Ratio[1, 50]линейныйничего
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);

Установите компрессор, чтобы иметь порог -15 дБ, отношение 7 и ширину колена 5 дБ. Используйте частоту дискретизации устройства чтения аудио файла.

dRC = compressor(-15,7, ...
    'KneeWidth',5, ...
    'SampleRate',fileReader.SampleRate);

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

scope = timescope( ...
    'SampleRate',fileReader.SampleRate, ...
    'TimeSpanSource','Property','TimeSpan',1, ...
    'BufferLength',44100*4, ...
    'YLimits',[-1,1], ...
    'TimeSpanOverrunAction','Scroll', ...
    'ShowGrid',true, ...
    'LayoutDimensions',[2,1], ...
    'NumInputPorts',2, ...
    'Title', ...
    ['Original vs. Compressed Audio (top)' ...
    ' and Compressor Gain in dB (bottom)']);
scope.ActiveDisplay = 2;
scope.YLimits = [-4,0];
scope.YLabel = 'Gain (dB)';

Воспроизведение обработанного аудио и визуализация его на возможностях.

while ~isDone(fileReader)
    x = fileReader();
    [y,g] = dRC(x);
    deviceWriter(y);
    scope([x(:,1),y(:,1)],g(:,1))
end

release(dRC)
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)

Плозивы являются созвучными звуками, возникающими в результате внезапного релиза воздушного потока. Они наиболее выражены в словах, начинающихся со звуков p, d и g. Плозивы могут быть подчеркнуты процессом записи и часто неприятно слышны. В этом примере вы минимизируете plosives речевого сигнала, применяя высокочастотную фильтрацию и низкополосное сжатие.

Создайте dsp.AudioFileReader объект и audioDeviceWriter объект для считывания аудиосигнала из файла и записи аудиосигнала в устройство. Воспроизведите необработанный сигнал. Затем отпустите средство чтения файлов и средство записи.

fileReader = dsp.AudioFileReader('audioPlosives.wav');
deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate);

while ~isDone(fileReader)
    audioIn = fileReader();
    deviceWriter(audioIn);
end
release(deviceWriter)
release(fileReader)

Проектируйте высокочастотный фильтр с крутым сгибом всех частот ниже 120 Гц. Использование dsp.BiquadFilter объект для реализации создания фильтра highpass. Создайте перекрестный фильтр с одним кроссовером на частоте 250 Гц. Перекрестный фильтр позволяет вам разделить интересующие полосы для обработки. Создайте динамический компрессор области значений для сжатия динамической области значений взрывных звуков. Чтобы не применять усиление подпитки, установите MakeUpGainMode в "Property" и используйте 0 дБ по умолчанию MakeUpGain значение свойства. Создайте временные возможности, чтобы визуализировать обработанный и необработанный аудиосигнал.

[B,A] = designVarSlopeFilter(48,120/(fileReader.SampleRate/2),"hi");
biquadFilter = dsp.BiquadFilter( ...
    "SOSMatrixSource","Input port", ...
    "ScaleValuesInputPort",false);

crossFilt = crossoverFilter( ...
    "SampleRate",fileReader.SampleRate, ...
    "NumCrossovers",1, ...
    "CrossoverFrequencies",250, ...
    "CrossoverSlopes",48);

dRCompressor = compressor( ...
    "Threshold",-35, ...
    "Ratio",10, ...
    "KneeWidth",20, ...
    "AttackTime",1e-4, ...
    "ReleaseTime",3e-1, ...
    "MakeUpGainMode","Property", ...
    "SampleRate",fileReader.SampleRate);

scope = timescope( ...
    "SampleRate",fileReader.SampleRate, ...
    "TimeSpanSource","property","TimeSpan",3, ...
    "BufferLength",fileReader.SampleRate*3*2, ...
    "YLimits",[-1 1], ...
    "ShowGrid",true, ...
    "ShowLegend",true, ...
    "ChannelNames",{'Original','Processed'});

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

  1. Чтение в систему координат аудио файла.

  2. Применить фильтрацию highpass с помощью биквадного фильтра.

  3. Разделите аудиосигнал на две полосы.

  4. Примените динамическое сжатие области значений к нижней полосе.

  5. Ремикшируйте каналы.

  6. Запишите обработанный аудиосигнал в аудио устройство для прослушивания.

  7. Визуализируйте обработанные и необработанные сигналы во временных возможностях.

Как лучшая практика, отпустите объекты после выполнения.

while ~isDone(fileReader)
    audioIn = fileReader();
    audioIn = biquadFilter(audioIn,B,A);
    [band1,band2] = crossFilt(audioIn);
    band1compressed = dRCompressor(band1);
    audioOut = band1compressed + band2;
    deviceWriter(audioOut);
    scope([audioIn audioOut])
end

Как лучшая практика, отпустите объекты после выполнения.

release(deviceWriter)
release(fileReader)
release(crossFilt)
release(dRCompressor)
release(scope)

Создайте dsp.AudioFileReader для чтения в аудиокадре за кадром. Создайте audioDeviceWriter чтобы записать аудио на звуковую карту. Создайте compressor для обработки аудио данных. Функции visualize для построения графика статической характеристики compressor.

frameLength = 1024;
fileReader = dsp.AudioFileReader('RockDrums-44p1-stereo-11secs.mp3', ...
    'SamplesPerFrame',frameLength);
deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate);

dRC = compressor('SampleRate',fileReader.SampleRate); 
visualize(dRC)

Создайте timescope визуализация оригинального и обработанного аудио.

scope = timescope( ...
    'SampleRate',fileReader.SampleRate, ...
    'TimeSpanSource','property',...
    'TimeSpan',1, ...
    'BufferLength',fileReader.SampleRate*4, ...
    'YLimits',[-1,1], ...
    'TimeSpanOverrunAction','Scroll', ...
    'ShowGrid',true, ...
    'LayoutDimensions',[2,1], ...
    'NumInputPorts',2, ...
    'Title','Original vs. Compressed Audio (top) and Compressor Gain in dB (bottom)');
scope.ActiveDisplay = 2;
scope.YLimits = [-4,0];
scope.YLabel = 'Gain (dB)';

Функции parameterTuner чтобы открыть пользовательский интерфейс для настройки параметров компрессора во время потоковой передачи.

parameterTuner(dRC)

Figure Audio Parameter Tuner: compressor [dRC] contains an object of type uigridlayout.

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

  1. Чтение в системе координат аудио из файла.

  2. Применить сжатие динамической области значений.

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

  4. Визуализация исходного аудио, обработанного аудио и приложенного усиления.

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

while ~isDone(fileReader)
    audioIn = fileReader();
    [audioOut,g] = dRC(audioIn);
    deviceWriter(audioOut);
    scope([audioIn(:,1),audioOut(:,1)],g(:,1));
    drawnow limitrate % required to update parameter
end

Figure Audio Parameter Tuner: compressor [dRC] contains an object of type uigridlayout.

Как лучшая практика, отпустите объекты после выполнения.

release(deviceWriter)
release(fileReader)
release(dRC)
release(scope)

Используйте вход EnableSidechain compressor объект для уменьшения уровня амплитуды отдельного аудиосигнала. Боковой сигнал управляет сжатием на вход аудиосигнале. Когда боковой сигнал превышает порог компрессора, компрессор активирует и уменьшает амплитуду входного сигнала. Когда уровень бокового сигнала падает ниже порога, звуковой вход возвращается к своей несжатой амплитуде.

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

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

Считывайте аудиосигнал. Повторно отобразите его, чтобы соответствовать частоте дискретизации входа аудиосигнала (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)]);

Создайте compressor объект. Используйте высокий Коэффициент, быстрый AttackTime и умеренно медленный ReleaseTime. Эти настройки идеально подходят для работы с голосовой связью. Быстрое время атаки гарантирует, что входной аудио сжимается почти сразу после того, как боковой сигнал превышает порог компрессора . Медленный релиз время гарантирует, что сжатие на вход аудио длится через любые потенциальные короткие тихие области в боковом сигнале.

iAmYourCompressor = compressor('EnableSidechain',true,...
               'SampleRate',targetFs,...
               'Threshold',-40,...
               'Ratio',8,...
               'AttackTime',0.01,...
               'ReleaseTime',1.5);

Создайте 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','Uncompressed 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 = 'Compressed Input Audio - Guitar';

Создайте аудиопотоковый цикл

Считывайте в систему координат аудио от ваших входов и боковых сигналов. Обработка входных и боковых сигналов с помощью compressor объект. Воспроизведите обработанные аудиосигналы и отображение аудиосигналы данных используя timescope объект.

Верхняя панель вашего timescope отображает несжатый входной аудиосигнал, а средняя панель отображает боковой аудиосигнал. На нижней панели отображается сжатый входной аудиосигнал. Обратите внимание, что амплитуды сигналов в верхней и нижней панелях идентичны, пока не начнется сигнал боковой связи. Когда боковой сигнал активизируется, амплитуда сигнала в нижней панели сжимается. Когда сигнал боковой связи заканчивается, амплитуда сигнала в нижней панели начинает возвращаться к своему несжатому уровню.

while ~isDone(inputAudioAFR)
   inputAudioFrame = inputAudioAFR();
   sideChainAudioFrame = sidechainAudioAFR();
   compressorOutput  = iAmYourCompressor(inputAudioFrame,sideChainAudioFrame);
   afw(sideChainAudioFrame+compressorOutput); 
   scope(inputAudioFrame,sideChainAudioFrame,compressorOutput);
end

Отпустите ваши объекты.

release(inputAudioAFR)
release(sidechainAudioAFR)
release(iAmYourCompressor)
release(afw)
release(scope)

Алгоритмы

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

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

Ссылки

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

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

.
Введенный в R2016a
Для просмотра документации необходимо авторизоваться на сайте