octaveFilter

Полоса октавы и дробный ленточный фильтр октавы

Описание

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

Выполнять полосу октавы или дробную фильтрацию полосы октавы на вашем входе:

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

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

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Синтаксис

octFilt = octaveFilter
octFilt = octaveFilter(centerFreq)
octFilt = octaveFilter(centerFreq,bw)
octFilt = octaveFilter(___,Name,Value)

Описание

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

octFilt = octaveFilter(centerFreq) устанавливает свойство CenterFrequency на centerFreq.

octFilt = octaveFilter(centerFreq,bw) устанавливает свойство Bandwidth на bw.

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

Пример: octFilt = octaveFilter(1000,'1/3 octave','SampleRate',96000) создает Системный объект, octFilt, с центральной частотой 1 000 Гц, 1/3 пропускной способностью фильтра октавы и частотой дискретизации 96 000 Гц.

Свойства

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

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

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

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

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

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

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

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

  • Максимальная центральная частота является значением, которое заставляет ребро верхней полосы быть равным частоте Найквиста, Fs/2. Частоты выше этого значения насыщаются.

  • Минимальная центральная частота является значением, которое заставляет ребро нижней полосы быть равным 1 Гц. Частоты ниже этого значения квантуются к значению, которое соответствует ребру нижней полосы, равному 1 Гц.

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

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

Отфильтруйте пропускную способность в октавах, заданных как '1 octave', '2/3 octave', '1/2 octave', '1/3 octave', '1/6 octave', '1/12 octave', '1/24 octave' или '1/48 octave'.

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

Типы данных: char | string

Сверхдискретизируйте переключатель, заданный как false или true.

  • ложь Фильтр октавы запускается на уровне входной частоты дискретизации.

  • tRUE Фильтр октавы достигает два раза входной частоты дискретизации. Сверхдискретизация минимизирует эффекты деформирования частоты, введенные билинейным преобразованием. Интерполятор полуполосы FIR реализует сверхдискретизацию перед фильтрацией октавы. Полуполоса decimator уменьшает частоту дискретизации назад до входного уровня выборки после фильтрации октавы.

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

Типы данных: логический

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

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

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

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

Синтаксис

audioOut = octFilt(audioIn)

Описание

пример

audioOut = octFilt(audioIn) применяет фильтрацию полосы октавы к входному сигналу, audioIn, и возвращает отфильтрованный сигнал, audioOut. Тип фильтрации задан алгоритмом и свойствами Системного объекта octaveFilter, octFilt.

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

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

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

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

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

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

Аудиовыход от фильтра октавы, возвращенного как матрица тот же размер как audioIn.

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

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

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

release(obj)

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

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

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

СвойствоОбласть значенийОтображениеМодули
CenterFrequency[3, 22000]журналГц
Bandwidth'1 octave', '2/3 octave', '1/2 octave', '1/3 octave', '1/6 octave', '1/12 octave', '1/24 octave' или '1/48 octave'

Ваша область значений MIDI-контроллера дискретизируется на семь уровней, соответствуя семи вариантам Bandwidth.

––

Примеры

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

Используйте Систему octaveFilter object™, чтобы разработать 1/3 ленточный фильтр октавы, сосредоточенный на уровне 1 000 Гц. Обработайте звуковой сигнал с помощью проекта фильтра октавы.

Создайте Системный объект dsp.AudioFileReader.

samplesPerFrame = 1024;
reader = dsp.AudioFileReader('Filename', ...
    'RockGuitar-16-44p1-stereo-72secs.wav', ...
    'SamplesPerFrame',samplesPerFrame, ...
    'PlayCount',Inf);

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

centerFreq = 1000;
bw = '1/3 octave';
Fs = reader.SampleRate;

octFilt = octaveFilter(centerFreq,bw,'SampleRate',Fs);

Визуализируйте ответ фильтра и проверьте, что он соответствует в маске класса 0 стандарта ANSI S1.11-2004.

visualize(octFilt,'class 0')

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

scope = dsp.SpectrumAnalyzer( ...
    'SampleRate',Fs, ...
    'PlotAsTwoSidedSpectrum',false, ...
    'FrequencyScale','Log', ...
    'FrequencyResolutionMethod','WindowLength', ...
    'WindowLength',samplesPerFrame, ...
    'Title','Octave-Band Filtering', ...
    'ShowLegend',true, ...
    'ChannelNames',{'Original signal','Filtered signal'});

Обработайте звуковой сигнал в цикле аудиопотока. Визуализируйте отфильтрованное аудио и исходное аудио. Как лучшая практика, выпустите Системные объекты, когда завершенный.

tic;
while toc < 20
    x = reader();
    y = octFilt(x);
    scope([x(:,1),y(:,1)])
end

release(octFilt)
release(scope)
release(reader)

Создайте банк ленточного фильтра октавы, который соответствует ANSI S1.11-2004. Передайте белый шум через набор фильтров и осмотрите получившуюся степень в каждой полосе.

