我正在尝试确定一个以最大值为特征的循环的开始。虽然数据似乎是周期性的,但没有一定数量的点,因此我不能将数据分解为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]
感谢您的帮助
非常感谢任何帮助。
答案 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)])