Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

この例では、複素数バンドパス フィルターの設計法を示します。複素バンドパス フィルターは、IF サブサンプリング デジタル周波数変換器からアナログとデジタル TV 放送の残留側波帯変調スキームまで、多くの用途で使用されます。複素バンドパス フィルターを設計する簡単な方法は、ローパス プロトタイプから開始して、複素シフト周波数変換を適用することです。この例では、単一ステージのシングルレート FIR フィルターから、多段のマルチレート FIR フィルターや IIR フィルターまで、ローパス プロトタイプのいくつかのケースを検証します。

単一ステージのシングルレート FIR 設計

シングルレート FIR 設計の場合、係数の各セットを複素指数で乗算します (「周波数変換処理を施す」とも言われます)。次の例では、ローパス ナイキスト フィルター プロトタイプの零点を正規化周波数 0.6 で回転させます。

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

Figure Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 2 objects of type line. These objects represent Lowpass Prototype, Complex Bandpass.

同じ手法は、単一ステージのマルチレート フィルターにも適用されます。

マルチレートの多段 FIR 設計

マルチレートの多段 FIR フィルターの場合、各フィルターの異なる相対周波数を考慮に入れる必要があります。多段間引きの場合、目的の周波数シフトは最初のステージにのみ適用されます。後続のステージも該当する累積間引き係数で目的の周波数シフトをスケールしなければなりません。

Hd = designMultistageDecimator(16,16,0.1,75);

Fc  = -.2;                          % Desired frequency shift 
Hdbp = clone(Hd);

Fck = Fc;
for k = 1:Hdbp.getNumStages
    Stagek = Hdbp.(sprintf('Stage%i',k));
    Nk = length(Stagek.Numerator)-1;
    Stagek.Numerator = Stagek.Numerator.*exp(1j*Fck*pi*(0:Nk));

    % Update the frequency shift applied to the k-th stage
    Fck = Fck* Stagek.DecimationFactor; 
end

hfvt = fvtool(Hd,Hdbp);
legend(hfvt,'Lowpass Prototype','Complex Bandpass',Location='NorthWest')

Figure Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 3 objects of type line. These objects represent Lowpass Prototype, Complex Bandpass.

同様に、多段内挿の場合、目的の周波数シフトは最後のステージにのみ適用されます。それ以前のステージも該当する内挿係数で目的の周波数シフトをスケールしなければなりません。

Hi = designMultistageInterpolator(16,16,0.1,75);

Fc = .4;                               % Desired frequency shift 
Hibp = clone(Hi);

Fck = Fc;
for k = Hibp.getNumStages:-1:1
    Stagek = Hibp.(sprintf('Stage%i',k));
    Nk = length(Stagek.Numerator)-1;
    Stagek.Numerator = Stagek.Numerator.*exp(1j*Fck*pi*(0:Nk));

    % Update the frequency shift applied to the k-th stage
    Fck = Fck* Stagek.InterpolationFactor;
end

hfvt = fvtool(Hi,Hibp);
legend(hfvt,'Lowpass Prototype','Complex Bandpass',Location='NorthWest')

Figure Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 3 objects of type line. These objects represent Lowpass Prototype, Complex Bandpass.

dsp.ComplexBandpassDecimator 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 contains an object of type line. Axes object 2 contains an object of type line.

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

visualizeFilterStages(bp);

Figure Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (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.SOSMatrix(:,1:3);
A = Hiirlp.SOSMatrix(:,4:6);

% 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);

hfvt = fvtool(Hiirlp,Hiircbp);
legend(hfvt,'Lowpass Prototype', 'Complex Bandpass',Location='NorthWest')

Figure Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 2 objects of type line. These objects represent Lowpass Prototype, Complex Bandpass.