【问题标题】:Identifying start of non-periodic cycles in Matlab在 Matlab 中识别非周期性循环的开始
【发布时间】:2013-08-23 16:04:32
【问题描述】:

我试图确定一个以最大值为特征的周期的开始。尽管数据似乎是周期性的,但没有固定的点数,所以我不能将数据分成 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]

感谢您的帮助

任何帮助将不胜感激。

【问题讨论】:

    标签: matlab max data-analysis


    【解决方案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)])
    

    【讨论】:

    • 寻找符号变化的问题是数据不是单调递增或递减的。信号中有噪声(因此是阈值概念)。如果我使用上面的代码,我会得到 49 个“结果”而不是 3 个。
    • 我刚刚意识到需要过滤数据。使用 filtfilt 功能可以帮助您。我在测试代码之前写了原始答案。
    • dsgrnt - 非常感谢。这正是它。我尝试了一个没有太多类似的移动平均滤波器。这真的很合算!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2013-04-06
    • 2015-04-25
    • 2013-03-05
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多