Main Content

bilinear

アナログ デジタル フィルター変換用の双一次変換

説明

[zd,pd,kd] = bilinear(z,p,k,fs) では、zpk、およびサンプル レート fs で指定される s 領域の伝達関数が等価な離散関数に極-零点形式で変換されます。

[numd,dend] = bilinear(num,den,fs) では、分子 num と分母 den で指定される s 領域の伝達関数が等価な離散関数に変換されます。

[Ad,Bd,Cd,Dd] = bilinear(A,B,C,D,fs) では、行列 ABC、および D の連続時間状態空間システムが離散時間システムに変換されます。

[___] = bilinear(___,fp) はパラメーター fp を "一致する" 周波数として使用し、プリワープを指定します。

すべて折りたたむ

6 dB の通過帯域のリップルをもつ 10 次のチェビシェフ I 型フィルターのプロトタイプを設計します。プロトタイプを状態空間形式に変換します。

[z,p,k] = cheb1ap(10,6);
[A,B,C,D] = zp2ss(z,p,k);  

プロトタイプをバンドパス フィルターに変換し、同等のデジタル フィルターが fs=2 kHz のレートでサンプリングされた場合に 100 Hz および 500 Hz でエッジをもつ通過帯域をもつようにします。変換に際しては、プリワープされた帯域エッジ u1 u2 (rad/s 単位)、中心周波数 Wo=u1u2、および帯域幅 Bw=u2-u1 を指定します。

fs = 2e3;

f1 = 100; u1 = 2*fs*tan(f1*(2*pi/fs)/2);
f2 = 500; u2 = 2*fs*tan(f2*(2*pi/fs)/2);

[At,Bt,Ct,Dt] = lp2bp(A,B,C,D,sqrt(u1*u2),u2-u1);

freqs を使用してアナログ フィルターの周波数応答を計算します。振幅応答とプリワープされた周波数帯域エッジをプロットします。

[b,a] = ss2tf(At,Bt,Ct,Dt);
[h,w] = freqs(b,a,2048);

plot(w,mag2db(abs(h)))
xline([u1 u2],"-",["Lower" "Upper"]+" passband edge", ...
    LabelVerticalAlignment="middle")

ylim([-165 5])
xlabel("Angular frequency (rad/s)")
ylabel("Magnitude (dB)")
grid

Figure contains an axes object. The axes object with xlabel Angular frequency (rad/s), ylabel Magnitude (dB) contains 3 objects of type line, constantline.

関数 bilinear を使用して、サンプル レート fs をもつデジタル バンドパス フィルターを作成します。

[Ad,Bd,Cd,Dd] = bilinear(At,Bt,Ct,Dt,fs);

デジタル フィルターを状態空間形式から 2 次セクションに変換し、freqz を使用して周波数応答を計算します。振幅応答と通過帯域エッジをプロットします。

[hd,fd] = freqz(ss2sos(Ad,Bd,Cd,Dd),2048,fs);

plot(fd,mag2db(abs(hd)))
xline([f1 f2],"-",["Lower" "Upper"]+" passband edge", ...
    LabelVerticalAlignment="middle")

ylim([-165 5])
xlabel("Frequency (Hz)")
ylabel("Magnitude (dB)")
grid

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Magnitude (dB) contains 3 objects of type line, constantline.

5 dB の通過帯域リップル、90 dB の阻止帯域減衰量、および fc=20 Hz のカットオフ周波数をもつ 6 次の楕円アナログ ローパス フィルターを設計します。

fc = 20;

[z,p,k] = ellip(6,5,90,2*pi*fc,"s");

アナログ楕円フィルターの振幅応答を可視化します。カットオフ周波数を表示します。

[num,den] = zp2tf(z,p,k);
[h,w] = freqs(num,den,1024);

plot(w/(2*pi),mag2db(abs(h)))
xline(fc,Color=[0.8500 0.3250 0.0980])

axis([0 100 -125 5])
grid
legend(["Magnitude response" "Cutoff frequency"])
xlabel("Frequency (Hz)")
ylabel("Magnitude (dB)")

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Magnitude (dB) contains 2 objects of type line, constantline. These objects represent Magnitude response, Cutoff frequency.

関数 bilinear を使用して、アナログ フィルターを離散時間 IIR フィルターに変換します。サンプル レートを fs=200 Hz に、プリワーピング一致周波数を fp=20 Hz に指定します。

fs = 200;
fp = 20;

[zd,pd,kd] = bilinear(z,p,k,fs,fp);

離散時間フィルターの振幅応答を可視化します。カットオフ周波数を表示します。

[hd,fd] = freqz(zp2sos(zd,pd,kd),[],fs);

plot(fd,mag2db(abs(hd)))
xline(fc,Color=[0.8500 0.3250 0.0980])

axis([0 100 -125 5])
grid
legend(["Magnitude response" "Cutoff frequency"])
xlabel("Frequency (Hz)")
ylabel("Magnitude (dB)")

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Magnitude (dB) contains 2 objects of type line, constantline. These objects represent Magnitude response, Cutoff frequency.

入力引数

すべて折りたたむ

s 領域伝達関数のゼロ、極およびゲイン。2 つの列ベクトルおよびスカラーとして指定します。

サンプル レート。正のスカラーで指定します。

アナログ伝達関数の分子と分母の係数。行ベクトルとして指定します。

s 領域の状態空間表現。行列として指定します。システムに p 個の入力と q 個の出力があり、n 個の状態変数により記述される場合、A は n 行 n 列、B は n 行 p 列、C は q 行 n 列、D は q 行 p 列になります。

