100% found this document useful (1 vote)
455 views

Zero Forcing, Lms

This MATLAB program simulates zero forcing and LMS algorithms for channel equalization. It generates a transmitted bit stream, adds inter-symbol interference from a channel model, and noise. It then uses the training data to find the zero forcing equalizer weights in closed form and estimates the LMS equalizer weights iteratively. Finally, it applies the equalizers to the received signal and plots eye diagrams before and after equalization.

Uploaded by

Immanuel Vinoth
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
455 views

Zero Forcing, Lms

This MATLAB program simulates zero forcing and LMS algorithms for channel equalization. It generates a transmitted bit stream, adds inter-symbol interference from a channel model, and noise. It then uses the training data to find the zero forcing equalizer weights in closed form and estimates the LMS equalizer weights iteratively. Finally, it applies the equalizers to the received signal and plots eye diagrams before and after equalization.

Uploaded by

Immanuel Vinoth
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 4

MATLAB PROGRAM: ZERO FORCING &LMS ALGORITHM

T = 1; % Bit period
tau = 3; % Time constant of channel
SNR = 100; % Ratio of signal power to noise power (NOT in dB)
dt = 0.01; % Sampling time in simulation
N = 250; % Number of training bits to generate
Ndata = 100; % Number of data bits to generate
clear t1 t2 c x y
% Create output pulse: rectangular pulse convolved with first-order low-pass filter impulse
response.
t1 = (dt:dt:T)';
c(1:100,1) = 1 - exp(-t1/tau);
t2 = (T+dt:dt:T+5*tau)';
c(101:100+length(t2),1) = c(100)*exp(-(t2-T)/tau);
figure(1)
plot([t1; t2], c)
xlabel('Time (sec)')
ylabel('c(t)')
title('Smeared pulse c(t)')
% Generate bit stream
b = rand(N,1);
z0 = find(b < 0.5);
z1 = find(b >= 0.5);
b(z0) = -1*ones(size(z0));
b(z1) = +1*ones(size(z1));
% Create received signal with ISI
nT = T/dt;
nc = length(c);
nx = N*nT;
x = zeros(nx, 1);
for n=1:N
i1 = (n-1)*nT;
y = [zeros(i1,1); b(n)*c; zeros(N*nT-i1-nc,1)];
x = x + y(1:nx);
end
% Add noise of the specified level
sp = sum(x.*x)/length(x); % Signal power
np = sp/SNR; % Noise power
noise = sqrt(np) * randn(length(x),1);
x = x + noise;
% Plot eye diagram
figure(2)
t3 = dt:dt:2;
plot(t3, x(1:200));
hold on
for n=3:2:N
plot(t3, x((n-1)*nT+1:(n+1)*nT));
end
hold off
xlabel('Time (sec)')
title('EYE DIAGRAM WITH NO EQUALIZATION')
Ne = 5*tau/T; % Define length of equalizer
cT = c(nT:nT:nc); % Get samples of c(t) to solve for ZF equalizer weights
csamp = [zeros(2*Ne,1); cT; zeros(2*Ne+1-length(cT),1)];
% Construct the matrix on the left side of ZF equalizer equation
C = zeros(2*Ne+1,2*Ne+1);
for ne = 1:2*Ne+1
C(ne,:) = csamp(2*Ne+ne:-1:ne)';
end
r = [zeros(Ne,1); 1; zeros(Ne,1)]; % Right side of ZF equalizer weight equation
wzf = C \ r; % Solve for ZF equalizer weights
% LMS algorithm to estimate the equalizer weights in real-time% using the training data
mu = 0.2;
xT = x(nT:nT:nx);
w = zeros(2*Ne+1,1); % Initialize weights to zero
wold = w;
wrec = w;
for k=(Ne+1):(N-Ne)
xk = xT((k+Ne):-1:(k-Ne));
yk = w'*xk;
ek = b(k) - yk;
w = wold + mu*ek*xk;
wrec = [wrec, w];
wold = w;
end
% Process the received signal with the LMS equalizer
nw = length(w);
z99 = [1; zeros(nT-1,1)];
hzf = kron(wzf, z99); % Impulse response of ZF equalizer
yall = conv(x, hzf); % Do the equalization filtering
yzf = yall((Ne*nT+1):(length(yall)-(Ne+1)*nT)+1);
h = kron(w, z99); % Impulse response of LMS equalizer
yall = conv(x, h); % Do the equalization filtering
y = yall((Ne*nT+1):(length(yall)-(Ne+1)*nT)+1);
% Eye diagrams of equalized signal
figure(3)
plot(t3, yzf(1:200));
hold on
for n=3:2:N
plot(t3, yzf((n-1)*nT+1:(n+1)*nT));
end
hold off
xlabel('Time (sec)')
title('EYE DIAGRAM AFTER ZF EQUALIZER')
figure(4)
plot(t3, y(1:200));
hold on
for n=3:2:N
plot(t3, y((n-1)*nT+1:(n+1)*nT));
end
hold off
xlabel('Time (sec)')
title('EYE DIAGRAM AFTER LMS EQUALIZER')

You might also like