%% Echo Cancelation Using the Real Cepstrum
% A speech recording includes an echo caused by reflection off a wall. Use the real cepstrum to filter it out.
% In the recording, a person says the word MATLAB®. 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 the real cepstrum of the signal. Plot the cepstrum and annotate its maxima. The cepstrum has a sharp peak at the time at which the echo starts to arrive.

c = rceps(mtEcho);

[px,locs] = findpeaks(c,'Threshold',0.2,'MinPeakDistance',0.2);

clf
plot(t,c,t(locs),px,'o')
xlabel('Time (s)')

%
% Cancel the echo by filtering the signal through an IIR system whose output, w, obeys w(n)+\alpha w(n-\Delta)=y(n). Plot the filtered signal and compare it to the original.

dl = locs(2)-1;

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

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)

% Copyright 2012 The MathWorks, Inc.