В этом примере показано, как спроектировать фильтры с индивидуально настраиваемой величиной и техническими требованиями фазы. Много проблем создания фильтра фокусируются на ответе величины только при принятии линейного фазового отклика через симметрию. В некоторых случаях, однако, желаемый фильтр должен удовлетворить ограничениям и на величину и на фазу.
Например, пользовательская величина и технические требования проекта фазы могут использоваться для эквализации величины и искажений фазы, найденных в системах передачи данных (эквализация канала) или в сверхдискретизированном ADC (компенсация за неидеальные характеристики оборудования). Другое приложение является проектом фильтров, которые имеют меньшие групповые задержки, чем линейные фильтры фазы и меньше искажения, чем фильтры минимальной фазы для данного распоряжения.
Ответы фильтра обычно задаются интервалами частоты (полосы) наряду с желаемым усилением на каждой полосе. Пользовательская величина и технические требования фильтра фазы подобны, но также и включают фазовый отклик, обычно как комплексное число, кодирующее и усиление и фазовый отклик. В большинстве случаев спецификация ответа состоит из вектора частот F = [f1..., fN] N увеличивающиеся частоты и вектор частотных характеристик H = [h1..., hN] соответствие комплексным значениям отклика фильтра. В DSP System Toolbox™ можно создать объект спецификации фильтров с желаемой частотной характеристикой с помощью fdesign.arbmagnphase
. Если объект спецификации был создан, можно спроектировать КИХ или БИХ-фильтр с помощью design
функция. Для получения дополнительной информации о КИХ и БИХ-алгоритмах проекта, см. [1].
В этом первом примере мы сравниваем несколько КИХ-методов разработки смоделировать величину и фазу комплексного полосового фильтра RF. Во-первых, загрузите желаемую спецификацию фильтра: частоты к вектору F и комплексные значения отклика к вектору H. Постройте усиление и частотные характеристики фазы на левые и правые графики соответственно.
load('gainAndPhase','F','H') % Load frequency response data plotResponse(F, H) % A helper plotting function used in this demo
Создайте объект спецификации использование fdesign.arbmagnphase
с 'N,F,H'
шаблон спецификации. Эта спецификация принимает желаемого порядка фильтра N
, наряду с векторами частотной характеристики F и H. 'N,F,H'
шаблон задает желаемый ответ на целой области значений Найквиста (то есть, спецификация одно полосы без расслабленного "не заботятся" об областях). В этом примере желаемые векторы данных ответа F и H имеют 655 точек, который является относительно плотным через частотный диапазон.
N = 100;
f = fdesign.arbmagnphase('N,F,H',N,F,H);
Определите, какие методы разработки могут использоваться для этого объекта спецификации использование designmethods
функция. В этом случае методы: equiripple
, firls
(наименьшие квадраты) и freqsamp
(выборка частоты).
designmethods(f,'fir')
FIR Design Methods for class fdesign.arbmagnphase (N,F,H): equiripple firls freqsamp
Спроектируйте фильтры с design
функция с помощью требуемого метода из списка выше. Можно также задать 'allfir'
чтобы спроектировать использование всех доступных методов, в этом случае функция возвращает массив ячеек Системных объектов.
Hd = design(f,'allfir',SystemObject = true);
Постройте частотные характеристики фильтров и номинальный ответ в пунктирной линии. equiripple проектируют Hd
(1) кажется, аппроксимирует очень хорошо на полосе пропускания, но немного отклоняется в других областях. Наименьшие квадраты проектируют
Hd
(2) оптимизирован для однородно взвешенной квадратичной нормы (не способствующий одной области или другому), и частота произвела КИХ-проект
Hd
(3) кажется, показывает худшее приближение всех трех.
hfvt = fvtool(Hd{:}, 'Color','w'); legend(hfvt,'Equiripple Hd(1)', 'FIR Least-Squares Hd(2)','Frequency Sampling Hd(3)', ... 'Location', 'NorthEast') ax = hfvt.CurrentAxes; ax.NextPlot = 'add'; plot(ax,F,20*log10(abs(H)),'r--')
hfvt(2) = fvtool(Hd{:},'Analysis','phase','Color','white'); legend(hfvt(2),'Equiripple Hd(1)', 'FIR Least-Squares Hd(2)','Frequency Sampling Hd(3)') ax = hfvt(2).CurrentAxes; ax.NextPlot = 'add'; plot(ax,F,unwrap(angle(H))+2*pi,'r--')
В следующей части мы проектируем БИХ-фильтр. Желаемый фильтр является полуполосой highpass фильтр с линейной фазой на полосе пропускания. Спецификация дана 100 точками на частотном диапазоне как показано в следующем рисунке.
F = [linspace(0,.475,50) linspace(.525,1,50)]; H = [zeros(1,50) exp(-1j*pi*13*F(51:100))]; plotResponse(F, H)
Создайте объект спецификации использование спецификации проекта одно полосы 'Nb, Na, F, H'
, то, которое берет желаемого БИХ, заказывает Na
= 10
(порядок знаменателя) и Nb
= 12
(порядок числителя) как входные параметры. Существует только один метод разработки, доступный для этой спецификации - БИХ-проект наименьших квадратов (iirls
).
Nb = 12;
Na = 10;
f = fdesign.arbmagnphase('Nb,Na,F,H',Nb,Na,F,H);
designmethods(f)
Design Methods for class fdesign.arbmagnphase (Nb,Na,F,H): iirls
iirls
метод разработки позволяет задавать различные веса для различных частот, давая больше контроля качеством приближения каждой полосы. Спроектируйте фильтр с весом 1 на полосе задерживания и весе 100 на полосе пропускания. Высокий вес, данный полосе пропускания, делает приближение более точным на этой области.
W = 1*(F<=0.5) + 100*(F>0.5); Hd = design(f,'iirls','Weights',W);
При использовании БИХ-методов проектирования не гарантируется устойчивость фильтра. Проверяйте БИХ-устойчивость с помощью isstable
функция. Чтобы сделать более полный анализ, исследуйте полюса и как близко они к модульному кругу.
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') ax = hfvt(2).CurrentAxes; ax.NextPlot = 'add'; plot(ax,F,unwrap(angle(H))+2*pi,'r--')
Интересное приложение произвольной величины и проекты фазы являются проектом асимметричных КИХ-фильтров, которые жертвуют линейной фазой в пользу более короткой групповой задержки. Такие фильтры могут все еще быть спроектированы, чтобы обеспечить хорошее приближение линейной фазы на полосе пропускания. Предположим, что у нас есть три полосы для полосового фильтра: полоса задерживания на и на , и полоса пропускания на . На полосе пропускания желаемая частотная характеристика , который имеет линейную фазу reponse с групповой задержкой gd.
F1 = linspace(0,.25,30); % Lower stopband F2 = linspace(.3,.56,40); % Passband F3 = linspace(.62,1,30); % Higher stopband % Define the desired frequency response on the bands gd = 12; % Desired Group Delay H1 = zeros(size(F1)); H2 = exp(-1j*pi*F2*gd); H3 = zeros(size(F3)); F = [F1 F2 F3]; H = [H1 H2 H3];
Постройте желаемую частотную характеристику.
plotResponse(F, H)
Создайте объект спецификации фильтров с помощью 'N,B,F,H'
шаблон спецификации. Здесь, N
= 50
желаемый порядок фильтра, B
= 3
обозначает количество полос, сопровождаемых B
пары F
и H
векторы как прежде.
N = 50; % Filter Order B = 3; % Number of bands f = fdesign.arbmagnphase('N,B,F,H',N,B, F1,H1, F2,H2, F3,H3); Hd_mnp = design(f,'equiripple');
Этот проект не имеет линейной фазы, как видно путем вызова islinphase
функция.
islinphase(Hd_mnp)
ans = logical
0
Теперь создайте спецификацию фильтра только для величины с помощью fdesign.arbmag
. 'N,B,F,A'
шаблон спецификации для этого объекта похож на 'N,B,F,H'
спецификация fdesign.argmagnphase
объект. Различие между этими двумя то, что комплексный ответ фильтра H
в 'N,B,F,H'
заменяется величиной только (неотрицательный действительный) ответ A
в 'N,B,F,A'
.
f_magonly = fdesign.arbmag('N,B,F,A',N,3,F1,abs(H1),F2,abs(H2),F3,abs(H3)); Hd_mo = design(f_magonly,'equiripple');
Спецификация только для величины дает к симметричному проекту с линейной фазой.
islinphase(Hd_mo)
ans = logical
1
subplot(1,2,1); stem(Hd_mnp.Numerator) title('Magnitude and Phase Design (asymetric)') subplot(1,2,2); stem(Hd_mo.Numerator) title('Magnitude-only Design (symmetric)')
Сравните два проекта. Обратите внимание на то, что у них есть очень похожий полосовой ответ величины.
close(hfvt(1)); close(hfvt(2)); hfvt = fvtool(Hd_mnp,Hd_mo, 'Color', 'w'); legend(hfvt,'Magnitude and Phase Design (Low Group Delay)', 'Magnitude Only (Linear Phase, High Group Delay)', 'Location', 'NorthEast')
Постройте групповую задержку. Произвольный проект величины и фазы имеет немного различную групповую задержку. Однако изменение мало и в среднем является 12,5 выборками. Эта групповая задержка является половиной групповой задержки величины, только проектируют, который является 25 выборками.
hfvt(2) = fvtool(Hd_mnp,Hd_mo,'Analysis','grpdelay','Color','w'); legend(hfvt(2),'Magnitude and Phase Design (Low Group Delay)', 'Magnitude Only (Linear Phase, High Group Delay)', 'Location', 'NorthEast') axis([.3 .56 0 35])
Различие в групповых задержках может также быть замечено в фазовом отклике. Более мелкий наклон указывает на меньшую групповую задержку.
hfvt(2).Analysis = 'phase'; hfvt(2).Color = 'w'; axis([.3 .56 -30 10])
Другое распространенное приложение произвольных проектов magnitue-фазы является эквализацией нелинейных фазовых откликов БИХ-фильтров. Считайте третий порядок Типом I Чебышева фильтр lowpass с нормированной частотой полосы пропускания 1/16 и неравномерностями в полосе пропускания 0,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');
Постройте групповую задержку. Существует значительная групповая задержка distorition на полосе пропускания с групповыми задержками в пределах от 10 - 20 выборок.
hfvt(2) = fvtool(Hcheby,'Color','w','Analysis','grpdelay'); legend(hfvt(2), 'Chebyshev Lowpass');
Смягчать искажение в групповой задержке, КИХ-эквалайзере может использоваться после БИХ-фильтра. Идеально, объединенным фильтром является идеальный lowpass. Объединенный фильтр имеет ответ полосы пропускания , устранение величины слегка колеблется к плоскому ответу величины и постоянной групповой задержке выборки. Целевая группа связывается к выделенной КИХ-длине для причинных проектов фильтра. В этом примере, делает разумный выбор.
Подводя итоги, проект эквалайзера имеет две полосы:
На полосе пропускания желаемая частотная характеристика эквалайзера должна быть .
На полосе задерживания желаемый ответ , сопоставимый с .
Эта спецификация проекта 2D полосы гарантирует, что КИХ-приближение эквалайзера фокусируется на полосе пропускания и полосе задерживания только. Остающиеся части частотного диапазона рассматриваются областями-ухода.
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));
Существует несколько КИХ-методов разработки, которые могут использоваться, чтобы реализовать эту КИХ-спецификацию эквалайзера. Сравните эффективность с помощью двух методов разработки: проект наименьших квадратов и проект equiripple.
feq = fdesign.arbmagnphase('N,B,F,H',51,2,F1,D1,F2,D2); Heq_ls = design(feq,'firls'); % Least-Squares design Heq_er = design(feq,'equiripple'); % Equiripple design % Create the cascaded filters Gls = cascade(Hcheby,Heq_ls); Geq = cascade(Hcheby,Heq_er);
Постройте ответы величины каскадных систем для обоих фильтров.
close(hfvt(1)); close(hfvt(2)); hfvt = fvtool(Hcheby,Gls, Geq, 'Color','w'); legend(hfvt,'Chebyshev Lowpass (no equalization)','Least-Squares Equalization (cascade)', ... 'Equiripple Equalization (cascade)', 'Location', 'NorthEast')
Увеличьте масштаб вокруг полосы пропускания. Неравномерности в полосе пропускания ослабляются после того, как эквализация от 0,5 дБ в исходном фильтре к 0,27 дБ с наименьшими квадратами спроектировала эквалайзер, и к 0,16 дБ с equiripple спроектировал эквалайзер.
hfvt(2) = fvtool(Hcheby,Gls,Geq, 'Color','w'); legend(hfvt(2),'Chebyshev Lowpass (no equalization)', ... 'Least-Squares Equalization (cascade)', ... 'Equiripple Equalization (cascade)', 'Location', 'NorthEast') axis([0 .1 -0.8 .5])
Мы теперь поворачиваем к фазе (и групповая задержка) эквализацию. Объединенная групповая задержка является почти постоянной приблизительно 35 выборок (задержка целевой группы) на полосе пропускания. Вне полосы пропускания объединенная групповая задержка является на вид расходящейся, но это незначительно, когда усиление фильтра исчезает на той области.
hfvt(2).Analysis = 'grpdelay';
axis([0 1 0 40])
Увеличьте масштаб вокруг полосы пропускания. Групповая задержка полосы пропускания компенсируется от различия от пика к пику 8,8 выборок к 0,51 выборкам с эквалайзером наименьших квадратов, и к 0,62 выборкам с equiripple эквалайзером. Оба эквалайзера выполняют одинаково хорошо.
hfvt(3) = fvtool(Hcheby,Gls,Geq, 'Analysis', 'grpdelay','Color','w'); legend(hfvt(3),'Chebyshev Lowpass (no equalization)', ... 'Least-Squares Equalization (cascade)', ... 'Equiripple Equalization (cascade)', 'Location', 'NorthEast') axis([0 Fp 34 36])
close(hfvt(1)); close(hfvt(2)); close(hfvt(3));
[1] Оппенхейм, A.V., и Р.В. Шафер, обработка сигналов дискретного времени, Prentice Hall, 1989.