Alinear señales mediante correlación cruzada
Muchas mediciones incluyen datos recogidos de forma asíncrona por múltiples sensores. Si quiere integrar las señales y estudiarlas en conjunto, tiene que sincronizarlas. Para ello, utilice xcorr
.
Consideremos el ejemplo de un coche que cruza un puente. Las vibraciones que produce se miden con tres sensores idénticos, situados en distintos puntos. Las señales tienen diferentes tiempos de llegada.
Cargue las señales en el espacio de trabajo de MATLAB® y represéntelas.
load relatedsig tiledlayout(3,1) ax(1) = nexttile; plot(s1) ylabel("s_1") ax(2) = nexttile; plot(s2) ylabel("s_2") ax(3) = nexttile; plot(s3) ylabel("s_3") xlabel("Samples") linkaxes(ax,"x")
Calcule las correlaciones cruzadas entre los tres pares de señales. Normalícelas para que su valor máximo sea 1.
[C21,lag21] = xcorr(s2,s1); C21 = C21/max(C21); [C31,lag31] = xcorr(s3,s1); C31 = C31/max(C31); [C32,lag32] = xcorr(s3,s2); C32 = C32/max(C32);
Las ubicaciones de los valores máximos de las correlaciones cruzadas indican desfases positivos o desfases negativos temporales.
[M21,I21] = max(C21); t21 = lag21(I21); [M31,I31] = max(C31); t31 = lag31(I31); [M32,I32] = max(C32); t32 = lag32(I32);
Represente las correlaciones cruzadas. En cada gráfica se muestra la ubicación del máximo.
tiledlayout(3,1) nexttile plot(lag21,C21) xline(t21,"-","Lag: "+t21,LabelOrientation="horizontal") ylabel("C_{21}") title('Cross-Correlations') nexttile plot(lag31,C31) xline(t31,"-","Lag: "+t31,LabelOrientation="horizontal") ylabel("C_{31}") nexttile plot(lag32,C32) xline(t32,"-","Lag: "+t32,LabelOrientation="horizontal") ylabel("C_{32}") xlabel("Samples")
s2
presenta un desfase positivo con respecto a s1
de 350 muestras; s3
presenta un desfase negativo con respecto a s1
de 150 muestras. Por lo tanto, s2
presenta un desfase positivo con respecto a s3
de 500 muestras. Alinee las señales recortando los vectores con mayor retardo. De este modo, las señales están sincronizadas y listas para su posterior procesamiento.
s1 = s1(-t21:end); s3 = s3(t32:end); tiledlayout(3,1) ax(1) = nexttile; plot(s1) ylabel("s_1") ax(2) = nexttile; plot(s2) ylabel("s_2") ax(3) = nexttile; plot(s3) ylabel("s_3") xlabel("Samples") linkaxes(ax,"x")
Consulte también
alignsignals
| finddelay
| xcorr