Showing posts with label デジタル信号. Show all posts
Showing posts with label デジタル信号. Show all posts

逐次ベイズ推定とカルマンフィルタ

カルマンフィルタは逐次ベイズフィルタの特殊系として言われますが、式を眺めていても結びつきがさっぱりイメージできなかったので数式いじりをしました。 もっとしっかりした入門は他でたくさん見かけますので、 参考文献として記事のリンクしておきます。

数式操作に関しては須山さんの本を参考にしました。

ベイズ推論による機械学習入門
ベイズ推論による機械学習入門
  • 作者: 須山敦志
  • 出版社/メーカー: 講談社
  • 発売日: 2017/10/21

逐次的ベイズ推定から見たカルマン・フィルタ

セオリーと違ってカルマンフィルタで得たい出力値 状態量 $ \hat{x}_{k|k} $ の位置付けから入ります。理解を簡単にするため、システムとしてD次元の酔歩 $ x_k \in \mathbb{R}^D $と 酔歩する粒子の観測誤差を含む観測値 $ y_{k} \in \mathbb{R}^D $ で考察します。

\[ \begin{array}{rll} x_{n+1} &= x_{n} + w_n & \qquad w_n \sim \mathcal{N}(0, Q) \quad Q \in \mathbb{R}^{D \times D} \\ y_{n} &= x_{n} + v_n & \qquad v_n \sim \mathcal{N}(0, R) \quad R \in \mathbb{R}^{D \times D} \\ \end{array} \]
観測値 $ y_n $ は真の平均値のわからない正規分布 $ \mathcal{N}(x_n, R) $ から取り出されたもので、 このn=1のデータからは、せいぜい $ \hat{x}_n = y_n $ とするのが関の山です。 しかし、うまく $ x_{n+1} - x_{n} \sim \mathcal{N}(0, Q) $ と、 観測したデータ $ Y_n = \{Y_{n-1}, y_{n}\} $ を使って、より高い精度で $ x_n $ を推定することを考えます。

カルマンフィルタの式

システムをざっくり簡略化したので、カルマンフィルタの式もザクッと簡単になります。この式は逐次ベイズ推定から求めた結果とあとから比較するために掲載しました。

予測のステップ
\[ \begin{array}{rl} \hat{x}_{k|k-1} &= \hat{x}_{k-1|k-1} \\ P_{k|k-1} &= P_{k-1|k-1} + Q \\ \end{array} \]
フィルタリングのステップ
\[ \begin{array}{rl} e_k &= y_k - \hat{x}_{k|k-1} \\ S_k &= R + P_{k|k-1} \\ K_k &= P_k S_k^{-1} = P_k (R + P_{k|k-1} )^{-1}\\ \hat{x}_{k|k} &= \hat{x}_{k|k-1} + K_k e_k\\ P_{k|k} &= (I - K_k) P_{k|k-1} \\ \end{array} \]

フィルタステップ

観測データ $ Y_n $から状態量 $ x_n $ の確率密度分布 $ p(x_n|Y_n) $ を求めます。確率密度分布にはベイズの定理から下記の性質があります。赤字では $ y_n $ と $ Y_{n-1} $ の独立性(マルコフ性)を用いました。

\[ \begin{array}{rll} p(x_n \vert Y_n) & = p(x_n | y_n, Y_{n-1}) \\ & \propto \color{red}{p(y_n | x_n, Y_{n-1})} p(x_n | Y_{n-1})\\ & = \color{red}{p(y_n | x_n)} p(x_n | Y_{n-1})\\ \end{array} \]

ここで、事前分布として $ p(x_n | Y_{n-1}) = \mathcal{N}(x_n | \hat{x}_{n \vert n-1}, P_{n \vert n-1}) $ をカルマンフィルタでは仮定する。このとき、$ p(y_n \vert x_n) = \mathcal{N}(y_n | x_n, R) $ であるので、

