zoukankan      html  css  js  c++  java
  • 数字通信—QPSK格雷码与非格雷码比较

    1 仿真结果

    参数设置:

    1. 信噪比:0~10dB
    2. 码元个数:1000000
    3. 调制方式:QPSK
    4. 格雷码和非格雷码的星座图:

    仿真结果:

    对于 QPSK 有格雷码和非格雷码两种编码方式,这里只需要改变从 bit 流映射成调制符号的方式就可以了。对于这两种编码方式其实其误码率性能是一样的,因为对于 QPSK 来说每一个象限只有一种调制符号,所以一旦错到别的象限就是错了一种符号。但是他们的误比特率是不一样的,从下面的仿真结果中也可以看出来,格雷码的效果是优于非格雷码的,这是因为格雷码相邻的符号间只有一个 bit 是不一样的,这样错到相邻的象限也只会造成 1bit 的错误。

    2 仿真代码

    %% QPSK
    clear;
    clc;
    M = 4;                %QPSK的阶数
    SNR = (0:1:10);       %信噪比范围
    nsymbol = 1000000;    %符号个数
    data_source = randsrc(nsymbol,2,[0 1]); 
    %% 坐标点映射(采用非格雷映射)
    [a1,b1] = find(data_source(:,1) == 0 & data_source(:,2) == 0);    %00的索引  
    data_send_1(a1) = -1-1j; 
    [a2,b2] = find(data_source(:,1) == 0 & data_source(:,2) == 1);    %01的索引
    data_send_1(a2) = -1+1j; 
    [a3,b3] = find(data_source(:,1) == 1 & data_source(:,2) == 0);    %10的索引
    data_send_1(a3) = 1+1j;  
    [a4,b4] = find(data_source(:,1) == 1 & data_source(:,2) == 1);    %11的索引
    data_send_1(a4) = 1-1j;  
    %% 坐标点映射(采用格雷映射)
    [c1,d1] = find(data_source(:,1) == 0 & data_source(:,2) == 0);    %00的索引  
    data_send_2(c1) = -1-1j; 
    [c2,d2] = find(data_source(:,1) == 0 & data_source(:,2) == 1);    %01的索引
    data_send_2(c2) = -1+1j; 
    [c3,d3] = find(data_source(:,1) == 1 & data_source(:,2) == 1);    %11的索引
    data_send_2(c3) = 1+1j;  
    [c4,d4] = find(data_source(:,1) == 1 & data_source(:,2) == 0);    %10的索引
    data_send_2(c4) = 1-1j;  
    %% 
    %symbol=[-1-1j, -1+1j, 1-1j, 1+1j];      %QPSK的符号坐标点
    Es = norm(data_send_1).^2 / nsymbol;     %一个符号的能量(QPSK每个符号的能量都是相等的)
    Eb = Es/(log2(M));                       %一个比特的能量
    snr = 10.^(SNR/10);                      %信噪比dB转化成数值
    N0  =Eb./snr;                            %求出在该比特能量下对应的噪声功率
    sigma=sqrt(N0/2);                        %要分成实部和虚部,所以功率要除上2
    for Eb_NO=1:length(sigma) 
        n1=sigma(Eb_NO)*randn(1,nsymbol); 
        n2=sigma(Eb_NO)*randn(1,nsymbol); 
        receive_1=data_send_1+n1+n2*1i;          %加噪声
        receive_2=data_send_2+n1+n2*1i;          %加噪声
        resum=0; 
        total=0; 
        %===========================
        %接收符号判决
        %===========================
        m1 = find(real(receive_1)>=0 & imag(receive_1)>0);
        n1 = find(real(receive_2)>=0 & imag(receive_2)>0);
        redata_1(m1,1) = 1;
        redata_1(m1,2) = 0;
        redata_2(n1,1) = 1;
        redata_2(n1,2) = 1;
        m2 = find(real(receive_1)<=0 & imag(receive_1)>0);
        n2 = find(real(receive_2)<=0 & imag(receive_2)>0);
        redata_1(m2,1) = 0;
        redata_1(m2,2) = 1;
        redata_2(n2,1) = 0;
        redata_2(n2,2) = 1;
        m3 = find(real(receive_1)<0 & imag(receive_1)<=0); 
        n3 = find(real(receive_2)<0 & imag(receive_2)<=0); 
        redata_1(m3,1) = 0;
        redata_1(m3,2) = 0;
        redata_2(n3,1) = 0;
        redata_2(n3,2) = 0;
        m4 = find(real(receive_1)>0 & imag(receive_1)<=0); 
        n4 = find(real(receive_2)>0 & imag(receive_2)<=0); 
        remessage(1,m4)=1-1i;
        redata_1(m4,1) = 1;
        redata_1(m4,2) = 1;
        redata_2(n4,1) = 1;
        redata_2(n4,2) = 0;
        
        total_symbol_1 = length(find(data_source(:,1)~=redata_1(:,1) ...
            | data_source(:,2)~=redata_1(:,2))); %找出不一样的符号
        total_symbol_2 = length(find(data_source(:,1)~=redata_2(:,1) ...
            | data_source(:,2)~=redata_2(:,2))); %找出不一样的符号
        
        total_bit_1 = length(find((data_source-redata_1)~=0));
        total_bit_2 = length(find((data_source-redata_2)~=0));
        
        [total_1,ratio1] = biterr(data_source,redata_1);
        [total_2,ratio2] = biterr(data_source,redata_2);
        
        Pb_1(Eb_NO) = total_bit_1/(nsymbol*2);
        Pb_2(Eb_NO) = total_bit_2/(nsymbol*2);
        
        Pe_1(Eb_NO) = total_symbol_1/nsymbol;
        Pe_2(Eb_NO) = total_symbol_2/nsymbol;
    end
    % scatterplot(receive_1)
    % title('接收信号的星座图')
    figure(1);          
    semilogy(SNR,Pb_1,'k-X',SNR,Pb_2,'k-s',SNR,Pe_1,'r-o',SNR,Pe_2,'r-*')
    legend('非格雷码QPSK仿真误比特率','格雷码QPSK仿真误比特率','非格雷码QPSK仿真误码率',...
        '格雷码QPSK仿真误码率')
    title('QPSK格雷编码与非格雷编码性能性能比较')
    xlabel('信噪比/dB');ylabel('误比特率/误码率')
    grid on
    
  • 相关阅读:
    'index.js' does not match the corresponding name on disk: '. ode_modules
    onload()方法只能在body标签中调用吗?怎么调用多个多个方法?
    HTML5新属性在Google浏览器中不能显示的问题
    HTML引入JS、CSS的各种方法
    框架、架构、设计模式的区别
    npm 命令 --save 和 --save-dev 的区别
    软件开发的权限控制和权限验证
    报错:Something is already running on port 8000.
    $stateProvider resovle 无法找到的原因
    git 统计代码量 shell脚本
  • 原文地址:https://www.cnblogs.com/MayeZhang/p/14753850.html
Copyright © 2011-2022 走看看