% MATLAB script for System Simulation Homework
close all;
clear all;
% Carrier frequency for modulation and
% demodulation
Fc =5e6;
%
% QPSK transmitter
%
data=5000;% Input binary data of 5MHz
rand_data =randn(1,data);
for i=1:data
if rand_data(i)>=0.5
input(i)=1;
else
input(i)=0;
end
end
%Series to Parallel
for i=1:data
if rem(i,2)==1
if input(i)==1
I(i)=1;
I(i+1)=1;
else
I(i)=-1;
I(i+1)=-1;
end
else
if input(i)==1
Q(i-1)=1;
Q(i)=1;
else
Q(i-1)=-1;
Q(i)=-1;
end
end
end
Q=[0,Q];
% Zero insertion
zero=5; % Sampling rate is 25MHz
for i=1:zero*data
if rem(i,zero)==1
Izero(i)=I(fix((i-1)/zero)+1);
Qzero(i)=Q(fix((i-1)/zero)+1);
else
Izero(i)=0;
Qzero(i)=0;
end
end
%Pulse shaping filter
NT =50;
N=2*zero*NT;
Fs=25e6;
rf=0.5;
psf=rcosfir(rf,NT,zero,Fs,'sqrt');
Ipulse= conv(Izero,psf);
Qpulse= conv(Qzero,psf);
%Modulation
for i=1:zero*data+N
t(i)=(i-1)/(Fc*zero);
Imod(i)=Ipulse(i).*cos(2*pi*Fc*t(i));
Qmod(i)=Qpulse(i).*(-1)*sin(2*pi*Fc*t(i));
end
sum=Imod+Qmod;
plot(t,sum);
axis([0.000040 0.000045 -1.5 1.5])
K=1024;
SUM=fft(sum,K);
Pxx=abs(SUM).^2/K;
index=0:K-1;
index=index/K*2*pi;
figure(2)
plot(index,Pxx)
set(gca,'XTickLabel',{'0','pi/4','pi/2','3pi/4','pi','5pi/4','3pi/2','7pi/4','2pi'})
% Create AWGN complex noise
EbNodBVals=0:2:10; %unit=dB :the power of noise
for SNR=1:length(EbNodBVals)
EbNo=10.^(EbNodBVals(SNR)./10);
EsNo=EbNo;
Es=2; %power of signal is 4
No=Es./EsNo;
sigma=sqrt(No);
n=sigma.*(randn(size(sum))+j.*randn(size(sum)));
r=sum+n; %awgn, r= received signal
%
% QPSK Receiver
%
% Demodulation
for i=1:zero*data+N
Idem(i)=r(i).*cos(2*pi*Fc*t(i));
Qdem(i)=r(i).*(-1)*sin(2*pi*Fc*t(i));
end
% Matched filter
mtf= rcosfir(rf,NT, zero,Fs,'sqrt');
Imat = conv(Idem,mtf);
Qmat = conv(Qdem,mtf);
% Data selection
for i=1:zero*data
Isel(i)=Imat(i+N);
Qsel(i)=Qmat(i+N);
end
% Sampler
for i = 1:data
Isam(i)= Isel((i-1)*zero+1);
Qsam(i)= Qsel((i-1)*zero+1);
end
% Decision threshold
threshold = 0.1;
for i = 1:data
if Isam(i)>= threshold
Ifinal(i)= 1;
else
Ifinal(i)= -1;
end
if Qsam(i) >= threshold
Qfinal(i) = 1;
else
Qfinal(i)= -1;
end
end
Qfinal=[Qfinal,-1];
Qfinal=Qfinal(2:end);
% Parallel to Series
for i = 1:data
if rem(i, 2)== 1
if Ifinal(i)== 1
final(i)=1;
else
final(i)= 0;
end
else
if Qfinal(i) == 1
final(i)= 1;
else
final(i)= 0;
end
end
end
[num,rat(SNR)]=symerr(input,final);
end
hold on
figure(3)
semilogy(EbNodBVals,rat,'r-*','linewidth',1);
snr = 0:0.1:10;
for i = 1:length(snr)
snr1(i)=10^(snr(i)/10);
pb(i)=1-(1-1/2*erfc(sqrt(snr1(i)/2)))^2;
end
hold on
semilogy(snr,pb);
%**************************************************************************
grid on
legend('simulation - qpsk', 'theory - qpsk');
xlabel('Eb/No, dB');
ylabel('error rate');
title('QPSK experiment results and comparison ');