clc
clear all
s00 = 1/sqrt(2)*(-1-1j);
s01 = 1/sqrt(2)*(-1+1j);
s10 = 1/sqrt(2)*(1-1j);
s11 = 1/sqrt(2)*(1+1j);
itermax = 10;
num = 5000;
snr = 0:10;
snrn = 10.^(snr/10);
ber = zeros(itermax,length(snr));
for iter = 1:itermax;
s = 1/sqrt(2)*(randsrc(1,num)+1j*randsrc(1,num));
for i = 1:length(snr)
N(i) = (10.^(-snr(i)/10));
n = sqrt(N(i)/2).*(randn(1,num)+1j.*randn(1,num));
r = s+n;
for k = 1:num
d00 = abs(r(k)-s00);
d01 = abs(r(k)-s01);
d10 = abs(r(k)-s10);
d11 = abs(r(k)-s11);
if((d00<d01)&(d00<d10)&(d00<d11))
y(k) = -1/sqrt(2)-1j/sqrt(2);
elseif((d01<d00)&(d01<d10)&(d01<d11))
y(k) = -1/sqrt(2)+1j/sqrt(2);
elseif((d10<d00)&(d10<d01)&(d10<d11))
y(k) = 1/sqrt(2)-1j/sqrt(2);
else
y(k) = 1/sqrt(2)+1j/sqrt(2);
end
end
ber(iter,i) = length(find(s~=y))/(num);
end
end
bern = sum(ber)/itermax;
q = 2*qfunc(sqrt(snrn)).*(1-0.5*qfunc(sqrt(snrn)));
scatterplot(s);
title('原始星座图');
scatterplot(r);
title('经过信道后的星座图');
scatterplot(y);
title('解调后的星座图');
figure;
semilogy(snr,bern,'-',snr,q,'+')
xlabel('Es/No(dB)');
ylabel('误码率');
title('QPSK');
legend('仿真误码率','理论误码率');