2013-08-23 48 views
0

我正在嘗試識別將以最大值爲特徵的週期的開始。雖然數據看起來是週期性的,但沒有一定數量的點,所以我不能將數據分成50個點並搜索最大值。但是,我知道在20點(pt_limit)過去之前,這個週期不能重複,可能會使用一次檢查。由於DAQ硬件的限制,也沒有數據觸發器。我已經包括了幾個循環,但實際的數據集將包含數千個這樣的準週期循環。
下面是一個例子(提前爲較長數據集對不起):在Matlab中識別非週期性週期的開始

data = [9147 9147 9513 9696 9696 9940 10093 10093 10246 10520 10520 10520 10795 10947 10947 11222 11772 11772 9452 4049 4049 4049 599 111 691 691 1515 2309 2309 2309 3072 3683 3683 4415 4995 4995 5453 5453 6063 6063 6643 7162 7162 7468 7742 7742 7742 8200 8536 8536 8841 9116 9116 9238 9543 9543 9543 9818 10001 10001 10246 10551 10551 10673 10673 10673 10917 10917 8749 4049 4049 1057 722 722 722 1210 2004 2004 2828 3683 3683 4293 4293 4751 4751 5270 5728 5728 6155 6643 6643 6643 7071 7437 7437 7712 8048 8048 8353 8353 8689 8689 9024 9269 9269 9513 9909 10215 10215 10215 10368 10673 10673 11008 11192 11192 11039 7864 7864 7864 2828 661 661 661 1332 1332 2309 2309 2950 2950 3683 4507 4507 5117 5667 5667 5667 6094 6521 6521 6949 7437 7437 7864 7864 8169 8169 8322 8689 9086 9086]; 
dt = [0 diff(data)]; 
t_thresh = -0.5;  % threshold to identify changes (exclude noise) 
ind = find(dt < t_thresh); 
figure 
set(gcf,'position',[50 50 (1080) (675)]) 
ax(1) = subplot(2,1,1); 
plot(data, '.') 
xlim([-5 155]) 
grid on 
ax(2) = subplot(2,1,2) 
plot(dt, '.') 
grid on 
hold on 
plot(ind, dt(ind), 'ro') 
xlim([-5 155]) 
linkaxes(ax,'x') 

數據經常包含這使得只是爲了尋找在衍生難以大的變化重複點。
這個問題與包括數據集的解決辦法是:

cycle_ind = [18 68 116] 

感謝您的幫助

任何幫助將不勝感激。

回答

1

我會嘗試過濾數據,然後尋找導數中的符號變化,而不是對它進行閾值處理。

B = fir1(8,0.5); 
newData = filtfilt(B,1,data); 
dt = [0 sign(diff(newData))]; 
ddt = -[0 diff(dt)]; 
localMaxima = data(ddt>0); 
idx = find(ddt>0); 
plot(1:length(data),[data;newData;ddt*max(data)]) 
+0

尋找符號變化的問題是數據並非單調遞增或遞減,只有一個方向跳躍。信號中有噪音(因此是門檻的想法)。如果我使用上面的代碼,我會得到49個「結果」而不是3個。 – dgmitch

+0

我剛剛意識到數據需要過濾。使用filtfilt函數可以讓你在那裏。我在測試代碼之前編寫了原始答案。 – dsgrnt

+0

dsgrnt - 非常感謝。這就是它。我嘗試了一個移動平均過濾器,沒有多少像。這真的符合法案! – dgmitch