The Negligible Lab

Astray in the forest of electrical and electronic circuits. Adrift in the gap between time and frequency domains. 独立独歩を是とする。

連続系の代表的な伝達関数の双一次変換による離散化

はじめに

連続系では1次遅れ要素や2次遅れ要素など,代表的な伝達関数というものがあります,例えば,

G_{1}(s) = \displaystyle \frac{\omega_{n}}{s + \omega_{n}}, \quad G_{2}(s) = \displaystyle \frac{\omega_{n}^{2}}{s^{2} + 2 \zeta \omega_{n} s + \omega_{n}^{2}} \tag{1}

などですね。

制御器やフィルタなどをもともと連続系で考えていた場合,マイコンFPGAに実装しようとする際には離散系に変換する必要が生じます。 このときのテクニックのひとつに双一次変換(bilinear transformまたはTustin transformとも)があります。これは,

s = \displaystyle \frac{2}{T_{s}} \frac{1 - z^{-1}}{1 + z^{-1}} \tag{2}

として,s領域の伝達関数z領域の伝達関数に変換する手法です。ここでT_{s}はサンプリング周期です。

動機と方法

双一次変換については,各種教科書・参考書で「変換できる」という記述は見掛けるのですが,実際に(記号計算として)変換した結果はあまり見たことがありませんでした。 そこで,Pythonの数式処理ライブラリSymPyを用いて,計算してみることにしました。

結果

連続系の様々な伝達関数を双一次変換してみました。結果は下表をご覧下さい。

要素名 連続系における伝達関数 双一次変換に基づく離散系における伝達関数
積分要素 \displaystyle \frac{1}{s T} \displaystyle \frac{\frac{T _ {s}}{2 T} + \frac{T _ {s}}{2 T} z^{-1}}{1 - z^{-1}}
1次LPF (1) \displaystyle \frac{1}{1 + sT} \displaystyle \frac{\frac{T _ {s}}{T _ {s} + 2 T} + \frac{T _ {s}}{T _ {s} + 2 T} z^{-1}}{1 - \frac{2 T - T _ {s}}{2 T + T _ {s}} z^{-1}}
1次LPF (2) \displaystyle \frac{\omega _ {n}}{s + \omega _ {n}} \displaystyle \frac{\frac{\omega _ {n} T _ {s}}{\omega _ {n} T _ {s} + 2} + \frac{\omega _ {n} T _ {s}}{\omega _ {n} T _ {s} + 2} z^{-1}}{1 - \frac{2 - \omega _ {n} T _ {s}}{2 + \omega _ {n} T _ {s}} z^{-1}}
1次HPF (1) \displaystyle \frac{s T}{1 + s T} \displaystyle \frac{\frac{2 T}{T _ {s} + 2 T} - \frac{2 T}{T _ {s} + 2 T} z^{-1}}{1 - \frac{2 T - T _ {s}}{2 T + T _ {s}} z^{-1}}
1次HPF (2) \displaystyle \frac{s}{s + \omega _ {n}} \displaystyle \frac{\frac{2}{\omega _ {n} T _ {s} + 2} - \frac{2}{\omega _ {n} T _ {s} + 2} z^{-1}}{1 - \frac{2 - \omega _ {n} T _ {s}}{2 + \omega _ {n} T _ {s}} z^{-1}}
2次LPF \displaystyle \frac{\omega _ {n}^{2}}{s^{2} + 2 \zeta \omega _ {n} s + \omega _ {n}^{2}} \displaystyle \frac{\frac{1}{1 + M + N} + \frac{2}{1 + M + N} z^{-1} + \frac{1}{1 + M + N} z^{-2}}{1 + \frac{2 (1 - N)}{1 + M + N} z^{-1} + \frac{1 - M + N}{1 + M + N} z^{-2}}
2次HPF \displaystyle \frac{s^{2}}{s^{2} + 2 \zeta \omega _ {n} s + \omega _ {n}^{2}} \displaystyle \frac{\frac{N}{1 + M + N} - \frac{2 N}{1 + M + N} z^{-1} + \frac{N}{1 + M + N} z^{-2}}{1 + \frac{2 (1 - N)}{1 + M + N} z^{-1} + \frac{1 - M + N}{1 + M + N} z^{-2}}
2次BPF \displaystyle \frac{2 \zeta \omega _ {n} s}{s^{2} + 2 \zeta \omega _ {n} s + \omega _ {n}^{2}} \displaystyle \frac{\frac{M}{1 + M + N} - \frac{M}{1 + M + N} z^{-2}}{1 + \frac{2 (1 - N)}{1 + M + N} z^{-1} + \frac{1 - M + N}{1 + M + N} z^{-2}}
2次BEF \displaystyle \frac{s^{2} + \omega _ {n}^{2}}{s^{2} + 2 \zeta \omega _ {n} s + \omega _ {n}^{2}} \displaystyle \frac{\frac{1 + N}{1 + M + N} + \frac{2 (1 - N)}{1 + M + N} z^{-1} + \frac{1 + N}{1 + M + N}}{1 + \frac{2 (1 - N)}{1 + M + N} z^{-1} + \frac{1 - M + N}{1 + M + N} z^{-2}}
位相遅れ補償 \alpha \displaystyle \frac{T _ {1} s  + 1}{\alpha T _ {1} s + 1}, \quad (\alpha \gt 0) \displaystyle \frac{\frac{\alpha (T _ {s} + 2 T _ {1})}{T _ {s} + 2 \alpha T _ {1}} + \frac{\alpha (T _ {s} - 2 T _ {1})}{T _ {s} + 2 \alpha T _ {1}} z^{-1}}{1 + \frac{T _ {s} - 2 \alpha T _ {1}}{T _ {s} + 2 \alpha T _ {1}} z^{-1}}
位相進み補償 \displaystyle \frac{T _ {2} s  + 1}{\beta T _ {2} s + 1}, \quad (\beta \lt 0) \displaystyle \frac{\frac{T _ {s} + 2 T _ {2}}{T _ {s} + 2 \beta T _ {2}} + \frac{T _ {s} - 2 T _ {2}}{T _ {s} + 2 \beta T _ {2}} z^{-1}}{1 + \frac{T _ {s} - 2 \beta T _ {2}}{T _ {s} + 2 \beta T _ {2}} z^{-1}}

ただし,

s = \displaystyle \frac{2}{T _ {s}} \frac{1 - z^{-1}}{1 + z^{-1}},\quad M = \displaystyle  \frac{4 \zeta}{\omega _ {n} T _ {s}}, \quad N =\displaystyle  \frac{4}{\omega _ {n}^{2} T _ {s}^{2}}  \tag{3}

です。

なお,SymPyでの数式処理については,GitHubにJupyter Notebookを置いておきましたのでご興味がございましたらご覧ください。

github.com

ただし…! 微分要素は意図したとおりに動いていないので,このブログの上表からは除いてあります…!

LTspice XVIIへの実装と確認

後日このブログにも書きたいと思いますが,LTspiceでもステートマシンを記述する".machine"文をうまく使うと,サンプリングを(力技ながら)表現できます。 上表のz領域での伝達関数は分母におけるzの0次の項が1となるように整理しています。 この場合,下記のすずむしさんのブログ記事のようにIIRフィルタを実装できます。

suzumushi0.hatenablog.com

これをLTspiceに実装し,上記の変換表が正しいのかどうか,確認してみました。

1次要素の連続系と双一次変換による離散化

2次要素の連続系と双一次変換による離散化

位相進み要素と位相遅れ要素の連続系と双一次変換による離散化

波形を見る限り,正しく動作しているように見えますね🎵