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

Этот пример показывает, как разработать полосу октавы и дробные ленточные фильтры октавы. Полоса октавы и дробные ленточные фильтры октавы обычно используются в акустике. Например, фильтры октавы используются, чтобы выполнить спектральный анализ для шумового управления. Акустики предпочитают работать с октавой или дробный (часто 1/3) наборы фильтров октавы, потому что она обеспечивает значимую меру шумовой степени в различных диапазонах частот.

Проект Полной Полосы Октавы и 1/3-Octave-Band Наборы фильтров

Октава является интервалом между двумя частотами, имеющими отношение 2:1. Полоса октавы или дробный ленточный фильтр октавы являются полосовым фильтром, определенным его центральной частотой и его порядком. Пределы затухания значения заданы в стандарте ANSI® S1.11-2004 для трех классов фильтров: класс 0, класс 1 и класс 2. Класс 0 позволяет только +/-0.15 дБ пульсаций в полосе пропускания, в то время как фильтры класса 1 позволяют +/-0.3 дБ, и фильтры класса 2 позволяют +/-0.5 дБ. Уровни затухания полосы задерживания отличаются от 60 до 75 дБ, в зависимости от класса фильтра.

Разработайте начальный полный ленточный фильтр октавы с помощью octaveFilter Системного объекта. Этот фильтр является отправной точкой для создания набора фильтров.

BW = '1 octave';
N = 6;           % Filter Order
F0 = 1000;       % Center Frequency (Hz)
Fs = 48000;      % Sampling Frequency (Hz)
oneOctaveFilter = octaveFilter('FilterOrder', N, ...
    'CenterFrequency', F0, 'Bandwidth', BW, 'SampleRate', Fs)
oneOctaveFilter = 

  octaveFilter with properties:

        FilterOrder: 6
    CenterFrequency: 1000
          Bandwidth: '1 octave'
         Oversample: false
         SampleRate: 48000

Заставьте все центральные частоты, заданные стандартом ANSI S1.11-2004 в диапазоне звуковых частот (от 20 Гц до 20 кГц) разрабатывать набор фильтров:

F0 = getANSICenterFrequencies(oneOctaveFilter);
F0(F0<20) = [];
F0(F0>20e3) = [];
Nfc = length(F0);
for i=1:Nfc
    fullOctaveFilterBank{i} = octaveFilter('FilterOrder', N, ...
        'CenterFrequency', F0(i), 'Bandwidth', BW, 'SampleRate', Fs); %#ok
end

Теперь разработайте 1/3-octave-band набор фильтров. Увеличьте порядок каждого фильтра к 8:

BW = '1/3 octave';
N = 8;
F0 = 1000;
oneThirdOctaveFilter = octaveFilter('FilterOrder', N, ...
    'CenterFrequency', F0, 'Bandwidth', BW, 'SampleRate', Fs);
F0 = getANSICenterFrequencies(oneThirdOctaveFilter);
F0(F0<20) = [];
F0(F0>20e3) = [];
Nfc = length(F0);
for i=1:Nfc
    oneThirdOctaveFilterBank{i} = octaveFilter('FilterOrder', N, ...
        'CenterFrequency', F0(i), 'Bandwidth', BW, 'SampleRate', Fs); %#ok
end

Визуализируйте ответ значения одного фильтра от каждого из этих двух наборов фильтров. 1/3-octave набор фильтров обеспечивает более прекрасный спектральный анализ, но по увеличенной стоимости. Это требует, чтобы 30 фильтров по сравнению с 10 для полного набора фильтров октавы покрыли диапазон звуковых частот [20 20 000 Гц].

visualize(fullOctaveFilterBank{6}, 'class 1');
visualize(oneThirdOctaveFilterBank{6}, 'class 1');

График visualizer синхронизируется с объектом, таким образом, вы видите обновление ответа значения, когда вы изменяете параметры фильтра. Маска вокруг ответа значения будет зеленой, если это выполнит стандарт ANSI S1.11-2004, и красный в противном случае. Можно также использовать audioTestBench инструмент, чтобы быстро настроить испытательный стенд, чтобы использовать фильтр октавы, который вы разработали. Например, запустите audioTestBench(fullOctaveFilterBank{6}), чтобы запустить испытательный стенд с одним из полных фильтров октавы от набора фильтров.

Спектральный анализ Белого шума

Человеческое ухо интерпретирует громкость звука в шкале ближе к логарифмическому масштабу, чем линейный, но основанный на ДПФ анализ частоты приводит к линейной шкале частоты. Вычислите (основанный на ДПФ) спектр мощности белого шумового сигнала с помощью спектра анализатор:

Nx = 100000;
scope1 = dsp.SpectrumAnalyzer('SpectralAverages',50,'SampleRate',Fs,...
    'PlotAsTwoSidedSpectrum',false,'FrequencyScale','Log',...
    'YLimits', [-80 20]);
tic
while toc < 15
    % Run for 15 seconds
    xw = randn(Nx,1);
    scope1(xw);
end

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

scope2 = dsp.SpectrumAnalyzer('SpectralAverages',50,'SampleRate',Fs,...
    'PlotAsTwoSidedSpectrum',false,'FrequencyScale','Log',...
    'RBWSource','Property','RBW',2000);
yw = zeros(Nx,Nfc);
tic
while toc < 15
    % Run for 15 seconds
    xw = randn(Nx,1);
    for i=1:Nfc
        oneThirdOctaveFilter = oneThirdOctaveFilterBank{i};
        yw(:,i) = oneThirdOctaveFilter(xw);
    end
    scope2(yw);
end

Спектральный анализ розового шума

В то время как белый шумовой сигнал имеет то же распределение степени для всех частот, розовый шумовой сигнал имеет то же распределение степени для каждой октавы, таким образом, степень между 0,5 Гц и 1 Гц эквивалентна между 5 000 Гц и 10 000 Гц.

pinkNoise = dsp.ColoredNoise('Color','pink',...
                             'SamplesPerFrame',Nx,...
                             'NumChannels',1);
scope3 = dsp.SpectrumAnalyzer('SpectralAverages',50,'SampleRate',Fs,...
    'PlotAsTwoSidedSpectrum',false,'FrequencyScale','Log',...
    'YLimits', [-80 20]);
tic,
while toc < 15
    % Run for 15 seconds
    x = pinkNoise();
    scope3(x);
end

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

scope4 = dsp.SpectrumAnalyzer('SpectralAverages',50,'SampleRate',Fs,...
    'PlotAsTwoSidedSpectrum',false,'FrequencyScale','Log',...
    'RBWSource','Property','RBW',2000);
yp = zeros(Nx,Nfc);
tic,
while toc < 15
    % Run for 15 seconds
    xp = pinkNoise();
    for i=1:Nfc
        oneThirdOctaveFilter = oneThirdOctaveFilterBank{i};
        yp(:,i) = oneThirdOctaveFilter(xp);
    end
    scope4(yp);
end