Main Content

Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Cancelación de eco

Una grabación de voz incluye un eco causado por el reflejo de una pared. Utilice la autocorrelación para filtrarla.

En la grabación, una persona dice la palabra MATLAB®. Cargue los datos y la frecuencia de muestreo,

<math display="block">
<mrow>
<msub>
<mrow>
<mi>F</mi>
</mrow>
<mrow>
<mi>s</mi>
</mrow>
</msub>
<mo>=</mo>
<mn>7</mn>
<mn>4</mn>
<mn>1</mn>
<mn>8</mn>
<mspace width="0.2777777777777778em"></mspace>
<mstyle mathvariant="normal">
<mrow>
<mi>H</mi>
<mi>z</mi>
</mrow>
</mstyle>
</mrow>
</math>
.

load mtlb  % To hear, type soundsc(mtlb,Fs)

Modele el eco añadiendo a la grabación una copia de la señal retrasada por

<math display="block">
<mrow>
<mi>Δ</mi>
</mrow>
</math>
muestras y atenuadas por un factor conocido
<math display="block">
<mrow>
<mi>α</mi>
</mrow>
</math>
:
<math display="block">
<mrow>
<mi>y</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo stretchy="false">)</mo>
<mo>+</mo>
<mi>α</mi>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>-</mo>
<mi>Δ</mi>
<mo stretchy="false">)</mo>
</mrow>
</math>
. Especifique un desatamiento de tiempo 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;

Trazar el 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)

Calcular una estimación imparcial de la autocorrelación de la señal. Seleccione y trace la sección que corresponde a retrasos 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 agudo en el retraso al que llega el eco. Cancele el eco filtrando la señal a través de un sistema IIR cuya salida,

<math display="block">
<mrow>
<mi>w</mi>
</mrow>
</math>
Obedece
<math display="block">
<mrow>
<mi>w</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo stretchy="false">)</mo>
<mo>+</mo>
<mi>α</mi>
<mi>w</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>-</mo>
<mi>Δ</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mi>y</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo stretchy="false">)</mo>
</mrow>
</math>
.

[~,dl] = findpeaks(Rmm,lags,'MinPeakHeight',0.22);  mtNew = filter(1,[1 zeros(1,dl-1) alpha],mtEcho);

Trazar la señal filtrada y comparar 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)

Consulte también

Funciones