目次 — 知りたいところから読む
入力を変えて確かめる
実験パネルを開き、実行を押すとPythonを読み込みます。停止と初期値へのリセットができます。結果はこの端末内で計算します。Pythonのインストールは不要です。
下にあるローカル実行の手順は、配布ソースを再現するための任意の手順です。ブラウザ実験には不要です。
前提と読み方
前提知識 周波数Hzと正弦波、センサログの基本。
実装・実験 · 本文の条件と確認項目に沿って、計算例や比較表を追う。
センサを速く読むと、同じ値を何度も受け取るだけの場合がある。逆に、標本に見える低い周波数が、本当は高い周波数の折り返しであることもある。ここでは、異なる入力から区別できないデータが生まれる例を計算する。
四つの速さを分ける
ODRはセンサが新しい出力を作るレート、読み出し周期はホストが値を取りに行く間隔である。帯域は入力変化をどの周波数まで通すかを表し、記録レートは保存する頻度を表す。ODRが100 Hzでも内部フィルタによって有効帯域は異なる。1 kHzで同じレジスタを読んでも、新しい1,000標本が生成されるとは限らない。
FIFOに複数の標本が入る機器では、まとめて読んだ時刻と各標本の測定時刻も違う。到着時刻だけを等間隔の測定時刻だと思わず、センサの仕様とタイムスタンプを確認する。
異なる波が同じ値になる例
標本化周波数を20 Hz、時刻をn/20 sとする。12 Hzと8 Hzの余弦波は、その時刻で一致する。
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を表計算でも確認できる。
図は0〜0.5 sを拡大している。連続曲線は違うが黒い標本点は同じになる。標本だけから、もともと12 Hzだったのか8 Hzだったのかを決められない。
ナイキスト条件には前提がある
ベースバンド信号を復元したい場合、対象の最高周波数を標本化周波数の半分より十分低く抑える必要がある。等号付近では位相によって標本がすべてゼロになる例もあり、実用設計で「ちょうど2倍」を余裕のある条件とは扱わない。対象信号だけでなく、帯域外の振動や雑音も折り返す。ADIのアンチエイリアシング解説を参照する。
一度低周波へ折り返した成分を、その後のデジタル平滑化だけで本来の信号と分離することはできない。ADCの折り返し説明も、サンプリング前のアナログフィルタと後段処理の役割を分けている。
保存量を減らすときの落とし穴
100 Hzのログから5個に1個を取ると、保存レートは20 Hzになる。元のログで正しく見えていた12 Hzも、新しいナイキスト周波数10 Hzを超える。したがって、間引く前に新しい帯域に合わせた低域通過フィルタを通す必要がある。フィルタの遷移帯域と遅延も設計条件になる。
平均を取るだけでも周波数特性は変わるが、必要な帯域外減衰が得られるとは限らない。滑らかなグラフになったことと、折り返しを抑えたことは別の確認である。
実機ログで確かめる順番
ODR、内部フィルタ、FIFO、タイムスタンプの意味を確認し、連番や時刻差から重複・欠測を調べる。既知の入力や安定した条件で複数レートを比較する。機械振動のピークがレート変更で移動するなら折り返しを疑うが、機械自体の動作条件も同じにする。IMUノイズ解析の前処理として、この確認を済ませておくと統計値を読み違えにくい。
ブラウザ実験の条件
入力周波数と標本化周波数を変え、0〜2秒(終端を除く)の余弦波と標本点を比較できます。振幅1・初期位相0、ノイズやフィルタのない理想標本化です。標本化周波数は整数Hzに限ります。折り返し周波数は abs((f + fs/2) % fs - fs/2) で求めます。「標本値の最大差」は入力と折り返し波形を同じ標本時刻で比較した値です。連続曲線は表示用の補間ではなく、各余弦の式を2000点/秒で評価しています。ナイキスト周波数上や一定値への折り返しのプリセットも、任意の位相の信号を復元できる保証ではありません。
ブラウザと同じ計算コードも保存できます。
現在の項目 · 8 / 21 · センサ・ハードウェア
コメント
コメントの投稿にはログインが必要です
まだコメントはありません。