このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
複素バンドパス フィルター設計
この例では、複素数バンドパス フィルターの設計法を示します。複素バンドパス フィルターは、IF サブサンプリング デジタル周波数変換器からアナログとデジタル TV 放送の残留側波帯変調スキームまで、多くの用途で使用されます。複素バンドパス フィルターを設計する簡単な方法は、ローパス プロトタイプから開始して、複素シフト周波数変換を適用することです。この例では、単一ステージのシングルレート FIR フィルターから、多段のマルチレート FIR フィルターや IIR フィルターまで、ローパス プロトタイプを検証します。
単一ステージのシングルレート FIR 設計とマルチレート FIR 設計
シングルレート FIR 設計に複素周波数シフトを適用するには、フィルター係数に複素指数を乗算します (「ヘテロダイン処理を施す」とも言われます)。
function modNum = modulateFIR(Num,Fc) N = length(Num)-1; modNum = Num.*exp(1j*Fc*pi*(0:N)); end
たとえば、ローパス ナイキスト フィルターのプロトタイプを正規化周波数 0.6 で変換します。
% Lowpass prototype Hlp = design(fdesign.nyquist(8),SystemObject=true); Fc = .6; % Desired frequency shift Hbp = clone(Hlp); Hbp.Numerator = modulateFIR(Hbp.Numerator,Fc); FA = filterAnalyzer(Hlp,Hbp,FrequencyRange='centered'); setLegendStrings(FA,["Lowpass Prototype","Complex Bandpass"]);
プロトタイプ フィルターと変換後のフィルターの零点を調べます。周波数シフトにより、ローパス プロトタイプの零点が正規化周波数 0.6 だけ回転します。
setLegendStrings(FA,["Lowpass Prototype","Complex Bandpass"]); newDisplayNum = duplicateDisplays(FA); setAnalysisOptions(FA,DisplayNums=newDisplayNum,Analysis='polezero');
同じ手法は、単一ステージのマルチレート フィルターにも適用できます。
多段のマルチレート FIR 設計
多段マルチレート FIR フィルターでは、各段の係数が複素指数で乗算されます。各段が動作するさまざまな相対周波数を考慮に入れる必要があります。たとえば、次数 16 の多段間引きについて考えます。このような間引きは、designRateConverter
関数を使用して設計できます。この特定の設計には 4 つの段 (各段は 2 分の 1 にダウンサンプリングする間引き) があります。
Hd = designRateConverter(DecimationFactor=16,OutputSampleRate=1,Bandwidth=0.45,StopbandAttenuation=75,Verbose=true)
designRateConverter(InterpolationFactor=1, DecimationFactor=16, OutputSampleRate=1, Bandwidth=0.45, StopbandAttenuation=75, MaxStages=Inf, CostMethod="estimate", Tolerance=0, ToleranceUnits="absolute") Conversion ratio: 1:16 Input sample rate: 16 Output sample rate: 1
Hd = dsp.FilterCascade with properties: Stage1: [1×1 dsp.FIRDecimator] Stage2: [1×1 dsp.FIRDecimator] Stage3: [1×1 dsp.FIRDecimator] Stage4: [1×1 dsp.FIRDecimator] CloneStages: true
多段間引きでは、目的の周波数シフトは 1 つ目の段にのみ適用されます。後続の段も該当する累積間引き係数で目的の周波数シフトをスケールしなければなりません。
Fc = -.2; % Desired frequency shift Hdbp = clone(Hd); Fck = Fc; for k = 1:Hdbp.getNumStages Stagek = Hdbp.(sprintf('Stage%i',k)); Stagek.Numerator = modulateFIR(Stagek.Numerator, Fck); % Update the frequency shift applied to the k-th stage Fck = Fck*Stagek.DecimationFactor; end FA = filterAnalyzer(Hd,Hdbp,FrequencyRange='centered'); setLegendStrings(FA,["Multistage Lowpass Prototype Decimator (Single-stage Equivalent)","Multistage Complex Bandpass Decimator (Single-stage Equivalent)"])
同様に、多段内挿では、目的の周波数シフトは最後の段にのみ適用されます。それ以前の段も該当する内挿係数で目的の周波数シフトをスケールしなければなりません。
Hi = designRateConverter(InterpolationFactor=16,InputSampleRate=1,Bandwidth=0.45,StopbandAttenuation=75); Fc = .4; % Desired frequency shift Hibp = clone(Hi); Fck = Fc; for k = Hibp.getNumStages:-1:1 Stagek = Hibp.(sprintf('Stage%i',k)); Stagek.Numerator = modulateFIR(Stagek.Numerator, Fck); % Update the frequency shift applied to the k-th stage Fck = Fck*Stagek.InterpolationFactor; end FA = filterAnalyzer(Hi,Hibp,FrequencyRange='centered'); setLegendStrings(FA,["Multistage Lowpass Prototype Interpolator (Single-stage Equivalent)","Multistage Complex Bandpass Interpolator (Single-stage Equivalent)"])
dsp.ComplexBandpassDecimator
System object™ を使用すると、多段バンドパス フィルターを容易に設計できます。オブジェクトは、指定された間引き係数、中心周波数およびサンプル レートに基づいてバンドパス フィルターを設計します。前の手順で設計したフィルターのようにローパス係数をバンドパスに変換する必要はありません。オブジェクトがそれを行います。
System object を使用して、間引き係数が 16、中心周波数が 5 KHz、サンプル レートが 44.1 KHz、遷移幅が 100 Hz、阻止帯域の減衰量が 75 dB の複素バンドパス フィルターを設計します。
bp = dsp.ComplexBandpassDecimator(16,5000,SampleRate=44100,... TransitionWidth=100,... StopbandAttenuation=75);
関数 freqz
を使用してフィルター応答を可視化します。
freqz(bp)
visualize
関数を使用して、さまざまなフィルター段階の応答を可視化します。
visualize(bp);
最初のフィルターのみが 5 KHz にシフトされます。後続のフィルター段階はローパスであり、実数係数をもっています。MinimizeComplexCoefficients
プロパティを false に設定し、すべてのフィルター段階を 5000 KHz にシフトします。
関数 cost
を使用してバンドパス フィルターのコストを計算します。
cost(bp)
ans = struct with fields:
NumCoefficients: 144
NumStates: 272
RealMultiplicationsPerInputSample: 27.8750
RealAdditionsPerInputSample: 27
シングルレート IIR 設計
シングルレート IIR 設計では、複素周波数シフト変換またはローパスからの複素バンドパス IIR 変換のいずれかを使用できます。後者の場合、バンドパス フィルターの帯域幅も変更できます。
Fp = .2; % Design a lowpass prototype, and obtain the second order coefficients Hiirlp = design(fdesign.lowpass(Fp,.25,.5,80),'ellip',SystemObject=true); B = (Hiirlp.ScaleValues(1:end-1)').*Hiirlp.Numerator; A = Hiirlp.Denominator; % Perform lowpass to complex bandpass transform Fc = .6; % Desired frequency shift [Bc,Ac] = iirlp2bpc(B,A, ... % Transform lowpass to complex bandpass Fp,[Fc-Fp, Fc+Fp]); % Lowpass passband frequency mapped % to bandpass passband frequencies % Construct a filter object and plot the responses Hiircbp = dsp.SOSFilter(Bc, Ac); FA = filterAnalyzer(Hiirlp,Hiircbp,FrequencyRange='centered'); setLegendStrings(FA,["IIR Lowpass Prototype","IIR Complex Bandpass"])
参考
designMultistageDecimator
| designMultistageInterpolator
| dsp.ComplexBandpassDecimator
| dsp.FIRFilter
| dsp.SOSFilter
| iirlp2bpc
| cost
| visualize
| freqz