出的图全为SNR vs BER。
1.BPSK
代码如下:
clear all;
close all;
k=1;
%生成10000个-1/1的随机数列作为初始信号
r=randint(1,10000);
for i=1:10000
if r(i)==0
s(i)=-1;
else
s(i)=1;
end
end
rs=s;
for snrdb=1:1:16;
%给信号乘上参数B=1/sqrt(2)的瑞利衰落系数
h=raylrnd(1/sqrt(2),1,10000)*sqrt(snrdb);
s=h.*s;
%给信号加上功率为snr(db)的高斯白噪声信号
x=s+wgn(1,10000,snrdb);
y=x;
%这里没有发生角度的衰落,所以排不排除瑞利衰落系数无所谓
%解调,加上噪声后如果与原信号同号,则未出错,反之则出错
error(snrdb)=length(find(y.*rs<0));
%计算误码率
ber(snrdb)=error(snrdb)/10000;
end
snrdb=1:1:16;
semilogy(snrdb,ber);
title('BPSK with Rayleigh channel');
xlabel('SER');
ylabel('BER');
这里仅讨论格雷映射下的瑞利衰落QPSK调制
clear all;
close all;
%生成10000个01/11/00/10的随机数列作为初始信号
r=randint(1,20000);
%分成两列,第一列代表实部,第二列代表虚部
s=reshape(r,10000,2);
rs=s;
k=1;
%按星座图对信号进行调制
for i=1:1:10000
if (s(i,1)==1 && s(i,2)==1)
s(i,1)=-sqrt(2)/2;
s(i,2)=-sqrt(2)/2;
end
if (s(i,1)==0 && s(i,2)==1)
s(i,1)=-sqrt(2)/2;
s(i,2)=sqrt(2)/2;
end
if (s(i,1)==0 && s(i,2)==0)
s(i,1)=sqrt(2)/2;
s(i,2)=sqrt(2)/2;
end
if (s(i,1)==1 && s(i,2)==0)
s(i,1)=sqrt(2)/2;
s(i,2)=-sqrt(2)/2;
end
end
for snrdb=1:1:16
%给信号乘上参数B=1/sqrt(2)的瑞利衰落系数
h=raylrnd(1/sqrt(2),10000,2)*sqrt(snrdb);
s=h.*s;
%给信号加上功率为snr(db)的高斯白噪声信号
x=s+wgn(10000,2,snrdb);
%解调先排除瑞利衰落系数影响
x=x./h;
%解调
for j=1:1:10000
if x(j,1)>=0 && x(j,2)>=0
y(j,1)=0;
y(j,2)=0;
end
if x(j,1)<0 && x(j,2)>0
y(j,1)=0;
y(j,2)=1;
end
if x(j,1)<0 && x(j,2)<0
y(j,1)=1;
y(j,2)=1;
end
if x(j,1)>0 && x(j,2)<0
y(j,1)=1;
y(j,2)=0;
end
end
%找出错误码
error=y~=rs;
%计算误码率
ber(k)=sum(sum(error))/20000;
k=k+1;
end
snrdb=1:1:16;
semilogy(snrdb,ber);
title('QPSK with Rayleigh channel');
xlabel('SER');
ylabel('BER');
%本代码为格雷映射、瑞利衰落信道下的16QAM调制
clear all;
close all;
%SNR计算
Eb_No = 0: 1: 10;
SNR = Eb_No + 10*log10(4);
for aa = 1: 1: length(SNR)
%随机生成4000个0/1作为初始信号
s=randint(1,4000);
%分成4行
B = reshape(s,4,1000);
C=B;
B1 = B(1,:);
B2 = B(2,:);
B3 = B(3,:);
B4 = B(4,:);
%开始调制
a = sqrt(1/10);
tx = a*(-2*(B3-0.5).*(3-2*B4)-j*2*(B1-0.5).*(3-2*B2));
%瑞利衰落
ray = sqrt((1/2)*((randn(1,length(tx))).^2+(randn(1,length(tx))).^2));
rx = tx.*ray;
%加噪声
N0 = 1/10^(SNR(aa)/10);
rx = rx + sqrt(N0/2)*(randn(1,length(tx))+i*randn(1,length(tx)));
%解调前先排除瑞利衰落系数影响
rx = rx./ray;
%解调
a = 1/sqrt(10);
B5 = imag(rx)<0;
B6 = (imag(rx)<2*a) & (imag(rx)>-2*a);
B7 = real(rx)<0;
B8 = (real(rx)<2*a) & (real(rx)>-2*a);
rs = [B5;B6;B7;B8];
%计算BER
error = rs~=C;
BER(aa) = sum(sum(error)) / 4000;
end
semilogy(SNR,BER);
xlabel('SNR');
ylabel('BER');
title('16-QAM Modualtion with Rayleigh Channel');