Используйте функцию findpeaks для временного ряда, только если этот временной ряд затмевает другой - PullRequest
0 голосов
/ 14 октября 2018

У меня вопрос по поводу findpeaks.Я хочу использовать его для обнаружения пиков в моем временном ряду сигнала (Сигнал 1).Это прекрасно работает, но у меня также есть суррогатные данные, служащие порогом значимости, равной длины (сигнал 2).Теперь я хочу использовать findpeaks для Сигнала 1, но только если Сигнал 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

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Вот пример, который должен выполнить то, что вы описали.Вы не указали фактическое содержимое вектора '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
0 голосов
/ 14 октября 2018

Не уверен, правильно ли я понял вопрос.Из вашего кода ясно, что у вас есть данные для пиков и координат, при которых эти пики возникают.

Если вы хотите только пики, где ваш второй временной ряд имеет меньшее значение, «просто переберите все пики - проверьте, что значение пика (i) меньше значения второй серии в locs (i) - удалите пики, которые меньше значения второй серии в тех же местах» .

Надеюсь, это поможет.

...