Произвольное создание фильтра величины

В этом примере показано, как спроектировать фильтры с произвольным ответом величины. Семейство создания фильтра (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 и рад/выборка пи (включенное экстремальное значение). Можно также задать отрицательные частоты и получить комплексные фильтры. Следующий пример демонстрирует комплексный полосовой фильтр RF и использует окно Кайзера, чтобы смягчить последствия Явления Гиббса, которое происходит из-за разрыва величины на 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');