crossoverFilter

Фильтр аудио-кроссовера

Описание

The crossoverFilter Система object™ реализует фильтр аудио-кроссовера, который используется для разделения аудиосигнала на два или более диапазона частот. Перекрестные фильтры являются многополосными фильтрами, общая величина частотной характеристики которых плоская.

Для реализации фильтра аудио-кроссовера:

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

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

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

Создание

Описание

crossFilt = crossoverFilter создает Системный объект, crossFilt, который реализует фильтр аудио-кроссовера.

crossFilt = crossoverFilter(nCrossovers) устанавливает свойство NumCrossovers на nCrossovers.

crossFilt = crossoverFilter(nCrossovers,xFrequencies) устанавливает свойство CrossoverFrequencies в xFrequencies.

crossFilt = crossoverFilter(nCrossovers,xFrequencies,xSlopes) устанавливает свойство CrossoverSlopes на xSlopes.

crossFilt = crossoverFilter(nCrossovers,xFrequencies,xSlopes,Fs) устанавливает свойство SampleRate на Fs.

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

Пример: crossFilt = crossoverFilter(2,'CrossoverFrequencies',[100,800],'CrossoverSlopes',[6,48]) создает Системный объект, crossFilt, с двумя кроссоверами, расположенными на частотах 100 Гц и 800 Гц, и наклонами кроссоверов 6 дБ/октава и 48 дБ/октава соответственно.

Свойства

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

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

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

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

Количество пересечений полосы отклика величины, заданное в виде скалярного целого числа в области значений от 1 до 4.

Количество полос, выводимых при реализации перекрестной фильтрации, на один больше, чем NumCrossovers значение.

Количество пересечений полосы отклика величиныКоличество выходных полос
1двухдиапазонный
2трехдиапазонный
3четырехполосный диапазон
4пятиполосный диапазон

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

Crossover frequencies являются пересечениями величины отклика полос двухдиапазонных перекрестных фильтров индивидуумов используемых в многодиапазонном перекрестном фильтре.

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

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

Склоны кроссовера в дБ/октаве, заданные как скаляр или вектор действительных значений в области значений [6:6:48]. Если заданный перекрестный уклон не находится внутри области значений, то наклон округлится до ближайшего допустимого значения.

  • Если CrossoverSlopes является скаляром, все двухполосные перекрестные склоны компонентов берут это значение.

  • Если CrossoverSlopes является вектором длины NumCrossovers, соответствующие двухполосные кросс-наклоны компонентов берут эти значения.

Crossover slopes являются наклонами отдельных полос на связанной частоте среза, как задано в двухполосном кроссе компонентов.

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

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

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

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

Описание

пример

[band1,...,bandN] = crossFilt(audioIn) применяет перекрестный фильтр на входе, audioIn, и возвращает отфильтрованные выходные полосы, [band1,...,bandN], где N = NumCrossovers + 1.

Входные параметры

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

Аудио вход в перекрестный фильтр, заданный как матрица. Столбцы матрицы рассматриваются как независимые аудиоканалы.

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

Выходные аргументы

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

Аудио полосы, выводимые из перекрестного фильтра, возвращаются как набор N полосы. Свойство NumCrossovers определяет количество возвращаемых аргументов: N = NumCrossovers + 1. Размер каждого выходного аргумента совпадает с размером audioIn.

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

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

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

release(obj)

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

visualizeВизуализируйте величину ответ перекрестного фильтра
costОценка стоимости реализации аудио Системных объектов
createAudioPluginClassСоздайте класс аудиоплагина, который реализует функциональность Системного объекта
parameterTunerНастройка параметров объекта во время потоковой передачи
configureMIDIСконфигурируйте соединения MIDI между аудио объекта и MIDI контроллера
disconnectMIDIОтсоедините элементы управления MIDI от аудио объекта
getMIDIConnectionsПолучите MIDI-соединения аудио объекта
cloneСоздайте повторяющийся системный объект
isLockedОпределите, используется ли системный объект
releaseОтпустите ресурсы и допустите изменения в значениях свойств системного объекта и входных характеристиках
resetСброс внутренних состояний Системного объекта
stepЗапуск алгоритма системного объекта

createAudioPluginClass и configureMIDI функции сопоставляют настраиваемые свойства crossoverFilter Системный объект по пользовательским параметрам:

СвойствоОбласть значенийОтображениеМодуль
CrossoverFrequencies[20, 20000]линейныйHz
CrossoverSlopes[6, 48]линейныйдБ/октава

Примеры

свернуть все

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

Создайте 5-секундный сигнал шума, который принимает частоту дискретизации 24 кГц.

fs = 24e3;
noise = randn(fs*5,1);

Создайте crossoverFilter объект с 2 кроссоверами (3 полосы), частотами среза на 4 кГц и 8 кГц, наклоном 48 дБ/октава и частотой дискретизации 24 кГц.

crossFilt = crossoverFilter( ...
    'NumCrossovers',2, ...
    'CrossoverFrequencies',[4000,8000], ...
    'CrossoverSlopes',48, ...
    'SampleRate',fs);

Визуализируйте величину ответ объекта перекрестного фильтра.

