exponenta event banner

Пиковый анализ

В этом примере показано, как выполнять базовый пиковый анализ. Это поможет вам ответить на такие вопросы, как: Как найти пики в моем сигнале? Как измерить расстояние между пиками? Как измерить амплитуду пиков сигнала, на который влияет тренд? Как найти пики в шумном сигнале? Как найти локальные минимумы?

Поиск максимумов или пиков

Цюрихское относительное число солнечных пятен измеряет как количество, так и размер солнечных пятен. Используйте findpeaks для поиска местоположений и значения пиков.

load sunspot.dat
year = sunspot(:,1); 
relNums = sunspot(:,2);
findpeaks(relNums,year)
xlabel('Year')
ylabel('Sunspot Number')
title('Find All Peaks')

Figure contains an axes. The axes with title Find All Peaks contains 2 objects of type line.

На приведенном выше графике показаны номера солнечных пятен в таблице за 300 лет и отмечены обнаруженные пики. В следующем разделе показано, как измерять расстояние между этими пиками.

Измерение расстояния между пиками

Пики в сигнале появляются через равные промежутки времени. Однако некоторые из пиков очень близки друг к другу. MinPeakProminence можно использовать свойство для фильтрации этих пиков. Рассмотрим пики, которые выпадают с обеих сторон как минимум на 40 относительных солнечных пятен, прежде чем встретить большее значение.

findpeaks(relNums,year,'MinPeakProminence',40)
xlabel('Year')
ylabel('Sunspot Number')
title('Find Prominent Peaks')

Figure contains an axes. The axes with title Find Prominent Peaks contains 2 objects of type line.

Следующая гистограмма показывает распределение пиковых интервалов в годах:

figure
[pks, locs] = findpeaks(relNums,year,'MinPeakProminence',40);
peakInterval = diff(locs);
histogram(peakInterval)
grid on
xlabel('Year Intervals')
ylabel('Frequency of Occurrence')
title('Histogram of Peak Intervals (years)')

Figure contains an axes. The axes with title Histogram of Peak Intervals (years) contains an object of type histogram.

AverageDistance_Peaks = mean(diff(locs))
AverageDistance_Peaks = 10.9600

Распределение показывает, что большинство пиковых интервалов лежит между 10 и 12 годами, что указывает на циклическую природу сигнала. Также средний интервал 10,96 года между пиками соответствует известной циклической активности солнечных пятен 11 лет.

Поиск пиков в отсеченных или насыщенных сигналах

Можно рассматривать плоские пики как пики или исключать их. В последнем случае минимальное отклонение, которое определяется как разность амплитуд между пиком и его ближайшими соседями, определяется с помощью threshold собственность.

load clippedpeaks.mat

figure

% Show all peaks in the first plot
ax(1) = subplot(2,1,1);
findpeaks(saturatedData)
xlabel('Samples')
ylabel('Amplitude')
title('Detecting Saturated Peaks')

% Specify a minimum excursion in the second plot
ax(2) = subplot(2,1,2);
findpeaks(saturatedData,'threshold',5)
xlabel('Samples')
ylabel('Amplitude')
title('Filtering Out Saturated Peaks')

% link and zoom in to show the changes
linkaxes(ax(1:2),'xy')
axis(ax,[50 70 0 250])

Figure contains 2 axes. Axes 1 with title Detecting Saturated Peaks contains 2 objects of type line. Axes 2 with title Filtering Out Saturated Peaks contains 2 objects of type line.

Первый подграфик показывает, что в случае плоского пика передний фронт обнаруживается как пик. Второй вложенный график показывает, что задание порога может помочь отклонить плоские пики.

Измерение амплитуд пиков

В этом примере показан пиковый анализ в сигнале ЭКГ (электрокардиограмма). ЭКГ является мерой электрической активности сердца с течением времени. Сигнал измеряется электродами, прикрепленными к коже, и чувствителен к возмущениям, таким как помехи источника питания и шумы из-за артефактов движения.

load noisyecg.mat
t = 1:length(noisyECG_withTrend);

figure
plot(t,noisyECG_withTrend)
title('Signal with a Trend')
xlabel('Samples');
ylabel('Voltage(mV)')
legend('Noisy ECG Signal')
grid on

Figure contains an axes. The axes with title Signal with a Trend contains an object of type line. This object represents Noisy ECG Signal.

Сдерживание данных

Вышеупомянутый сигнал показывает сдвиг базовой линии и, следовательно, не представляет истинную амплитуду. Чтобы удалить тренд, поместите многочлен низкого порядка в сигнал и используйте многочлен, чтобы его уменьшить.

