Main Content

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

butter

バタワース フィルターの設計

説明

[b,a] = butter(n,Wn) は、正規化されたカットオフ周波数 Wn をもつ n 次のローパス デジタル バタワース フィルターの伝達関数の係数を返します。

[b,a] = butter(n,Wn,ftype)ftype の値および Wn の要素数に応じてローパス、ハイパス、バンドパスまたはバンドストップのバタワース フィルターを設計します。得られるバンドパスおよびバンドストップの設計は次数が 2n です。

メモ: 伝達関数形式の作成に影響する数値的問題の詳細については、制限を参照してください。

[z,p,k] = butter(___) はローパス、ハイパス、バンドパスまたはバンドストップのデジタル バタワース フィルターを設計し、その零点、極およびゲインを返します。この構文には、前の構文の任意の入力引数を含めることができます。

[A,B,C,D] = butter(___) はローパス、ハイパス、バンドパスまたはバンドストップのデジタル バタワース フィルターを設計し、その状態空間表現を指定する行列を返します。

[___] = butter(___,'s') はカットオフ角周波数 Wn をもつ、ローパス、ハイパス、バンドパスまたはバンドストップのアナログ バタワース フィルターを設計します。

すべて折りたたむ

1000 Hz でサンプリングされたデータに対し、カットオフ周波数 300 Hz (0.6π ラジアン/サンプルに相当) をもつ 6 次のローパス バタワース フィルターを設計します。その振幅応答と位相応答をプロットします。これを使用して、1,000 サンプルのランダム信号をフィルター処理します。

fc = 300;
fs = 1000;

[b,a] = butter(6,fc/(fs/2));

freqz(b,a,[],fs)

subplot(2,1,1)
ylim([-100 20])

dataIn = randn(1000,1);
dataOut = filter(b,a,dataIn);

0.2π および 0.6π ラジアン/サンプルの正規化されたエッジ周波数をもつ 6 次のバタワース バンドストップ フィルターを設計します。その振幅応答と位相応答をプロットします。これを使用してランダム データをフィルター処理します。

[b,a] = butter(3,[0.2 0.6],'stop');
freqz(b,a)

dataIn = randn(1000,1);
dataOut = filter(b,a,dataIn);

9 次のハイパス バタワース フィルターを設計します。1000 Hz でサンプリングされたデータに対し、カットオフ周波数 300 Hz (0.6π ラジアン/サンプルに相当) を指定します。その振幅応答と位相応答を表示します。零点、極、およびゲインを 2 次セクションに変換します。フィルターの周波数応答を表示します。

[z,p,k] = butter(9,300/500,"high");
sos = zp2sos(z,p,k);
freqz(sos)

低域カットオフ周波数 500 Hz と高域カットオフ周波数 560 Hz をもつ 20 次のバタワース バンドパス フィルターを設計します。サンプル レート 1500 Hz を指定します。状態空間表現を使用します。状態空間表現を 2 次セクションに変換します。周波数応答を可視化します。

fs = 1500;
[A,B,C,D] = butter(10,[500 560]/(fs/2));
sos = ss2sos(A,B,C,D);
freqz(sos,[],fs)

designfilt を使用して同じフィルターを設計します。周波数応答を可視化します。

d = designfilt("bandpassiir",FilterOrder=20, ...
    HalfPowerFrequency1=500,HalfPowerFrequency2=560, ...
    SampleRate=fs);
freqz(d,[],fs)

カットオフ周波数 2 GHz をもつ 5 次のアナログ バタワース ローパス フィルターを設計します。2π 倍にして周波数を秒あたりのラジアン単位に変換します。4096 点でのフィルターの周波数応答を計算します。

n = 5;
fc = 2e9;

[zb,pb,kb] = butter(n,2*pi*fc,"s");
[bb,ab] = zp2tf(zb,pb,kb);
[hb,wb] = freqs(bb,ab,4096);

同じエッジ周波数と通過帯域リップル 3 dB をもつ 5 次のチェビシェフ I 型フィルターを設計します。その周波数応答を計算します。

