Классическое БИХ-создание фильтра

В этом примере показано, как спроектировать классические БИХ-фильтры. Начальное особое внимание находится на ситуации, для которой критический расчетный параметр является частотой среза, в которой степень фильтра затухает к половине (-3 дБ) номинальное значение полосы пропускания.

Пример иллюстрирует, как легкий это должно заменить проект Баттерворта или на Чебышева или на эллиптический фильтр того же порядка и получить более крутой спад за счет некоторой пульсации в полосе пропускания и/или полосе задерживания фильтра. После этого проекты минимального порядка исследуются.

Фильтры lowpass

Давайте спроектируем 8-й фильтр порядка с нормированной частотой среза 0.4pi. Во-первых, мы проектируем Фильтр Баттерворта, который является максимально плоским (никакая пульсация в полосе пропускания или в полосе задерживания):

N = 8;
F3dB = .4;
d = fdesign.lowpass('N,F3dB',N,F3dB);
Hbutter = design(d,'butter','SystemObject',true);

Чебышевский Тип, который я проектирую, допускает управление пульсаций в полосе пропускания. В полосе задерживания нет все еще никаких пульсаций. Большие пульсации включают более крутой спад. Здесь, мы задаем пульсации от пика к пику 0.5 дБ:

Ap = .5;
setspecs(d,'N,F3dB,Ap',N,F3dB,Ap);
Hcheby1 = design(d,'cheby1','SystemObject',true);
hfvt = fvtool(Hbutter,Hcheby1,'Color','white');
axis([0 .44 -5 .1])
legend(hfvt,'Butterworth','Chebyshev Type I');

Чебышевский проект Типа II допускает управление затухания в полосе задерживания. В полосе пропускания нет никаких пульсаций. Меньшее затухание в полосе задерживания включает более крутой спад. В этом примере мы задаем затухание в полосе задерживания 80 дБ:

Ast = 80;
setspecs(d,'N,F3dB,Ast',N,F3dB,Ast);
Hcheby2 = design(d,'cheby2','SystemObject',true);
hfvt = fvtool(Hbutter,Hcheby2,'Color','white');
axis([0 1 -90 2])
legend(hfvt,'Butterworth','Chebyshev Type II');

Наконец, эллиптический фильтр может обеспечить более крутой спад по сравнению с предыдущими проектами путем разрешения пульсаций и в полосе задерживания и в полосе пропускания. Чтобы проиллюстрировать, что, мы снова используем ту же полосу пропускания и характеристику полосы задерживания как выше:

setspecs(d,'N,F3dB,Ap,Ast',N,F3dB,Ap,Ast);
Hellip = design(d,'ellip','SystemObject',true);
hfvt = fvtool(Hbutter,Hcheby1,Hcheby2,Hellip,'Color','white');
axis([0 1 -90 2])
legend(hfvt, ...
    'Butterworth','Chebyshev Type I','Chebyshev Type II','Elliptic');

Путем увеличивания масштаб полоса пропускания мы проверяем, что все фильтры имеют ту же-3dB точку частоты и что только у Баттерворта и Чебышевских проектов Типа II есть совершенно плоская полоса пропускания:

axis([0 .44 -5 .1])

Фактор фазы

Если фаза является проблемой, полезно заметить, что Баттерворт и Чебышевские проекты Типа II - также те вводящие меньшее искажение (их групповая задержка является более плоской):

hfvt.Analysis = 'grpdelay';

Проекты минимального порядка

В случаях, где частота среза на 3 дБ не представляет главного интереса, но вместо этого и полоса пропускания и полоса задерживания полностью заданы в терминах частот и суммы терпимых пульсаций, мы можем использовать метод проектирования минимального порядка:

Fp = .1;
Fst = .3;
Ap = 1;
Ast = 60;
setspecs(d,'Fp,Fst,Ap,Ast',Fp,Fst,Ap,Ast);
Hbutter = design(d,'butter','SystemObject',true);
Hcheby1 = design(d,'cheby1','SystemObject',true);
Hcheby2 = design(d,'cheby2','SystemObject',true);
Hellip = design(d,'ellip','SystemObject',true);
hfvt = fvtool(Hbutter,Hcheby1,Hcheby2,Hellip, 'DesignMask', 'on',...
    'Color','white');
axis([0 1 -70 2])
legend(hfvt, ...
    'Butterworth','Chebyshev Type I','Chebyshev Type II','Elliptic');

7-й фильтр порядка необходим, чтобы выполнить спецификации с проектом Баттерворта, тогда как 5-й порядок достаточен с любой Чебышевские методы. Порядок фильтра может даже уменьшаться до 4 с эллиптическим проектом:

order(Hbutter)
order(Hcheby1)
order(Hcheby2)
order(Hellip)
ans =

     7


ans =

     5


ans =

     5


ans =

     4

Соответствие точно с техническими требованиями полосы пропускания или полосы задерживания

С проектами минимального порядка идеальный порядок должен быть округлен до следующего целого числа. Этот дополнительный дробный порядок позволяет алгоритму на самом деле превышать технические требования. Мы можем использовать флаг 'MatchExactly' для ограничения алгоритм проекта, чтобы совпадать точно с одной полосой. Другая полоса превысит свои технические требования. По умолчанию Чебышевский Тип, который я проектирую, совпадает с полосой пропускания, Баттерворт и Чебышевский Тип II совпадают с полосой задерживания, и затухание обеих полос являются соответствующими эллиптическим проектом (в то время как частота ребра полосы задерживания превышена):

Hellipmin1    = design(d, 'ellip', 'MatchExactly', 'passband',...
    'SystemObject',true);
Hellipmin2 = design(d, 'ellip', 'MatchExactly', 'stopband',...
    'SystemObject',true);
hfvt = fvtool(Hellip, Hellipmin1, Hellipmin2, 'DesignMask', 'on',...
    'Color','white');
axis([0 1 -80 2]);
legend(hfvt, 'Matched passband and stopband', ...
    'Matched passband', 'Matched stopband', ...
    'Location', 'Northeast')

Увеличение полосы пропускания, чтобы сравнить ребра полосы пропускания. Совпадающая полоса пропускания и соответствующий оба проекта имеет затухание точно 1 дБ в Fpass =.1:

axis([0 .11 -1.1 0.1]);
legend(hfvt, 'Location', 'Southwest')

Мы проверяем, что получившийся порядок фильтров не изменился:

order(Hellip)
order(Hellipmin1)
order(Hellipmin2)
ans =

     4


ans =

     4


ans =

     4

Highpass, полосовые и заграждающие фильтры

Результаты, представленные выше, могут быть расширены к highpass, полосе пропускания и bandstop типам ответа. Например, вот полосовые фильтры минимального порядка:

d = fdesign.bandpass('Fst1,Fp1,Fp2,Fst2,Ast1,Ap,Ast2', ...
    .35,.45,.55,.65,60,1,60);
Hbutter = design(d,'butter','SystemObject',true);
Hcheby1 = design(d,'cheby1','SystemObject',true);
Hcheby2 = design(d,'cheby2','SystemObject',true);
Hellip = design(d,'ellip','SystemObject',true);
hfvt = fvtool(Hbutter,Hcheby1,Hcheby2,Hellip, 'DesignMask', 'on',...
    'Color','white');
axis([0 1 -70 2])
legend(hfvt, ...
    'Butterworth','Chebyshev Type I','Chebyshev Type II','Elliptic',...
    'Location', 'Northwest')