Ccmmutty logo
Commutty IT
0 pv3 min read

[MATLAB]移動平均を用いたノイズ除去

https://cdn.magicode.io/media/notebox/f15b2d2d-0630-49a3-97c9-b8dc3c620610.jpeg

はじめに

移動平均とは何か、移動平均を用いるメリット・デメリット、実装する際のソースコードなどをまとめる。

実行環境

  • Ubuntu20.04
  • MATLAB R2022a

移動平均とは

移動平均(Moving Average,MA)とは、ある時刻のデータとその前後の時間のデータの平均を求めることである。FXなどのチャートでよく用いられる移動平均線も同じである。高周波成分のノイズを減少させ、信号が強調される。

移動平均の原理

移動平均では、観測データx(k)に重畳するノイズを時刻kの前後L点のデータを利用し低減させる。 P=3の移動平均を3点MA、P=5の移動平均を5点MAと呼ぶ。
y(x)=x(k1)+x(k)+x(k+1)3y(x) = \displaystyle\frac{x(k-1)+x(k)+x(k+1)}{3}
y(x)=x(k2)+x(k1)+x(k)+x(k+1)+x(k+2)5y(x) = \displaystyle\frac{x(k-2)+x(k-1)+x(k)+x(k+1)+x(k+2)}{5}

移動平均の一般式

データx(k)の時刻kより前後L点(-L ~ L)のデータを利用し導出できる移動平均は下式の通りである。
y(k)=1Pm=LLx(k+m)y(k)=\displaystyle\frac{1}{P}\sum^{L}_{m=-L}x(k+m)
P=2L+1P = 2L + 1

移動平均の実装

MATLABで3点MAを実装する。
t = 0:0.02:5;       %データの作成 
s = 2*sin(2*pi*1*t);
x = s + randn(1, length(t));

y = x*0;               %これより3点MA
for k=2: length(x)-1
y(k) = (x(k-1) + x(k) + x(k+1))/3;
end
y(1) = (x(1)+x(2))/2;
y(end) = (x(end-1) + x(end))/2;

figure (2)            %グラフの描画
plot(t, x, 'b', t, y, 'r', t, s, 'k');
legend('x(k): before MA', 'y(k): after MA', 's(k): signal')
title('3点MA');     % タイトルを記入
実行結果は以下の通りである。
移動平均でノイズを減衰出来ていることがわかる。
お次は5点MAの実装。
t = 0:0.02:5;        %データの作成 
s = 2*sin(2*pi*1*t);
x = s + randn(1, length(t));

y = x*0;                %これより5点MA
for k=3: length(x)-2
y(k) = (x(k-2)+x(k-1)+x(k)+x(k+1)+x(k+2))/5;
end
y(1) = (x(1) + x(2) + x(3))/3;
y(2) = (x(1) + x(2) + x(3) + x(4))/4;
y(end-1) = (x(end-3) + x(end-2) + x(end-1) + x(end))/4;
y(end) = (x(end-2) + x(end-1) + x(end))/3;

figure (2)             %グラフの描画
plot(t, x, 'b', t, y, 'r', t, s, 'k');
legend('x(k): before MA', 'y(k): after MA', 's(k): signal')
title('5点MA');      % タイトルを記入
実行結果は以下の通りである。

最後に

移動平均はノイズを減衰させ信号の特徴を捉えやすくするが、前後の時間のデータを増やすとノイズだけでなく特徴まで平均化されて、信号が読み取れなくなるので注意する必要がある。

Discussion

コメントにはログインが必要です。