[z1,p1,k1] = cheby1(n,3,2*pi*fc,"s");
[b1,a1] = zp2tf(z1,p1,k1);
[h1,w1] = freqs(b1,a1,4096);

同じエッジ周波数と阻止帯域の減衰量 30 dB をもつ 5 次のチェビシェフ II 型フィルターを設計します。その周波数応答を計算します。

[z2,p2,k2] = cheby2(n,30,2*pi*fc,"s");
[b2,a2] = zp2tf(z2,p2,k2);
[h2,w2] = freqs(b2,a2,4096);

同じエッジ周波数、通過帯域リップル 3 dB および阻止帯域の減衰量 30 dB をもつ 5 次の楕円フィルターを設計します。その周波数応答を計算します。

[ze,pe,ke] = ellip(n,3,30,2*pi*fc,"s");
[be,ae] = zp2tf(ze,pe,ke);
[he,we] = freqs(be,ae,4096);

同じエッジ周波数をもつ 5 次のベッセル フィルターを設計します。その周波数応答を計算します。

[zf,pf,kf] = besself(n,2*pi*fc);
[bf,af] = zp2tf(zf,pf,kf);
[hf,wf] = freqs(bf,af,4096);

減衰をデシベルでプロットします。周波数をギガヘルツで表します。フィルターを比較します。

plot([wb w1 w2 we wf]/(2e9*pi), ...
    mag2db(abs([hb h1 h2 he hf])))
axis([0 5 -45 5])
grid
xlabel("Frequency (GHz)")
ylabel("Attenuation (dB)")
legend(["butter" "cheby1" "cheby2" "ellip" "besself"])

バタワース フィルターおよびチェビシェフ II 型フィルターには平坦な通過帯域と広い遷移帯域幅があります。チェビシェフ I 型フィルターおよび楕円フィルターは速くロールオフしますが、通過帯域リップルがあります。チェビシェフ II 型設計関数に対する周波数入力は、通過帯域の末尾ではなく阻止帯域の始点を設定します。ベッセル フィルターは、通過帯域に沿って定数近似群遅延をもちます。

入力引数

すべて折りたたむ

フィルター次数。整数スカラーで指定します。バンドパスおよびバンドストップの設計では、n がフィルター次数の 1/2 を表します。

データ型: double

カットオフ周波数。スカラーまたは 2 要素ベクトルとして指定します。カットオフ周波数は、フィルターの振幅応答が 1 / √2 となる周波数です。

  • Wn がスカラーの場合、butter は、カットオフ周波数 Wn をもつローパス フィルターまたはハイパス フィルターを設計します。

    Wn が 2 要素ベクトル [w1 w2] (ここで、w1 < w2) の場合、butter は低域カットオフ周波数 w1 および高域カットオフ周波数 w2 をもつバンドパス フィルターまたはバンドストップ フィルターを設計します。

  • デジタル フィルターの場合、カットオフ周波数は 0 ~ 1 の間でなければなりません。ここで 1 はナイキスト レート — サンプル レートの 1/2 つまり π ラジアン/サンプルに相当します。

    アナログ フィルターの場合、カットオフ周波数は必ずラジアン/秒で表示され、任意の正の値をとることができます。

データ型: double

フィルターの種類。次のいずれかとして指定します。

  • 'low' はカットオフ周波数 Wn をもつローパス フィルターを指定します。'low' はスカラー Wn の既定値です。

  • 'high' はカットオフ周波数 Wn をもつハイパス フィルターを指定します。

  • Wn が 2 要素ベクトルの場合、'bandpass' は次数 2n のバンドパス フィルターを指定します。'bandpass' は、Wn が 2 要素をもつ場合の既定値です。

  • Wn が 2 要素ベクトルの場合、'stop' は次数 2n のバンドストップ フィルターを指定します。

出力引数

すべて折りたたむ

