exponenta event banner

компрессор

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

Описание

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

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

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

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

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

Создание

Описание

dRC = compressor создает объект System, 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) создает объект System, dRCс временем атаки 10 мс, работающим с частотой дискретизации 16 кГц.

Свойства

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

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

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

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

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

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

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

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

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

Степень сжатия - это отношение вход/выход для сигналов, которые превышают порог работы.

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

  • R - степень сжатия.

  • x [n] - входной сигнал в дБ.

  • y [n] - выходной сигнал в дБ.

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

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

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

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

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

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

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

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

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

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

  • R - степень сжатия.

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

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

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

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

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

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

Создать 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 изобретение позволяет реализовать конструкцию фильтра верхних частот. Создайте перекрестный фильтр с одним перекрестным фильтром на частоте 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. Примените фильтрацию верхних частот с помощью биквад-фильтра.

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

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)

Алгоритмы

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

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

Ссылки

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

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

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