компрессор

Компрессор динамического диапазона

Описание

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

Выполнять сжатие динамического диапазона:

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

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

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Синтаксис

dRC = compressor
dRC = compressor(thresholdValue)
dRC = compressor(thresholdValue,ratioValue)
dRC = compressor(___,Name,Value)

Описание

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 Используя Системные объекты (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 дБ.

  • Свойство Усиление состава установлено в значение, заданное в свойстве MakeUpGain.

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

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

Усиление состава в дБ, заданном как действительный скаляр.

Make-up gain компенсирует усиление, потерянное во время сжатия. Это применяется при выводе компрессора динамического диапазона.

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

Зависимости

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

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

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

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

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

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

Для версий ранее, чем R2016b, используйте функцию step, чтобы запустить алгоритм Системного объекта. Аргументы к step являются объектом, который вы создали, сопровождаемый аргументами, показанными в этом разделе.

Например, y = step(obj,x) и y = obj(x) выполняют эквивалентные операции.

Синтаксис

audioOut = dRC(audioIn)
[audioOut,gain] = dRC(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]линейныйдБ
Ratio[1, 50]линейный'none'
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);

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

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

Визуализируйте статическую характеристику сжатия.

visualize(dRC)

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

scope = dsp.TimeScope( ...
    'SampleRate',fileReader.SampleRate, ...
    '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 = dsp.TimeScope( ...
    'SampleRate',osc.SampleRate, ...
    'TimeSpan',2, ...
    'BufferLength',osc.SampleRate*4, ...
    'YLimits',[-1 1], ...
    'TimeSpanOverrunAction','Scroll', ...
    'ShowGrid',true, ...
    'LayoutDimensions',[2 1], ...
    'NumInputPorts',2, ...
    'Title', ...
    'Original Signal vs. Limited Signal (top) and Compressed Signal (bottom)');

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

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')
for i = 1:numFrames
    x = fileReader();
    deviceWriter(x);
end
reset(fileReader);

fprintf('Now playing limited signal...\n')
for i = 1:numFrames
    x = fileReader();
    xLimited = dRL(x);
    deviceWriter(xLimited);
end
reset(fileReader);

fprintf('Now playing compressed signal...\n')
for i = 1:numFrames
    x = fileReader();
    xCompressed = dRC(x);
    deviceWriter(xCompressed);
end
    
release(fileReader)
release(deviceWriter)
release(dRC)
release(dRL)

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

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

fileReader   = dsp.AudioFileReader( ...
    fullfile(matlabroot,'examples','audio','Plosives.wav'));
deviceWriter = audioDeviceWriter;

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

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

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

crossFilt = crossoverFilter( ...
    '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 = dsp.TimeScope( ...
    'SampleRate',fileReader.SampleRate, ...
    'TimeSpan',3, ...
    'BufferLength',fileReader.SampleRate*3*2, ...
    'YLimits',[-1 1], ...
    'ShowGrid',true, ...
    'ShowLegend',true, ...
    'ChannelNames',{'Original','Processed'});

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

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

  2. Примените highpass, фильтрующий использование вашего фильтра biquad.

  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(scope)
release(crossFilt)
release(dRCompressor)

Создайте dsp.AudioFileReader, чтобы читать в покадровом аудио. Создайте audioDeviceWriter, чтобы записать аудио в вашу звуковую карту. Создайте compressor, чтобы обработать аудиоданные. Вызовите visualize, чтобы построить статическую характеристику compressor. Создайте dsp.TimeScope, чтобы визуализировать исходное и обработанное аудио.

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

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

scope = dsp.TimeScope( ...
    'SampleRate',fileReader.SampleRate, ...
    '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)

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

  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

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

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

Алгоритмы

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

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

Ссылки

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

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

Смотрите также

Блоки

Системные объекты

Введенный в R2016a