Этот пример показывает, как разработать полосу октавы и дробные ленточные фильтры октавы. Полоса октавы и дробные ленточные фильтры октавы обычно используются в акустике. Например, фильтры октавы используются, чтобы выполнить спектральный анализ для шумового управления. Акустики предпочитают работать с октавой или дробный (часто 1/3) наборы фильтров октавы, потому что она обеспечивает значимую меру шумовой степени в различных диапазонах частот.
Октава является интервалом между двумя частотами, имеющими отношение 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