Azzera filtri
Azzera filtri

データの移動平均を求める関数はありますか?

31 visualizzazioni (ultimi 30 giorni)
MathWorks Support Team
MathWorks Support Team il 25 Ott 2013
データの移動平均を求める関数はありますか?

Risposta accettata

MathWorks Support Team
MathWorks Support Team il 7 Ago 2017
Modificato: MathWorks Support Team il 7 Ago 2017
MATLAB R2016a 以降では、移動平均を求める関数として、movmean 関数が提供されています。
>> A = [4 8 6 -1 -2 -3 -1 3 4 5];
>> M = movmean(A,3)
M = 6.0000 6.0000 4.3333 1.0000 -2.0000 -2.0000 -0.3333 2.0000 4.0000 4.5000
他にも移動分散、移動標準偏差を求める関数を提供しています。 詳細は、以下の URL から移動統計の項目をご確認ください。
・MATLAB ヘルプドキュメント:記述統計
R2015b 以前のバージョンをご使用の場合には、下記の方法をご検討ください。
次の2通りの方法が考えられます。
(1) MATLABで提供されているfilter関数によるフィルタリング
(2) Curve Fitting Toolboxで提供されているsmooth関数による平滑化
以下にそれぞれの方法について説明します。
(1)filter関数によるフィルタリング
filter関数は、フィルタとして表される伝達関数の分母係数をベクトルa、分子係数をベクトルbとした時、ベクトルxのデータを下記式によってフィルタリングします。
   y = filter(b,a,x)
例えば、5点移動平均の場合、現時点の値をx(n)とすると、4サンプル前までの値の総和の平均値y(n)は次の差分方程式で表現されます。
   y(n) = (x(n) + x(n-1) + x(n-2) + x(n-3) + x(n-4)) / 5
これをZ変換し、伝達関数で表現すると以下のようになります。
   H(z) = Y(z) / X(z) = (1 + z^-1 + z^-2 + z^-3 + z^-4) / 5
よって、フィルタの係数aとbは以下のように表されます。
 
a = 5;
b = ones(1,5);
以上より、filter関数によって5点移動平均の結果が以下のように得られます。
 
t = 0:0.1:2*pi;
y1 = sin(t)+rand(1,length(t));
y2 = filter(b,a,y1);
plot(t,y1,'o-')
hold on
plot(t,y2,'r-*')
hold off
legend('original','filter')
上記の5点移動平均の場合、filter関数は現在の点から前の4点までを加算して平均を求めます。ここで、最初の4要素は次のように与えられます。
   y2(1) = y1(1) / 5
   y2(2) = (y1(1)+y1(2)) / 5
   y2(3) = (y1(1)+y1(2)+y1(3)) / 5
   y2(4) = (y1(1)+y1(2)+y1(3)+y1(4)) / 5
(2)smooth関数による平滑化
smooth関数は、下記式のように、使用する点数spanと手法methodを使って、データyの平滑化を行います。
   z = smooth(y,span,method)
5点移動平均の場合、以下のようにspanが5、methodが'moving'となります。
 
y3 = smooth(y1,5,'moving');
figure
plot(t,y1,'o-')
hold on
plot(t,y3,'r-*')
hold off
legend('original','smooth')
smooth関数は現在の点x(n)を中心とし、前後の点を加算して平均を求めるため、5点移動平均の差分方程式は以下の形式で表されます。
   y(n) = (x(n-2) + x(n-1) + x(n) + x(n+1) + x(n+2)) / 5
ここで、最初の4要素と最後の4要素は次のように与えられます。
・最初の4要素
   y3(1) = y1(1)
   y3(2) = (y1(1)+y1(2)+y1(3)) / 3
   y3(3) = (y1(1)+y1(2)+y1(3)+y1(4)+y1(5)) / 5
   y3(4) = (y1(2)+y1(3)+y1(4)+y1(5)+y1(6)) / 5
・最後の4要素
   y3(end-3) = (y1(end-5)+y1(end-4)+y1(end-3)+y1(end-2)+y1(end-1)) / 5
   y3(end-2) = (y1(end-4)+y1(end-3)+y1(end-2)+y1(end-1)+y1(end)) / 5
   y3(end-1) = (y1(end-2)+y1(end-1)+y1(end)) / 3
   y3(end) = y1(end)

Più risposte (0)

Categorie

Scopri di più su データの前処理 in Help Center e File Exchange

Prodotti


Release

R2016a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!