exponenta event banner

расширитель

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

Описание

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

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

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

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

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

Создание

Описание

dRE = expander создает объект System, 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) создает объект System, dRE, с 0,01 секундным временем атаки и частотой дискретизации 16 кГц.

Свойства

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

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

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

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

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

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

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

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

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

Коэффициент расширения - это отношение вход/выход для сигналов, которые не соответствуют пороговому значению операции.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы использовать функцию объекта, укажите объект 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 функции отображают настраиваемые свойства 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)

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

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

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

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

release(deviceWriter)
release(fileReader)

Создание expander Системный объект отменяет звуковой сигнал. Установите частоту дискретизации расширителя на частоту дискретизации аудиофайла. Создайте двухполосный перекрестный фильтр с частотой перехода 3000 Гц. В этом диапазоне обычно встречается сибиланс. Задайте уклон пересечения равным 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 цель - эмулировать электронный контроллер барабана, также известный как многопад. Эта техника распространена в звукозаписывающей студии и создает интересные изменения в тембре инструмента. Сигнал боковой цепи управляет расширением входного сигнала. Расширение боковой цепи уменьшает амплитуду входного сигнала, когда сигнал боковой цепи падает ниже порога 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 объект. Используйте высокое отношение, мягкую KneyWidth, быстрое время ожидания и время восстановления и короткое время ожидания.

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)

Алгоритмы

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

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

Ссылки

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

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

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