在Matlab中识别非周期性循环的开始

时间:2013-08-23 16:04:33

标签: matlab max data-analysis

我正在尝试确定一个以最大值为特征的循环的开始。虽然数据似乎是周期性的,但没有一定数量的点,因此我不能将数据分解为50分并搜索最大值。但是,我知道在20 pts(pt_limit)过去之前循环不能重复,这可能会被用来检查。由于DAQ硬件的限制,也没有数据触发器。我在下面列出了几个循环,但实际数据集将包含数千个这样的准周期循环 这是一个例子(对于较长的数据集,提前抱歉):

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 个答案:

答案 0 :(得分: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)])