Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

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, Fs=7418Hz.

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: y(n)=x(n)+αx(n-Δ). 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;

% To hear, type soundsc(mtEcho,Fs)

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)")

Figure contains 2 axes objects. Axes object 1 contains 2 objects of type line. These objects represent Original, Echo. Axes object 2 with xlabel Time (s) contains an object of type line. This object represents Total.

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)")

Figure contains an axes object. The axes object with xlabel Lag (s) contains an object of type line.

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 w obedece w(n)+αw(n-Δ)=y(n).

[~,dl] = findpeaks(Rmm,lags,MinPeakHeight=0.22);

mtNew = filter(1,[1 zeros(1,dl-1) alpha],mtEcho);

% To hear, type soundsc(mtNew,Fs)

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)")

Figure contains 2 axes objects. Axes object 1 contains an object of type line. This object represents Original. Axes object 2 with xlabel Time (s) contains an object of type line. This object represents Filtered.

Consulte también

Funciones