目次 — 知りたいところから読む

センサを速く読むと、同じ値を何度も受け取るだけの場合がある。逆に、標本に見える低い周波数が、本当は高い周波数の折り返しであることもある。ここでは、異なる入力から区別できないデータが生まれる例を計算する。

四つの速さを分ける

ODRはセンサが新しい出力を作るレート、読み出し周期はホストが値を取りに行く間隔である。帯域は入力変化をどの周波数まで通すかを表し、記録レートは保存する頻度を表す。ODRが100 Hzでも内部フィルタによって有効帯域は異なる。1 kHzで同じレジスタを読んでも、新しい1,000標本が生成されるとは限らない。

FIFOに複数の標本が入る機器では、まとめて読んだ時刻と各標本の測定時刻も違う。到着時刻だけを等間隔の測定時刻だと思わず、センサの仕様とタイムスタンプを確認する。

異なる波が同じ値になる例

標本化周波数を20 Hz、時刻をn/20 sとする。12 Hzと8 Hzの余弦波は、その時刻で一致する。

\cos(2\pi\cdot12n/20)=\cos(2\pi\cdot8n/20),\qquad n\in\mathbb Z

12 Hzは20 Hzから8 Hzを引いた周波数なので、整数周の位相を除くと符号が反転する。余弦は符号反転に対して同じ値を返すため、この等式が成り立つ。これは位相をそろえた余弦の例であり、任意の信号の見た目がそのまま一致するという主張ではない。

コードと結果

実行コードを保存してpython3 engineering_labs.pyを実行する。Python 3.12.3、NumPy 1.26.4、Matplotlib 3.6.3で検証した。0〜1.95 sの40標本の最大差は約2.24×10⁻¹⁴で、浮動小数点の丸め誤差の範囲で一致した。CSVを表計算でも確認できる。

図1 · ボタンで表示を切り替え
12 Hzと8 Hzの連続波形と、20 Hzで採った同じ標本。横軸s、縦軸は無次元振幅。

図は0〜0.5 sを拡大している。連続曲線は違うが黒い標本点は同じになる。標本だけから、もともと12 Hzだったのか8 Hzだったのかを決められない。

ナイキスト条件には前提がある

ベースバンド信号を復元したい場合、対象の最高周波数を標本化周波数の半分より十分低く抑える必要がある。等号付近では位相によって標本がすべてゼロになる例もあり、実用設計で「ちょうど2倍」を余裕のある条件とは扱わない。対象信号だけでなく、帯域外の振動や雑音も折り返す。ADIのアンチエイリアシング解説を参照する。

一度低周波へ折り返した成分を、その後のデジタル平滑化だけで本来の信号と分離することはできない。ADCの折り返し説明も、サンプリング前のアナログフィルタと後段処理の役割を分けている。

保存量を減らすときの落とし穴

100 Hzのログから5個に1個を取ると、保存レートは20 Hzになる。元のログで正しく見えていた12 Hzも、新しいナイキスト周波数10 Hzを超える。したがって、間引く前に新しい帯域に合わせた低域通過フィルタを通す必要がある。フィルタの遷移帯域と遅延も設計条件になる。

平均を取るだけでも周波数特性は変わるが、必要な帯域外減衰が得られるとは限らない。滑らかなグラフになったことと、折り返しを抑えたことは別の確認である。

実機ログで確かめる順番

ODR、内部フィルタ、FIFO、タイムスタンプの意味を確認し、連番や時刻差から重複・欠測を調べる。既知の入力や安定した条件で複数レートを比較する。機械振動のピークがレート変更で移動するなら折り返しを疑うが、機械自体の動作条件も同じにする。IMUノイズ解析の前処理として、この確認を済ませておくと統計値を読み違えにくい。

次に読む

等間隔で取得できたデータの統計を読む。IMUの静止ログからノイズを読むシリーズの次の内容へ進むロータリーエンコーダの仕組み — 光学式・磁気式同じ分野を別の観点から読むロボットの電源設計 — モータ起動で計算機が落ちる原因を追う