ノイズを含む単純波形を移動平均でスムージングする
こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
背景・目的
前の記事で波形に移動平均でスムージングする方法を調べました。
移動平均の実装方法を調べただけで、移動平均によるスムージングの効果を確認していなかったので、テスト用の簡単な波形データを作り、 その波形に誤差を与えます。
そして、 元の簡単な波形に近づけてみたいと思います。
動作環境
・Windows 7
・winpython 64bit 3.4.4
プログラム
ソースコード
###############################################################################
# 移動平均によるスムージングプログラム
###############################################################################
# ファイルインポート ###############################################################
import numpy as np
import matplotlib.pyplot as plt
# テスト波形の作成 ###############################################################
x = np.linspace(0, 10, 100) # x 軸の値
y_org = np.cos(x) # y の値
np.random.seed(seed=12)
y = np.cos(x) + np.random.randn(100)*0.1 # ノイズを含んだ y の値
for i in range(2, 10):
# 移動平均 ################################################################
term = i # 移動平均の個数
kernel = np.ones(term)/term # カーネル
x2 = np.convolve(x, kernel, mode='valid') # y の移動平均
y2 = np.convolve(y, kernel, mode='valid') # x の移動平均
# グラフの出力 ##############################################################
plt.figure(figsize=(10, 8))
plt.plot(x, y_org, 'r', label='original-sin')
plt.plot(x, y, 'k--', label='original-sin with noise')
plt.plot(x2, y2, 'g-', label='moving average term = ' + str(term))
plt.legend()
# グラフの出力 ##############################################################
file_name = 'smoothing(moving average term = ' + str(term) + ').jpg'
plt.savefig(file_name)
結果
このプログラムから出力される元波形・ノイズ入り波形・ノイズ除去波形の重ね合わせグラフを図1 に示します。
コメント
意外とキレイに除去されています。
複雑な波形に対して効果があるのか…
term による違いが見たかったので、与える誤差は seed 値を固定して、 term を変更して繰り返し実行しても同じ乱数が発生するようにしました。
term が大きくなるにつれて元波形に近づいてます。
しかし、 term を大きくしたり、何度も移動平均するとピーク値が小さくなるデメリットがありますね。
使い方が難しい‼︎
以上