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

Этот пример показывает, как разработать фильтры с произвольным ответом значения. Семейство проекта фильтра (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 и рад/выборка пи (включенное экстремальное значение). Можно также задать отрицательные частоты и получить комплексные фильтры. Следующий пример моделирует комплексный полосовой фильтр РФ и использует окно Kaiser, чтобы смягчить последствия Явления Гиббса, которое происходит из-за разрыва значения на 70 дБ между - пи и частоты рада/выборки пи:

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

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');

Одно полоса по сравнению с многополосными КИХ-проектами Equiripple

В определенных приложениях это может представлять интерес сформировать полосу задерживания фильтра к, например, минимизировать интегрированные уровни бокового лепестка или улучшить робастность квантования. Следующий пример разрабатывает фильтр 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 алгоритм сходится к решению с более низкими пульсациями полосы пропускания и большим затуханием полосы задерживания. Другими словами, характеристики частоты первого фильтра могли быть соответствующими низшему порядку. Следующий пример иллюстрирует этот последний комментарий путем получения эквивалентных фильтров с помощью проектов минимального заказа:

% Minimum order designs require the specification of one ripple value per
% band. For this example, set the ripple to 0.0195 in all bands.
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) %#ok
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

Свойства B1Constrained и B3Constrained собирались в истину указать, что первые и третьи полосы являются ограниченными полосами. Укажите, что значение пульсации для ith ограничило полосу, использующую свойство 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);
fvtool(Hd,'Legend','Off','Color','White');

Одно диапазоны частот

Следующий пример разрабатывает минимальный заказ equiripple фильтр с двумя метками в точно 0.25*pi и 0.55*pi рад/выборка, и с пульсацией 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');

Принудительные точки частоты

Следующий пример разрабатывает фильтр highpass с ребром полосы задерживания на уровне 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);
% Use the B1ForcedFrequencyPoints design option to force the 60 Hz point to
% its specified amplitude value
Hd = design(d,'equiripple','B1ForcedFrequencyPoints',60,...
    'SystemObject',true);
hfvt = fvtool(Hd,'Fs', Fs,'Color','White');

Масштабируйте в полосу задерживания фильтра highpass, чтобы заметить, что амплитуда является нулем в заданной точке частоты на 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');