データ型: single | double

一致する周波数。正のスカラーとして指定します。

出力引数

すべて折りたたむ

z 領域伝達関数のゼロ、極およびゲイン。列ベクトルおよびスカラーとして返されます。

デジタル伝達関数の分子と分母の係数。行ベクトルとして返されます。

z 領域の状態空間表現。行列として返されます。システムが n 個の状態変数により記述され、q 個の出力をもつ場合、Ad は n 行 n 列、Bd は n 行 1 列、Cd は q 行 n 列、Dd は q 行 1 列になります。

データ型: single | double

アルゴリズム

すべて折りたたむ

"双一次変換" とは変数の数学的なマッピングで、デジタル フィルター処理において s (アナログ) 平面を z (デジタル) 平面にマッピングする標準的な方法です。この変換では、従来のフィルター設計法を使用して設計されたアナログ フィルターが離散の等価なフィルターに変換されます。

双一次変換では、以下の式によって s 平面が z 平面にマッピングされます。

H(z)=H(s)|s=2fsz1z+1.

この変換では、以下の式を使用して、jΩ 軸 (Ω = -∞ から +∞) が単位円周上 (e、範囲は ω = –π から π) に繰り返しマッピングされます。

ω=2tan1(Ω2fs).

bilinear では、プリワープを指定するオプションのパラメーター Fp を指定することができます。fp は、マッピング処理前後で周波数応答が厳密に一致する "一致する" 周波数を Hz で示します。プリワーピング モードでは、双一次変換によって以下の式を使用して s 平面が z 平面にマッピングされます。

H(z)=H(s)|s=2πfptan(πfpfs)z1z+1.

プリワーピング オプションを選択した場合、bilinear では以下の式を使用して、jΩ 軸 (Ω = –∞ から +∞) が単位円周上 (e、ω = -π から π) に繰り返しマッピングされます。

ω=2tan1(Ωtan(πfpfs)2πfp).

プリワーピング モードでは、bilinear によって s 平面の周波数 2πfp (ラジアン/秒単位) が、z 平面の正規化周波数 2πfp/fs (ラジアン/秒単位) に一致されます。

関数 bilinear では、3 つの異なる線形システム表現を扱うことができます。すなわち、零点-極-ゲイン、伝達関数、および状態空間形式です。

bilinear では、提供した入力線形システムの形式に応じて、2 つのアルゴリズムのいずれかが使用されます。1 つのアルゴリズムは零点-極-ゲイン形式を、もう 1 つのアルゴリズムは状態空間形式を処理します。伝達関数表現に対し、関数 bilinear は状態空間形式に転換し、変換を実行し、結果として得られた状態空間システムを伝達関数形式に逆変換します。

零点-極-ゲイン アルゴリズム

零点-極-ゲイン形式のシステムでは、関数 bilinear によって以下の 4 つのステップが実行されます。

  1. fp が存在する場合、以下のようにプリワーピングが行われます。

    fp = 2*pi*fp;
    fs = fp/tan(fp/fs/2)
    

    そうでない場合は fs = 2*fs となります。

  2. 次のステートメントを使用して、±∞ で零点が削除されます。

    z = z(finite(z));
    
  3. 次のステートメントを使用して、零点、極、およびゲインの変換が行われます。

    pd = (1+p/fs)./(1-p/fs);    % Do bilinear transformation
    zd = (1+z/fs)./(1-z/fs);
    kd = real(k*prod(fs-z)./prod(fs-p));
    
  4. -1 に零点が追加され、結果として得られるシステムの分子と分母の次数が等しくなるようにします。

状態空間アルゴリズム

状態空間形式のアナログ システムは

x˙=Ax+Buy=Cx+Du

で表現されます。このシステムは、次のように状態空間方程式を使用して離散形式に変換されます。

x[n+1]=Adx[n]+Bdu[n],y[n]     =Cdx[n]+Ddu[n].

状態空間形式でアナログ システムを変換するには、bilinear が次の 2 つのステップを実行します。

  1. fp が存在する場合は

    λ=πfptan(πfp/fs).

    に、fp が存在しない場合は λ=fs にします。

  2. 以下を使用して、ABC、および D に対して、AdBdCd、および Dd を計算します。

    Ad=(IA12λ)1(I+A12λ),Bd=1λ(IA12λ)1B,Cd=1λC(IA12λ)1,Dd=12λC(IA12λ)1B+D.

伝達関数

伝達関数形式のシステムの場合、bilinear では、num および den で指定される s 領域の伝達関数が離散の等価な関数に変換されます。行ベクトル num および den では、分子および分母の係数がs の降べきの順でそれぞれ指定されます。Bs を分子の多項式に、As を分母の多項式にします。伝達関数は、次のように表されます。

B(s)A(s)=B(1)sn++B(n)s+B(n+1)A(1)sm++A(m)s+A(m+1)

fs は Hz のサンプル レートです。関数 bilinear では、離散相当が、行ベクトル numddend に z の降べきの順 (z–1 の昇べきの順) で返されます。fp は、プリワーピング用のオプションの一致する周波数を Hz で表したものです。

参照

[1] Oppenheim, Alan V., and Ronald W. Schafer, with John R. Buck. Discrete-Time Signal Processing. Upper Saddle River, NJ: Prentice Hall, 1999.

[2] Parks, Thomas W., and C. Sidney Burrus. Digital Filter Design. New York: John Wiley & Sons, 1987.

拡張機能

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

バージョン履歴

R2006a より前に導入