Создайте фильтр октавы с настройками по умолчанию. Визуализируйте проект фильтра и проверьте, что он соответствует ANSI S1.11-2004 для класса 0.

octFilt = octaveFilter;
visualize(octFilt,'class 0')

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

centerFrequencies = getANSICenterFrequencies(octFilt);
for i = 1:11
    octaveFilterBank{i} = octaveFilter(centerFrequencies(i),'FilterOrder',12);
end

Используйте getFilter, чтобы возвратиться, biquad объекты фильтра для каждого просачиваются ваш набор фильтров октавы. Визуализируйте набор фильтров октавы с линейной шкалой частоты.

plotter = fvtool(getFilter(octaveFilterBank{1}), ...
    getFilter(octaveFilterBank{2}), ...
    getFilter(octaveFilterBank{3}), ...
    getFilter(octaveFilterBank{4}), ...
    getFilter(octaveFilterBank{5}), ...
    getFilter(octaveFilterBank{6}), ...
    getFilter(octaveFilterBank{7}), ...
    getFilter(octaveFilterBank{8}), ...
    getFilter(octaveFilterBank{9}), ...
    getFilter(octaveFilterBank{10}), ...
    getFilter(octaveFilterBank{11}), ...
    'Fs',octaveFilterBank{1}.SampleRate);

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

set(plotter,'FrequencyScale','Log')

Создайте белый шумовой сигнал. По определению белый шум имеет плоскую силу спектральная плотность.

whiteNoiseGenerator = dsp.ColoredNoise(0,1024);
whiteNoise = whiteNoiseGenerator();

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

for i = 1:11
    filteredWhiteNoise(:,i) = octaveFilterBank{i}(whiteNoise);
end

Вычислите и постройте степень в каждой октаве.

for i = 1:11
    powerPerBand(i) = bandpower(filteredWhiteNoise(:,i));
end

bar(powerPerBand)
title('Power Distribution of Octave Band Filter Bank')
set(gca,'XTickLabel',{round(centerFrequencies)})
xlabel('Center Frequency of Octave Band Filter (Hz)')
ylabel('Normalized Power')

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

Обработайте речевой сигнал использование различных полос октавы от банка ленточного фильтра октавы.

Разработайте 1/2 фильтр октавы с предполагаемой центральной частотой 800 Гц. Используйте isStandardCompliant, чтобы найти самую близкую совместимую центральную частоту.

octFilt = octaveFilter(800,'1/2 octave');
[complianceStatus,suggestedCenterFrequency] = isStandardCompliant(octFilt,'class 0')
complianceStatus =

  logical

   0


suggestedCenterFrequency =

  841.3951

Измените центральную частоту объекта octFilt к предложенной центральной частоте, возвращенной isStandardCompliant. Получите список допустимых частот центра ANSI S1.11-2004, учитывая вашу заданную частоту центра octFilt.

octFilt.CenterFrequency = suggestedCenterFrequency;
Fo = getANSICenterFrequencies(octFilt);

Создайте считывающее устройство звукового файла и средство записи аудио устройства.

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

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

scope = dsp.SpectrumAnalyzer(...
    'PlotAsTwoSidedSpectrum',false,...
    'FrequencyScale','Log',...
    'Title','Octave-Band Filtering',...
    'ShowLegend',true,...
    'ChannelNames',{'Original signal','Filtered signal'});

В цикле аудиопотока обработайте звуковой сигнал с помощью ленточного фильтра октавы. Отличайтесь центральная частота, чтобы услышать эффект. Как лучшая практика, выпустите свои объекты после обработки.

index = 12;
octFilt.CenterFrequency = Fo(index);
count = 1;
while ~isDone(fileReader)
    x = fileReader();
    y = octFilt(x);
    scope([x,y])
    deviceWriter(y);

    if mod(count,100)==0
        octFilt.CenterFrequency = Fo(index);
        index = index+1;
    end
    count = count+1;
end

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

Удалите аддитивный шум из аудио тональной шкалы с помощью Системы octaveFilter object™.

Создайте audioOscillator и Системные объекты audioDeviceWriter со свойствами по умолчанию. Создайте Системный объект octaveFilter с центральным набором частоты к 100 Гц.

osc = audioOscillator;
deviceWriter = audioDeviceWriter;
octFilt = octaveFilter(100);

В цикле аудиопотока слушайте тон, созданный вашим аудио осциллятором. Тон содержит аддитивный Гауссов шум.

for i = 1:400
    x = osc();
    x1 = x + 0.1*randn(512,1);
    deviceWriter(x1);
    if rem(i,100)==0
        osc.Frequency = osc.Frequency*2;
    end
end

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

