Selective DF - BPSK - Rayleigh Fading
MATLAB PROGRAM
clc;
clear all;
N = 10^5; % number of symbols
ip0 = randi([0,1], 1,N); % random symbol generation
s = 2*ip0-1; % BPSK mapping
snr_dB = 0:2:20; % SNR in dB
h1= 1/sqrt(2)*(randn(1,N)+1i*randn(1,N)); % complex channel gain
h2= 1/sqrt(2)*(randn(1,N)+1i*randn(1,N)); % complex channel gain
h3= 1/sqrt(2)*(randn(1,N)+1i*randn(1,N)); % complex channel gain
n1 = 1/sqrt(2)*(randn(1,N)+1i*randn(1,N)); % AWGN
n2 = 1/sqrt(2)*(randn(1,N)+1i*randn(1,N)); % AWGN
n3 = 1/sqrt(2)*(randn(1,N)+1i*randn(1,N)); % AWGN
for ii = 1:length(snr_dB) % iteration for each SNR
%% simulation
snr = 10^(snr_dB(ii)/10);
r_u1bs = sqrt(snr/2)*s.*h1 + n1; % received signal
r_u1u2 = sqrt(snr/2)*s.*h2 + n2; % received signal
r_u2bs = sqrt(snr/2)*s.*h3 + n3; % received signal
%
r1 = conj(h1).*r_u1bs; % compensation for fading (equalization)
r2 = conj(h2).*r_u1u2; % compensation for fading (equalization)
r3 = conj(h1).*r_u1bs + conj(h3).*r_u2bs; % compensation for fading (equalization)
%
s1_hat = real(r1)>0; % decision making
s2_hat = real(r2)>0; % decision making
s3_hat = real(r3)>0; % decision making
%
n_err1 = size(find(s1_hat-ip0),2); % number of errors for given SNR
n_err2 = size(find(s2_hat-ip0),2); % number of errors for given SNR
n_err3 = size(find(s3_hat-ip0),2); % number of errors for given SNR
%
err1 = n_err1/N; % error for given SNR
err2 = n_err2/N; % error for given SNR
err3 = n_err3/N; % error for given SNR
err_sim(ii) = err1*err2 +(1-err1)*err3;
%% analytical
Pe = 0.5*(1-sqrt(snr/2/(1+snr/2)));
err_ana(ii) = Pe^2 + (1-Pe)*Pe^2*(3-2*Pe);
end
figure;
semilogy(snr_dB, err_sim,'--+k');
hold on; grid on;
semilogy(snr_dB, err_ana,'-ok');
xlabel('SNR (dB)');
ylabel('Error rate');
legend('simulation', 'analytical');
title('Selective DF - BPSK - Rayleigh Fading')
SIMULATED OUTPUT
DOWNLOAD LINK