移動中に、引き続き MEMS 加速度センサーのノイズを低減する方法を考えていました。
参考書をパラパラ見ていて、目に留まったのがエイリアシング。
ナイキスト周波数よりも高い側に信号が含まれていると、FFTの結果にノイズとなって現れます。これ、大事です。
https://www.analog.com/jp/technical-articles/elusive-tones-aliasing-effects-in-digital-mems-accelerometers-in-condition-monitoring.html
では、どうすれば良いか?
答えは簡単で、事前に LPF を通せば良いわけです。が、カットする高周波を求めるために FFT をかけてしまうとエイリアシングが生じます。
そこで、時刻歴データの段階で LPF をかけてしまうという発想。これがデジタルフィルタ。FIR と IIR が有名ですが、実装上、計算の軽い前者がよく利用されているようです。PolyPhase フィルタも同様です。
FIR フィルタを今まで使ってきたものの、自分で作ったことはありませんでした。今では Python でも簡単に作成できるようです。
帰社後に探してみると、すぐに見つかりました。scipy.signal.firwin で作成できます。https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.firwin.html
FIR filter design using the window method.
This function computes the coefficients of a finite impulse response filter. The filter will have linear phase; it will be Type I if numtaps is odd and Type II if numtaps is even.
これを手元の信号にかけると、位相が遅れます。ま、タップ数の半分の時間を補正してやればOKです。直線位相から最小位相にしたい場合は scipy.signal.minimum_phase で良いみたい。https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.minimum_phase.html
Convert a linear-phase FIR filter to minimum phase
MEMSセンサーから500Hzで吐き出したサンプルに対し作成した係数を乗じ、その後に100Hzへ間引き。Tap 数 201 で 2msec 以内に回るか心配でしたが、全く問題なし。しかも効果は抜群で、ノイズを大きく取り除くことができました。成功です。