フィルターの伝達関数の係数。ローパス フィルターおよびハイパス フィルターの場合は長さ n + 1 の行ベクトルとして、バンドパス フィルターおよびバンドストップ フィルターの場合は長さ 2n + 1 の行ベクトルとして返されます。

  • デジタル フィルターの場合、伝達関数は b および a で以下のように表されます。

    H(z)=b1+b2z1++brz(r1)a1+a2z1++arz(r1)

  • アナログ フィルターの場合、伝達関数は b および a で以下のように表されます。

    H(s)=b1sr1+b2sr2++bra1sr1+a2sr2++ar

データ型: double

フィルターのゼロ、極、ゲイン。長さ n (バンドパス設計とバンドストップ設計の場合は 2n) およびスカラーの 2 つの列ベクトルとして返されます。

  • デジタル フィルターの場合、伝達関数は zp および k で以下のように表されます。

    H(z)=k(1z1z1)(1z2z1)(1zrz1)(1p1z1)(1p2z1)(1prz1)

  • アナログ フィルターの場合、伝達関数は zp および k で以下のように表されます。

    H(s)=k(sz1)(sz2)(szr)(sp1)(sp2)(spr)

データ型: double

フィルターの状態空間表現。行列として返されます。ローパス設計とハイパス設計の場合、m = n で、バンドパス フィルターとバンドストップ フィルターの場合に m = 2n ならば、Am × m で、Bm × 1、C は 1 × mD は 1 × 1 となります。

  • デジタル フィルターの場合、状態空間の行列は状態ベクトル x、入力 u および出力 y を以下の式により表します。

    x(k+1)=Ax(k)+Bu(k)y(k)=Cx(k)+Du(k).

  • アナログ フィルターの場合、状態空間の行列は状態ベクトル x、入力 u および出力 y を以下の式により表します。

    x˙=Ax+Buy=Cx+Du.

データ型: double

詳細

すべて折りたたむ

制限

伝達関数構文の数値的不安定性

一般に、IIR フィルターを設計する場合は、[z,p,k] 構文を使用します。フィルターを解析または実装する場合は、[z,p,k] の出力を zp2sos で使用します。[b,a] 構文を使用するフィルターを設計する場合、数値の問題が発生することがあります。これらの問題は、丸め誤差によるものであり、n が 4 の低さの場合に発生することがあります。以下の例はこの制限を示しています。

n = 6;
Wn = [2.5e6 29e6]/500e6;
ftype = 'bandpass';

% Transfer Function design
[b,a] = butter(n,Wn,ftype);      % This is an unstable filter

% Zero-Pole-Gain design
[z,p,k] = butter(n,Wn,ftype);
sos = zp2sos(z,p,k);

% Display and compare results
[h,f] = freqz(b,a,8192);
hsos = freqz(sos,8192);

semilogx(f/pi,mag2db(abs([h hsos])))
grid
legend('TF Design','ZPK Design')
xlabel('Normalized Frequency (\times\pi rad/sample)')
ylabel('Magnitude (dB)')

アルゴリズム

バタワース フィルターは、通過帯域で振幅応答が最大フラットで全体に単調な振幅応答をもちます。この滑らかさはロールオフの急峻さが低減することで得られます。楕円フィルターとチェビシェフ フィルターは通常、与えられたフィルター次数に対し、急峻なロールオフを提供します。

butter は、以下の 5 つのステップのアルゴリズムを使用します。

  1. 関数 buttap を使用して、ローパス アナログ プロトタイプの極、零点およびゲインを求めます。

  2. 極、零点、およびゲインを状態空間形式に変換します。

  3. 必要に応じて、状態空間変換を使ってローパス フィルターを、望ましい周波数制約をもつバンドパス、ハイパス、または、バンドストップのフィルターに変換します。

  4. デジタル フィルター設計の場合、bilinear を使用して、プリワーピング周波数をもつ双一次変換によりアナログ フィルターをデジタル フィルターに変換します。周波数を慎重に調整することで、アナログ フィルターとデジタル フィルターが Wn、あるいは w1w2 で確実に同じ周波数応答の振幅をもつようになります。

  5. 必要に応じて、状態空間フィルターを伝達関数、または、零点-極-ゲイン形式に逆変換します。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2006a より前に導入