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.

Medición de similitudes de señal

Este ejemplo muestra cómo medir las similitudes de la señal. Le ayudará a responder preguntas tales como: ¿Cómo comparo las señales con diferentes longitudes o diferentes frecuencias de muestreo? ¿Cómo puedo encontrar si hay una señal o simplemente ruido en una medición? ¿Están relacionadas dos señales? ¿Cómo medir un retardo entre dos señales (y cómo las alineo)? ¿Cómo comparo el contenido de frecuencia de dos señales? Las similitudes también se pueden encontrar en diferentes secciones de una señal para determinar si una señal es periódica.

Comparación de señales con diferentes velocidades de muestreo

Considere una base de datos de señales de audio y una aplicación de coincidencia de patrones donde necesita identificar una canción mientras se está reproduciendo. Los datos se almacenan comúnmente a una baja velocidad de muestreo para ocupar menos memoria.

% Load data load relatedsig.mat  figure ax(1) = subplot(3,1,1); plot((0:numel(T1)-1)/Fs1,T1,'k') ylabel('Template 1') grid on ax(2) = subplot(3,1,2);  plot((0:numel(T2)-1)/Fs2,T2,'r') ylabel('Template 2') grid on ax(3) = subplot(3,1,3);  plot((0:numel(S)-1)/Fs,S) ylabel('Signal') grid on xlabel('Time (secs)') linkaxes(ax(1:3),'x') axis([0 1.61 -4 4])

La primera y la segunda subtrama muestran las señales de plantilla de la base de datos. La tercera subtrama muestra la señal que queremos buscar en nuestra base de datos. Con solo mirar la serie temporal, la señal no parece coincidir con ninguna de las dos plantillas. Una inspección más detallada revela que las señales realmente tienen diferentes longitudes y frecuencias de muestreo.

[Fs1 Fs2 Fs]
ans = 1×3

        4096        4096        8192

Diferentes longitudes le impiden calcular la diferencia entre dos señales, pero esto se puede remediar fácilmente mediante la extracción de la parte común de las señales. Además, no siempre es necesario igualar longitudes. La correlación cruzada se puede realizar entre señales con diferentes longitudes, pero es esencial asegurarse de que tienen velocidades de muestreo idénticas. La forma más segura de hacerlo es remuestrear la señal con una frecuencia de muestreo más baja. La función aplica un filtro FIR anti-aliasing(low-pass) a la señal durante el proceso de remuestreo.resample

[P1,Q1] = rat(Fs/Fs1);          % Rational fraction approximation [P2,Q2] = rat(Fs/Fs2);          % Rational fraction approximation T1 = resample(T1,P1,Q1);        % Change sampling rate by rational factor T2 = resample(T2,P2,Q2);        % Change sampling rate by rational factor

Encontrar una señal en una medición

Ahora podemos correlacionar la señal S con las plantillas T1 y T2 con la función para determinar si hay una coincidencia.xcorr

[C1,lag1] = xcorr(T1,S);         [C2,lag2] = xcorr(T2,S);          figure ax(1) = subplot(2,1,1);  plot(lag1/Fs,C1,'k') ylabel('Amplitude') grid on title('Cross-correlation between Template 1 and Signal') ax(2) = subplot(2,1,2);  plot(lag2/Fs,C2,'r') ylabel('Amplitude')  grid on title('Cross-correlation between Template 2 and Signal') xlabel('Time(secs)')  axis(ax(1:2),[-1.5 1.5 -700 700 ])

La primera subtrama indica que la señal y la plantilla 1 están menos correlacionadas, mientras que el pico alto en la segunda subtrama indica que la señal está presente en la segunda plantilla.

[~,I] = max(abs(C2)); SampleDiff = lag2(I)
SampleDiff = 499 
timeDiff = SampleDiff/Fs
timeDiff = 0.0609 

El pico de la correlación cruzada implica que la señal está presente en la plantilla T2 comenzando después de 61 ms. En otras palabras, la señal T2 conduce la señal S por 499 muestras según lo indicado por SampleDiff. Esta información se puede utilizar para alinear las señales.

Medición del retardo entre señales y alineación de las mismas

Considere una situación en la que está recopilando datos de diferentes sensores, registrando las vibraciones causadas por los coches a ambos lados de un puente. Al analizar las señales, es posible que deba alinearlas. Supongamos que tiene 3 sensores que funcionan a las mismas velocidades de muestreo y que están midiendo las señales causadas por el mismo evento.

figure, ax(1) = subplot(3,1,1); plot(s1) ylabel('s1') grid on ax(2) = subplot(3,1,2);  plot(s2,'k') ylabel('s2') grid on ax(3) = subplot(3,1,3);  plot(s3,'r') ylabel('s3') grid on xlabel('Samples') linkaxes(ax,'xy')

También podemos utilizar la función para encontrar el retardo entre dos señales.finddelay

t21 = finddelay(s1,s2)
t21 = -350 
t31 = finddelay(s1,s3)
t31 = 150 

t21 indica que s2 lags s1 por 350 muestras, y t31 indica que s3 conduce s1 por 150 muestras. Esta información ahora se puede utilizar para alinear las 3 señales por tiempo cambiando las señales. También podemos utilizar la función directamente para alinear las señales que alinean dos señales retrasando la señal más temprana.alignsignals