[p,s,mu] = polyfit((1:numel(noisyECG_withTrend))',noisyECG_withTrend,6);
f_y = polyval(p,(1:numel(noisyECG_withTrend))',[],mu);

ECG_data = noisyECG_withTrend - f_y;        % Detrend data

figure
plot(t,ECG_data)
grid on
ax = axis;
axis([ax(1:2) -1.2 1.2])
title('Detrended ECG Signal')
xlabel('Samples')
ylabel('Voltage(mV)')
legend('Detrended ECG Signal')

Figure contains an axes. The axes with title Detrended ECG Signal contains an object of type line. This object represents Detrended ECG Signal.

После сдерживания найдите комплекс QRS, который является наиболее заметным повторяющимся пиком в сигнале ЭКГ. Комплекс QRS соответствует деполяризации правого и левого желудочков сердца человека. Он может быть использован для определения частоты сердечных сокращений пациента или прогнозирования нарушений функции сердца. На следующем рисунке показана форма комплекса QRS в ЭКГ-сигнале.

Пороговое значение для поиска интересующих пиков

Комплекс QRS состоит из трёх основных компонентов: Q wave, R wave, S wave. Волны R могут быть обнаружены пороговыми пиками выше 0,5 мВ. Обратите внимание, что волны R разделены более чем 200 выборками. Эта информация используется для удаления нежелательных пиков путем указания MinPeakDistance.

[~,locs_Rwave] = findpeaks(ECG_data,'MinPeakHeight',0.5,...
                                    'MinPeakDistance',200);

Для обнаружения S-волн найдите локальные минимумы в сигнале и примените соответствующие пороги.

Поиск локальных минимумов в сигнале

Локальные минимумы могут быть обнаружены путем нахождения пиков в инвертированной версии исходного сигнала.

ECG_inverted = -ECG_data;
[~,locs_Swave] = findpeaks(ECG_inverted,'MinPeakHeight',0.5,...
                                        'MinPeakDistance',200);

На следующем графике показаны волны R и S, обнаруженные в сигнале.

figure
hold on 
plot(t,ECG_data)
plot(locs_Rwave,ECG_data(locs_Rwave),'rv','MarkerFaceColor','r')
plot(locs_Swave,ECG_data(locs_Swave),'rs','MarkerFaceColor','b')
axis([0 1850 -1.1 1.1])
grid on
legend('ECG Signal','R waves','S waves')
xlabel('Samples')
ylabel('Voltage(mV)')
title('R wave and S wave in Noisy ECG Signal')

Figure contains an axes. The axes with title R wave and S wave in Noisy ECG Signal contains 3 objects of type line. These objects represent ECG Signal, R waves, S waves.

Затем попытаемся определить местоположение Q-волн. Пороговое значение пиков для определения местоположения Q-волн приводит к обнаружению нежелательных пиков, когда Q-волны погружены в шум. Сначала мы фильтруем сигнал, а затем находим пики. Фильтрация Савицки-Голая используется для удаления шума в сигнале.

smoothECG = sgolayfilt(ECG_data,7,21);

figure
plot(t,ECG_data,'b',t,smoothECG,'r')
grid on
axis tight
xlabel('Samples')
ylabel('Voltage(mV)')
legend('Noisy ECG Signal','Filtered Signal')
title('Filtering Noisy ECG Signal')

Figure contains an axes. The axes with title Filtering Noisy ECG Signal contains 2 objects of type line. These objects represent Noisy ECG Signal, Filtered Signal.

Мы выполняем обнаружение пиков на гладком сигнале и используем логическую индексацию, чтобы найти местоположения Q волн.

[~,min_locs] = findpeaks(-smoothECG,'MinPeakDistance',40);

% Peaks between -0.2mV and -0.5mV
locs_Qwave = min_locs(smoothECG(min_locs)>-0.5 & smoothECG(min_locs)<-0.2);

figure
hold on
plot(t,smoothECG); 
plot(locs_Qwave,smoothECG(locs_Qwave),'rs','MarkerFaceColor','g')
plot(locs_Rwave,smoothECG(locs_Rwave),'rv','MarkerFaceColor','r')
plot(locs_Swave,smoothECG(locs_Swave),'rs','MarkerFaceColor','b')
grid on
title('Thresholding Peaks in Signal')
xlabel('Samples')
ylabel('Voltage(mV)')
ax = axis;
axis([0 1850 -1.1 1.1])
legend('Smooth ECG signal','Q wave','R wave','S wave')

Figure contains an axes. The axes with title Thresholding Peaks in Signal contains 4 objects of type line. These objects represent Smooth ECG signal, Q wave, R wave, S wave.

На приведенном выше рисунке показано, что комплекс QRS успешно обнаружен в шумном ЭКГ сигнале.

Ошибка между шумным и плавным сигналом

Обратите внимание на среднюю разницу между комплексом QRS в необработанном и подавленном отфильтрованном сигнале.

% Values of the Extrema
[val_Qwave, val_Rwave, val_Swave] = deal(smoothECG(locs_Qwave), smoothECG(locs_Rwave), smoothECG(locs_Swave));

meanError_Qwave = mean((noisyECG_withTrend(locs_Qwave) - val_Qwave))
meanError_Qwave = 0.2771
meanError_Rwave = mean((noisyECG_withTrend(locs_Rwave) - val_Rwave))
meanError_Rwave = 0.3476
meanError_Swave = mean((noisyECG_withTrend(locs_Swave) - val_Swave))
meanError_Swave = 0.1844

Это демонстрирует, что для эффективного пикового анализа необходимо подавлять шумный сигнал.

Пиковые свойства

Некоторые важные пиковые свойства включают время подъема, время падения, уровень подъема и уровень падения. Эти свойства вычисляются для каждого из комплексов QRS в ЭКГ-сигнале. Средние значения этих свойств показаны на рисунке ниже.

avg_riseTime = mean(locs_Rwave-locs_Qwave); % Average Rise time
avg_fallTime = mean(locs_Swave-locs_Rwave); % Average Fall time
avg_riseLevel = mean(val_Rwave-val_Qwave);  % Average Rise Level
avg_fallLevel = mean(val_Rwave-val_Swave);  % Average Fall Level

helperPeakAnalysisPlot(t,smoothECG,...
                    locs_Qwave,locs_Rwave,locs_Swave,...
                    val_Qwave,val_Rwave,val_Swave,...
                    avg_riseTime,avg_fallTime,...
                    avg_riseLevel,avg_fallLevel)

Figure contains an axes. The axes with title QRS-complex in an ECG signal contains 11 objects of type line, text. These objects represent QRS-Complex, Peak, Minima.

См. также