フィルターのクリア

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

31 ビュー (過去 30 日間)
MathWorks Support Team
MathWorks Support Team 2013 年 10 月 25 日
編集済み: MathWorks Support Team 2017 年 8 月 7 日
データの移動平均を求める関数はありますか?

採用された回答

MathWorks Support Team
MathWorks Support Team 2017 年 8 月 7 日
編集済み: MathWorks Support Team 2017 年 8 月 7 日
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)

その他の回答 (0 件)

カテゴリ

Help Center および File Exchangeデータの前処理 についてさらに検索

製品


リリース

R2016a

Community Treasure Hunt

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

Start Hunting!