scope = dsp.SpectrumAnalyzer( ...
    'PlotAsTwoSidedSpectrum',false, ...
    'FrequencyScale','Log', ...
    'FrequencyResolutionMethod','WindowLength', ...
    'Title','Octave-Band Filtering', ...
    'ShowLegend',true, ...
    'SpectralAverages',10, ...
    'ChannelNames',{'Original signal','Filtered signal'});

Сбросьте частоту своего аудио осциллятора к его значению по умолчанию, 100 Гц.

osc.Frequency = 100;

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

for i = 1:400
    x = osc();
    x1 = x + 0.1*randn(512,1);
    x2 = octFilt(x1);
    deviceWriter(x2);
    if rem(i,100)==0
        osc.Frequency = osc.Frequency*2;
        octFilt.CenterFrequency = octFilt.CenterFrequency*2;
    end
    scope([x1,x2])
end

release(deviceWriter)

Разработайте фильтр октавы шестого порядка 1/3 с частотой дискретизации 96 кГц.

octFilt = octaveFilter('FilterOrder',6, ...
    'Bandwidth','1/3 octave', ...
    'SampleRate',96e3);

Задайте центральные частоты по стандарту ANSI S1.11-2004. Центральные частоты, заданные стандартом, зависят от свойств Bandwidth и SampleRate.

centerFrequencies = getANSICenterFrequencies(octFilt)

Установите центральную частоту фильтра октавы к 19,953 кГц и визуализируйте ответ с маской соответствия 'класса 0'.

octFilt.CenterFrequency = centerFrequencies(38);
visualize(octFilt,'class 0')

Красная маска на графике задает границы для ответа значения фильтра. Ответ значения этого фильтра выходит за предел верхней границы маски соответствия приблизительно 6,6 кГц. Один способ противостоять этому состоит в том, чтобы увеличить порядок фильтра так, чтобы спад фильтра был более крутым.

Чтобы принести проект фильтра октавы в соответствие, установите порядок фильтра октавы к 8.

octFilt.FilterOrder = 8;

Другая опция, чтобы принести проект фильтра октавы в соответствие должна установить свойство Overample на true. Это разрабатывает и запускает фильтр в дважды заданном SampleRate, чтобы уменьшать эффекты билинейного преобразования во время стадии проектирования.

octFilt.FilterOrder = 6;
octFilt.Oversample = true;

Разработайте фильтр октавы шестого порядка 2/3 с частотой дискретизации на 96 кГц.

octFilt = octaveFilter('FilterOrder',6, ...
    'Bandwidth','2/3 octave', ...
    'SampleRate',96e3);

Задайте центральные частоты по стандарту ANSI S1.11-2004. Центральные частоты, заданные стандартом, зависят от свойств Bandwidth и SampleRate.

centerFrequencies = getANSICenterFrequencies(octFilt)

Установите центральную частоту фильтра октавы к ~6 Гц и визуализируйте ответ с маской соответствия 'класса 0'.

octFilt.CenterFrequency = centerFrequencies(2);
visualize(octFilt,'class 0')

Красная маска на графике задает границы для ответа значения фильтра. Ответ значения этого фильтра понижается нижняя граница маски соответствия между 5.5 и 7,5 Гц.

Низкочастотные фильтры в наборе фильтров октавы очень низко нормировали центральные частоты, и фильтры, разработанные для них, имеют полюса, которые находятся почти на модульном круге. Чтобы сделать этот ANSI фильтра совместимым, это должно разрабатываться и управляться на уровне более низкой частоты дискретизации.

Чтобы принести проект фильтра октавы в соответствие, установите частоту дискретизации на 48 кГц.

octFilt.SampleRate = 48e3;

Создайте dsp.AudioFileReader, чтобы читать в покадровом аудио. Создайте audioDeviceWriter, чтобы записать аудио в вашу звуковую карту. Создайте octaveFilter, чтобы обработать аудиоданные. Вызовите visualize, чтобы построить частотную характеристику фильтра октавы.

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

octFilt = octaveFilter('SampleRate',fileReader.SampleRate);
visualize(octFilt)

Вызовите parameterTuner, чтобы открыть пользовательский интерфейс для настроек параметров octaveFilter при потоковой передаче.

parameterTuner(octFilt)

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

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

  2. Примените фильтрацию октавы.

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

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

while ~isDone(fileReader)
    audioIn = fileReader();
    audioOut = octFilt(audioIn);
    deviceWriter(audioOut);
    drawnow limitrate % required to update parameter
end

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

release(deviceWriter)
release(fileReader)
release(octFilt)

Больше о

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

Алгоритмы

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

Ссылки

[1] Orfanidis, Софокл Дж. Введение в обработку сигналов. Englewood Cliffs, NJ: Prentice Hall, 2010.

[2] Акустическое общество Америки. Американская национальная стандартная спецификация для аналога полосы октавы и Дробной Полосы октавы и цифровых фильтров. ANSI S1.11-2004. Мелвилл, Нью-Йорк: акустическое общество Америки, 2009.

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

Введенный в R2017b