Октавный и дробный октавный диапазонные фильтры

В этом примере показано, как проектировать октавно-диапазонные и дробно-октавно-диапазонные фильтры, включая банки фильтров и октавные SPL-метры. Фильтры октавного и дробного диапазона октавного диапазона обычно используются в акустике. Для примера октавные фильтры используются для выполнения спектрального анализа для контроля шума. Акустики работают с октавными или дробными (часто 1/3) октавными банками фильтров, потому что это обеспечивает значимую меру степени шума в различных полосах.

Фильтр октавного диапазона

Октава - это интервал между двумя частотами, имеющий отношение 2:1 (или 103/101.995 для основы -10 октавных коэффициентов). Фильтр октавного диапазона или дробного октавного диапазона является полосно-пропускающим фильтром, определяемым его центральной частотой, порядком и шириной полосы пропускания. Пределы ослабления величины определены в стандарте ANSI ® S1.11-2004 для трех классов фильтров: класса 0, класса 1 и класса 2. Класс 0 допускает только +/-0,15 дБ пульсации в полосе пропускания, в то время как класс 1 позволяет +/-0,3 дБ, а класс 2 позволяет +/-0,5 дБ. Уровни затухания в полосе задерживания варьируются от 60 до 75 дБ, в зависимости от класса фильтра.

Разработайте полный октавный фильтр с использованием octaveFilter.

BW = '1 octave';  % Bandwidth
N  = 8;           % Filter order
F0 = 1000;        % Center frequency (Hz)
Fs = 48000;       % Sampling frequency (Hz)
of = octaveFilter('FilterOrder',N,'CenterFrequency',F0,  ...
                  'Bandwidth',BW,'SampleRate',Fs);

Визуализируйте амплитудную характеристику фильтра.

visualize(of,'class 1')

График визуализатора синхронизируется с объектом, поэтому вы можете увидеть обновление величины отклика, когда изменяете параметры фильтра. Маска вокруг величины характеристики зеленая, если фильтр соответствует стандарту ANSI S1.11-2004 (включая центрирование с допустимой частотой), и красная в противном случае. Чтобы изменить спецификации фильтра с графическим пользовательским интерфейсом, используйте parameterTuner. Вы также можете использовать приложение Audio Test Bench, чтобы быстро настроить испытательный стенд для проектируемого октавного фильтра. Для примера запуска audioTestBench(of) чтобы запустить испытательный стенд с октавным фильтром.

Откройте тюнер параметров, который позволяет вам изменять фильтр в режиме реального времени.

parameterTuner(of)

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

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

Nx = 100000;
scope1 = dsp.SpectrumAnalyzer('SampleRate',Fs,'Method','Filter bank', ...
    'AveragingMethod','Exponential','PlotAsTwoSidedSpectrum',false, ...
    'FrequencyScale','Log','FrequencySpan','Start and stop frequencies', ...
    'StartFrequency',1,'StopFrequency',Fs/2,'YLimits',[-60 10], ...
    'RBWSource','Property','RBW',1);
tic
while toc < 20
    % Run for 20 seconds
    x1 = randn(Nx,1);
    y1 = of(x1);
    scope1(y1)
end

Figure Spectrum Analyzer contains an axes and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes contains an object of type line. This object represents Channel 1.

Банк фильтров октавного диапазона

Многим приложениям требуется полный набор октавных фильтров для формирования банка фильтров. Чтобы спроектировать каждый фильтр вручную, вы бы использовали getANSICenterFrequencies(of) для получения списка центральных частот для каждого отдельного фильтра. Однако обычно намного проще использовать octaveFilterBank объект.

Создайте octaveFilterBank объект и постройте график его величины отклика.

ofb = octaveFilterBank('1/3 octave',Fs,'FilterOrder',N);
freqz(ofb,'NFFT',2^16)   % Increase FFT length for better low-frequency resolution
set(gca,'XScale','log')
axis([20 Fs/2 -50 5])
title('1/3-Octave Filter Bank Magnitude Response')

Figure contains an axes. The axes with title 1/3-Octave Filter Bank Magnitude Response contains 30 objects of type line.

Отфильтруйте выход генератора розового шума с 1/3-октавным набором фильтров и вычислите общую степень на выходе каждого фильтра.

pinkNoise = dsp.ColoredNoise('Color','pink', ...
                             'SamplesPerFrame',Nx, ...
                             'NumChannels',1);

scope2 = dsp.SpectrumAnalyzer('SampleRate',Fs,'Method','Filter bank', ...
    'AveragingMethod','Exponential','PlotAsTwoSidedSpectrum',false, ...
    'FrequencyScale','Log','FrequencySpan','Start and stop frequencies', ...
    'StartFrequency',20,'StopFrequency',Fs/2,'YLimits',[-40 30], ...
    'RBWSource','Property','RBW',10);

centerOct = getCenterFrequencies(ofb);
nbOct = numel(centerOct);
bandPower = zeros(1,nbOct);
nbSamples = 0;

tic
while toc < 10
    xp = pinkNoise();
    yp = ofb(xp);
    bandPower = bandPower + sum(yp.^2,1);
    nbSamples = nbSamples + Nx;
    scope2(yp)    
end

Figure Spectrum Analyzer contains an axes and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes contains 30 objects of type line. These objects represent Channel 1, Channel 2, Channel 3, Channel 4, Channel 5, Channel 6, Channel 7, Channel 8, Channel 9, Channel 10, Channel 11, Channel 12, Channel 13, Channel 14, Channel 15, Channel 16, Channel 17, Channel 18, Channel 19, Channel 20, Channel 21, Channel 22, Channel 23, Channel 24, Channel 25, Channel 26, Channel 27, Channel 28, Channel 29, Channel 30.

Розовый шум имеет ту же полную степень в каждой октавной полосе, поэтому степень между 5 Гц и 10 Гц такая же, как между 5 000 Гц и 10 000 Гц. Следовательно, в анализаторе спектра можно наблюдать падение на 10 дБ/десятилетие, которое характерно для розового шума по логарифмической шкале и как этот сигнал разделяется на 30 1/3-октавные полосы. Более высокие полосы частот имеют меньшую степень плотность, но журнал шкала означает, что они также шире, так что их общая степень постоянна.

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

b = 10^(3/10); % base-10 octave ratio
% Compute power (including pressure reference)
octPower = 10*log10(bandPower/nbSamples/4e-10);

bar(log(centerOct)/log(b),octPower);
set(gca,'Xticklabel',round(b.^get(gca,'Xtick'),2,'significant'));
title('1/3-Octave Power Spectrum')
xlabel('Octave Frequency Band (Hz)')
ylabel('Power (dB)')

Figure contains an axes. The axes with title 1/3-Octave Power Spectrum contains an object of type bar.

Октавный SPL

Объект SPL Meter (splMeter) также поддерживает измерения октавного диапазона. Воспроизведите то же измерение спектра степени в реальном времени. Использование dsp.ArrayPlot объект, чтобы визуализировать степень на полосу. Используйте опцию Z-взвешивания, чтобы опустить фильтр частотного взвешивания.

spl = splMeter('Bandwidth','1/3 octave', ...
               'OctaveFilterOrder',N, ...
               'SampleRate',Fs, ...
               'FrequencyWeighting','Z-weighting');

scope3 = dsp.ArrayPlot('Title','Pink Noise SPL', ...
                       'XLabel','Octave Frequency Band Number', ...
                       'YLabel','Power (dB)','YLimits',[0 100]);
tic
while toc < 10
    xp = pinkNoise();
    yp = spl(xp);
    ypm = mean(yp,1).';
    scope3(ypm)
end