在Matlab timeseries数据中查找阈值交叉点,然后在查找下一个阈值交叉点之前忽略后续交叉点60秒

在Matlab timeseries数据中查找阈值交叉点,然后在查找下一个阈值交叉点之前忽略后续交叉点60秒,matlab,threshold,Matlab,Threshold,这解释起来有点复杂。我有如下格式的时间序列数据: 该数据表示0.01秒间隔的电压记录。绘制时,它如下所示: 基本上,我想做的是找出每个非常窄的对中第一个峰值出现的时间(即~.1、.75、1.6等) 时间值位于单独的数组中,但索引值(行号)对应于两个集合 有什么办法吗 我最初的尝试类似于matlab手册中的内容 function [edges2] = risingEdge2(time, data) threshold = 0.4; offsetData = [data(2:end); NaN];

这解释起来有点复杂。我有如下格式的时间序列数据:

该数据表示0.01秒间隔的电压记录。绘制时,它如下所示:

基本上,我想做的是找出每个非常窄的对中第一个峰值出现的时间(即~.1、.75、1.6等)

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

有什么办法吗

我最初的尝试类似于matlab手册中的内容

function [edges2] = risingEdge2(time, data)
threshold = 0.4;
offsetData = [data(2:end); NaN];
edges2 = find(data < threshold & offsetData > threshold);
end
function[edges2]=risingEdge2(时间、数据)
阈值=0.4;
offsetData=[数据(2:结束);NaN];
edges2=查找(数据<阈值&偏移数据>阈值);
结束

我想不出一个好办法,在第一个峰值后n秒忽略…我也得到了比预期更多的峰值…可能是因为嘈杂的数据

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

%// 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);

如果你放大上图,你会看到山峰周围的凸台-

%// 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);

输出-

index =
         682
        8048
       16487
       24164
       31797
在这里——找到所有的上升边,然后找到那些非常接近的,然后取第一个

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));
rising_edges=find(diff(data>.3)>0);
第一条成对边=查找(差异(时间(上升边))<500;
第一条上升边的次数=时间(上升边(第一条配对边));
然后你可以沿着边缘滑到山顶

first_peak_times = time(arrayfun( @(n) n+find(diff(data(n+[0:1000]) < 0, 1, 'first'), 
                        rising_edges(first_of_paired_edges));
first_peak_times=时间(arrayfun(@(n)n+find(diff)(数据(n+[0:1000])<0,1,'first'),
上升边(成对边中的第一条边);

是否有您尝试过但遇到问题的东西?您能使用信号处理工具箱吗?@AnonSubmitter85刚刚用我的尝试更新。好吧,在sig proc工具箱中有
findpeaks
命令,但我不知道这是否适用于方脉冲序列顶部的上下特性。如何ral和robust这必须是吗?如果你对简单的阈值设置感到满意,那么你可以只设置阈值并忽略阈值以上超过N秒的区域。但是这样做有点像黑客。如果窄信号是周期性的,你能在频域中隔离它们吗?同样,方形脉冲序列可能很难做到这一点。所以如果你只是设定阈值,你会得到一个由1和0组成的向量。找到1的每个连续跨度的长度,丢弃那些太长的。剩下的将是更窄的脉冲。哦,我喜欢这个解决方案。但我无法让它工作。我不熟悉nlfilter…我一直得到错误未定义函数n“nlfilter”用于“function_handle”类型的输入参数。编辑:我想我需要安装图像处理工具箱。@user3746901是的图像处理工具箱需要使用这些代码!让我知道它是如何运行的?
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));