Main Content

Alinear dos señales simples

Este ejemplo muestra cómo utilizar la correlación cruzada para alinear las señales. En el caso más general, las señales tienen diferentes longitudes, y para sincronizarlas correctamente, debe tener en cuenta las longitudes y el orden en el que se introducen los argumentos en .xcorr

Considere dos señales, idénticas excepto por el número de ceros circundantes y por el hecho de que una de ellas se relague con la otra.

sz = 30; sg = randn(1,randi(8)+3); s1 = [zeros(1,randi(sz)-1) sg zeros(1,randi(sz)-1)]; s2 = [zeros(1,randi(sz)-1) sg zeros(1,randi(sz)-1)];  mx = max(numel(s1),numel(s2));  subplot(2,1,1) stem(s1) xlim([0 mx+1])  subplot(2,1,2) stem(s2,'*') xlim([0 mx+1])

Determinar cuál de las dos señales es más larga que la otra en el sentido de tener más elementos, ya sean ceros o no.

if numel(s1) > numel(s2)     slong = s1;     sshort = s2; else     slong = s2;     sshort = s1; end

Calcular la correlación cruzada de las dos señales. Ejecute con la señal más larga como primer argumento y la señal más corta como segundo argumento.xcorr Trazar el resultado.

[acor,lag] = xcorr(slong,sshort);  [acormax,I] = max(abs(acor)); lagDiff = lag(I)
lagDiff = 15 
 figure stem(lag,acor) hold on plot(lagDiff,acormax,'*') hold off

Alinee las señales. Piense en la señal de retraso como "más largo" que la otra, en el sentido de que tiene que "esperar más tiempo" para detectarla.

  • Si es positivo, "acortar" la señal larga teniendo en cuenta sus elementos de +1 hasta el final.lagDifflagDiff

  • Si es negativo, "alargar" la señal corta considerando sus elementos de +1 hasta el final.lagDiff-lagDiff

Debe agregar 1 a la diferencia de retraso porque MATLAB® utiliza la indexación basada en uno.

if lagDiff > 0     sorig = sshort;     salign = slong(lagDiff+1:end); else     sorig = slong;     salign = sshort(-lagDiff+1:end); end

Trazar las señales alineadas.

subplot(2,1,1) stem(sorig) xlim([0 mx+1])  subplot(2,1,2) stem(salign,'*') xlim([0 mx+1])

El método funciona porque la operación de correlación cruzada es antisimétrica y porque se ocupa de señales de diferentes longitudes mediante la adición de ceros en la señal más corta.xcorrFinal Esta interpretación le permite alinear las señales fácilmente utilizando el operador MATLAB® sin tener que rellenarlas a mano.end

También puede alinear las señales en un trazo invocando la función.alignsignals

[x1,x2] = alignsignals(s1,s2);  subplot(2,1,1) stem(x1) xlim([0 mx+1])  subplot(2,1,2) stem(x2,'*') xlim([0 mx+1])