【问题标题】:Use findpeaks function on a time series only if this time series eclipses another仅当该时间序列超过另一个时间序列时才对时间序列使用 findpeaks 函数
【发布时间】:2018-10-14 14:17:27
【问题描述】:

我有一个关于 findpeaks 的问题。我想用它来检测我的信号时间序列(信号 1)中的峰值。这很好用,但我也有替代数据,作为重要性阈值,长度相等(信号 2)。我现在想在信号 1 上使用 findpeaks,但前提是信号 1 在那个时间点大于信号 2。我尝试使用 findpeaks 的常规属性,但到目前为止没有任何效果......这是我现在所拥有的:

GPDC 是一个 9x9x512 的双精度。 Dim 1 包含通过多变量自回归模型在方向 xi - xj 上估计的部分定向相干值, Dim 2 包含与 xj -xi 相同的值, Dim 3 表示频率区间的数量。 eEPDCsth 是一个 9x9x512 双精度型,包含相应的代理数据。 f 是一个 1x512 双精度值,包含频率值。我认为现在 >= 参考不起作用,因为它不是特定时间的,即它不会逐点比较信号,而是总体比较。这是我认为的主要问题......

Sz=9;
for i=1:Sz
    for j=1:Sz
    if squeeze(GPDC(i,j,:)) >= squeeze(eEPDCsth(i,j,:))
       [pks_1{i,j},locs_1{i,j}] = findpeaks(squeeze(GPDC(i,j,:)),f,'npeaks',5,'MinPeakHeight', .1);
    end
    end
end

【问题讨论】:

  • 那么你到底做了什么?显示一些代码。
  • 不要评论代码。出于这个确切原因,您的问题下方有一个编辑按钮。请把它变成一个遵循网站规则的完整的可回答问题。
  • 我的错!我现在更新了。希望这会更好
  • 您的实际输入是什么?它们有多大,尺寸代表什么?即,您认为代码在做什么? (回答问题并在完成后使用 cmets ping 我)
  • 谢谢,我现在详细说明了。

标签: matlab threshold significance


【解决方案1】:

这是一个应该完成您所描述的示例。您没有指定 'f' 向量的实际内容,因此我在本例中将其设置为 1:512

% data for testing
GPDC = rand(9,9,512);
eEPDCsth = rand(9,9,512);
f = 1:512; % the value of the 'f' vector wasn't specified in question

Sz=9;
for i=1:Sz
    for j=1:Sz
        % find the 'raw' peaks below thresholding
        [peak_val_raw, peak_indices_raw] = findpeaks(squeeze(GPDC(i,j,:)),'npeaks',5,'MinPeakHeight', .1);

        % only keep peaks that are above the corresponding threshold value
        peaks_above_threshold = squeeze(GPDC(i,j,peak_indices_raw)) > squeeze(eEPDCsth(i,j,peak_indices_raw));
        peak_values_thresholded = peak_val_raw(peaks_above_threshold);
        peak_indices_thresholded = peak_indices_raw(peaks_above_threshold);

        pks_1{i,j} = peak_values_thresholded;
        % index into 'f' vector to match code in original question
        locs_1{i,j} = f(peak_indices_thresholded); 

    end
end

【讨论】:

  • 嘿,非常感谢。我试过了,但是 findpeaks 函数中不是缺少“f”向量吗?因为我还想在 findpeaks 中指定频率范围...
  • 如果“f”向量(用于 findpeaks 的 MATLAB 文档称为“位置向量”)特定于 findpeaks,则返回的位置将根据 f,而不是它们的原始索引。但是在这里,我们需要知道原始索引,以便我们可以索引信号和比较数据集以进行阈值比较。然后循环的最后一行将超过阈值的值的位置索引回“f”向量。
【解决方案2】:

不确定我是否正确理解了这个问题。从您的代码中可以清楚地看出,您有峰值的数据以及这些峰值出现的坐标。

如果您只想要第二个时间序列值较低的峰值,“只需循环遍历所有峰值 - 检查 peak(i) 值是否低于 locs 处的第二个序列值( i) - 去除同一位置低于第二序列值的峰".

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多