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? ¿Hay dos señales relacionadas? ¿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.

Comparando señales con diferentes frecuencias 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 reproduce. Los datos se almacenan comúnmente a una baja frecuencia 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 subgráfica muestran las señales de plantilla de la base de datos. El tercer subgráfico muestra la señal que queremos buscar en nuestra base de datos. Con solo mirar la serie de tiempo, la señal no parece coincidir con ninguna de las dos plantillas. Una inspección más cercana 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 puede remediarse fácilmente extrayendo la parte común de las señales. Además, no siempre es necesario ecualizar las longitudes. La correlación cruzada se puede realizar entre señales con longitudes diferentes, pero es esencial asegurarse de que tienen frecuencias de muestreo idénticas. La forma más segura de hacerlo es Remuestrear la señal con una tasa de muestreo más baja. La función aplica un filtro FIR de suavizado (paso bajo) 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 a 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 ])

El primer subgráfico indica que la señal y la plantilla 1 están menos correlacionadas, mientras que el pico alto en el segundo subgráfico 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 dirige la señal S por 499 muestras según lo indicado por SampleDiff. Esta información se puede utilizar para alinear las señales.

Medir el retardo entre las señales y alinearlos

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 trabajan a la misma velocidad de muestreo y que miden 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 se retrasa S1 por 350 muestras, y T31 indica que S3 lidera S1 por 150 muestras. Esta información ahora se puede utilizar para alinear las 3 señales por el cambio de tiempo de las señales. También podemos utilizar la función directamente para alinear las señales que alinea dos señales retrasando la señal más antigua.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')

Comparando el 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 de dominio de frecuencia entre 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 las frecuencias en las que la coherencia espectral es alta, la fase relativa entre los componentes correlacionados se puede estimar con la fase de espectro transversal.

[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 está cerca de-90 grados, y el desfase de fase entre los componentes de 165 Hz está cerca de-60 grados.

Encontrar 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, 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 retardo 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 son, calcule y trace la diferencia entre las ubicaciones de los picos subsiguientes.

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 de 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 aumentan durante el día.