Произвольный проект фильтра значения и фазы

Этот пример показывает, как разработать фильтры, данные настроенное значение и спецификации фазы. Пользовательское значение и спецификации проекта фазы используются для коррекции значения и искажений фазы, найденных в системах передачи данных (коррекция канала) или в сверхдискретизированном ADC (компенсация за неидеальные характеристики оборудования, например). Эти методы также допускают проект фильтров, которые имеют меньшие групповые задержки, чем линейные фильтры фазы и меньше искажения, чем фильтры минимальной фазы для данного распоряжения.

КИХ-моделирование

В этом первом примере мы сравниваем несколько КИХ-методов проектирования, чтобы смоделировать значение и фазу комплексного полосового фильтра РФ, заданного на полной области значений Найквиста (существует не ослаблено, или "не заботятся" об областях).

load cpxbp.mat
f = fdesign.arbmagnphase('N,F,H',100,F1,H1);
Hd = design(f,'allfir');
hfvt = fvtool(Hd, 'Color','w');
legend(hfvt,'Equiripple', 'FIR Least-Squares','Frequency Sampling', ...
    'Location', 'NorthEast')
hfvt(2) = fvtool(Hd,'Analysis','phase','Color','white');
legend(hfvt(2),'Equiripple', 'FIR Least-Squares','Frequency Sampling')

ax = hfvt(2).CurrentAxes;
ax.NextPlot = 'add';
pidx = find(F1>=0);
plot(ax,F1,[fliplr(unwrap(angle(H1(pidx-1:-1:1)))) ... % Mask
    unwrap(angle(H1(pidx:end)))],'k--')

БИХ-проект

Затем, мы разрабатываем highpass БИХ-фильтр приблизительно с линейной фазой полосы пропускания. Осторожность должна использоваться при использовании этого БИХ-метода проектирования, поскольку устойчивость фильтра не гарантируется.

F = [linspace(0,.475,50) linspace(.525,1,50)];
H = [zeros(1,50) exp(-1j*pi*13*F(51:100))];
f = fdesign.arbmagnphase('Nb,Na,F,H',12,10,F,H);
W = [ones(1,50) 100*ones(1,50)];
Hd = design(f,'iirls','Weights',W);
isstable(Hd)
ans =

  logical

   1

close(hfvt(1));
close(hfvt(2));
hfvt = fvtool(Hd, 'Color','w');
legend(hfvt,'IIR Least-Squares','Location', 'NorthWest')
hfvt(2) = fvtool(Hd,'Analysis','phase','Color','white');
legend(hfvt(2),'IIR Least-Squares','Location', 'NorthEast')

Полосовой КИХ-фильтр с низкой групповой задержкой

Иногда интересно бросить точную линейность фазы в порядке уменьшать задержку фильтра при поддержании хорошего приближения линейности фазы в полосе пропускания. Давайте зададим 3 полосы полосового фильтра:

F1 = linspace(0,.25,30);  % Lower stopband
F2 = linspace(.3,.56,40); % Passband
F3 = linspace(.62,1,30);  % Higher stopband
N = 50;  % Filter Order
gd = 12; % Desired Group Delay
H1 = zeros(size(F1));
H2 = exp(-1j*pi*gd*F2);
H3 = zeros(size(F3));
f = fdesign.arbmagnphase('N,B,F,H',N,3,F1,H1,F2,H2,F3,H3);
Hd = design(f,'equiripple');

Соответствуя линейному проекту фазы, мы видим, что групповая задержка уменьшается наполовину, в то время как фазовый отклик остается приблизительно линейным в полосе пропускания.

f = fdesign.arbmag('N,B,F,A',N,3,F1,abs(H1),F2,abs(H2),F3,abs(H3));
Hd(2) = design(f,'equiripple');
close(hfvt(1));
close(hfvt(2));
hfvt = fvtool(Hd, 'Color', 'w');
legend(hfvt,'Low Group Delay', 'Linear Phase', 'Location', 'NorthEast')
hfvt(2) = fvtool(Hd,'Analysis','grpdelay','Color','w');
legend(hfvt(2),'Low Group Delay', 'Linear Phase', 'Location', 'NorthEast')
axis([.3 .56 0 35])

