メインコンテンツ

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

butter

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

説明

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

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

メモ

伝達関数の次数を 4 次まで減らして IIR フィルターを設計すると、数値的に不安定となる可能性があります。伝達関数の形式に影響する数値的問題の詳細については、伝達関数と CTFを参照してください。

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

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

[___] = butter(___,"s") は、前の構文のいずれかの入力引数または出力引数を使用して、アナログ バタワース フィルターを設計します。

[B,A] = butter(n,Wn,"ctf") は、2 次のカスケード伝達関数 (CTF) を使用して、ローパス デジタル バタワース フィルターを設計します。この関数は、フィルター セクションのカスケードとして表されるフィルター伝達関数の分母と分子の多項式係数をリストする行列を返します。この方法により、単一セクションの伝達関数と比べて数値安定性が向上した IIR フィルターが生成されます。 (R2024b 以降)

[___] = butter(n,Wn,ftype,"ctf") は、ローパス、ハイパス、バンドパス、またはバンドストップのデジタル バタワース フィルターを設計し、CTF 形式を使用してフィルター表現を返します。得られる設計セクションは、2 次 (ローパス フィルターとハイパス フィルター) または 4 次 (バンドパス フィルターとバンドストップ フィルター) になります。 (R2024b 以降)

[___,gS] = butter(___) は、システムの全体的なゲインも返します。gS を返すには、"ctf" を指定しなければなりません。 (R2024b 以降)

すべて折りたたむ

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])

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

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)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

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)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

低域カットオフ周波数 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)

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

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

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

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

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

n = 5;
wc = 2*pi*2e9;
w = 2*pi*1e9*logspace(-2,1,4096)';

[zb,pb,kb] = butter(n,wc,"s");
[bb,ab] = zp2tf(zb,pb,kb);
[hb,wb] = freqs(bb,ab,w);
gdb = -diff(unwrap(angle(hb)))./diff(wb);

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

[z1,p1,k1] = cheby1(n,3,wc,"s");
[b1,a1] = zp2tf(z1,p1,k1);
[h1,w1] = freqs(b1,a1,w);
gd1 = -diff(unwrap(angle(h1)))./diff(w1);

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

[z2,p2,k2] = cheby2(n,30,wc,"s");
[b2,a2] = zp2tf(z2,p2,k2);
[h2,w2] = freqs(b2,a2,w);
gd2 = -diff(unwrap(angle(h2)))./diff(w2);

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

[ze,pe,ke] = ellip(n,3,30,wc,"s");
[be,ae] = zp2tf(ze,pe,ke);
[he,we] = freqs(be,ae,w);
gde = -diff(unwrap(angle(he)))./diff(we);

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

[zf,pf,kf] = besself(n,wc);
[bf,af] = zp2tf(zf,pf,kf);
[hf,wf] = freqs(bf,af,w);
gdf = -diff(unwrap(angle(hf)))./diff(wf);

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

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

Figure contains an axes object. The axes object with xlabel Frequency (GHz), ylabel Attenuation (dB) contains 5 objects of type line. These objects represent butter, cheby1, cheby2, ellip, besself.

サンプル単位で群遅延をプロットします。周波数をギガヘルツで、群遅延をナノ秒で表します。フィルターを比較します。

gdns = [gdb gd1 gd2 gde gdf]*1e9;
gdns(gdns<0) = NaN;
loglog(fGHz(2:end,:),gdns)
grid on
xlabel("Frequency (GHz)")
ylabel("Group delay (ns)")
legend(["butter" "cheby1" "cheby2" "ellip" "besself"])

Figure contains an axes object. The axes object with xlabel Frequency (GHz), ylabel Group delay (ns) contains 5 objects of type line. These objects represent butter, cheby1, cheby2, ellip, besself.

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

カットオフ周波数が 300 Hz、サンプル レートが 1000 Hz である 9 次のハイパス バタワース フィルターを設計します。フィルター システムの係数を、2 次セクションのカスケードとして返します。

