Main Content

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;

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 contains an object of type line. This object represents Total.

% 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)')

Figure contains an axes object. The axes object 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);

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 contains an object of type line. This object represents Filtered.

% To hear, type soundsc(mtNew,Fs)

Consulte también

Funciones