hfvt(2).Analysis = 'phase';
hfvt(2).Color = 'w';
axis([.3 .56 -30 10])

Коррекция полосы пропускания фильтра Чебышева Лоупэсса

Типичная проблема состоит в том, чтобы компенсировать нелинейные фазовые отклики БИХ-фильтров. В этом примере мы будем работать с 3-м порядком Чебышевский Тип я, lowpass фильтруют с нормированной частотой полосы пропускания 1/16 и.5 дБ пульсаций полосы пропускания.

Fp = 1/16;  % Passband frequency
Ap = .5;    % Passband ripples
f = fdesign.lowpass('N,Fp,Ap',3,Fp,Ap);
Hcheby = design(f,'cheby1');
close(hfvt(1));
close(hfvt(2));
hfvt = fvtool(Hcheby,'Color','w');
legend(hfvt, 'Chebyshev Lowpass');
hfvt(2) = fvtool(Hcheby,'Color','w','Analysis','grpdelay');
legend(hfvt(2), 'Chebyshev Lowpass');

Проект цифрового КИХ-эквалайзера с 2 полосами. Мы выбираем подход с 2 полосами, потому что мы хотим сконцентрировать наши усилия в полосе пропускания. Мы стремимся к плоской групповой задержке 35 выборок в полосе пропускания.

Gd = 35;    % Passband Group Delay of the equalized filter (linear phase)
F1 = 0:5e-4:Fp; % Passband
D1 = exp(-1j*Gd*pi*F1)./freqz(Hcheby,F1*pi);
Fst = 3/16; % Stopband
F2 = linspace(Fst,1,100);
D2 = zeros(1,length(F2));
f = fdesign.arbmagnphase('N,B,F,H',51,2,F1,D1,F2,D2);
Hfirls = design(f,'firls');      % Least-Squares design
Heqrip = design(f,'equiripple'); % Equiripple design

Коррекция значения

Пульсации полосы пропускания ослабляются после коррекции от.5 дБ до.27dB для эквалайзера наименьших квадратов и.16 дБ для equiripple эквалайзера.

close(hfvt(1));
close(hfvt(2));
hfvt = fvtool(Hcheby,cascade(Hcheby,Hfirls),cascade(Hcheby,Heqrip), ...
    'Color','w');
legend(hfvt,'Chebyshev Lowpass','Least-Squares Equalization (cascade)', ...
    'Equiripple Equalization (cascade)', 'Location', 'NorthEast')
hfvt(2) = fvtool(Hcheby,cascade(Hcheby,Hfirls),cascade(Hcheby,Heqrip), ...
    'Color','w');
legend(hfvt(2),'Chebyshev Lowpass', ...
    'Least-Squares Equalization (cascade)', ...
    'Equiripple Equalization (cascade)', 'Location', 'NorthEast')
axis([0 .1 -.8 .5])

Фаза (групповая задержка) коррекция

Групповая задержка полосы пропускания компенсировалась от пика, чтобы достигнуть максимума различие 8,8 выборок к.51 выборкам с эквалайзером наименьших квадратов и.62 выборкам с equiripple эквалайзером.

hfvt(2).Analysis = 'grpdelay';
axis([0 1 0 40])
hfvt(3) = fvtool(Hcheby,cascade(Hcheby,Hfirls),cascade(Hcheby,Heqrip), ...
    'Analysis', 'grpdelay','Color','w');
legend(hfvt(3),'Chebyshev Lowpass', ...
    'Least-Squares Equalization (cascade)', ...
    'Equiripple Equalization (cascade)', 'Location', 'NorthEast')
axis([0 Fp 34 36])

close(hfvt(1));
close(hfvt(2));
close(hfvt(3));