Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Análisis de picos

Este ejemplo muestra cómo realizar el 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 picos? ¿Cómo mido la amplitud de los picos de una señal que se ve afectada por una tendencia? ¿Cómo encuentro picos en una señal ruidoso? ¿Cómo encuentro minima local?

Encontrar Maxima o Peaks

El número relativo de manchas solares 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 la distancia entre picos

Los picos de 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 manchas de sol relativas antes de encontrar un valor mayor.

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

El histograma siguiente muestra la distribución de los intervalos pico 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 pico se encuentran entre 10 y 12 años, lo que indica que la señal tiene una naturaleza cíclica. Además, el intervalo medio de 10,96 años entre los picos coincide con la actividad conocida de manchas solares cíclicas de 11 años.

Búsqueda de picos en señales recortadas o saturadas

Es posible que desee considerar los 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])

La primera subtrama muestra, que en caso de un pico plano, el borde ascendente se detecta como el pico. El segundo subgráfico muestra que especificar un umbral puede ayudar a rechazar picos planos.

Medición de amplitudes de picos

Este ejemplo muestra el análisis de pico en una señal ECG (electrocardiograma). El ECG es una medida de la actividad eléctrica del corazón a lo largo del tiempo. La señal se mide mediante electrodos conectados a la piel y es sensible a alteraciones tales como interferencias en la fuente de alimentación y 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

Datos detrending

La señal anterior muestra un desplazamiento de línea base y, por lo tanto, no representa la amplitud verdadera. Con el fin de eliminar la tendencia, ajuste un polinomio de orden bajo a la señal y utilice el polinomio para destendencia.

[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 detrending, encontrar el complejo QRS que es el pico de repetición más prominente en la señal 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 de un paciente o predecir anomalías en la función cardíaca. La siguiente figura muestra la forma del complejo QRS en una señal ECG.

Umbral 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 umbrales 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, busque el mínimo local en la señal y aplique los umbrales apropiadamente.

Encontrar Minima local en señal

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, intentamos determinar las ubicaciones de las ondas Q. Umbral de los picos para localizar las ondas Q da como resultado la detección de picos no deseados como las ondas Q están enterradas en el ruido. Filtramos la señal primero y luego encontramos los picos. El filtrado Savitzky-Golay se utiliza para eliminar el ruido de 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 utilizamos 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 detectado con éxito en la señal ECG ruidoso.

Error entre la señal ruidosa y suave

Observe la diferencia media entre el complejo QRS en la cruda y la señal filtrada detendencia.

% 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 destendencia de una señal de ruidoso para el análisis de picos eficiente.

Propiedades de pico

Algunas propiedades pico importantes 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 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