仅当此时间序列超过另一个时间序列时,才对时间序列使用 findpeaks 函数

Use findpeaks function on a time series only if this time series eclipses another

我有一个关于 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

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

如果您只想要第二个时间序列具有较低值的峰值,"just loop through all the peaks - check if the peak(i) value is lower than value of second series at locs(i) - remove the peaks that are lower than value of second series at same locs".

希望对您有所帮助。

这是一个应该可以完成您所描述内容的示例。您没有指定 '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