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

В этом примере показано, как спроектировать полосу октавы и дробные ленточные фильтры октавы, включая наборы фильтров и метры 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')

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

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

parameterTuner(of)

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

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

Банк ленточного фильтра октавы

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

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

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

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

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

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)')

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