Effacer les filtres
Effacer les filtres

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

31 vues (au cours des 30 derniers jours)
MathWorks Support Team
MathWorks Support Team le 25 Oct 2013
データの移動平均を求める関数はありますか?

Réponse acceptée

MathWorks Support Team
MathWorks Support Team le 7 Août 2017
Modifié(e) : MathWorks Support Team le 7 Août 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)

Plus de réponses (0)

Catégories

En savoir plus sur データの前処理 dans Help Center et File Exchange

Produits


Version

R2016a

Community Treasure Hunt

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

Start Hunting!