课程作业记录3:瑞利衰落信道下的BPSK/QPSK/16QAM的Matlab仿真

出的图全为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');

  1. QPSK
    代码如下:
这里仅讨论格雷映射下的瑞利衰落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');

  1. 16QAM
    代码如下:
%本代码为格雷映射、瑞利衰落信道下的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');

你可能感兴趣的:(课程作业记录3:瑞利衰落信道下的BPSK/QPSK/16QAM的Matlab仿真)