Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Análisis de picos

Este ejemplo muestra cómo realizar análisis de picos básicos. Le ayudará a responder preguntas tales como: ¿Cómo encuentro picos en mi señal? ¿Cómo Mido la distancia entre los picos? ¿Cómo se mide la amplitud de los picos de una señal que se ve afectada por una tendencia? ¿Cómo encuentro picos en una señal ruidosa? ¿Cómo encuentro los mínimos locales?

Encontrar maxima o Peaks

El número relativo de la mancha solar de Zúrich mide tanto el número como el tamaño de las manchas solares. Utilice la función para buscar las ubicaciones y el valor de los picos.findpeaks

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

La gráfica anterior muestra los números de manchas solares tabulados a lo largo de 300 años y etiqueta los picos detectados. La siguiente sección muestra cómo medir la distancia entre estos picos.

Medición de distancia entre picos

Los picos en la señal parecen aparecer a intervalos regulares. Sin embargo, algunos de los picos están muy cerca el uno del otro. La propiedad se puede utilizar filtrar estos picos.MinPeakProminence Considere los picos que caen en ambos lados por al menos 40 números de puntos solares relativos antes de encontrar un valor más grande.

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

El siguiente histograma muestra la distribución de los intervalos de cresta en años:

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

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

La distribución muestra que la mayoría de los intervalos de cresta se encuentran entre 10 y 12 años indicando que la señal tiene una naturaleza cíclica. Además, el intervalo promedio de 10,96 años entre los picos coincide con la actividad conocida de la mancha solar cíclica de 11 años.

Encontrar picos en señales recortadas o saturadas

Es posible que desee considerar picos planos como picos o excluirlos. En este último caso, se especifica una excursión mínima que se define como la diferencia de amplitud entre un pico y sus vecinos inmediatos utilizando la propiedad.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])

El primer subgráfico muestra que, en el caso de un pico plano, el borde ascendente se detecta como el pico. El segundo subgráfico muestra que la especificación de un umbral puede ayudar a rechazar picos planos.

Midiendo amplitudes of Peaks

Este ejemplo muestra el análisis de picos en una señal de ECG (electro-cardiograma). El ECG es una medida de la actividad eléctrica del corazón con el tiempo. La señal se mide por electrodos conectados a la piel y es sensible a perturbaciones como la interferencia de la fuente de alimentación y los ruidos debidos a artefactos de movimiento.

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

Detrending Data

La señal antedicha muestra un desplazamiento de línea de fondo y por lo tanto no representa la amplitud verdadera. Con el fin de eliminar la tendencia, ajustar un polinomio de bajo orden a la señal y utilizar el polinomio para detrend.

[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')

Después de la resta, encontrar el complejo QRS que es el pico repetido más prominente en la señal de ECG. El complejo QRS corresponde a la despolarización de los ventrículos derecho e izquierdo del corazón humano. Se puede utilizar para determinar la frecuencia cardíaca del paciente o predecir anomalías en la función cardíaca. La figura siguiente muestra la forma del complejo QRS en una señal de ECG.

Thresholding para encontrar picos de interés

El complejo QRS consta de tres componentes principales:.Q-wave, R-wave, S-wave Las ondas R se pueden detectar por los picos de umbral por encima de 0.5 mV. Observe que las ondas R están separadas por más de 200 muestras. Utilice esta información para eliminar picos no deseados especificando un ' MinPeakDistance '.

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

Para la detección de las ondas S, encuentre el minima local en la señal y aplique los umbrales apropiadamente.

Finding Local Minima in Signal

Los mínimos locales se pueden detectar encontrando picos en una versión invertida de la señal original.

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

La siguiente gráfica muestra las ondas R y las ondas S detectadas en la señal.

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')

A continuación, tratamos de determinar las ubicaciones de las ondas Q. Thresholding de los picos para localizar los resultados de las ondas Q en la detección de picos no deseados como las ondas Q están enterrados en el ruido. Primero filtramos la señal y luego encontramos los picos. El filtrado Savitzky-Golay se utiliza para eliminar el ruido en la señal.

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')

Realizamos la detección de picos en la señal suave y usamos la indexación lógica para encontrar las ubicaciones de las ondas 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')

La figura anterior muestra que el complejo QRS detectó con éxito en la señal de ECG ruidoso.

Error Between Noisy and Smooth Signal

Observe la diferencia media entre el QRS-Complex en la señal filtrada en bruto y la detrended.

% 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 

Esto demuestra que es esencial restar una señal ruidosa para un análisis de picos eficiente.

Peak Properties

Algunas propiedades importantes del pico implican tiempo de subida, tiempo de caída, nivel de subida y nivel de caída. Estas propiedades se calculan para cada uno de los complejos QRS en la señal de ECG. Los valores medios de estas propiedades se muestran en la figura siguiente.

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)

Consulte también