Wn = 300/(1000/2);
[B,A] = butter(9,Wn,"high","ctf")
B = 5×3

    0.2544   -0.2544         0
    0.2544   -0.5088    0.2544
    0.2544   -0.5088    0.2544
    0.2544   -0.5088    0.2544
    0.2544   -0.5088    0.2544

A = 5×3

    1.0000    0.1584         0
    1.0000    0.3264    0.0561
    1.0000    0.3575    0.1570
    1.0000    0.4189    0.3554
    1.0000    0.5304    0.7165

フィルターの振幅応答をプロットします。

filterAnalyzer(B,A)

入力引数

すべて折りたたむ

フィルター次数。500 以下の整数スカラーとして指定します。バンドパスおよびバンドストップの設計では、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 の場合、この関数は、r 個のサンプルの ba を返します。ここで、ローパス フィルターとハイパス フィルターの場合は r = n+1、バンドパス フィルターとバンドストップ フィルターの場合は r = 2*n+1 です。

伝達関数は、b = [b1 b2br]a = [a1 a2ar] を使用し、次のいずれかとして表されます。

  • デジタル フィルターの場合: H(z)=b1+b2z1++brz(r1)a1+a2z1++arz(r1)

  • アナログ フィルターの場合: H(s)=b1sr1+b2sr2++bra1sr1+a2sr2++ar

データ型: double

フィルターの零点、極、およびゲイン。2 つの列ベクトルと 1 つのスカラーとして返されます。フィルターの次数が n の場合、この関数は、r 個のサンプルの zp を返します。ここで、ローパス フィルターとハイパス フィルターの場合は r = n、バンドパス フィルターとバンドストップ フィルターの場合は r = 2*n です。

伝達関数は、z = [z1 z2zr]p = [p1 p2pr]、および k を使用し、次のいずれかとして表されます。

  • デジタル フィルターの場合: H(z)=k(1z1z1)(1z2z1)(1zrz1)(1p1z1)(1p2z1)(1prz1)

  • アナログ フィルターの場合: H(s)=k(sz1)(sz2)(szr)(sp1)(sp2)(spr)

データ型: double

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

状態空間行列は、状態ベクトル x、入力 u、出力 y の関係を以下のいずれかの連立方程式で表します。

  • デジタル フィルターの場合:

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

  • アナログ フィルターの場合:

    x˙=Ax+Buy=Cx+Du.

データ型: double

R2024b 以降

カスケード伝達関数 (CTF) 係数。行ベクトルまたは行列として返されます。BA は、それぞれカスケード伝達関数の分子係数と分母係数をリストします。

BA のサイズは、それぞれ L 行 (m+1) 列と L 行 (n+1) 列です。この関数は、A の最初の列を 1 として返すため、A が行ベクトルの場合、A(1)=1 となります。

  • L はフィルター セクションの数を表します。

  • m はフィルターの分子の次数を表します。

  • n はフィルターの分母の次数を表します。

butter 関数は、次のように次数を指定して CTF 係数を返します。

  • ローパス フィルターとハイパス フィルターの場合: m = n = 2

  • バンドパス フィルターとバンドストップ フィルターの場合: m = n = 4

メモ

CTF 係数の次数の変更やゲインのスケーリングのカスタマイズといった、CTF 係数の計算のカスタマイズを行うには、z,p,k を返すように指定し、zp2ctf を使用して B,A を取得します。

カスケード伝達関数の形式と係数行列の詳細については、CTF 形式でのデジタル フィルターの取得を参照してください。

R2024b 以降

全体のシステム ゲイン。実数値スカラーとして返されます。

  • gS を返すように指定した場合、butter 関数は、B の最初の列が 1 となるように分子係数を正規化し、システム全体のゲインを gS で返します。

  • gS を返すように指定しない場合、butter 関数は、scaleFilterSections 関数を使用してシステム内のすべてのセクションにシステム ゲインを均一に分散します。

詳細

すべて折りたたむ

アルゴリズム

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

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

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

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

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

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

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

参照

[1] Lyons, Richard G. Understanding Digital Signal Processing. Upper Saddle River, NJ: Prentice Hall, 2004.

拡張機能

すべて展開する

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

バージョン履歴

R2006a より前に導入

すべて展開する