В этом примере показано, как спроектировать худые и отмечающие фильтры. Фильтры, которые достигают максимума или отмечают на определенной частоте, сохраняют или устраняют конкретную частотную составляющую сигнала. Расчетные параметры для фильтра являются частотой, на которой пик или метка желаемы, и или полоса пропускания на 3 дБ или фактор фильтра Q. Кроме того, учитывая эти технические требования, путем увеличения порядка фильтра, возможно получить проекты, которые более тесно аппроксимируют идеальный фильтр.
Предположим, что необходимо устранить интерференцию на 60 Гц в сигнал, произведенный на уровне 3 000 Гц. Фильтр метки может использоваться для такой цели. Функция
iirnotch
может быть использован для расчета коэффициенты фильтра метки второго порядка.
Вот пример:
F0 = 60; % Interference is at 60 Hz Fs = 3000; % Sampling frequency is 3000 Hz BW = 6; % Choose a bandwidth factor of 6Hz [num1,den1] = iirnotch(F0/(Fs/2),BW/(Fs/2)); fvtool(num1,den1,'Fs',Fs,'Color','white');
Эквивалентный способ спроектировать фильтр состоит в том, чтобы задать добротность и получить полосу пропускания на 3 дБ. Добротность задана как отношение метки или пиковой частоты и полоса пропускания на 3 дБ . Математически, Q фактор дают . В вышеупомянутом случае значение добротности равняется 10. Определение полосы пропускания является более удобным способом достигнуть точно желаемой формы для спроектированного фильтра. Там Q фактор фильтра мера того, как хорошо желаемая частота изолируется от других частот. Для фиксированного порядка фильтра более высокий фактор Q выполняется путем продвижения полюсов ближе к нулям.
Визуализируйте ответ величины фильтра с помощью fvtool
.
Q2 = 100; % Choose a Q factor of 100 [num2,den2] = iirnotch(F0/(Fs/2),F0/(Q2*Fs/2)); fvt = fvtool(num1,den1,num2,den2,'Fs',Fs,'Color','white'); legend(fvt,'Q = 10','Q = 100');
Худые фильтры используются, чтобы сохранить только одну частотную составляющую (или малочисленная полоса частот) от сигнала. iirpeak
функция может быть использована для расчета коэффициенты фильтра пика второго порядка.
F0 = 1000; % Interference is at 60 Hz Fs = 3000; % Sampling frequency is 3000 Hz Q1 = 10; [num1,den1] = iirpeak(F0/(Fs/2),F0/(Q1*Fs/2)); Q2 = 100; [num2,den2] = iirpeak(F0/(Fs/2),F0/(Q2*Fs/2)); fvt = fvtool(num1,den1,num2,den2,'Fs',Fs,'Color','white'); legend(fvt,'Q = 10','Q = 100');
Используя изменяющиеся во времени фильтры требует изменения коэффициентов фильтра, в то время как симуляция запускается. DSP System Toolbox™ обеспечивает определенные функции, такие как the iirnotch
функционируйте и dsp.NotchPeakFilter
возразите, чтобы спроектировать изменяющиеся во времени настраиваемые фильтры метки. Эти функции вычисляют коэффициенты фильтра непосредственно.
Для того, чтобы реализовать время различный фильтр, создайте динамическую настройку, чтобы симулировать фильтр и реализовать фильтр с изменяющимися во времени расчетными параметрами.
Запустите путем создания динамической (переданной потоком) симуляции с фильтрами, коэффициенты которых не изменяются. Создайте два фильтра метки второго порядка, одно использование
dsp.SOSFilter
возразите и второе использование dsp.NotchFilter
объект. В первом фильтре, набор центральная частота к 1 кГц и полоса пропускания на уровне-3 дБ к 50 Гц. Вычислите коэффициенты этого фильтра непосредственно с помощью iirnotch
функция. Во втором фильтре, набор центральная частота к 3 кГц и полоса пропускания на уровне-3 дБ к 50 Гц. Частота дискретизации для обоих фильтров составляет 8 кГц.
Fs = 8e3; % 8 kHz sampling frequency F01 = 1e3; % Notch at 1 kHz for Filter 1 BW = 500; % 500 Hz bandwidth for both filters [b, a] = iirnotch(F01/(Fs/2), BW/(Fs/2)) % Filter 1 coefficients
b = 1×3
0.8341 -1.1796 0.8341
a = 1×3
1.0000 -1.1796 0.6682
sosFilter = dsp.SOSFilter(b,a); F02 = 3e3; % Notch at 3 kHz for Filter 2 npFilter = dsp.NotchPeakFilter('CenterFrequency',F02,'Bandwidth',BW,... 'SampleRate',Fs); scope = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ... 'SampleRate', Fs, ... 'AveragingMethod',"Exponential",... 'ForgettingFactor',.95,... 'Method','Filter bank',... 'ChannelNames',{'Filter 1','Filter 2'},... 'ShowLegend',true); samplesPerFrame = 256; nFrames = 8192; for k = 1:nFrames x = randn(samplesPerFrame, 1); y1 = sosFilter(x); y2 = npFilter(x); scope([y1,y2]); end
Для изменяющегося во времени фильтра коэффициенты изменяющихся во времени фильтров изменяются в зависимости от времени из-за изменений во время выполнения в расчетных параметрах (например, центральная частота для фильтра метки). Создайте два фильтра метки второго порядка со временем различные расчетные параметры. Подобно вышеупомянутому примеру используйте iirnotch
функционируйте и dsp.SOSFilter
объект реализовать первый фильтр и dsp.NotchFilter
объект реализовать второй фильтр. Варьируйтесь расчетные параметры обоих фильтров в зависимости от времени.
% Notch filter parameters - how they vary over time Fs = 8e3; % 8 kHz sampling frequency F01 = 1e3 * [0.5, 1, 1.5, 3]; % Notch frequencies for Filter 1 F02 = 1e3 * [3.5, 3, 2.5, 2]; % Notch frequencies for Filter 2 BW = 500 * ones(1,4); % 500 Hz bandwidth for both filters myChangingParams1 = struct('f0', num2cell(F01/(Fs/2)), 'bw', num2cell(BW/(Fs/2))); myChangingParams2 = struct('F0', num2cell(F02), 'BW', num2cell(BW)); paramsChangeTimes = [0, 70, 140, 210]; % in seconds % Simulation time management nSamplesPerFrame = 256; tEnd = 300; nSamples = ceil(tEnd * Fs); nFrames = floor(nSamples / nSamplesPerFrame); % Object creation sosFilter = dsp.SOSFilter; %Filter 1 object npFilter = dsp.NotchPeakFilter('SampleRate',Fs); scope = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ... 'SampleRate', Fs, ... 'AveragingMethod',"Exponential",... 'ForgettingFactor',.75,...... 'RBWSource', 'Auto',... 'Method','Filter bank',... 'ChannelNames',{'Filter 1','Filter 2'},... 'ShowLegend',true); paramtbl1 = ParameterTimeTable('Time', paramsChangeTimes, ... 'Values', myChangingParams1, ... 'SampleRate', Fs/nSamplesPerFrame); paramtbl2 = ParameterTimeTable('Time', paramsChangeTimes, ... 'Values', myChangingParams2, ... 'SampleRate', Fs/nSamplesPerFrame); % Actual simulation loop for frameIdx = 1:nFrames % Get current F0 and BW [params1, update1] = paramtbl1(); [params2, update2] = paramtbl2(); if(update1) % Recompute filter coefficients if parameters changed [b, a] = iirnotch(params1.f0, params1.bw); % Set filter coefficients to new values sosFilter.Numerator = b; sosFilter.Denominator = a; end if(update2) npFilter.CenterFrequency = params2.F0; npFilter.Bandwidth = params2.BW; end % Generate vector of white noise samples x = randn(nSamplesPerFrame, 1); % Filter noise y1 = sosFilter(x); y2 = npFilter(x); % Visualize spectrum scope([y1,y2]); end
Настраиваемый худой фильтр может быть реализован так же с помощью dsp.NotchPeakFilter
объект или использование iirpeak
функция и dsp.SOSFilter
объект.
Примечание: Эти настраиваемые худые и отмечающие фильтры поддерживают генерацию кода.
Поскольку только возможно продвинуть полюса до сих пор и остаться устойчивым, для того, чтобы улучшить приближение кирпичной стены фильтра, необходимо увеличить порядка фильтра. Фильтром метки высшего порядка может быть созданный с использованием fdesign.notch
объект спецификации фильтров.
notchspec = fdesign.notch('N,F0,Q',2,.4,100); notchfilt = design(notchspec,'SystemObject',true); notchspec.FilterOrder = 6; notchfilt1 = design(notchspec,'SystemObject',true); fvt= fvtool(notchfilt, notchfilt1, 'Color','white'); legend(fvt,'2nd Order Filter','6th Order Filter');
Для данного распоряжения мы можем получить более резкие переходы путем обеспечения пульсаций полосы задерживания и/или полосы пропускания.
N = 8; F0 = 0.4; BW = 0.1; notchspec = fdesign.notch('N,F0,BW',N,F0,BW); notchfilt = design(notchspec,'SystemObject',true); notchspec1 = fdesign.notch('N,F0,BW,Ap,Ast',N,F0,BW,0.5,60); notchfilt1 = design(notchspec1,'SystemObject',true); fvt= fvtool(notchfilt, notchfilt1, 'Color','white'); legend(fvt,'Maximally Flat 8th Order Filter',... '8th Order Filter With Passband/Stopband Ripples', ... 'Location','SouthEast'); axis([0 1 -90 0.5]);
Фильтром пика высшего порядка может быть созданный с использованием fdesign.peak
объект спецификации фильтров. Все технические требования и компромиссы, упомянутые до сих пор, применяются одинаково к худым фильтрам.
Вот пример высшего порядка, достигающего максимума фильтр:
N = 6; F0 = 0.7; BW = 0.001; peakspec = fdesign.peak('N,F0,BW',N,F0,BW); peakfilt = design(peakspec,'SystemObject',true); peakspec1 = fdesign.peak('N,F0,BW,Ast',N,F0,BW,80); peakfilt1 = design(peakspec1,'SystemObject',true); fvt= fvtool(peakfilt, peakfilt1, 'Color','white'); legend(fvt,'Maximally Flat 6th Order Filter',... '6th Order Filter With 80 dB Stopband Attenuation','Location','SouthEast');