科学・技術
Recursive Filters: SMA, EMA, Low‑Pass, および Tiny Kalman
Recursive Filters: SMA, EMA, Low‑Pass, and a Tiny Kalman (staszewski.xyz)
要約
この記事は、ノイズの多い測定値に対して、レイテンシと計算量がタイトな状況で使用できる再帰フィルタ(スムーザー)について解説しています。SMA(単純移動平均)、EMA(指数移動平均)/ローパスフィルタ、および軽量な1次元カルマンフィルタに焦点を当て、それぞれの直感的な理解と使用例を最小限の数学で紹介しています。特に、計算リソースやメモリが限られている組み込みシステムやストリーミングデータ処理に適しています。
全文翻訳
18 October 2025 / 4 分で読む
再帰フィルタ: SMA, EMA, ローパス, および軽量カルマン
フィルタ, シグナル処理, 数学
オプティマイザを調べているうちに、再帰フィルタの深淵に迷い込んでしまいました。
この記事は、測定値がノイズが多いものの、レイテンシと計算量がタイトな場合に使えるスムーザーの、コンパクトで実践的なツアーです。
数学は最小限に、直感は高く保ち、SMA、EMA/ローパス、そして軽量な1次元カルマンをいつ、なぜ使うかに焦点を当てます。
コードだけを見たい方は、私のKaggle Notebookはこちらで見つけられます。
なぜ再帰フィルタなのか
再帰フィルタは、計算量とメモリが少ない場合、またはデータがストリームとして到着し、即座に反応する必要がある場合に輝きます。
O(1) メモリ: 長いバッファではなく、最後の状態(および場合によっては実行中の合計)のみを保持します。
O(1) サンプルあたりの計算量: ステップあたり1つか2つの乗算・加算で、マイクロコントローラやタイトなループに最適です。
オンライン、低レイテンシ: サンプルが到着次第、更新された推定値を生成します。完全なウィンドウを待つ必要はありません。
シンプルで堅牢な実装: ポート、ベクトル化、または低精度での実行が容易です。
不規則なサンプリングでもうまく機能: 更新は段階的であり、バッチの利用可能性を想定しません。
直感的な注記
私たちが使用する再帰フィルタは、すべて定数サイズの状態を使用します。
そのため、組み込みシステム、ロボット制御ループ、モバイルセンサーのスムージング、テレメトリで一般的です。
記法
x_t: 時刻 t における生の観測値。
s_t: 時刻 t におけるスムージングされた推定値。
k: ウィンドウサイズ(移動平均用)。
α ∈ [0,1]: スムージング係数(αが高いほどスムージングされるが、遅延も大きくなる)。
再帰平均フィルタ(EMAとしても知られる)
最もよく使うワンライナー:
s_t = α s_{t-1} + (1-α) x_t
多くのライブラリは直接αを選択しますが、私たちの例はk個のデータポイントで構成され、記法を記憶しやすくするためにαを α = (k-1)/k と定義します。
直感的な注記
これはリーキーインテグレータのように振る舞います。
αが大きいほど過去をゆっくりと忘れます(スムージングされるが、遅延が大きい)。
最初の行は、実際の平均値に近づくまでに数回のイテレーションが必要です。
単純移動平均(SMA)
過去 k サンプルに対するウィンドウ化された平均:
s_t = (1/k) Σ_{i=0}^{k-1} x_{t-i}
直感的な注記
ノイズを軽減するのに優れていますが、遅延があり、過去 k ポイントのバッファが必要です。
スパイクはウィンドウ全体に均等に「希釈」されます。
一次ローパスフィルタ
離散時間では、古典的なローパスフィルタは代数的にEMAと同じです:
y_t = α y_{t-1} + (1-α) x_t
名前は異なりますが、形式は同じです。
ノイズ抑制と応答性のトレードオフを α で選択します。
軽量1次元カルマン更新
これはカルマンフィルタの表面をかすめただけです - 軽量な1次元カルマン更新です。
実際のKFに進む前に直感を構築するための最初のアプローチです。
センサーノイズ(R)とプロセスノイズ(Q)を知っている場合、カルマンは予測と測定の信頼度を自動的にバランスさせる適応ゲインを提供します。
定値モデル(A=H=1)の場合:
予測: x̂_{t}^{-} = x̂_{t-1}, P_{t}^{-} = P_{t-1} + Q
更新: K_t = P_{t}^{-} / (P_{t}^{-} + R), x̂_t = x̂_{t}^{-} + K_t (z_t - x̂_{t}^{-}), P_t = (1 - K_t) P_{t}^{-}
直感的な注記
測定値がノイズが多い(Rが大きい)場合、K_t は縮小し、事前情報により多く信頼します。
プロセスが不安定(Qが大きい)場合、P_{t}^{-} は増加し、K_t は増加します - 新しい測定値により多く信頼します。
パラメータの選択
SMAウィンドウ k: k が大きいほど、スムージングされるが遅延が大きくなる。バッファが必要。
EMA/ローパス α: 0.8 ~ 0.95 あたりから始めます。遅延とノイズを目視で調整します。
カルマン(Q, R): R はセンサーの分散に設定します。Q はステップ間で潜在変数がどれだけドリフトすると予想されるかに設定します。
次は何へ?
SMAはシンプルで堅牢です。EMA/ローパスはストリーミングのデフォルトです。そして軽量カルマンフィルタは、ノイズを推定できる場合に原理的な適応性を追加します。
最初の2つのフィルタは実装が容易ですが、カルマンは1次元バージョンに簡略化されました。
実際のカルマンフィルタははるかに複雑であり、私の将来の学習の主題となるべきです。
質の高いテキストが公開されることを願っています。
巨人の肩の上に立つ
参考にしたリソース:
Dr. Shane Ross のトピックに関するビデオ
Kalman Filter explained simply