今回はPythonで移動平均フィルタを実装する方法についてまとめたいと思います。
移動平均フィルタとは
移動平均フィルタとはローパスフィルタの一種で、時系列データの一定範囲の平均値をとって出力値とするフィルタです。この移動平均フィルタを使用することで、信号のノイズ成分等をカットすることが可能です。
組み込みの分野では、A/Dコンバータからの入力信号を取得する際のノイズ対策などでよく用いられます。
作成したソースコード
今回はサンプルとして10回分のデータから平均値を取得するプログラムを作成してみました。
filterというメソッドの引数として
第1引数:過去の時系列データの配列
第2引数:最新の値
第3引数:時系列データの要素数
を渡して移動平均を計算します。
def filter(list, in_val, lmt_cnt):
#配列を更新
list.pop(0) #先頭を削除(引数で要素番号を指定)
list.append(in_val) #末尾に要素を追加
#配列の合計値を計算
total = sum(list)
print("list total = ", total)
#要素数で割って平均を計算
average_val = total / lmt_cnt
return list, average_val
if __name__ == "__main__":
list = [3,4,7,3,8,2,9,7,5,8]
data = 5
print("元データ = ", list)
print("新しい入力値", data)
#フィルタ処理
result = filter(list, data, len(list))
print("result = ", result[1])
実行結果
プログラムを実行した結果、以下のような応答が得られました。
元データ = [3, 4, 7, 3, 8, 2, 9, 7, 5, 8]
新しい入力値 5
list total = 58
result = 5.8
リストの先頭データ(一番古いデータ)を削除し、末尾に新しい入力値が追加され、その合計と平均値を正しく計算することができました。
マイコン等でリアルタイムに処理をする際は、高速化のためprintメソッドは削除して使用してください。
まとめ
いかがだったでしょうか?
今回作成した簡単なコードでノイズ対策を行うことができます。
私が製作しているロボットでも、ディープラーニングを使った物体検出の位置情報取得処理にも活用していきたいと思います。
また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。
スキルアップや副業にぜひ活用してみてください。
スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。
講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。
それでは、また次の記事でお会いしましょう。
コメント