В этом примере показано, как спроектировать фильтры с произвольным ответом величины. Семейство создания фильтра (FDESIGN) объекты допускает проект фильтров с различными типами ответов. Среди этих типов произвольная величина является менее специализированным и большей частью универсального. Примеры ниже иллюстрируют, как произвольные проекты величины могут решить задачи, когда другие типы ответа находят ограничения.
Этот раздел иллюстрирует случай, где амплитуда фильтра задана в полной области значений Найквиста (существует не ослаблено, или "не заботятся" об областях). Пример, который следует, использует один (полный) тип спецификации полосы и устойчивый алгоритм выборки частоты, чтобы спроектировать фильтр, амплитуда которого задана более чем три раздела: синусоидальный раздел, кусочный линейный раздел и квадратичный раздел. Необходимо выбрать большого порядка фильтра, потому что форма фильтра является вполне сложной:
N = 300; B1 = 0:0.01:0.18; B2 = [.2 .38 .4 .55 .562 .585 .6 .78]; B3 = 0.79:0.01:1; A1 = .5+sin(2*pi*7.5*B1)/4; % Sinusoidal section A2 = [.5 2.3 1 1 -.2 -.2 1 1]; % Piecewise linear section A3 = .2+18*(1-B3).^2; % Quadratic section F = [B1 B2 B3]; A = [A1 A2 A3]; d = fdesign.arbmag('N,F,A',N,F,A); Hd = design(d,'freqsamp','SystemObject',true); fvtool(Hd,'MagnitudeDisplay','Zero-phase','Color','White');
close(gcf)
В предыдущем примере нормированные точки частоты были распределены между 0 и рад/отсчет пи (включенное экстремальное значение). Можно также задать отрицательные частоты и получить комплексные фильтры. Следующий пример демонстрирует комплексный полосовой фильтр RF и использует окно Кайзера, чтобы смягчить последствия Явления Гиббса, которое происходит из-за разрыва величины на 70 дБ между - пи и частоты рад/отсчета пи:
load cfir.mat; % load a predefined set of frequency and amplitude vectors N = 200; d = fdesign.arbmag('N,F,A',N,F,A); Hd = design(d,'freqsamp', 'window' ,{@kaiser,20},'SystemObject',true); fvtool(Hd,'FrequencyRange','[-pi, pi)','Color','White');
equiripple алгоритм хорошо подходит для моделирования сглаженных функций как показано в следующем примере, который моделирует экспоненциал с КИХ-фильтром минимального порядка. Пример задает маленькое значение пульсации через все частоты и задает веса, которые увеличиваются пропорционально до желаемой амплитуды, чтобы улучшать производительность на высоких частотах:
F = linspace(0,1,100); A = exp(-2*pi*F); R = 0.045; % ripple W = .1-20*log10(abs(A)); % weights d = fdesign.arbmag('F,A,R',F,A,R); Hd = design(d,'equiripple','weights',W,'SystemObject',true); fvtool(Hd,'MagnitudeDisplay','Zero-phase', 'FrequencyRange','[0, pi)',... 'Color','White');
В определенных приложениях это может представлять интерес сформировать полосу задерживания фильтра к, например, минимизировать интегрированные уровни бокового лепестка или улучшить робастность квантования. Следующий пример проектирует фильтр lowpass с полосой задерживания лестницы. Чтобы достигнуть проекта, это использует распределение весов, которые увеличивают затухание каждого шага на 5 дБ в полосе задерживания:
N = 150; F = [0 .25 .3 .4 .401 .5 .501 .6 .601 .7 .701 .8 .801 .9 .901 1]; A = [1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; W = 10.^([0 0 5 5 10 10 15 15 20 20 25 25 30 30 35 35]/20); d = fdesign.arbmag('N,F,A',N,F,A); Hd1 = design(d,'equiripple','weights',W,'SystemObject',true);
Следующий пример представляет альтернативный проект на основе использования многополосного подхода, который задает две полосы (полоса пропускания, и полоса задерживания) разделенный "не заботятся" об области (или полоса перехода):
B = 2; % Number of bands F1 = F(1:2); % Passband F2 = F(3:end); % Stopband % F(2:3)=[.25 .3] % Transition band A1 = A(1:2); A2 = A(3:end); W1 = W(1:2); W2 = W(3:end); d = fdesign.arbmag('N,B,F,A',N,B,F1,A1,F2,A2); Hd2 = design(d,'equiripple','B1Weights',W1,'B2Weights',W2,... 'SystemObject',true); hfvt = fvtool(Hd1,Hd2,'MagnitudeDisplay','Magnitude (dB)','Legend','On',... 'Color','White'); legend(hfvt, 'Single-Band Design', 'Multi-Band Design');
Заметьте ясное преимущество многополосного подхода. Расслабляющими ограничениями в области перехода equiripple алгоритм сходится к решению с более низкими неравномерностями в полосе пропускания и большим затуханием в полосе задерживания. Другими словами, характеристики частоты первого фильтра могли быть соответствующими низшему порядку. Следующий пример иллюстрирует этот последний комментарий путем получения эквивалентных фильтров с помощью проектов минимального порядка.
Проекты минимального порядка требуют спецификации одного значения пульсации на полосу. В данном примере установите пульсацию на 0,0195 во всех полосах.
R = 0.0195; % Single-band minimum order design d = fdesign.arbmag('F,A,R',F,A,R); Hd1 = design(d,'equiripple','Weights',W,'SystemObject',true); % Multi-band minimum order design d = fdesign.arbmag('B,F,A,R',B,F1,A1,R,F2,A2,R); Hd2 = design(d,'equiripple','B1Weights',W1,'B2Weights',W2,... 'SystemObject',true); hfvt = fvtool(Hd1,Hd2,'Color','White'); legend(hfvt, 'Single-Band Minimum Order Design', ... 'Multi-Band Minimum Order Design');
Неравномерность в полосе пропускания и затухание в полосе задерживания обоих соответствий проектов. Однако проект одно полосы имеет порядок 152, в то время как многополосный проект имеет порядок 72.
order(Hd)
ans = 32
Многополосные проекты equiripple позволяют вам задавать ограничения пульсации для различных полос, задавать одно диапазоны частот, и сила указала, что частота указывает на заданные значения.
Следующий пример проектирует 80-й фильтр полосы пропускания порядка с затуханием 60 дБ в первой полосе задерживания и 40 дБ во второй полосе задерживания. Путем ослабления затухания второй полосы задерживания пульсация в полосе пропускания уменьшается при поддержании того же порядка фильтра.
N = 80; % filter order B = 3; % number of bands d = fdesign.arbmag('N,B,F,A,C',N,B,[0 0.25],[0 0],true,... [0.3 0.6],[1 1],false,[0.65 1],[0 0],true)
d = arbmag with properties: Response: 'Arbitrary Magnitude' Specification: 'N,B,F,A,C' Description: {4x1 cell} NormalizedFrequency: 1 FilterOrder: 80 NBands: 3 B1Frequencies: [0 0.2500] B1Amplitudes: [0 0] B1Constrained: 1 B1Ripple: 0.2000 B2Frequencies: [0.3000 0.6000] B2Amplitudes: [1 1] B2Constrained: 0 B3Frequencies: [0.6500 1] B3Amplitudes: [0 0] B3Constrained: 1 B3Ripple: 0.2000
B1Constrained
и B3Constrained
свойства собирались в истину указать, что первые и третьи полосы являются ограниченными полосами. Задайте значение пульсации для i-ой принужденной полосы, использующей BiRipple
свойство:
d.B1Ripple = 10^(-60/20); % Attenuation for the first stopband d.B3Ripple = 10^(-40/20); % Attenuation for the second stopband Hd = design(d,'equiripple','SystemObject',true)
Hd = dsp.FIRFilter with properties: Structure: 'Direct form' NumeratorSource: 'Property' Numerator: [-0.0036 0.0049 0.0052 -0.0022 -0.0097 -0.0044 ... ] InitialConditions: 0 Show all properties
fvtool(Hd,'Legend','Off','Color','White');
Следующий пример проектирует минимальный порядок equiripple фильтр с двумя метками в точно 0.25*pi и 0.55*pi рад/отсчет, и с пульсацией 0,15 в полосах пропускания.
B = 5; % number of bands d = fdesign.arbmag('B,F,A,R',B); d.B1Frequencies = [0 0.2]; d.B1Amplitudes = [1 1]; d.B1Ripple = 0.15; d.B2Frequencies = 0.25; % single-frequency band d.B2Amplitudes = 0; d.B3Frequencies = [0.3 0.5]; d.B3Amplitudes = [1 1]; d.B3Ripple = 0.15; d.B4Frequencies = 0.55; % single-frequency band d.B4Amplitudes = 0; d.B5Frequencies = [0.6 1]; d.B5Amplitudes = [1 1]; d.B5Ripple = 0.15; Hd = design(d,'equiripple','SystemObject',true); fvtool(Hd,'Color','White');
Следующий пример проектирует фильтр highpass с ребром полосы задерживания на уровне 100 Гц и ребром полосы пропускания на уровне 150 Гц. Предположим, что вы хотите отклонить сильную интерференцию на 60 Гц, не имея необходимость добавлять дополнительный фильтр или не имея необходимость увеличивать порядка фильтра на большую сумму. Можно сделать это путем принуждения ответа величины фильтра highpass, чтобы быть 0 на уровне 60 Гц:
B = 2; % number of bands N = 92; % filter order Fs = 2e3; % sampling frequency d = fdesign.arbmag('N,B,F,A',N,B,[0 60 100],[0 0 0],[150 1000],[1 1],Fs);
Используйте B1ForcedFrequencyPoints
проектное решение, чтобы обеспечить точку на 60 Гц к ее заданному амплитудному значению.
Hd = design(d,'equiripple','B1ForcedFrequencyPoints',60,... 'SystemObject',true); hfvt = fvtool(Hd,'Fs', Fs,'Color','White');
Масштабируйте в полосу задерживания фильтра highpass, чтобы заметить, что амплитуда является нулем в заданной точке частоты на 60 Гц:
hfvt.MagnitudeDisplay = 'Magnitude';
xlim([0 100])
ylim([0 0.015])
Как в КИХ-случае, БИХ-проблемы проектирования, где полоса перехода не может быть легко идентифицирована, лучше всего разрешены с одним (полным) подходом спецификации полосы. Как пример, смоделируйте оптическое поглощение газа (атомарный пар Rubidium87):
Nb = 12; Na = 10; F = linspace(0,1,100); As = ones(1,100)-F*0.2; Absorb = [ones(1,30),(1-0.6*bohmanwin(10))',... ones(1,5), (1-0.5*bohmanwin(8))',ones(1,47)]; A = As.*Absorb; d = fdesign.arbmag('Nb,Na,F,A',Nb,Na,F,A); W = [ones(1,30) ones(1,10)*.2 ones(1,60)]; Hd = design(d, 'iirlpnorm', 'Weights', W, 'Norm', 2, 'DensityFactor',30,... 'SystemObject',true); fvtool(Hd, 'MagnitudeDisplay','Magnitude (dB)', ... 'NormalizedFrequency','On','Color','White');
В других случаях, где ограничения могут быть ослаблены в одной или нескольких полосах перехода, многополосный подход предоставляет те же преимущества как в КИХ-случае (а именно, лучшая полоса пропускания и характеристики полосы задерживания). Следующий пример иллюстрирует эти различия путем моделирования канала радиосвязей Релеевского замирания:
Nb = 4; Na = 6; F = [0:0.01:0.4 .45 1]; A = [1.0./(1-(F(1:end-2)./0.42).^2).^0.25 0 0]; d = fdesign.arbmag('Nb,Na,F,A',Nb,Na,F,A); % single-band design Hd1 = design(d,'iirlpnorm','SystemObject',true); B = 2; F1 = F(1:end-2); % Passband F2 = F(end-1:end); % Stopband % F(end-2:end-1)=[.4 .45] % Transition band A1 = A(1:end-2); A2 = A(end-1:end); d = fdesign.arbmag('Nb,Na,B,F,A',Nb,Na,B,F1,A1,F2,A2); % multi-band design Hd2 = design(d,'iirlpnorm','SystemObject',true); hfvt = fvtool(Hd1,Hd2,'Color','White'); legend(hfvt, 'Single-Band Design', 'Multi-Band Design');