expander

Динамическая область значений расширитель

Описание

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

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

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

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

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

Создание

Описание

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

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

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

пример

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

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

Свойства

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

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

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

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

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

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

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

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

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

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

Принимая характеристику жесткого колена и установившийся вход, такой что x [n] дБ < thresholdValue, коэффициент расширения задан как R=(y[n]T)(x[n]T) .

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

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

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

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

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

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

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

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

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

y=x+(1R)×(xTW2)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

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

Hold time - период, в течение которого (отрицательный) коэффициент усиления удерживается перед началом уменьшения к своему установившемуся значению, когда входной уровень падает ниже порога.

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

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

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

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

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

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

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

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

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

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

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

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

Описание

пример

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

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

СвойствоОбласть значенийОтображениеМодуль
Threshold[–140, 0]линейныйdB
Ratio[1, 50]линейныйничего
KneeWidth[0, 20]линейныйdB
AttackTime[0, 4]линейныйсекунды
ReleaseTime[0, 4]линейныйсекунды
HoldTime[0, 4]линейныйсекунды

Примеры

свернуть все

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

Настройте dsp.AudioFileReader и audioDeviceWriter Системные объекты.

frameLength = 1024;
fileReader = dsp.AudioFileReader( ...
    'Filename','Counting-16-44p1-mono-15secs.wav', ...
    'SamplesPerFrame',frameLength);
deviceWriter = audioDeviceWriter( ...
    'SampleRate',fileReader.SampleRate);

Портируйте аудиосигнал с Гауссовым шумом. Воспроизведение аудио.

while ~isDone(fileReader)
    x = fileReader();
    xCorrupted = x + (1e-2/4)*randn(frameLength,1);
    deviceWriter(xCorrupted);
end

release(fileReader)

Установите расширитель с порогом -40 дБ, отношением 10, временем атаки 0,01 секунды, временем релиза 0,02 секунды и временем удержания 0 секунд. Используйте частоту дискретизации устройства чтения аудио файла.

dRE = expander(-40,10, ...
    'AttackTime',0.01, ...
    'ReleaseTime',0.02, ...
    'HoldTime',0, ...
    'SampleRate',fileReader.SampleRate);

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

scope = timescope( ...
    'SampleRate',fileReader.SampleRate, ...
    'TimeSpanOverrunAction','Scroll', ...
    'TimeSpanSource','property','TimeSpan',16, ...
    'BufferLength',1.5e6, ...
    'YLimits',[-1 1], ...
    'ShowGrid',true, ...
    'ShowLegend',true, ...
    'Title','Corrupted vs. Expanded Audio');

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

while ~isDone(fileReader)
    x = fileReader();
    xCorrupted = x + (1e-2/4)*randn(frameLength,1);
    y = dRE(xCorrupted);
    deviceWriter(y);
    scope([xCorrupted,y])
end

release(fileReader)
release(dRE)
release(deviceWriter)
release(scope)

Деэссинг - это процесс уменьшения одноуровневых звуков в аудиосигнале. Sibilance относится к звукам s, z и sh в речи, которые могут быть непропорционально подчеркнуты во время записи. es звуки попадают под категорию негласной речи со всеми согласными и имеют более высокую частоту, чем звонкая речь. В этом примере вы применяете деэссинг разделенного диапазона к речевому сигналу путем разделения сигнала на высокие и низкие частоты, применения расширителя для уменьшения одноуровневых частот и последующего ремиксирования каналов.

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

fileReader = dsp.AudioFileReader( ...
    'Sibilance.wav');
deviceWriter = audioDeviceWriter;

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

release(deviceWriter)
release(fileReader)

Создайте expander Системный объект для деэскалации аудиосигнала. Установите частоту дискретизации расширителя равную частоте дискретизации аудио файл. Создайте двухдиапазонный перекрестный фильтр с кроссовером 3000 Гц. Sibilance обычно встречается в этой области значений. Установите уклон кроссовера равным 12. Постройте график частотной характеристики перекрестного фильтра, чтобы подтвердить ваш проект визуально.

dRExpander = expander( ...
    'Threshold',-50, ...
    'AttackTime',0.05, ...
    'ReleaseTime',0.05, ...
    'HoldTime',0.005, ...
    'SampleRate',fileReader.SampleRate);

crossFilt = crossoverFilter( ...
    'NumCrossovers',1, ...
    'CrossoverFrequencies',3000, ...
    'CrossoverSlopes',12);
visualize(crossFilt)

Создайте timescope объект для визуализации исходных и обработанных аудиосигналов.

scope = timescope( ...
    'SampleRate',fileReader.SampleRate, ...
    'TimeSpanOverrunAction','Scroll', ...
    'TimeSpanSource','Property','TimeSpan',4, ...
    'BufferLength',fileReader.SampleRate*8, ...
    'YLimits',[-1 1], ...
    'ShowGrid',true, ...
    'ShowLegend',true, ...
    'ChannelNames',{'Original','Processed'});

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

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

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

  3. Примените динамическое расширение области значений к верхней полосе.

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

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

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

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

