ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

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

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

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

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

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

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

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));
set(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));
set(hfvt,'Filters',[Hi,Hibp])
legend(hfvt,'Lowpass Prototype','Complex Bandpass','Location','NorthWest')

シングルレート IIR 設計

最後に、シングルレート IIR 設計の場合、複素シフト周波数変換またはローパスから複素バンドパス IIR 変換のいずれかを使用できます。後者の場合、バンドパス フィルターの帯域幅も変更できます。

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
set(hfvt,'Filters',[Hiirlp,Hiircbp,Hiircbp2])
legend(hfvt,'Lowpass Prototype','Complex Bandpass #1',...
    'Complex Bandpass #2','Location','NorthWest')

この情報は役に立ちましたか?