visualize(crossFilt)

Вызовите перекрестный фильтр как функцию с сигналом шума в качестве аргумента.

[y1,y2,y3] = crossFilt(noise);

Визуализируйте результаты с помощью спектрограммы.

figure('Position',[100,100,800,700])

subplot(4,1,1)
spectrogram(noise,120,100,6000,fs,'yaxis')
title('Noise')

subplot(4,1,2)
spectrogram(y1,120,100,6000,fs,'yaxis')
title('y1')

subplot(4,1,3)
spectrogram(y2,120,100,6000,fs,'yaxis')
title('y2')

subplot(4,1,4)
spectrogram(y3,120,100,6000,fs,'yaxis')
title('y3')

Figure contains 4 axes. Axes 1 with title Noise contains an object of type image. Axes 2 with title y1 contains an object of type image. Axes 3 with title y2 contains an object of type image. Axes 4 with title y3 contains an object of type image.

Используйте crossoverFilter объект для разделения аудиосигнала на три полосы частот.

Создайте dsp.AudioFileReader и audioDeviceWriter объекты. Используйте частоту дискретизации считывающего устройства в качестве частоты дискретизации средства записи.

samplesPerFrame = 256;

fileReader = dsp.AudioFileReader( ...
    'RockGuitar-16-44p1-stereo-72secs.wav', ...
    'SamplesPerFrame',samplesPerFrame);
deviceWriter = audioDeviceWriter( ...
    'SampleRate',fileReader.SampleRate);

Создайте crossoverFilter объект с 2 кроссоверами (3 полосы), частотами среза на 500 Гц и 1 кГц и наклоном 18 дБ/октава. Используйте частоту дискретизации считывателя как частоту дискретизации перекрестного фильтра.

crossFilt = crossoverFilter( ...
    'NumCrossovers',2, ...
    'CrossoverFrequencies',[500,1000], ...
    'CrossoverSlopes',18, ...
    'SampleRate',fileReader.SampleRate);

Визуализация полос перекрестного фильтра.

visualize(crossFilt)

Получите стоимость перекрестного фильтра.

cost(crossFilt)
ans = struct with fields:
                  NumCoefficients: 48
                        NumStates: 18
    MultiplicationsPerInputSample: 48
          AdditionsPerInputSample: 37

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

scope = dsp.SpectrumAnalyzer( ...
    'SampleRate',fileReader.SampleRate, ...
    'PlotAsTwoSidedSpectrum',false, ...
    'FrequencyScale','Log', ...
    'FrequencyResolutionMethod','WindowLength', ...
    'WindowLength',samplesPerFrame, ...
    'Title','Crossover Bands and Reconstructed Signal', ...
    'ShowLegend',true, ...
    'ChannelNames',{'Original Signal','Band 1','Band 2','Band 3','Sum'});

Воспроизведите 10 секунд аудиосигнала. Визуализируйте спектр исходного аудио, перекрестных полос и восстановленного сигнала (сумма полос).

setup(scope,ones(samplesPerFrame,5))
count = 0;
while count < (fileReader.SampleRate/samplesPerFrame)*10
    originalSignal = fileReader();
    [band1,band2,band3] = crossFilt(originalSignal);
    sumOfBands = band1 + band2 + band3;
    scope([originalSignal(:,1), ...
           band1(:,1), ...
           band2(:,1), ...
           band3(:,1), ...
           sumOfBands(:,1)])
    deviceWriter(sumOfBands);
    count = count + 1;
end

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

Figure Spectrum Analyzer contains an axes and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes with title Crossover Bands and Reconstructed Signal contains 5 objects of type line. These objects represent Original Signal, Band 1, Band 2, Band 3, Sum.

Деэссинг - это процесс уменьшения одноуровневых звуков в аудиосигнале. 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)

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

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

  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 чтобы записать аудио на звуковую карту. Создайте crossoverFilter для обработки аудио данных. Вызовите visualize, чтобы построить график частотных характеристик фильтров.

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

xFilt = crossoverFilter('SampleRate',fileReader.SampleRate);
visualize(xFilt)

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

parameterTuner(xFilt)

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

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

  2. Применить перекрестную фильтрацию.

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

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

while ~isDone(fileReader)
    audioIn = fileReader();
    [low,high] = xFilt(audioIn);
    deviceWriter([low(:,1),high(:,1)]);
    drawnow limitrate % required to update parameter
end

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

release(deviceWriter)
release(fileReader)
release(xFilt)

Алгоритмы

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

Системный объект реализован как двоичное дерево пар crossover с дополнительными фазокомпенсирующими секциями [1]. Кроссоверы нечетного порядка реализованы с фильтрами Баттерворта, в то время как кроссоверы четного порядка реализованы с каскадными фильтрами Баттерворта (фильтрами Linkwitz-Riley).

Ссылки

[1] D'Appolito, Joseph A. «Active Realization of Multivay All-Pass Crossover Systems». Журнал Общества Аудиотехники. Том 35, Выпуск 4, 1987, стр. 239-245.

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

.

См. также

Объекты

Блоки

Введенный в R2016a