while ~isDone(fileReader)
    audioIn = fileReader();
    
    [band1,band2] = crossFilt(audioIn);
    
    band2processed = dRExpander(band2);
    
    procAudio  = band1 + band2processed;
    
    deviceWriter(procAudio);
    
    scope([audioIn procAudio]);
end

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

release(crossFilt)
release(dRExpander)

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

frameLength = 1024;
fileReader = dsp.AudioFileReader('Counting-16-44p1-mono-15secs.wav', ...
    'SamplesPerFrame',frameLength);
deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate);

dRE = expander(-40,10, ...
    'AttackTime',0.01, ...
    'ReleaseTime',0.02, ...
    'HoldTime',0, ...
    'SampleRate',fileReader.SampleRate);
visualize(dRE)

Создайте 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. Processed Audio (top) and Applied Gain in dB (bottom)');
scope.ActiveDisplay = 2;
scope.YLimits = [-300,0];
scope.YLabel = 'Gain (dB)';

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

parameterTuner(dRE)

Figure Audio Parameter Tuner: expander [dRE] contains an object of type uigridlayout.

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

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

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

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

  4. Визуализация исходного и обработанного аудио, и примененный коэффициент усиления.

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

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

Figure Audio Parameter Tuner: expander [dRE] contains an object of type uigridlayout.

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

release(deviceWriter)
release(fileReader)
release(dRE)
release(scope)

Используйте вход EnableSidechain expander объект для эмуляции электронного контроллера барабана, также известного как мультипад. Этот метод распространён в звукозаписи студийного производства и создает интересные изменения в тембре инструмента. Боковой сигнал управляет расширением входного сигнала. Расширение Sidechain уменьшает амплитуду входного сигнала, когда сигнал Sidechain падает ниже Порога expander.

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

Преобразуйте боковой сигнал из стерео в моно.

[expanderSideChainStereo,Fs] = audioread('FunkyDrums-44p1-stereo-25secs.mp3');
expanderSideChainMono = (expanderSideChainStereo(:,1) + expanderSideChainStereo(:,2)) / 2;

Запишите преобразованный боковой сигнал в файл.

audiowrite('convertedSidechainSig.wav',expanderSideChainMono,Fs);

Создание аудио Объектов

Создайте dsp.AudioFileReader объект для входа и боковых сигналов. Чтобы позволить скрипту запускаться бессрочно, измените playbackCount переменная от 1 на Inf.

inputAudio = 'SoftGuitar-44p1_mono-10mins.ogg';
sidechainAudio  = 'convertedSidechainSig.wav';
playbackCount = 1;
inputAudioAFR = dsp.AudioFileReader(inputAudio,'PlayCount',playbackCount);
sidechainAudioAFR = dsp.AudioFileReader(sidechainAudio,'PlayCount',playbackCount);

Построение и визуализация expander объект. Используйте высокий Коэффициент, мягкую Ширину Колена, быстрый AttackTime и ReleaseTime, и короткий HoldTime.

dRE = expander('EnableSidechain',true,'Threshold',-20,'Ratio',6.5,...
    'KneeWidth',20,'AttackTime',0.84,'ReleaseTime',0.001,'HoldTime',0.0001);
visualize(dRE)

Создайте audioDeviceWriter объект для воспроизведения боковых и входных сигналов.

afw = audioDeviceWriter;

Создайте timescope объект для просмотра входного сигнала, бокового сигнала, а также расширенного входного сигнала.

scope = timescope('NumInputPorts',3,...
                      'SampleRate',Fs,...
                      'TimeSpanSource','property',...
                      'TimeSpan',5,...
                       'TimeDisplayOffset',0,...
                      'LayoutDimensions',[3 1],...
                      'BufferLength',Fs*15,...
                      'TimeSpanOverrunAction','Scroll',...
                      'YLimits',[-1 1],...
                      'ShowGrid',true,...
                      'Title','Input Audio - Classical Guitar');
scope.ActiveDisplay = 2;
scope.YLimits = [-1 1];
scope.Title = 'Sidechain Audio - Drums';
scope.ShowGrid = true;
scope.ActiveDisplay = 3;
scope.YLimits = [-1 1];
scope.ShowGrid = true;
scope.Title = 'Expanded Input Audio - Classical Guitar';

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

parameterTuner(dRE)

Figure Audio Parameter Tuner: expander [dRE] contains an object of type uigridlayout.

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

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

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

Замените различные аудио файлов для вашего inputAudio переменная, чтобы создать различные текстуры и тембры в смеси барабанов.

while ~isDone(sidechainAudioAFR)
   inputAudioFrame = inputAudioAFR();
   sideChainAudioFrame = sidechainAudioAFR();
   expanderOutput  = dRE(inputAudioFrame,sideChainAudioFrame);
   afw(sideChainAudioFrame+expanderOutput); 
   scope(inputAudioFrame,sideChainAudioFrame,expanderOutput);
   drawnow limitrate;   % required to update parameter settings from UI
end

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

release(inputAudioAFR)
release(sidechainAudioAFR)
release(dRE)
release(afw)
release(scope)

Алгоритмы

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

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

Ссылки

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

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

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