\[ \begin{array}{rll} \ln \left(p(y_n | x_n) p(x_n | Y_{n-1}) \right) &= \ln \mathcal{N}(y_n | x_n, k) + \ln \mathcal{N}(x_n | \hat{x}_{n|n-1}, P_{n|n-1}) \\ &= - \frac{1}{2} \left\{ x_n^T (\color{green}{R^{-1}+P_{n|n-1}^{-1}}) x_n - 2 x_n^T \color{blue}{(R^{-1} y_n + P_{n|n-1}^{-1} \hat{x}_{n|n-1}}) \right\} + \text{const.} \end{array} \]
この数式の形状により $ p(x_n \vert Y_n) $ がガウス分布であることがわかるので (須山本の手法です)、
\[ p(x_n \vert Y_n) = \mathcal{N}(x_n \vert \hat{x}_{n|n}, P_{n|n}) \\ \]
とおくと
\[ \begin{array}{rl} \ln p(x_n \vert Y_n) &= \left( -\frac{1}{2}(x_n - \hat{x}_{n|n})^T P_{n|n}^{-1} (x_n - \hat{x}_{n|n}) - \ln | P_{n|n}| \right) + \text{const}\\ & = -\frac{1}{2} \left( x_n^T \color{green}{P_{n|n}^{-1}} x_n - 2 x_n^T \color{blue}{P_{n|n}^{-1} \hat{x}_{n|n}} \right) + \text{const.} \end{array} \]
ここから各パラメータの比較をします。すると
\[ \begin{array}{crl} &P^{-1}_{n|n} &= \color{green}{R^{-1} + P_{n|n-1}^{-1}}\\ \Leftrightarrow & P_{n|n} &= \left( 1- P_{n|n-1}(P_{n|n-1}+R)^{-1} \right) P_{n|n-1} \\ && = \left( 1- K_n \right) P_{n|n-1} \\ \end{array} \]
と誤差共分散の更新式が求まります。さらに目当ての推定値が
\[ \begin{array}{crl} & P_{n|n}^{-1} \hat{x}_{n|n} &= \color{blue}{ R^{-1} y_n + P_{n|n-1}^{-1} \hat{x}_{n|n-1} }\\ \Leftrightarrow & \hat{x}_{n|n} &= P_{n|n} \left( R^{-1} y_n + P_{n|n-1}^{-1} \hat{x}_{n|n-1} \right) \\ && = \hat{x}_{n|n-1} + P_{n|n-1}(P_{n|n-1}+R)^{-1} (y_n - \hat{x}_{n|n-1}) \\ && = \hat{x}_{n|n-1} + K_n e_n \\ \text{where} & K_n &= P_{n|n-1}(P_{n|n-1}+R)^{-1} \\ & e_n &= y_n - \hat{x}_{n|n-1} \end{array} \]

と求まり、$ K $が、このシステムにおける最適カルマンゲインになっているなど、カルマンフィルタの更新ステップの式になっています。 $ \hat{x}_{n|n} $は、条件付き確率密度分布 $ p(x_n \vert Y_n) $ に従う、$ x_n $ の条件付き期待値 $ \mathbb{E}(x_n|Y_n) $ ですので、 これ自体が最小分散推定になっています(証明は省略. 参考文献[4]参照)。

予測のステップ

先ほどのフィルタリングのステップでは、事前分布として$ p(x_n | Y_{n-1}) = \mathcal{N}(x_n | \hat{x}_{n \vert n-1}, P_{n \vert n-1}) $を用いていました。この事前分布のパラメータ、$ \hat{x}_{n|n-1} $と$ P_{n|n-1} $を求めます。 $ x_{n+1} - x_{n} \sim \mathcal{N}(0, Q) $ であることから、 その1ステップ前のフィルタリングステップで求めた粒子位置に関する確率密度分布 $ p(x_{n-1}|Y_{n-1}) = \mathcal{N}(x_{n-1}|\hat{x}_{n-1|n-1}, P_{n-1|n-1}) $ に対して、 正規分布の加法性から

\[ \begin{array}{rl} \hat{x}_{n|n-1} &= \hat{x}_{n-1|n-1}\\ P_{n|n-1} &= P_{n-1|n-1} + Q\\ \end{array} \]
となります。そのままですね。

初期値

さて、同じようにしてフィルタリングステップ→予測ステップ→フィルタリングと、ステップをどんどんさかのぼっていくと、最初の位置 $ \hat{x}_{0|0} $, そしてその位置に関する共分散 $ P_{0|0} $ に行き着きます。 これはハイパーパラメータというか、えいやと決めるものになります。

