Ограничитель динамической области значений
The limiter
Система object™ выполняет динамическую область значений стенок кирпича, ограничивая независимо по каждому входному каналу. Ограничение динамической области значений подавляет громкость громких звуков, которые пересекают заданный порог. Он использует заданные время атаки и релизы, чтобы достичь плавной приложенной кривой усиления. Свойства limiter
Системный объект задает тип ограничения динамической области значений.
Для выполнения ограничения динамической области значений:
Создайте limiter
Объекту и установите его свойства.
Вызывайте объект с аргументами, как будто это функция.
Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».
dRL = limiter
создает Системный объект, dRL
осуществляют динамическую область значений кирпичных стенок, ограничивающий независимо по каждому входному каналу.
dRL = limiter(
устанавливает свойство Threshold на thresholdValue
)thresholdValue
.
dRL = limiter(___,
устанавливает каждое свойство Name,Value
)Name
к заданной Value
. Неопределенные свойства имеют значения по умолчанию.
dRL = limiter('AttackTime',0.01,'SampleRate',16000)
создает Системный объект, dRL
, со временем атаки 10 мс и частотой дискретизации 16 кГц.Если не указано иное, свойства являются нетронутыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируются, когда вы вызываете их, и release
функция разблокирует их.
Если свойство настраивается, можно изменить его значение в любой момент.
Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.
Threshold
- Эксплуатационный порог (дБ)–10
(по умолчанию) | действительный скалярОперационный порог в дБ, заданный как действительный скаляр.
Operation threshold - уровень, выше которого коэффициент усиления прикладывается к входному сигналу.
Настраиваемый: Да
Типы данных: single
| double
KneeWidth
- Ширина колена (дБ)0
(по умолчанию) | действительный скалярШирина колена в дБ, заданная как действительный скаляр, больший или равный 0.
Knee width - переходная область в характеристике ограничителя.
Для характеристик мягкого колена переходная область определяется отношением
для области значений .
y - уровень выхода в дБ.
x - уровень входа в дБ.
T - порог в дБ.
W - ширина колена в дБ.
Настраиваемый: Да
Типы данных: single
| double
AttackTime
- Время (ы) атаки0
(по умолчанию) | действительный скалярВремя атаки в секундах, заданное как действительный скаляр, больший или равный 0.
Attack time время, когда коэффициент усиления ограничителя увеличивается с 10% до 90% от его конечного значения, когда вход переходит выше порога.
Настраиваемый: Да
Типы данных: single
| double
ReleaseTime
- Время (ы) выпуска0.2
(по умолчанию) | действительный скалярВремя релиза в секундах, заданное как действительный скаляр, больший или равный 0.
Release time время, когда коэффициент усиления ограничителя падает с 90% до 10% от его конечного значения, когда вход идет ниже порога.
Настраиваемый: Да
Типы данных: single
| double
MakeUpGainMode
- Режим усиления подпитки'Property'
(по умолчанию) | 'Auto'
Режим усиления подпитки, заданный как 'Auto'
или 'Property'
.
'Auto'
- Усиление подпитки прикладывается к выходу ограничителя динамической области значений таким образом, что установившийся вход 0 дБ имеет выход 0 дБ.
'Property'
- Коэффициент усиления устанавливается на значение, заданное в свойстве MakeUpGain.
Настраиваемый: Нет
Типы данных: char
| string
MakeUpGain
- Коэффициент усиления подпитки (дБ)0
(по умолчанию) | действительный скалярКоэффициент усиления в дБ, заданный как действительный скаляр.
Make-up gain компенсирует коэффициент усиления, потерянный во время ограничения. Оно применяется на выходе ограничителя динамической области значений.
Настраиваемый: Да
Чтобы включить это свойство, установите MakeUpGainMode на 'Property'
.
Типы данных: single
| double
SampleRate
- Входная частота выборки (Гц)44100
(по умолчанию) | положительная скалярная величинаВход скорость выборки в Гц, заданная как положительная скалярная величина.
Настраиваемый: Да
Типы данных: single
| double
EnableSidechain
- Включите вход боковой цепиfalse
(по умолчанию) | true
Включите вход боковой цепи, заданный как true
или false
. Это свойство определяет количество доступных входов на limiter
объект.
Тип данных sidechain и (система координат) должны быть такими же, как и audioIn
.
Количество каналов входного сигнала боковой цепи должно быть равно количеству каналов audioIn
или равен единице. Когда количество боковых каналов равно единице, gain
Вычисленный на основе этого канала применяется ко всем каналам audioIn
. Когда количество боковых каналов равно количеству каналов в audioIn
, а gain
Вычисленный для каждого бокового канала применяется к соответствующему каналу audioIn
.
Настраиваемый: Нет
audioIn
- Аудио вход в ограничительАудио вход ограничителя, заданный как матрица. Столбцы матрицы рассматриваются как независимые аудиоканалы.
Типы данных: single
| double
audioOut
- Аудиовыход от ограничителяАудио выхода от ограничителя, возвращенный как матрица того же размера, как audioIn
.
Типы данных: single
| double
gain
- Коэффициент усиления, приложенный ограничителем (дБ)Усиление, приложенное ограничителем, возвращается как матрица того же размера, как audioIn
.
Типы данных: single
| double
Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем obj
, используйте следующий синтаксис:
release(obj)
limiter
visualize | Визуализируйте статическую характеристику контроллера динамической области значений |
createAudioPluginClass | Создайте класс аудиоплагина, который реализует функциональность Системного объекта |
parameterTuner | Настройка параметров объекта во время потоковой передачи |
configureMIDI | Сконфигурируйте соединения MIDI между аудио объекта и MIDI контроллера |
disconnectMIDI | Отсоедините элементы управления MIDI от аудио объекта |
getMIDIConnections | Получите MIDI-соединения аудио объекта |
createAudioPluginClass
и configureMIDI
функции сопоставляют настраиваемые свойства limiter
Системный объект по пользовательским параметрам:
Свойство | Область значений | Отображение | Модуль |
---|---|---|---|
Threshold | [–50, 0] | линейный | dB |
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);
Настройте limiter
иметь порог -15 дБ, время атаки 0,005 секунд и время релиза 0,1 секунды. Установите коэффициент усиления 0 дБ (по умолчанию). Чтобы задать это значение, установите режим усиления макияжа равным 'Property'
но не указывайте MakeUpGain
свойство. Используйте частоту дискретизации устройства чтения аудио файла.
dRL = limiter(-15, ... 'AttackTime',0.005, ... 'ReleaseTime',0.1, ... 'MakeUpGainMode','Property', ... 'SampleRate',fileReader.SampleRate);
Установите временные возможности, чтобы визуализировать исходный сигнал и ограниченный сигнал.
scope = timescope( ... 'SampleRate',fileReader.SampleRate, ... 'TimeSpanOverrunAction','Scroll', ... 'TimeSpanSource','property',... 'TimeSpan',1, ... 'BufferLength',44100*4, ... 'YLimits',[-1 1], ... 'ShowGrid',true, ... 'LayoutDimensions',[2,1], ... 'NumInputPorts',2, ... 'ShowLegend',true, ... 'Title',['Original vs. Limited Audio (top)' ... ' and Limiter Gain in dB (bottom)']);
Воспроизведение обработанного аудио и визуализация его на возможностях.
while ~isDone(fileReader) x = fileReader(); [y,g] = dRL(x); deviceWriter(y); x1 = x(:,1); y1 = y(:,1); g1 = g(:,1); scope([x1,y1],g1); end release(fileReader) release(dRL) 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)
Создайте dsp.AudioFileReader
для чтения в аудиокадре за кадром. Создайте audioDeviceWriter
чтобы записать аудио на звуковую карту. Создайте limiter
для обработки аудио данных.
frameLength = 1024; fileReader = dsp.AudioFileReader('RockDrums-44p1-stereo-11secs.mp3', ... 'SamplesPerFrame',frameLength); deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate); dRL = limiter('SampleRate',fileReader.SampleRate);
Функции parameterTuner
чтобы открыть пользовательский интерфейс для настройки параметров ограничителя во время потоковой передачи.
parameterTuner(dRL)
В цикле аудиопотока:
Чтение в системе координат аудио из файла.
Примените ограничение динамической области значений.
Запишите систему координат аудио в своё аудио устройство для прослушивания.
Во время потоковой передачи настройте параметры ограничителя динамической области значений и прослушайте эффект.
while ~isDone(fileReader) audioIn = fileReader(); audioOut = dRL(audioIn); deviceWriter(audioOut); drawnow limitrate % required to update parameter end
Как лучшая практика, отпустите объекты после выполнения.
release(deviceWriter) release(fileReader) release(dRL)
Используйте вход EnableSidechain limiter
объект для ограничения уровня амплитуды отдельного аудиосигнала. Боковой сигнал управляет ограничением динамической области значений входного аудиосигнала. Когда боковой сигнал превышает ограничитель Threshold, ограничитель активирует и ограничивает амплитуду входного сигнала. Когда уровень бокового сигнала падает ниже порога, звуковой вход возвращается к своей исходной амплитуде. Для подробного сравнения сжатия и ограничения динамической области значений смотрите Сравнение Ограничителя Динамической Области значений и Компрессора.
Подготовка аудио Файлов
В этом разделе вы повторно отобразите и обнулите речевой файл для использования в качестве входов в EnableSidechain
свойство вашего limiter
объект.
Считывайте аудиосигнал. Повторно отобразите его, чтобы соответствовать частоте дискретизации входа аудиосигнала (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)]);
Создайте limiter
объект. Используйте быстрый AttackTime, и умеренно медленный ReleaseTime. Эти настройки идеально подходят для работы с голосовой связью. Быстрое время атаки гарантирует, что входной аудио ограничивается почти сразу после того, как боковой сигнал превышает порог ограничителя. Медленный релиз время гарантирует, что ограничение на вход аудио длится через любые потенциальные короткие тихие области в боковом сигнале.
iAmYourLimiter = limiter('EnableSidechain',true,... 'SampleRate',targetFs,... 'Threshold',-48,... 'AttackTime',0.01,... 'ReleaseTime',1.75);
Создайте 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','Original 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 = 'Dynamic Range Limited Input Audio - Guitar';
Создайте аудиопотоковый цикл
Считывайте в систему координат аудио от ваших входов и боковых сигналов. Обработка входных и боковых сигналов с помощью limiter
объект. Воспроизведите обработанные аудиосигналы и отображение аудиосигналы данных используя timescope
объект.
Верхняя панель вашего timescope
отображает необработанный входной аудиосигнал, а средняя панель отображает боковой аудиосигнал. На нижней панели отображается ограниченный входной аудиосигнал. Обратите внимание, что амплитуды сигналов в верхней и нижней панелях идентичны, пока не начнется сигнал боковой связи. Когда сигнал боковой цепи активизируется, амплитуда в нижней панели уменьшается. Когда сигнал боковой связи заканчивается, амплитуда нижней панели возвращается к своему исходному уровню.
while ~isDone(inputAudioAFR) inputAudioFrame = inputAudioAFR(); sideChainAudioFrame = sidechainAudioAFR(); limiterOutput = iAmYourLimiter(inputAudioFrame,sideChainAudioFrame); afw(sideChainAudioFrame+limiterOutput); scope(inputAudioFrame,sideChainAudioFrame,limiterOutput); end
Отпустите ваши объекты.
release(inputAudioAFR) release(sidechainAudioAFR) release(iAmYourLimiter) release(afw) release(scope)
The limiter
Системный объект обрабатывает систему координат за кадром и элемент за элементом.
Сигнал N- точка, x [n], преобразуется в децибелы:
x дБ [n] проходит через усилительный компьютер. Компьютер с усилением использует статические характеристические свойства ограничителя динамической области значений для кирпичного усиления, которое выше порога.
Если вы указали мягкое колено, усиливающий компьютер имеет следующую статическую характеристику:
где T - порог, а W - ширина колена.
Если вы указали жесткое колено, усиливающий компьютер имеет следующую статическую характеристику:
Вычисленный коэффициент усиления, g c [n], вычисляется как
g c [n] сглаживается с помощью заданных времени атаки и релиза:
Коэффициент времени атаки, α A , вычисляется как
Коэффициент времени освобождения, α R , вычисляется как
T A
является периодом атаки, заданным AttackTime свойство. T R
- период релиза, заданный
ReleaseTime
свойство. Fs - входная частота дискретизации, заданная SampleRate
свойство.
Если MakeUpGainMode
задано значение по умолчанию 'Auto'
коэффициент усиления вычисляется как отрицательное значение вычисленного коэффициента усиления для входа 0 дБ:
Учитывая установившийся вход 0 дБ, это строение достигает установившегося выхода 0 дБ. Коэффициент усиления определяется Threshold
и KneeWidth
свойства. Это не зависит от входного сигнала.
Коэффициент усиления подпитки, M, добавляется к сглаженному усилению, g с [n]:
Вычисленный коэффициент усиления в дБ, g м [n], переводится в линейную область:
Выход ограничителя динамической области значений дается как
[1] Джаннулис, Димитриос, Майкл Массберг и Джошуа Д. Рейсс. Digital Dynamic Range Compressor Design -- A Tutorial and Analysis (неопр.) (недоступное руководство). Журнал Общества Аудиотехники. Том 60, Выпуск 6, 2012, стр. 399-408.
Указания и ограничения по применению:
Системные объекты в генерации кода MATLAB (MATLAB Coder)
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.