%BER vs SNR for Direct and QF multi-hop relay%
%using BPSK and rayleigh fading channel + AWGN%
%using Convolutional code 1/2%
%using MRC%
%Isyqi Harzaki
clc
clear all
close all
sum_qf = 0;
sum_qf2 = 0;
sum_qf3 = 0;
sum_qf4 = 0;
sum_d = 0;
N_bits = 1000; % bit data
BERthreshold=1e-5;
N_iter = 10;%iteration
for iter = 1:N_iter
SNRdB = 0:30;%range of SNR
for k = 1:length(SNRdB)
SNR = 10^(SNRdB(k)/10); %convert SNRdB to linear SNR
%Source
data = round(rand(N_bits,1));%random data bit
%kanal koding dengan rate 1/2 convolutional code:
trellis = poly2trellis(3,[7 5]); %trellis structure
c_data = convenc(data,trellis); %encoding data
tx = 2*c_data - 1;% BPSK modulation
%additive noise and fading channel at relays channel:
%Source to Destination
noise_sd = 1/sqrt(2) * (randn(2 * N_bits,1) + j * randn(2 *N_bits,1));
h_sd = 1/sqrt(2) .* (randn(2 * N_bits,1) + j * randn(2 * N_bits,1));
%Source to Relay1
noise_sr1 = 1/sqrt(2) * (randn(2 * N_bits,1) + j * randn(2 *N_bits,1));
h_sr1 = 1/sqrt(2) * (randn(2 * N_bits,1) + j * randn(2 * N_bits,1));
%Relay1 to Relay2
noise_r1r2 = 1/sqrt(2) * (randn(2 * N_bits,1) + j * randn(2 *N_bits,1));
h_r1r2 = 1/sqrt(2) * (randn(2 * N_bits,1) + j * randn(2 * N_bits,1));
%Relay2 to Relay3
noise_r2r3 = 1/sqrt(2) * (randn(2 * N_bits,1) + j * randn(2 *N_bits,1));
h_r2r3 = 1/sqrt(2) * (randn(2 * N_bits,1) + j * randn(2 * N_bits,1));
%Relay3 to Destination
noise_r3d = 1/sqrt(2) * (randn(2 * N_bits,1) + j * randn(2 *N_bits,1));
h_r3d = 1/sqrt(2) * (randn(2 * N_bits,1) + j * randn(2 * N_bits,1));
%the signal from Source to Relay1%
tx_sr1 = sqrt(SNR) * tx .* h_sr1 + noise_sr1;
%quantize
L=2^7;
Xmax=1;
Xmin=-1;
delta=(Xmax-Xmin)/L;
ih1=round((tx_sr1-Xmin)/delta);
if (ih1==L)
ih1=ih1-1;
end
if ih1<0;
ih1=0;
end
tx_qf1=Xmin+ih1*delta;
%the signal from Relay 1 to Relay 2%
tx_r1r2 = sqrt(SNR) * tx_qf1 .* h_r1r2 + noise_r1r2;
%Quantize:
ih2=round((tx_r1r2-Xmin)/delta);
if (ih2==L)
ih2=ih2-1;
end
if ih2<0;
ih2=0;
end
tx_qf2=Xmin+ih2*delta;
%the signal from Relay 2 to Relay 3%
tx_r2r3 = sqrt(SNR) * tx_qf2 .* h_r2r3 + noise_r2r3;
%Quantize:
ih3=round((tx_r2r3-Xmin)/delta);
if (ih3==L)
ih3=ih3-1;
end
if ih3<0;
ih3=0;
end
tx_qf3=Xmin+ih3*delta;
%the signal from Relay 3 to Destination%
tx_r3d = sqrt(SNR) * tx_qf3 .* h_r3d + noise_r3d;
%%the signal from Source to Destination%%
tx_sd = sqrt(SNR) * tx .* h_sd + noise_sd;
%Destination
%%Quantize and Forward%%%
%MRC%%
R_qf = tx_qf1 .* conj(h_sr1).* conj(h_r1r2);
dec_com_qf = sign(real(R_qf));
%BER calculations Hop 1%
%at destination:
err_com1(k) = sum(abs(dec_com_qf - tx_qf1)/2);
simber_com1(k) = err_com1(k) / (2 * N_bits);
R_qf2 = tx_qf2 .* conj(h_r1r2).* conj(h_r2r3);
dec_com_qf2 = sign(real(R_qf2));
%BER calculations Hop 2%
%at destination:
err_com2(k) = sum(abs(dec_com_qf2 - tx_qf1)/2);
simber_com2(k) = err_com2(k) / (2 * N_bits);
R_qf3 = tx_qf3 .* conj(h_r2r3).* conj(h_r3d);
dec_com_qf3 = sign(real(tx_qf3));
%BER calculations Hop 3%
%at destination:
err_com3(k) = sum(abs(dec_com_qf3 - tx_r2r3)/2);
simber_com3(k) = err_com3(k) / (2 * N_bits);
R_qf4 = tx_r3d .* conj(h_r3d).* conj(h_sd) + tx_sd .* conj(h_sd);
dec_com_qf4 = sign(real(R_qf4));
%BER calculations Hop 4%
%at destination:
err_com4(k) = sum(abs(dec_com_qf4 - tx_r3d)/2);
simber_com4(k) = err_com3(k) / (2 * N_bits);
%theoratical rayleigh
direct(k) = 0.5 * (1 - sqrt(SNR./(1 + SNR)));
end
sum_qf = sum_qf + simber_com1 ;
sum_qf2 = sum_qf2 + simber_com2 ;
sum_qf3 = sum_qf3 + simber_com3 ;
sum_qf4 = sum_qf4 + simber_com4 ;
sum_d = direct;
if (sum_qf > BERthreshold) sum_qf = sum_qf
else sum_qf = sum_qf;
if (sum_qf2 > BERthreshold) sum_qf2 = sum_qf2+1
else sum_qf2 = sum_qf2;
if (sum_qf3 > BERthreshold) sum_qf3 = sum_qf3+1
else sum_qf3 = sum_qf3;
if (sum_qf4 > BERthreshold) sum_qf4 = sum_qf4+1
else sum_qf4 = sum_qf4;
if (sum_d > BERthreshold) sum_d = sum_d+1;
else sum_d = sum_d;
end
end
end
end
end
end
avgber_qf = sum_qf/N_iter;
avgber_qf2 = sum_qf2/N_iter;
avgber_qf3 =sum_qf3/N_iter;
avgber_qf4 =sum_qf4/N_iter;
avgber_d = sum_d;
semilogy(SNRdB,avgber_d,'s-r','LineWidth',2)
hold on
semilogy(SNRdB,avgber_qf, '-b','LineWidth',2)
hold on
semilogy(SNRdB,avgber_qf2, '-k','LineWidth',2)
hold on
semilogy(SNRdB,avgber_qf3, 'o-k','LineWidth',2)
hold on
semilogy(SNRdB,avgber_qf4, '-y','LineWidth',2)
hold on
axis([0 30 10^-4 10^0]);
xlabel('SNR dB');
ylabel('BER');
legend('Direct','Hop 1','Hop 2','Hop 3','Hop 4')
grid on