解释起来有点复杂。我的时间序列数据格式如下:https://docs.google.com/spreadsheets/d/1B8mN0uD-t4kQr2U20gS713ZFHN6IgGB7OMR3-pqJjrw/edit?usp=sharing
该数据表示以0.01秒间隔的电压记录。绘制时,它看起来像这样:
基本上我想要做的是找到每个非常窄的对中的第一个峰出现的时间(即〜。,。,。,1.6,等等)。
时间值位于单独的数组中,但索引值(行号)在两个集合之间对应。
关于如何做到这一点的任何想法?
我最初的尝试来自matlab手册
function [edges2] = risingEdge2(time, data)
threshold = 0.4;
offsetData = [data(2:end); NaN];
edges2 = find(data < threshold & offsetData > threshold);
end
在第一个峰值之后的n秒内,我无法找到一个忽略的好方法......我还会得到比预期更多的峰值......可能是因为数据噪音很大。
答案 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);
%// Quantize sliding max data to three levels as the plot seem to suggest
quantized_slmax_data = round((slmax_data-min(slmax_data))./stepsize);
如果你放大上图,你会看到高峰周围的壁架 -
%// 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);
%// 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));