Комплексный проект полосового фильтра

Этот пример показывает, как разработать комплексные полосовые фильтры. Комплексные полосовые фильтры используются во многих приложениях от подвыборки IF, цифровой вниз конвертеры к остаточным схемам модуляции боковой полосы широковещательной передачи аналогового и цифрового телевидения. Один простой способ разработать комплексный полосовой фильтр состоит в том, чтобы запуститься с lowpass, моделируют и применяют комплексное преобразование частоты сдвига. В этом примере мы рассматриваем несколько случаев прототипов lowpass с одноступенчатых односкоростных КИХ-фильтров на многоступенчатые многоскоростные КИХ-фильтры к БИХ-фильтрам.

Одноступенчатый односкоростной КИХ-проект

В случае односкоростного КИХ-проекта мы просто умножаем каждый набор коэффициентов (иначе 'гетеродин с') комплексный экспоненциал. В следующем примере мы вращаем нули lowpass прототипа фильтра Найквиста нормированной частотой.6.

Hlp = design(fdesign.nyquist(8));     % Lowpass prototype
N = length(Hlp.Numerator)-1;
Fc = .6;                              % Desired frequency shift
j = complex(0,1);
Hbp = copy(Hlp);
Hbp.Numerator = Hbp.Numerator.*exp(j*Fc*pi*(0:N));
hfvt = fvtool(Hlp,Hbp,'Color','white');
legend(hfvt,'Lowpass Prototype','Complex Bandpass','Location','NorthWest')

Тот же метод также применяется к одноступенчатым многоскоростным фильтрам.

Многоскоростной многоступенчатый КИХ-проект

В случае многоскоростных многоступенчатых КИХ-фильтров мы должны объяснить различные относительные частоты, с которыми работает каждый фильтр. В случае многоступенчатого decimator желаемый сдвиг частоты применяется только к первой стадии. Последующие этапы должны также масштабировать желаемый сдвиг частоты своим соответствующим совокупным фактором десятикратного уменьшения.

f = fdesign.decimator(16,'nyquist',16,'TW,Ast',.01,75);
Hd = design(f,'multistage');
N1 = length(Hd.Stage(1).Numerator)-1;
N2 = length(Hd.Stage(2).Numerator)-1;
N3 = length(Hd.Stage(3).Numerator)-1;
M12 = Hd.Stage(1).DecimationFactor; % Decimation factor between stage 1 & 2
M23 = Hd.Stage(2).DecimationFactor; % Decimation factor between stage 2 & 3
Fc  = -.2;                          % Desired frequency shift
Fc1 = Fc;                     % Frequency shift applied to the first stage
Fc2 = Fc*M12;                 % Frequency shift applied to the second stage
Fc3 = Fc*M12*M23;             % Frequency shift applied to the third stage
Hdbp = copy(Hd);
Hdbp.Stage(1).Numerator = Hdbp.Stage(1).Numerator.*exp(j*Fc1*pi*(0:N1));
Hdbp.Stage(2).Numerator = Hdbp.Stage(2).Numerator.*exp(j*Fc2*pi*(0:N2));
Hdbp.Stage(3).Numerator = Hdbp.Stage(3).Numerator.*exp(j*Fc3*pi*(0:N3));
hfvt.Filters = [Hd,Hdbp];
legend(hfvt,'Lowpass Prototype','Complex Bandpass','Location','NorthWest')

Точно так же в случае многоступенчатого интерполятора, желаемый сдвиг частоты применяется только к последней стадии. Предыдущие этапы должны также масштабировать желаемый сдвиг частоты своим соответствующим совокупным коэффициентом интерполяции.

f = fdesign.interpolator(16,'nyquist',16,'TW,Ast',.01,75);
Hi = design(f,'multistage');
N1 = length(Hi.Stage(1).Numerator)-1;
N2 = length(Hi.Stage(2).Numerator)-1;
N3 = length(Hi.Stage(3).Numerator)-1;
L12 = Hi.Stage(2).InterpolationFactor; % Interpolation factor
                                       % between stage 1 & 2
L23 = Hi.Stage(3).InterpolationFactor; % Interpolation factor
                                       % between stage 2 & 3
Fc = .4;                               % Desired frequency shift
Fc3 = Fc;                    % Frequency shift applied to the third stage
Fc2 = Fc*L23;                % Frequency shift applied to the second stage
Fc1 = Fc*L12*L23;            % Frequency shift applied to the first stage
Hibp = copy(Hi);
Hibp.Stage(1).Numerator = Hibp.Stage(1).Numerator.*exp(j*Fc1*pi*(0:N1));
Hibp.Stage(2).Numerator = Hibp.Stage(2).Numerator.*exp(j*Fc2*pi*(0:N2));
Hibp.Stage(3).Numerator = Hibp.Stage(3).Numerator.*exp(j*Fc3*pi*(0:N3));
hfvt.Filters = [Hi,Hibp];
legend(hfvt,'Lowpass Prototype','Complex Bandpass','Location','NorthWest')

Мы можем разработать многоступенчатые полосовые фильтры легко при помощи dsp. Системный объект ComplexBandpassDecimator. Объект разрабатывает полосовой фильтр на основе заданного фактора десятикратного уменьшения, центральной частоты и частоты дискретизации. Нет никакой потребности перевести lowpass коэффициенты в полосу пропускания, как мы сделали в разделе выше: объект сделает это для нас.

Разработайте комплексный полосовой фильтр с фактором десятикратного уменьшения 16, центральной частотой 5 кГц, уровнем выборки 44,1 кГц, шириной перехода 100 Гц и затуханием полосы задерживания 75 дБ:

bp = dsp.ComplexBandpassDecimator(16 , 5000, 'SampleRate',44100,...
                                  'TransitionWidth',100,...
                                  'StopbandAttenuation',75);

Визуализируйте ответ фильтра с помощью freqz:

freqz(bp);

Визуализируйте ответ различных этапов фильтра с помощью visualizeFilterStages:

visualizeFilterStages(bp);

Заметьте, что только первый фильтр переключен к 5 кГц. Последующие этапы фильтра являются lowpass и имеют действительные коэффициенты. Установите свойство MinimizeComplexCoefficients на ложь переключать все этапы фильтра к 5 000 кГц.

Получите стоимость полосового фильтра с помощью cost:

cost(bp)
ans = 

  struct with fields:

                      NumCoefficients: 144
                            NumStates: 272
    RealMultiplicationsPerInputSample: 27.8750
          RealAdditionsPerInputSample: 27

Односкоростной БИХ-проект

Наконец в случае односкоростных БИХ-проектов, мы можем или использовать комплексное преобразование частоты сдвига или lowpass, чтобы объединить полосовое БИХ-преобразование. В последнем случае может также быть изменена пропускная способность полосового фильтра.

Fp = .2;
Hiirlp = design(fdesign.lowpass(Fp,.25,.5,80),'ellip');
Fc  = .6;                         % Desired frequency shift
Hiircbp = ciirxform(Hiirlp, ...   % Shift frequency transformation
    'zpkshiftc', 0, Fc);          % DC shifted to Fc
Hiircbp2 = iirlp2bpc(Hiirlp, ...  % Lowpass to complex bandpass transf.
    Fp, [Fc-Fp, Fc+Fp]);          % Lowpass passband frequency mapped
                                  % to bandpass passband frequencies
hfvt.Filters = [Hiirlp,Hiircbp,Hiircbp2];
legend(hfvt,'Lowpass Prototype','Complex Bandpass #1',...
    'Complex Bandpass #2','Location','NorthWest')