课程作业记录2:自然映射和格雷映射下的QPSK与16QAM的Matlab仿真

一次作业记录,出的图全为SNR vs BER。

1.QPSK

1.1 自然映射
自然映射下的QPSK如图所示:
课程作业记录2:自然映射和格雷映射下的QPSK与16QAM的Matlab仿真_第1张图片
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)==0)
        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)==1)
        s(i,1)=sqrt(2)/2;
        s(i,2)=-sqrt(2)/2;
    end
end

for snrdb=1:1:10
   
    %给信号加上功率为snr(db)的高斯白噪声信号
    x=awgn(s,snrdb,'measured');
    
    %解调
    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)=0;
        end
         if x(j,1)>0 && x(j,2)<0
           y(j,1)=1;
           y(j,2)=1;
         end
    end
    
    %找出错误码
    error=y~=rs;
    
    %计算误码率
    ber(k)=sum(sum(error))/20000;
    k=k+1;
end

snrdb=1:1:10;
semilogy(snrdb,ber);
title('QPSK with natural mapping');
xlabel('SER');
ylabel('BER');

1.2 格雷映射

格雷映射下的QPSK如图所示:
课程作业记录2:自然映射和格雷映射下的QPSK与16QAM的Matlab仿真_第2张图片
格雷映射与自然映射过程相同,故这里仅列出格雷映射调制过程,解调过程亦类似。

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

  1. 16QAM

2.1 自然映射
自然映射下的16QAM如图所示:
课程作业记录2:自然映射和格雷映射下的QPSK与16QAM的Matlab仿真_第3张图片
代码如下:

%本代码为自然映射下的16QAM调制

clear all;
close all;

a=sqrt(1/10);

%随机生成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,:);

%在这里我们仍然借用格雷映射的调制公式
%但在调制前将不同的码位置换掉
for i=1:1000
    if B1(i)==0 && B2(i)==0 && B3(i)==1 && B4(i)==0
        B4(i)=1;
    end
    if B1(i)==0 && B2(i)==0 && B3(i)==1 && B4(i)==1
        B4(i)=0;
    end
    if B1(i)==1 && B2(i)==0 && B3(i)==1 && B4(i)==1
        B4(i)=0;
    end
    if B1(i)==1 && B2(i)==0 && B3(i)==1 && B4(i)==0
        B4(i)=1;
    end
    if B1(i)==1 && B2(i)==1 && B3(i)==1 && B4(i)==1
        B4(i)=0;
    end
    if B1(i)==1 && B2(i)==1 && B3(i)==1 && B4(i)==0
        B4(i)=1;
    end
    if B1(i)==0 && B2(i)==1 && B3(i)==1 && B4(i)==1
        B4(i)=0;
    end
    if B1(i)==0 && B2(i)==1 && B3(i)==1 && B4(i)==0
        B4(i)=1;
    end
end

%根据星座图调制信号
tx = a*(-2*(B3-0.5).*(3-2*B4)-j*2*(B1-0.5).*(3-2*B2));

for snrdb = 1:1:20;
    
    %向信号中加入噪声
    rx = awgn(tx,snrdb);
    
    %解调信号
    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);
    
    %解调后还原信号
    for i=1:1000
    if B5(i)==0 && B6(i)==0 && B7(i)==1 && B8(i)==0
        B4(i)=1;
    end
    if B5(i)==0 && B6(i)==0 && B7(i)==1 && B8(i)==1
        B4(i)=0;
    end
    if B5(i)==1 && B6(i)==0 && B7(i)==1 && B8(i)==1
        B8(i)=0;
    end
    if B5(i)==1 && B6(i)==0 && B7(i)==1 && B8(i)==0
        B8(i)=1;
    end
    if B5(i)==1 && B6(i)==1 && B7(i)==1 && B8(i)==1
        B8(i)=0;
    end
    if B5(i)==1 && B6(i)==1 && B7(i)==1 && B8(i)==0
        B8(i)=1;
    end
    if B5(i)==0 && B6(i)==1 && B7(i)==1 && B8(i)==1
        B8(i)=0;
    end
    if B5(i)==0 && B6(i)==1 && B7(i)==1 && B8(i)==0
        B8(i)=1;
    end
    end
    
    rs = [B5;B6;B7;B8];
    
    %计算BER
    error = rs~=C;
    BER(snrdb) = sum(sum(error)) / 4000;
end

snrdb = 1:1:20;
semilogy(snrdb,BER);
title('16QAM with natural mapping');
xlabel('SNR');
ylabel('BER');

2.2 格雷映射

格雷映射下的16QAM如图所示:
课程作业记录2:自然映射和格雷映射下的QPSK与16QAM的Matlab仿真_第4张图片
把上部分自然映射下的换码部分删除即为格雷映射代码。

你可能感兴趣的:(课程作业记录2:自然映射和格雷映射下的QPSK与16QAM的Matlab仿真)