Encontrar una señal en una medición
Recibe algunos datos y desea saber si coinciden con un flujo más largo que ha medido. La correlación cruzada permite determinarlo, aunque los datos estén corrompidos por ruido.
Cargue al espacio de trabajo una grabación de un anillo girando sobre una mesa. Recorte un fragmento de un segundo y escúchelo.
load('Ring.mat') Time = 0:1/Fs:(length(y)-1)/Fs; m = min(y); M = max(y); Full_sig = double(y); timeA = 7; timeB = 8; snip = timeA*Fs:timeB*Fs; Fragment = Full_sig(snip); % To hear, type soundsc(Fragment,Fs)
Represente la señal y el fragmento. Resalte los puntos finales del fragmento como referencia.
plot(Time,Full_sig,[timeA timeB;timeA timeB],[m m;M M],'r--') xlabel('Time (s)') ylabel('Clean') axis tight
plot(snip/Fs,Fragment) xlabel('Time (s)') ylabel('Clean') title('Fragment') axis tight
Calcule y represente la correlación cruzada de la señal completa y del fragmento.
[xCorr,lags] = xcorr(Full_sig,Fragment); plot(lags/Fs,xCorr) grid xlabel('Lags (s)') ylabel('Clean') axis tight
El desfase en el que la correlación cruzada es más grande es el retardo temporal entre los puntos iniciales de las señales. Vuelva a representar la señal y superponga el fragmento.
[~,I] = max(abs(xCorr)); maxt = lags(I); Trial = NaN(size(Full_sig)); Trial(maxt+1:maxt+length(Fragment)) = Fragment; plot(Time,Full_sig,Time,Trial) xlabel('Time (s)') ylabel('Clean') axis tight
Repita el procedimiento, pero añada ruido por separado a la señal y al fragmento. No se puede distinguir el sonido del ruido.
NoiseAmp = 0.2*max(abs(Fragment)); Fragment = Fragment+NoiseAmp*randn(size(Fragment)); Full_sig = Full_sig+NoiseAmp*randn(size(Full_sig)); % To hear, type soundsc(Fragment,Fs) plot(Time,Full_sig,[timeA timeB;timeA timeB],[m m;M M],'r--') xlabel('Time (s)') ylabel('Noisy') axis tight
El procedimiento encuentra el fragmento que falta pese al nivel de ruido elevado.
[xCorr,lags] = xcorr(Full_sig,Fragment); plot(lags/Fs,xCorr) grid xlabel('Lags (s)') ylabel('Noisy') axis tight
[~,I] = max(abs(xCorr)); maxt = lags(I); Trial = NaN(size(Full_sig)); Trial(maxt+1:maxt+length(Fragment)) = Fragment; figure plot(Time,Full_sig,Time,Trial) xlabel('Time (s)') ylabel('Noisy') axis tight