Этот пример показов, как спроектировать оптимальный БИХ фильтры с произвольной величины характеристикой с помощью алгоритма наименьшего Pth оптимизации без ограничений.
Алгоритм IIRLPNORM отличается от традиционных алгоритмов проекта БИХ в нескольких аспектах:
. The designs are done directly in the Z-domain. No need for bilinear transformation.
. The numerator and denominator order can be different.
. One can design IIR filters with arbitrary magnitude response in addition to the basic lowpass, highpass, bandpass, and bandstop.
Однако для простых проектов (lowpass, highpass и т.д.), мы должны задать частоты полосы пропускания и полосы остановки. Переходная полоса рассматривается как безразличная полоса алгоритмом.
d = fdesign.lowpass('N,Fp,Fst',8,.4,.5) %#ok
d = lowpass with properties: Response: 'Lowpass' Specification: 'N,Fp,Fst' Description: {3x1 cell} NormalizedFrequency: 1 FilterOrder: 8 Fpass: 0.4000 Fstop: 0.5000
hiirlpnorm = design(d,'iirlpnorm','SystemObject',true);
Для сравнения рассмотрим это создание эллиптического фильтра
d = fdesign.lowpass('N,Fp,Ap,Ast',8,.4,0.0084,66.25); hellip = design(d, 'ellip','SystemObject',true); hfvt = fvtool(hiirlpnorm,hellip,'Color','White'); legend(hfvt,'IIRLPNORM design','ELLIP design');
Реакция двух фильтров очень похожа. Масштабирование полосы пропускания подчеркивает точку. Однако величина фильтра, разработанного с помощью IIRLPNORM, не ограничена, чтобы быть меньше 0 дБ.
axis([0 .44 -.0092 .0052])
Хотя мы можем получить очень похожие проекты, как эллиптические фильтры, IIRLPNORM обеспечивает большую гибкость. Например, скажем, что мы меняем порядок знаменателя
d = fdesign.lowpass('Nb,Na,Fp,Fst',8,6,.4,.5) %#ok
d = lowpass with properties: Response: 'Lowpass' Specification: 'Nb,Na,Fp,Fst' Description: {4x1 cell} NormalizedFrequency: 1 NumOrder: 8 DenOrder: 6 Fpass: 0.4000 Fstop: 0.5000
hiirlpnorm = design(d,'iirlpnorm','SystemObject',true);
С эллиптическими фильтрами (и другим классическим БИХ проектов) мы должны изменить и числитель, и порядок знаменателя.
d = fdesign.lowpass('N,Fp,Ap,Ast',6,.4,0.0084,58.36); hellip = design(d, 'ellip','SystemObject',true); hfvt = fvtool(hiirlpnorm,hellip,'Color','White'); legend(hfvt,'IIRLPNORM design','ELLIP design');
Очевидно, что эллиптический проект (зеленым цветом) теперь приводит к гораздо более широкой ширине перехода.
Подобно equiripple или наименьшим квадратным проектам, мы можем взвесить критерии оптимизации, чтобы изменить дизайн, как мы считаем нужным. Однако, в отличие от equiripple, у нас есть дополнительная гибкость в предоставлении различных весов для каждой частотной точки вместо для каждой частотной полосы.
Примите во внимание следующие два высокочастотных фильтра:
d = fdesign.highpass('Nb,Na,Fst,Fp',6,4,.6,.7) %#ok
d = highpass with properties: Specification: 'Nb,Na,Fst,Fp' Response: 'Highpass' Description: {4x1 cell} NormalizedFrequency: 1 NumOrder: 6 DenOrder: 4 Fstop: 0.6000 Fpass: 0.7000
h1 = design(d,'iirlpnorm','Wpass',1,'Wstop',10,'SystemObject',true); h2 = design(d,'iirlpnorm','Wpass',1,'Wstop',[100 10],'SystemObject',true); hfvt = fvtool(h1,h2,'Color','White'); legend(hfvt,'Same weight for entire band',... 'Different weights in stopband');
Первый проект использует тот же вес на полосу (10 в полосе стопора, 1 в полосе пропускания). Второй проект использует другой вес на точку частоты. Это обеспечивает простой способ достижения наклонной стопорной полосы, которая может быть желательной в некоторых приложениях. Дополнительное ослабление над фрагментами стопорной полосы происходит за счет большей неравномерности в полосе пропускания и ширины перехода.
Грубо говоря, оптимальный проект достигается путем минимизации ошибки между фактическим спроектированным фильтром и идеальным фильтром в смысле Pth-нормы. Различные значения нормы приводят к различным проектам. При определении P-й нормы мы фактически задаем два значения, 'InitNorm' и 'Norm', где 'InitNorm' является начальным значением нормы, используемой алгоритмом, и 'Norm' является конечным (фактическим) значением, для которого оптимизирован проект. Запуск оптимизации с меньшим начальным значением способствует сходимости алгоритма.
По умолчанию алгоритм начинает оптимизацию в 2-норма смысле, но, наконец, оптимизирует проект в 128-нормальном смысле. 128-норма на практике приводит к хорошему приближению к норме по бесконечности. Так что проекты имеют тенденцию быть равноудаленными. Для проекта методом наименьших квадратов мы должны установить норму равную 2. Для образца рассмотрите следующий lowpass фильтр
d = fdesign.lowpass('Nb,Na,Fp,Fst',10,7,.25,.35); design(d,'iirlpnorm','Norm',2,'SystemObject',true); fig = gcf; fig.Color = [1 1 1];
Еще одной из важных функций IIRLPNORM является его способность проектировать фильтры кроме базовых lowpass, highpass, bandpass и bandstop. Смотрите пример Создания фильтра Произвольная величина для получения дополнительной информации. Сейчас мы покажем несколько примеров:
Вот фильтр для формирования шума при симуляции канала беспроводной связи Релеевского замирания
F1 = 0:0.01:0.4; A1 = 1.0 ./ (1 - (F1./0.42).^2).^0.25; F2 = [0.45 1]; A2 = [0 0]; d = fdesign.arbmag('Nb,Na,B,F,A',4,6,2,F1,A1,F2,A2); design(d,'iirlpnorm','SystemObject',true); fig = gcf; fig.Color = [1 1 1];
Следующая конструкция моделирует поглощение света в определенном газе. Получившийся фильтр оказывается примерно линейно-фазовым:
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)]; design(d, 'iirlpnorm', 'Weights', W, 'Norm', 2, 'DensityFactor', 30,... 'SystemObject',true); fig = gcf; fig.Color = 'white';