В этом примере показано, как спроектировать комплексные полосовые фильтры. Комплексные полосовые фильтры используются во многих приложениях от подвыборки 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')