在Matlab时间序列数据中找到阈值交叉,然后在找到下一个阈值交叉之前忽略后续交叉60秒

时间:2014-11-07 14:24:24

标签: matlab threshold

解释起来有点复杂。我的时间序列数据格式如下:https://docs.google.com/spreadsheets/d/1B8mN0uD-t4kQr2U20gS713ZFHN6IgGB7OMR3-pqJjrw/edit?usp=sharing

该数据表示以0.01秒间隔的电压记录。绘制时,它看起来像这样:

http://i.imgur.com/yatlBLt.jpg .

基本上我想要做的是找到每个非常窄的对中的第一个峰出现的时间(即〜。,。,。,1.6,等等)。

时间值位于单独的数组中,但索引值(行号)在两个集合之间对应。

关于如何做到这一点的任何想法?

我最初的尝试来自matlab手册

function [edges2] = risingEdge2(time, data)
threshold = 0.4;
offsetData = [data(2:end); NaN];
edges2 = find(data < threshold & offsetData > threshold);
end

在第一个峰值之后的n秒内,我无法找到一个忽略的好方法......我还会得到比预期更多的峰值......可能是因为数据噪音很大。

2 个答案:

答案 0 :(得分:0)

以下方法似乎适用于给定的数据。

%// Define parameters
window_size = 200;
stepsize = 0.4; %// to be used for quantizing data into three levels - 0, 0.4, 0.8

%// Perform a sliding max to get rid of the dips within the spikes
slmax_data = nlfilter(data,[window_size 1],@max);

enter image description here

%// Quantize sliding max data to three levels as the plot seem to suggest
quantized_slmax_data = round((slmax_data-min(slmax_data))./stepsize);

enter image description here

如果你放大上图,你会看到高峰周围的壁架 -

enter image description here

%// Get sliding mode to get rid of the short ledges around the high peaks
slmax_mode_data = nlfilter(quantized_slmax_data,[window_size 1],@mode);

enter image description here

%// Finally, find the indices where the mode data jump from 0 to 1 only, which
%// correspond to the start of spikes
index = find(diff(slmax_mode_data)==1)+window_size/2;

输出 -

index =
         682
        8048
       16487
       24164
       31797

答案 1 :(得分:0)

在这里 - 找到所有上升沿,然后找到非常靠近的那些并取第一个。

rising_edges = find(diff(data > .3) > 0);
first_of_paired_edges = find(diff(time(rising_edges)) < 500);

first_rising_edge_times = time(rising_edges(first_of_paired_edges));

然后,您可以将边缘向上滑动到峰值。

first_peak_times = time(arrayfun( @(n) n+find(diff(data(n+[0:1000]) < 0, 1, 'first'), 
                        rising_edges(first_of_paired_edges));