www.gusucode.com > signal 案例源码程序 matlab代码 > signal/EchoCancelationExample.m

    %% Echo Cancelation
% A speech recording includes an echo caused by reflection off a wall. Use
% autocorrelation to filter it out.

% Copyright 2015 The MathWorks, Inc.


%%
% In the recording, a person says the word MATLAB(R). Load the data and the
% sample rate, $F_s=7418\;\rm Hz$.

load mtlb

% To hear, type soundsc(mtlb,Fs)

%%
% Model the echo by adding to the recording a copy of the signal delayed by
% $\Delta$ samples and attenuated by a known factor $\alpha$:
% $y(n)=x(n)+\alpha x(n-\Delta)$. Specify a time lag of 0.23 s and an
% attenuation factor of 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;

%%
% Plot the original, the echo, and the resulting signal.

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)

%%
% Compute an unbiased estimate of the signal autocorrelation. Select and
% plot the section that corresponds to lags greater than zero.

[Rmm,lags] = xcorr(mtEcho,'unbiased');

Rmm = Rmm(lags>0);
lags = lags(lags>0);

figure
plot(lags/Fs,Rmm)
xlabel('Lag (s)')

%%
% The autocorrelation has a sharp peak at the lag at which the echo
% arrives. Cancel the echo by filtering the signal through an IIR system
% whose output, $w$, obeys $w(n)+\alpha w(n-\Delta)=y(n)$.

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

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

%%
% Plot the filtered signal and compare to the 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)