システムがもう少し複雑な場合

前節では酔歩を仮定しましたが、一般の線形システムとして、

\[ \begin{array}{rl} x_{n+1} &= A x_n + B u_n + w_n \\ y_n &= C x_n + v_n \end{array} \]
について考えます。このとき、
\[ \begin{array}{rl} p(x_{n+1}|x_{n}) &= \mathcal{N}(A x_n + B u_n, Q) \\ p(y_n|x_n) &= \mathcal{N}(C x_n, R) \end{array} \]
であって、他の確率分布についても正規分布の再生性をふまえて
\[ \begin{array}{rl} x &\sim \mathcal{N}(\mu, \Sigma) \\ \Rightarrow G x &\sim \mathcal{N}(G \mu, G^T \Sigma G) \end{array} \]
に注意すれば、もとのカルマンフィルタの式になるのは自明ですね。

参考文献

  1. シンプルなモデルとイラストでカルマンフィルタを直観的に理解してみる - Qiita
  2. ベイズの定理からカルマンフィルタを導出する - ssk tech blog
  3. データ同化|カルマンフィルタと尤度 - ari23の研究ノート
  4. 知能制御システム学 画像追跡 (3) ― ベイズ推定とパーティクルフィルタ ― 東北大学 大学院情報科学研究科 鏡 慎吾 准教授
  5. カルマンフィルタの誤差共分散の意味 - 夜間飛行

デジタル制御:最初の最初 ②

デジタル制御:最初の最初①で、デジタル制御を連続系で近似する方法があることを知りました.
今回は近似の効能を確認するところをスタートにしてみます.

制御系のモデルとしては、ここまでで3つあります.

  1. 連続系:オリジナル
  2. デジタル制御
  3. ②を連続系に近似したもの


ここで、$ K_E = 1 $, $ \tau_m = 1 $ とします.
さらに、PIコントローラの係数として$ K_p = 112 $, $ K_i = 3947 $を採用して、
①の閉ループ伝達関数 $ \frac{2\omega \zeta s + \omega^2}{s^2+2\omega \zeta s + \omega^2} $が、$ \omega = 10Hz $, $ \zeta = 0.9 $程度になるように調整しました.
センサのサンプリング周期 $ T_s $は制御周期 $ T_c $の1/100未満として、
サンプリングによるむだ時間などは無視できると仮定しましょう.


確認のため、連続系(オリジナル)のステップ応答を確認すると以下の通りです.
次に、制御周期を1kHz ( $ T_c = 1msec $)として、計算してみます.
閉ループ系の周波数帯域が10Hz程度であるのに対して制御系が1kHzあるので、
デジタル化による問題は生じてないように見えます.

まだまだ制御周期を落としてみましょう.500Hzと250Hzです.
250Hzで「連続系近似」が「デジタル制御」を近似できなくなってきているように見えます.
さらに制御周期を落として、125Hzと62.5Hzです.62.5Hzに至っては遂に発振してしましました.
この発振するかしないかの閾値は、この系の場合だと70Hz前後にあり、
そこ周辺の制御周波数でシミュレーションしてみると
75Hzで収束し、70.5Hzで持続的な振動が起こる…という現象が見られます.

この辺では「連続系近似」はもはや用をなしていないですね.

この70Hzという数字、どこから来たのでしょう.

つづく⇒ デジタル制御:最初の最初 ③ 

デジタル制御:最初の最初 ①

3部構成の①です。

DCモータの速度制御を例にデジタル制御を考えみたい.

DCモータPI制御については、以前、連続系PID制御 : DCモータの速度制御で少し取り扱ったが、
多摩川精機さんのカタログ P.5にならって、簡略化したDCモータの伝達関数を使うことにしました[1].

DCモータの端子電圧V [V]に対するモータ回転数ω [rad/s]の伝達関数は
\[ G(s) = \frac{\omega (s)}{V(s)}=\frac{1/K_E}{s \tau_m+1} \]
ここで
$ K_E $ : 誘起電圧定数 $ [V/\frac{rad}{s}] $
$ \tau_m $ : 機械的時定数 $ [sec] $ 

このモータを連続系のPI制御で速度制御する場合のブロック図は、
これを例えばArduinoのようなものでデジタル制御する場合、
モータをPWM制御することが前提となって、実装上、だいたい以下のような形になります.