s1 = alignsignals(s1,s3); s2 = alignsignals(s2,s3);  figure ax(1) = subplot(3,1,1); plot(s1) grid on  title('s1') axis tight ax(2) = subplot(3,1,2); plot(s2) grid on  title('s2') axis tight ax(3) = subplot(3,1,3);  plot(s3) grid on  title('s3') axis tight linkaxes(ax,'xy')

Comparación del contenido de frecuencia de las señales

Un espectro de potencia muestra la potencia presente en cada frecuencia. La coherencia espectral identifica la correlación frecuencia-dominio entre las señales. Los valores de coherencia que tienden hacia 0 indican que los componentes de frecuencia correspondientes no están correlacionados, mientras que los valores que tienden hacia 1 indican que los componentes de frecuencia correspondientes están correlacionados. Considere dos señales y sus respectivos espectros de potencia.

Fs = FsSig;         % Sampling Rate  [P1,f1] = periodogram(sig1,[],[],Fs,'power'); [P2,f2] = periodogram(sig2,[],[],Fs,'power');  figure t = (0:numel(sig1)-1)/Fs; subplot(2,2,1) plot(t,sig1,'k') ylabel('s1') grid on title('Time Series') subplot(2,2,3) plot(t,sig2) ylabel('s2') grid on xlabel('Time (secs)') subplot(2,2,2) plot(f1,P1,'k') ylabel('P1') grid on axis tight title('Power Spectrum') subplot(2,2,4) plot(f2,P2) ylabel('P2') grid on axis tight xlabel('Frequency (Hz)')

La función calcula la coherencia espectral entre las dos señales.mscohere Confirma que sig1 y sig2 tienen dos componentes correlacionados alrededor de 35 Hz y 165 Hz. En frecuencias donde la coherencia espectral es alta, la fase relativa entre los componentes correlacionados se puede estimar con la fase de espectro cruzado.

[Cxy,f] = mscohere(sig1,sig2,[],[],[],Fs); Pxy     = cpsd(sig1,sig2,[],[],[],Fs); phase   = -angle(Pxy)/pi*180; [pks,locs] = findpeaks(Cxy,'MinPeakHeight',0.75);  figure subplot(2,1,1) plot(f,Cxy) title('Coherence Estimate') grid on hgca = gca; hgca.XTick = f(locs); hgca.YTick = 0.75; axis([0 200 0 1]) subplot(2,1,2) plot(f,phase) title('Cross-spectrum Phase (deg)') grid on hgca = gca; hgca.XTick = f(locs);  hgca.YTick = round(phase(locs)); xlabel('Frequency (Hz)') axis([0 200 -180 180])

El desfase de fase entre los componentes de 35 Hz es cercano a -90 grados, y el desfase de fase entre los componentes de 165 Hz es cercano a -60 grados.

Búsqueda de periodicidades en una señal

Considere un conjunto de mediciones de temperatura en un edificio de oficinas durante la temporada de invierno. Las mediciones se tomaron cada 30 minutos durante aproximadamente 16,5 semanas.

% Load Temperature Data load officetemp.mat   Fs = 1/(60*30);                 % Sample rate is 1 sample every 30 minutes days = (0:length(temp)-1)/(Fs*60*60*24);   figure plot(days,temp) title('Temperature Data') xlabel('Time (days)') ylabel('Temperature (Fahrenheit)') grid on

Con las temperaturas en los años 70 bajos, es necesario eliminar la media para analizar pequeñas fluctuaciones en la señal. La función elimina la media de la señal antes de calcular la correlación cruzada.xcov Devuelve la covarianza cruzada. Limite el retraso máximo al 50% de la señal para obtener una buena estimación de la covarianza cruzada.

maxlags = numel(temp)*0.5; [xc,lag] = xcov(temp,maxlags);           [~,df] = findpeaks(xc,'MinPeakDistance',5*2*24); [~,mf] = findpeaks(xc);  figure plot(lag/(2*24),xc,'k',...      lag(df)/(2*24),xc(df),'kv','MarkerFaceColor','r') grid on xlim([-15 15]) xlabel('Time (days)') title('Auto-covariance')

Observe las fluctuaciones dominantes y menores en la covarianza automática. Los picos dominantes y menores parecen equidistantes. Para comprobar si lo son, calcule y trace la diferencia entre las ubicaciones de los picos posteriores.

cycle1 = diff(df)/(2*24); cycle2 = diff(mf)/(2*24);  subplot(2,1,1) plot(cycle1) ylabel('Days') grid on title('Dominant peak distance') subplot(2,1,2) plot(cycle2,'r') ylabel('Days') grid on title('Minor peak distance')

 mean(cycle1)
ans = 7 
mean(cycle2)
ans = 1.0000 

Los picos menores indican 7 ciclos/semana y los picos dominantes indican 1 ciclo por semana. Esto tiene sentido dado que los datos provienen de un edificio con temperatura controlada en un calendario de 7 días. El primer ciclo de 7 días indica que hay un comportamiento cíclico semanal de la temperatura del edificio donde las temperaturas bajan durante los fines de semana y vuelven a la normalidad durante los días de la semana. El comportamiento del ciclo de 1 día indica que también hay un comportamiento cíclico diario - temperaturas más bajas durante la noche y aumentar durante el día.