Этот пример показывает, как спроектировать фильтры с произвольной амплитудной характеристикой. Семейство созданий фильтра (FDESIGN) позволяет проектировать фильтры с различными типами откликов. Среди этих типов произвольная величина является менее специализированной и наиболее универсальной. Приведенные ниже примеры иллюстрируют, как проекты произвольной величины могут решить проблемы, когда другие типы отклика находят ограничения.
Этот раздел иллюстрирует случай, когда амплитуда фильтра задана в полной области значений Найквиста (нет расслабленных или «не заботятся» областей). В следующем примере используется один (полный) тип спецификации полосы и алгоритм устойчивой частотной дискретизации для разработки фильтра, амплитуда которого задана в трех разделах: синусоидальном сечении, кусочно-линейном сечении и квадратичном сечении. Необходимо выбрать большой порядок фильтра, потому что форма фильтра довольно сложная:
N = 300; B1 = 0:0.01:0.18; B2 = [.2 .38 .4 .55 .562 .585 .6 .78]; B3 = 0.79:0.01:1; A1 = .5+sin(2*pi*7.5*B1)/4; % Sinusoidal section A2 = [.5 2.3 1 1 -.2 -.2 1 1]; % Piecewise linear section A3 = .2+18*(1-B3).^2; % Quadratic section F = [B1 B2 B3]; A = [A1 A2 A3]; d = fdesign.arbmag('N,F,A',N,F,A); Hd = design(d,'freqsamp','SystemObject',true); fvtool(Hd,'MagnitudeDisplay','Zero-phase','Color','White');
close(gcf)
В предыдущем примере нормированные частотные точки были распределены между 0 и pi рад/выборка (включена экстрема). Можно также задать отрицательные частоты и получить комплексные фильтры. В следующем примере моделируется комплексный RF полосно-пропускающий фильтр и использует окно Кайзера, чтобы уменьшить эффекты явления Гиббса, которое происходит из-за разрыва величины 70 дБ между частотами -pi и pi rad/sample:
load cfir.mat; % load a predefined set of frequency and amplitude vectors N = 200; d = fdesign.arbmag('N,F,A',N,F,A); Hd = design(d,'freqsamp', 'window' ,{@kaiser,20},'SystemObject',true); fvtool(Hd,'FrequencyRange','[-pi, pi)','Color','White');
Алгоритм equiripple хорошо подходит для моделирования сглаживающих функций, как показано в следующем примере, который моделирует экспоненциал с конечной импульсной характеристикой фильтром минимального порядка. Пример задает небольшое значение пульсации на всех частотах и задает веса, которые увеличиваются пропорционально желаемой амплитуде, чтобы улучшить эффективность на высоких частотах:
F = linspace(0,1,100); A = exp(-2*pi*F); R = 0.045; % ripple W = .1-20*log10(abs(A)); % weights d = fdesign.arbmag('F,A,R',F,A,R); Hd = design(d,'equiripple','weights',W,'SystemObject',true); fvtool(Hd,'MagnitudeDisplay','Zero-phase', 'FrequencyRange','[0, pi)',... 'Color','White');
В некоторых приложениях может быть интересно сформировать полосу стопора фильтра, чтобы, например, минимизировать интегрированные уровни боковых лепестков или улучшить робастность квантования. В следующем примере проектируется фильтр lowpass с полосой упора лестницы. Чтобы достичь проекта, он использует распределение весов, которые увеличивают ослабление каждого шага на 5 дБ в полосе остановки:
N = 150; F = [0 .25 .3 .4 .401 .5 .501 .6 .601 .7 .701 .8 .801 .9 .901 1]; A = [1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; W = 10.^([0 0 5 5 10 10 15 15 20 20 25 25 30 30 35 35]/20); d = fdesign.arbmag('N,F,A',N,F,A); Hd1 = design(d,'equiripple','weights',W,'SystemObject',true);
В следующем примере представлен альтернативный проект, основанная на использовании многодиапазонного подхода, который задает две полосы (полосу пропускания и полосу упора), разделенные областью «не заботится» (или полосой перехода):
B = 2; % Number of bands F1 = F(1:2); % Passband F2 = F(3:end); % Stopband % F(2:3)=[.25 .3] % Transition band A1 = A(1:2); A2 = A(3:end); W1 = W(1:2); W2 = W(3:end); d = fdesign.arbmag('N,B,F,A',N,B,F1,A1,F2,A2); Hd2 = design(d,'equiripple','B1Weights',W1,'B2Weights',W2,... 'SystemObject',true); hfvt = fvtool(Hd1,Hd2,'MagnitudeDisplay','Magnitude (dB)','Legend','On',... 'Color','White'); legend(hfvt, 'Single-Band Design', 'Multi-Band Design');
Заметьте явное преимущество многополосного подхода. Расслабляя ограничения в переходной области, алгоритм equiripple сходится к решению с более низкими неравномерностями в полосе пропускания и большим затуханием в полосе задерживания. Другими словами, частотные характеристики первого фильтра могут быть согласованы с более низким порядком. Следующий пример иллюстрирует этот последний комментарий путем получения эквивалентных фильтров с использованием проектов минимального порядка.
Проекты минимального порядка требуют спецификации одного значения пульсации на полосу. В данном примере установите пульсацию равной 0,0195 во всех полосах.
R = 0.0195; % Single-band minimum order design d = fdesign.arbmag('F,A,R',F,A,R); Hd1 = design(d,'equiripple','Weights',W,'SystemObject',true); % Multi-band minimum order design d = fdesign.arbmag('B,F,A,R',B,F1,A1,R,F2,A2,R); Hd2 = design(d,'equiripple','B1Weights',W1,'B2Weights',W2,... 'SystemObject',true); hfvt = fvtool(Hd1,Hd2,'Color','White'); legend(hfvt, 'Single-Band Minimum Order Design', ... 'Multi-Band Minimum Order Design');
Неравномерности в полосе пропускания и затухание в полосе задерживания обоих проектов совпадают. Однако однополосный проект имеет порядок 152, в то время как многополосный проект имеет порядок 72.
order(Hd)
ans = 32
Многополосные проекты equiripple позволяют вам задавать ограничения пульсации для различных полос, задавать одночастотные полосы и принуждать заданные частотные точки к заданным значениям.
В следующем примере проектируется фильтр полосы пропускания 80-го порядка с ослаблением 60 дБ в первой полосе остановки и 40 дБ во второй полосе остановки. За счет ослабления второй стопорной полосы пульсация в полосе пропускания уменьшается при сохранении того же порядка фильтра.
N = 80; % filter order B = 3; % number of bands d = fdesign.arbmag('N,B,F,A,C',N,B,[0 0.25],[0 0],true,... [0.3 0.6],[1 1],false,[0.65 1],[0 0],true)
d = arbmag with properties: Response: 'Arbitrary Magnitude' Specification: 'N,B,F,A,C' Description: {4x1 cell} NormalizedFrequency: 1 FilterOrder: 80 NBands: 3 B1Frequencies: [0 0.2500] B1Amplitudes: [0 0] B1Constrained: 1 B1Ripple: 0.2000 B2Frequencies: [0.3000 0.6000] B2Amplitudes: [1 1] B2Constrained: 0 B3Frequencies: [0.6500 1] B3Amplitudes: [0 0] B3Constrained: 1 B3Ripple: 0.2000
The B1Constrained
и B3Constrained
свойства были установлены на true, чтобы указать, что первая и третья полосы являются ограниченными полосами. Задайте значение пульсации для i-го ограниченной полосы, используя BiRipple
свойство:
d.B1Ripple = 10^(-60/20); % Attenuation for the first stopband d.B3Ripple = 10^(-40/20); % Attenuation for the second stopband Hd = design(d,'equiripple','SystemObject',true)
Hd = dsp.FIRFilter with properties: Structure: 'Direct form' NumeratorSource: 'Property' Numerator: [1x81 double] InitialConditions: 0 Show all properties
fvtool(Hd,'Legend','Off','Color','White');
В следующем примере разработан фильтр равновесия минимального порядка с двумя надрезами в точности 0,25 * pi и 0,55 * pi rad/sample, и с пульсацией 0,15 в полосах пропускания.
B = 5; % number of bands d = fdesign.arbmag('B,F,A,R',B); d.B1Frequencies = [0 0.2]; d.B1Amplitudes = [1 1]; d.B1Ripple = 0.15; d.B2Frequencies = 0.25; % single-frequency band d.B2Amplitudes = 0; d.B3Frequencies = [0.3 0.5]; d.B3Amplitudes = [1 1]; d.B3Ripple = 0.15; d.B4Frequencies = 0.55; % single-frequency band d.B4Amplitudes = 0; d.B5Frequencies = [0.6 1]; d.B5Amplitudes = [1 1]; d.B5Ripple = 0.15; Hd = design(d,'equiripple','SystemObject',true); fvtool(Hd,'Color','White');
В следующем примере проектируется высокочастотный фильтр с ребром стопорной полосы со скоростью 100 Гц и ребром полосы пропускания со частотой 150 Гц. Предположим, что вы хотите отклонить сильную интерференцию 60 Гц, не добавляя дополнительный фильтр или не увеличивая порядок фильтра на большую величину. Сделать это можно, заставив величину ответ highpass-фильтра равняться 0 при 60 Гц:
B = 2; % number of bands N = 92; % filter order Fs = 2e3; % sampling frequency d = fdesign.arbmag('N,B,F,A',N,B,[0 60 100],[0 0 0],[150 1000],[1 1],Fs);
Используйте B1ForcedFrequencyPoints
опция проекта, чтобы заставить точку 60 Гц к заданному значению амплитуды.
Hd = design(d,'equiripple','B1ForcedFrequencyPoints',60,... 'SystemObject',true); hfvt = fvtool(Hd,'Fs', Fs,'Color','White');
Масштабируйте диапазон остановок фильтра высокой частоты, чтобы заметить, что амплитуда равна нулю в заданной частотной точке 60 Гц:
hfvt.MagnitudeDisplay = 'Magnitude';
xlim([0 100])
ylim([0 0.015])
Как и в случае конечной импульсной характеристики, проблемы, связанные с проектом БИХ, где переходная полоса не может быть легко идентифицирована, лучше всего решить с помощью подхода с одной (полной) полосой спецификаций. В качестве примера моделируйте оптическое поглощение газа (атомарного 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)]; Hd = design(d, 'iirlpnorm', 'Weights', W, 'Norm', 2, 'DensityFactor',30,... 'SystemObject',true); fvtool(Hd, 'MagnitudeDisplay','Magnitude (dB)', ... 'NormalizedFrequency','On','Color','White');
В других случаях, когда ограничения могут быть ослаблены в одной или нескольких полосах переходов, многодиапазонный подход обеспечивает те же преимущества, что и в случае конечной импульсной характеристики (а именно, лучшие характеристики полосы пропускания и полосы упора). Следующий пример иллюстрирует эти различия путем моделирования канала радиосвязи Релеевского замирания:
Nb = 4; Na = 6; F = [0:0.01:0.4 .45 1]; A = [1.0./(1-(F(1:end-2)./0.42).^2).^0.25 0 0]; d = fdesign.arbmag('Nb,Na,F,A',Nb,Na,F,A); % single-band design Hd1 = design(d,'iirlpnorm','SystemObject',true); B = 2; F1 = F(1:end-2); % Passband F2 = F(end-1:end); % Stopband % F(end-2:end-1)=[.4 .45] % Transition band A1 = A(1:end-2); A2 = A(end-1:end); d = fdesign.arbmag('Nb,Na,B,F,A',Nb,Na,B,F1,A1,F2,A2); % multi-band design Hd2 = design(d,'iirlpnorm','SystemObject',true); hfvt = fvtool(Hd1,Hd2,'Color','White'); legend(hfvt, 'Single-Band Design', 'Multi-Band Design');