解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

移動平均で波形のスムージングが出来る⁉︎ 〜 Python 〜



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


フーリエ変換して周波数特性・振幅特性を利用してノイズ除去するとデータが振動したり、キレイにノイズ除去出来ない事もあります。

私もノイズを除去して波形が振動したので、何か良い方法はないかと調べていると移動平均でスムージングが出来るとの事でした。
気がつきませんでした…

Numpy の convolve メソッドで簡単に移動平均出来るとのことなので試してみたところ、かなり簡単に出来ました。

ただ、移動平均すると波形の両端が平均値を計算する関係上少なくなるので、グラフを描くときにつまずきました。

気づかなかったし、つまずいたのでまとめておきます。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# convolve メソッドを使用した移動平均プログラム
###############################################################################
# ファイルインポート ###############################################################
import numpy as np
import matplotlib.pyplot as plt
 
# テスト波形の作成 ###############################################################
#             1  2  3  4  5  6  7  8  9    要素数は 9 個
x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([1, 3, 9, 3, 5, 5, 6, 1, 4])
 
for i in range(2, 9):
    # 移動平均 ################################################################
    term = i # 移動平均の個数
    b = np.ones(term)/term
    y2 = np.convolve(y, b, mode='valid') # x の移動平均
    x2 = np.convolve(x, b, mode='valid') # y の移動平均
   
    # グラフの作成 ##############################################################
    plt.figure(figsize=(8, 6))
    plt.plot(x,  y,  'k-',  label='original-sin with noise')
    plt.plot(x2, y2, 'r--', label='moving average term = ' + str(term))
    plt.legend()
    # グラフ出力
    file_name = 'moving average term = ' + str(term) + '.jpg'
    plt.savefig(file_name)



結果

このプログラムから出力される移動平均のグラフを図1 〜 図8 に示します。

図1 グラフ term = 2


図2 グラフ term = 3


図3 グラフ term = 4


図4 グラフ term = 5


図5 グラフ term = 6


図6 グラフ term = 7


図7 グラフ term = 8



コメント

グラフを描く上で x の値に手をこまねいた瞬間がありました。

結局、少し考えて x も移動平均してしまえば良いということに気づいて良かったです。

このスムージングにどの程度効果があるのか気になるところです。



以上