メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

複素バンドパス フィルター設計

この例では、複素数バンドパス フィルターの設計法を示します。複素バンドパス フィルターは、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)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Frequency (kHz), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Frequency (kHz), ylabel Magnitude (dB) contains an object of type line.

visualize 関数を使用して、さまざまなフィルター段階の応答を可視化します。

visualize(bp);

Figure contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (Hz), ylabel Magnitude (dB) (normalized to 0 dB) contains 4 objects of type line. These objects represent Filter #1, Filter #2, Filter #3, Filter #4.

最初のフィルターのみが 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"])

参考

| | | | | | | |

トピック