読者です 読者をやめる 読者になる 読者になる

その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Pythonで単純移動平均法の処理をするスクリプト書いたよー

タイトル通りです。
必要に迫られたので、単純移動平均法でノイズを除去するスクリプト書きました。

MATLABScilabを使えば良かったんじゃ……というのは無しでお願いします。


以下ソース

import matplotlib.pyplot as plt

time = []	# Store the Data of Time
data = []	# Store the Data
average = []	# Store the Data of Average

# Reading the Data of Time
file = open( 'noise_time.txt', 'r' )
for line in file:
    time.append( line )
file.close

# Reading the Data of Wave
file = open( 'noise_data.txt', 'r' )
for line in file:
    data.append( line )
file.close

# Plot the Raw Wave
plt.plot( time, data )

pointAve = 121;	# Set the points to use Moving Average

# Delete unused data of time ( Part of Begin )
i = 0
while i < pointAve / 2 :
    time.pop(0)
    i += 1

# Calcurate the Average
i = pointAve / 2;
while  i < ( len( data ) - pointAve / 2 ) :
    sum = 0.0;
    j = 0;
    while j < pointAve:
        sum += float(data[ i - ( pointAve / 2 ) + j ])
        j += 1
    ave = sum / pointAve
    average.append( ave )
    i += 1

# Delete unused data of time ( Part of End )
i = 0	
while i < pointAve / 2:
    time.pop()
    i += 1

# Plot the Moveng Average Wave
plt.plot( time, average )

# Set Title and Labels
plt.title( "Compare Raw Wave and Moving Averaged Wave" )
plt.xlabel( "Time [sec]" )
plt.ylabel( "Signal [V]" )
plt.legend( ("Raw Wave","Moving Averaged Wave"))

plt.show()

もしも、このスクリプトを実行したいという奇特な方がいらっしゃる場合について。

  • まず、グラフ描画の部分でmatplotlibに依存してるので、インストールしてください。
  • pointAveの値は、平均を取る時の点数を表しています(つまりn点平均のnです。ご存知でしょうが、奇数の値が望ましいです)
  • データの入力はテキスト形式のファイルを読み込む事で行っています。

(データ例1)noise_data.txt

-0.928063521
-0.132489882
-1.467890972
5.364932847
・
・
・

(データ例2)noise_time.txt

0
0.000005
0.00001
0.000015
・
・
・

(このスクリプトではtxtファイルからtimeの情報を読み込んでいますが、
別にわざわざtxtから読み込む必要無いと思います。自分で生成すれば良いと思います)


とまあこんな感じでした。
なお、このスクリプトの実行によって何か不都合が起きたとしても責任は取りかねます。
このスクリプトの実行によって何か良い事が起きたら、僕にも幸せのお裾分けの方をよろしくお願いします。


※コメントアウトの英語がおかしいのは仕様ですのでそっとしておいてください。