Этот пример показывает, как разработать фильтры, данные настроенное значение и спецификации фазы. Пользовательское значение и спецификации проекта фазы используются для коррекции значения и искажений фазы, найденных в системах передачи данных (коррекция канала) или в сверхдискретизированном 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));