「A/D変換(デジタル変換)」「D/A変換(アナログ変換)」「デジタルPI」が連続系と異なるところで、
センサの値をマイコンなんかに取り込むために必須の処理です.

このデジタル変換で、「量子化」(値の離散化)と「標本化」(時間の離散化)をいっぺんにやってしまうのですが [2]、
中でも「標本化」が制御の安定性に大きな影響を与えます.

1. 標本化 と サンプル&ホールド

「標本化」「量子化」の具体的な仕組みは[Wikipedia : A/D変換回路]を参考にするとして、
標本化(サンプリング)だけに注目すると下図のような仕組みでA/D変換がなされる.

[標本化の流れ]
① 連続時間の信号が入力される
② サンプラ部がサンプリング周期T[sec]毎に値を切り出す
③ ホールド部が切り出した値をT[sec]間維持する→出力へ

この③の「切り出した値をT[sec]間維持する」という部分だけを取り出すと、
0次ホールド(Zero Order Hold : ZOH) $ H_{ZOH}(s) = \frac{1-e^{-sT}}{sT} $という伝達関数で表現できるのですが [3]
Matlabなどのシミュレータは、②と③の機能を合わせて"ZOH"と呼んでいるようです[4].
(便宜上でしょうか?)
このZOHは離散系(デジタル)の制御を、連続系として扱って考えるために便利なようです.

2. デジタル制御設計を連続系で…

ここまでを まとめて、ブロック図を書き直すと


制御周期$ T_c $とセンサのサンプリング周期 $ T_s $については、大抵 $ T_c > T_s $なので、 
特にデジタルフィルタ(含 移動平均)などの処理をしていなければ、
A/D変換のブロックは 1 に置き換えてもよいと思います.

すると、Yasunari SHIMADA先生のページ「[5]  連続制御系で近似する方法 」にならって、
連続系に近似的に表現できて、以下の制御ブロックとして扱えます.


背景にはスター変換(ラプラス変換の離散版)の考え方がありますが、
まずは、この近似の効果を見てみることにします.


参考文献
[1] DCサーボモータ - サーボモータ|多摩川精機株式会社 - カタログ (PDFへのリンクあり)
http://www.tamagawa-seiki.co.jp/jpn/servo/tredc.html

[2] CH:2 Discretization of continuous signals
http://www.wakayama-u.ac.jp/~kawahara/signalproc/CH2cont2discrete/contsig2discrete.html

[3] Wikipedia : ZOH
https://en.wikipedia.org/wiki/Zero-order_hold

[4] 連続/離散の変換方法 - MATLAB & Simulink - MathWorks 日本
http://jp.mathworks.com/help/control/ug/continuous-discrete-conversion-methods.html#bs78nig-2

[5] 連続制御系で近似する方法
http://ysserve.wakasato.jp/Lecture/ControlMecha3/node27.html

移動平均とローパスフィルタ

デジタル制御ではセンサのAD変換値を平滑化するために移動平均を使います.この移動平均を連続系で考えてみるために考察します.

サンプリング周波数$ f_s $[Hz], 移動平均数 N個の移動平均は、ローパスフィルタと同じような役割をします.

カットオフ周波数$ f_c $ は、おおよそ下記で表されます.

\[ f_c = \frac{0.443}{\sqrt{N^2 - 1}} \cdot f_s \]

ステップ応答の比較

まずステップ応答を比べてみます.

計算条件:カットオフ周波数44.3Hzで合わせたフィルタ


① サンプリング周波数 1kHz, 10個の移動平均
② サンプリング周波数 2kHz, 20個の移動平均
③ カットオフ周波数 44.3Hzの1次ローパスフィルタ $ \frac{2 \pi \cdot 44.3}{s+(2  \pi \cdot 44.3)} $
④ カットオフ周波数 44.3Hz、減衰比0.7の2次ローパスフィルタ $ \frac{(2 \pi \cdot 44.3)^2}{s^2+2 \cdot 0.7 \cdot (2 \pi \cdot 44.3)s+(2 \pi \cdot 44.3)^2} $

応答としては2次のローパスフィルタに近いと考えたらよいのでしょうか?

ボード線図の比較

