Cancelación de eco
Una grabación de voz incluye un eco causado por la reflexión en una pared. Utilice la autocorrelación para filtrarlo.
En la grabación, una persona dice la palabra MATLAB®. Cargue los datos y la tasa de muestreo, .
load mtlb % To hear, type soundsc(mtlb,Fs)
Modele el eco añadiendo a la grabación una copia de la señal retardada por muestras y atenuada por un factor conocido: . Especifique un desfase temporal de 0,23 s y un factor de atenuación de 0,5.
timelag = 0.23; delta = round(Fs*timelag); alpha = 0.5; orig = [mtlb;zeros(delta,1)]; echo = [zeros(delta,1);mtlb]*alpha; mtEcho = orig + echo;
Represente la señal original, el eco y la señal resultante.
t = (0:length(mtEcho)-1)/Fs; subplot(2,1,1) plot(t,[orig echo]) legend('Original','Echo') subplot(2,1,2) plot(t,mtEcho) legend('Total') xlabel('Time (s)')
% To hear, type soundsc(mtEcho,Fs)
Calcule una estimación sin sesgo de la autocorrelación de la señal. Seleccione y represente la sección que corresponde a desfases mayores que cero.
[Rmm,lags] = xcorr(mtEcho,'unbiased'); Rmm = Rmm(lags>0); lags = lags(lags>0); figure plot(lags/Fs,Rmm) xlabel('Lag (s)')
La autocorrelación tiene un pico pronunciado en el desfase al que llega el eco. Cancele el eco filtrando la señal mediante un sistema IIR cuya salida, , obedece .
[~,dl] = findpeaks(Rmm,lags,'MinPeakHeight',0.22);
mtNew = filter(1,[1 zeros(1,dl-1) alpha],mtEcho);
Represente la señal filtrada y compárela con la original.
subplot(2,1,1) plot(t,orig) legend('Original') subplot(2,1,2) plot(t,mtNew) legend('Filtered') xlabel('Time (s)')
% To hear, type soundsc(mtNew,Fs)