2017-04-25 165 views
-1

我需要計算窗口大小爲20個樣本的移動窗口平均值。該窗口應該在整個數據中移動。例如:對於前20個樣本,它將計算平均值,並且窗口從0移動到20到21,並從1到21個樣本計算平均值,然後繼續移動。移動(滑動)窗口平均在Matlab中創建基線

我寫了一個代碼,其中'x'變量加載了.dat文件,並且已經編寫了for循環來計算平均值。代碼如下

clear all; 
close all; 
x= load ('cpp1500.dat'); 
for i=1:length(x) 
    s(i)=sum(x(1:i)); 
    r(i)=s(i)./i; 
end 

plot(x,'R') 
hold on; 
plot(r) 

請建議我一種方法來計算移動窗口的平均值。 Graphs of samples v/s sensor data

回答

0

這很容易做到。您只需使用for循環的索引來幫助您爲您計算。而不是從1到i,你會從ii + 19。你需要確保你的for循環沒有超出信號的範圍,所以你需要迭代到length(x) - 19。您還需要20分的信號,你走之前到下一個窗口:

clear all; 
close all; 
x = load ('cpp1500.dat'); 
for i = 1 : length(x) - 19 % Change 
    s(i) = sum(x(i : i + 19)); % Change 
    r(i) = s(i)/20; % Change 
end 

plot(x,'R'); 
hold on; 
plot(r) 

但是,如果我能推薦一下,這裏不使用循環。使用filter並將右側係數指定爲全1,而左側係數爲20.您還必須認識到會出現延遲,因爲它在您收集20個樣本以獲得移動平均數之前立即開始過濾信號。因此,您需要大功告成後,從輸出刪除第一個19個樣本:

clear all; 
close all; 
x = load ('cpp1500.dat'); 
r = filter(ones(20, 1), 20, x(:)); 
r = r(20 : end); 
plot(x, 'R'); 
hold on; 
plot(r); 

請注意,我不知道你裝載體是什麼結構,所以我保證,這是一個列向量。

+0

謝謝。數據的變化與上圖主要問題一樣。計算的平均值作爲閾值,我想通過平均值計算原始信號的變化。所以,應該計算平均值而不使用過濾器。正如你在程序中所建議的,平均值計算到9980,但樣本數是10000.它想要計算所有樣本的平均值。我無法使用過濾器,因爲它提供了平滑的值。我想要有可以與實際數據進行比較的平均值。 –

+0

@NagaArjun您需要刪除原始信號末尾的最後21個樣本,以進行有意義的比較。即'xr = x(1:9980);'。 「過濾器」語法已經表達了意思。我不知道你想要什麼。 – rayryeng

+0

謝謝@rayryeng。我想計算整個樣本的平均值,並且我想保留那個移動均值作爲閾值。 –

0

在你的代碼中,你似乎混淆了一些索引。要回答這個問題(這不是推薦版本,請參閱下面的版本)

clear all; 
close all; 
x= load ('cpp1500.dat'); 
wndSize = 20; 
for i=1:length(x) - wndSize 
    s(i)=sum(x(i:i + wndSize)); 
end 
r = s ./ wndSize 

plot(x,'R') 

堅持; plot(r)

Matlab通常會懲罰在運行時間較長的數組上循環。你想用尺寸爲20的盒式過濾器執行1d過濾,其中Matlab碰巧有效地實現了函數。這應該做的伎倆:

windowSize = 20; 
b = (1/windowSize)*ones(1,windowSize); 
a = 1; 

r = filter(b, a, x) 

當心濾波器的實現稍有不同就從X是比windowSize靠近陣列的兩端元素的處理。但是,它會產生可用的滑動平均值。

參見:https://de.mathworks.com/help/matlab/ref/filter.html?requestedDomain=www.mathworks.com

+0

小心你的循環。這實際上會獲得每個滑動窗口的「wndSize + 1」值,而不是OP所需的「wndSize」。然而,你的過濾器實現是正確的......你需要從開始的時候從輸出中刪除'windowSize'元素。 – rayryeng

0

如果R2016a或更高版本,可以使用movmean function做到這一點。

r = movmean(x, [0 19]); 

將採取從當前點開始的20點移動平均線和向左使用19點。該函數還有其他選項,具體取決於您希望如何對齊窗口,處理端點,tec。