次はボード線図で比べてみます.Scilabを使って①、②、③、④を比較した図です.
(考え方は[2]を参考にしました)

ボード線図の見どころは

  1. 先にあげた公式はゲインが-3.0dBになる周波数を求めている
    (4つの曲線はすべて44.3Hz, -3.0dBを通る)
  2. 移動平均のフィルタとしての特性は、移動平均数 ÷ サンプリング周波数で決まる.
  3. 0~100Hzの範囲での移動平均は1次のローパスフィルタより強く、2次のローパスフィルタに似ている
    (先のステップ応答で見られた通り)
  4. 100~500Hzまで見てみると、ところどころ減衰が悪い周波数があり、その周波数では1次LPF程度のレベルで考えたほうが良い

というところだと思います.

100 Hz前後までのボード線図

もう少しひいて1kHz前後までのボード線図


係数の理屈

パターン①

参考文献[1]や[2]を参照して、
サンプリング周波数 $ f_s $で無次元化した周波数 $ \omega = 2 \pi \frac{f}{f_s} $ に対して、 移動平均の伝達関数は

\[ H(\omega) = \frac{1}{N} \frac{e^{-i \omega N/2}}{e^{-i \omega/2}} \frac{\sin\left(\frac{\omega N}{2}\right)}{\sin\left(\frac{\omega}{2}\right)} \]

これからゲインを計算すると

\[ |H(\omega)| = \frac{1}{N} \left|\frac{\sin\left(\frac{\omega N}{2}\right)}{\sin\left(\frac{\omega}{2}\right)}\right| \]
です。これを$ \omega = 0 $ 周りでテイラー展開して(1/N*Sin(x∗N/2)/Sin(x/2) expands at x=0 - Wolfram|Alpha)
\[ |H(\omega)| \approx 1 + \frac{1}{24} (1 - N^2) \omega^2 + O(\omega^4) \]

するとカットオフ周波数 $ f_c $は$ \omega_c = 2 \pi \frac{f_c}{f_s} $ とおいて

\[ \begin{array}{rrl} & \frac{1}{\sqrt{2}} & = 1 + \frac{1}{24} (1 - N^2) \omega^2 \\ \Leftrightarrow & \frac{1}{\sqrt{2}} &= 1 +\frac{1}{24} (1 - N^2) \left(2 \pi \frac{f_c}{f_s}\right)^2 \\ \Leftrightarrow & f_c^2 &= \frac{24 (\sqrt{2} - 1)}{4 \sqrt{2} \pi^2 (N^2 - 1)} f_s^2 \\ \Leftrightarrow & f_c & \approx \frac{0.4219 \dots}{ \sqrt{N^2 - 1}} f_s \end{array} \]
ここで得た0.4219..に対して、テーラー展開の展開点 $ \omega = 0 $ から離れてしまうことによる誤差を勘案して調節した秘伝の係数が 0.44294.. ということらしい。 よく見つけるわ…。

パターン②

ある定義域 $ 0 < \omega \leq \pi/2N $ で

\[ \begin{array}{rl} |H(\omega)|&= \frac{1}{N} \left|\frac{\sin\left(\frac{\omega N}{2}\right)}{\sin\left(\frac{\omega}{2}\right)}\right| \\ &\approx \frac{1}{N \omega}{\sqrt{2(1-\cos N \omega)}} \end{array} \]

近似状況の例: plot 1/N*Sin(N*x/2)/Sin(x/2) and 1/(x*N)*sqrt(2-2*cos(x*N)) at N = 4 between x = 0 and 6 - Wolfram|Alpha

したがって、

\[ \begin{array}{rrl} & \frac{1}{\sqrt{2}} &= \frac{1}{N \omega}{\sqrt{2(1-\cos N \omega)}} \\ \Rightarrow & N \omega &\approx 2.78311 \dots \\ \Leftrightarrow & f_c &\approx \frac{2.78311 \dots / 2 \pi}{N} f_s \\ &&= \frac{0.42946 \dots}{N} f_s \end{array} \]

参考文献

[2] デジタルフィルタを計算する
[3] filter design - 3dB-Cut off frequency of moving average - Signal Processing Stack Exchange
より良い近似を求めて論争が繰り広げられていますが、0.4429..意外に良いんですよね…。