MATLAB Code
M = 4; % QPSK
numSymbols = 10000;
numTrainingSymbols = 5000;
chtaps = [1 0.5*exp(1i*pi/6) 0.1*exp(-1i*pi/8)];
% Generate QPSK symbols
data = randi([0 M-1], numSymbols, 1);
tx = pskmod(data, M, pi/4);
% DFE setup
eq = comm.DecisionFeedbackEqualizer;
eq.ReferenceTap = 1;
eq.NumForwardTaps = 5;
eq.NumFeedbackTaps = 3;
% SNR sweep
snrVec = 0:5:25; % 0,5,10,...25 dB
berBefore = zeros(size(snrVec));
berAfter = zeros(size(snrVec));
for k = 1:length(snrVec)
% Apply channel and AWGN
rx = awgn(filter(chtaps,1,tx), snrVec(k), 'measured');
% BER before equalization
rxDataNoEq = pskdemod(rx, M, pi/4);
[~, berBefore(k)] = biterr(data, rxDataNoEq);
% Equalize
[y,~,~] = eq(rx, tx(1:numTrainingSymbols));
% Phase correction
phaseOffset = angle(mean(conj(tx(1:numTrainingSymbols)) .* y(1:numTrainingSymbols)));
yCorrected = y * exp(-1i*phaseOffset);
% BER after equalization
rxDataEq = pskdemod(yCorrected, M, pi/4);
[~, berAfter(k)] = biterr(data(1:length(rxDataEq)), rxDataEq);
end
% Plot BER vs SNR
figure;
semilogy(snrVec, berBefore, 'ro-', 'LineWidth', 2); hold on;
semilogy(snrVec, berAfter, 'bs-', 'LineWidth', 2); grid on;
xlabel('SNR (dB)'); ylabel('BER');
legend('Before Equalization', 'After Equalization');
title('BER vs SNR for QPSK with DFE');
Output