Наименьшее количество Pth-нормы оптимальное БИХ-создание фильтра

В этом примере показано, как спроектировать оптимальные БИХ-фильтры с произвольным ответом величины с помощью наименее неограниченного алгоритма оптимизации.

Основные принципы IIRLPNORM

Алгоритм 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

Для простых проектов однако (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, у нас есть дополнительная гибкость обеспечения различных весов для каждой точки частоты вместо для каждого диапазона частот.

Рассмотрите следующие два фильтра highpass:

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-норма

Примерно говоря, оптимальный проект достигается путем минимизации ошибки между фактическим спроектированным фильтром, и идеал просачиваются смысл Pth-нормы. Различные значения нормы приводят к различным проектам. При определении нормы P-th мы на самом деле задаем два значения, 'InitNorm' и 'Норму', где 'InitNorm' является начальным значением нормы, используемой алгоритмом, и 'Норма' является финалом (фактическое) значение, для которого оптимизирован проект. Запуск оптимизации с меньшим начальным значением помогает в сходимости алгоритма.

По умолчанию алгоритм начинает оптимизировать в смысле 2-нормы, но наконец оптимизирует проект в смысле с 128 нормами. С 128 нормами в практике дает к хорошему приближению норме по бесконечности. Так, чтобы проекты имели тенденцию быть equiripple. Для проекта наименьших квадратов мы должны установить норму на 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, полосы пропускания и 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];

Оптическое поглощение атомарного пара 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)];
design(d, 'iirlpnorm', 'Weights', W, 'Norm', 2, 'DensityFactor', 30,...
    'SystemObject',true);
fig = gcf;
fig.Color = 'white';