m一种基于QPSK信号的准最大似然译码器误码率matlab仿真

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

《An efficient quasi-maximum likelihood decoder for PSK signal》

《[1] Luo Z Q ,  Luo X ,  Kisialiou M . An efficient quasi-maximum likelihood decoder for PSK signals[C]// IEEE. IEEE, 2003.》   

        Since exact maximum likelihood (ML) detection is computationally intractable in general, approximate ML approaches are needed to reduce the computation time while maintaining low bit error rate (BER). In this work, we develop an efficient approximate ML decoder for constant modulus signals based on a simple nonlinear programming relaxation. Unlike the existing sphere decoder whose expected complexity is cubic in problem size and whose performance deteriorates with increasing problem size and noise level, our proposed new decoder enjoys a worst case quadratic complexity and scales gracefully with problem dimension and noise level. Our initial testing and analysis suggests that this new decoder is capable of delivering ML like BER performance for PSK signals while requiring substantially lower computational complexity. In this sense, our new decoder is similar to the sphere decoder which is an effective method for QAM signals.

        这里,从论文的仿真图可知,我们所要做的主要工作就是本课题所使用的算法和球形译码的性能对比。球形译码的不是本文的研究内容,其主要参考文献3获得,这里不做介绍,这里我们重点介绍本文所研究的PSKD算法。

        其中误码率,我们进行系统的误码率分析,而复杂度的对比,我们这里主要是统计仿真时间,然后反映其复杂度,注意,这里仿真时间和电脑的配置有关,配置牛逼,则仿真时间则越短,但是其复杂度的对比曲线基本变化趋势是不变的。

      这里,我们主要根据


上述算法流程进行仿真。 

2.仿真效果预览

matlab2022a仿真如下:

 

3.MATLAB核心程序

SNR          = 1:8;
%统计无码数
Times        = 500;
%m
Tm           = 10;
%n
Rn           = 10;
%仿真序列帧长度
data_Numbers = 300;
 
for i=1:length(SNR) 
     Bit_err(i) = 0;
     Num_err    = 0;
     Numbers    = 0; %误码率累加器   
     N0         = 10/(10^(SNR(i)/10));  
     while Num_err <= Times
           Num_err
           fprintf('SNR = %f\n', SNR(i));
           %产生需要发送的随机数
           Trans_data  = round(rand(1,data_Numbers)); 
           %BPSK
           Trans_BPSK  = 2*Trans_data-1;
           %作为发送信源
           MIMO_Tx(1,:) = Trans_BPSK;
           for send_loop = 2:Tm            
               MIMO_Tx(send_loop,:) = MIMO_Tx(1,:);              
           end
           %信道
           H_Ray = (randn(Rn,Tm)+sqrt(-1)*randn(Rn,Tm))/sqrt(2);
           H_Ray = abs(H_Ray);
           %QUASI-ML PSK decoder算法
           for k=1:data_Numbers
               y            = H_Ray*MIMO_Tx(:,k) + 2*N0*randn(size(H_Ray*MIMO_Tx(:,k)));
               y            = y/max(max(abs(y)));
               %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
               e0    = 0.5;
               beta0 = 0.4;
               n1    = 10;
               n2    = 10;
               ee    = zeros(n1,1);
               %STEP1
               for i1 = 1:n1
                   ee(i1) = -i1*e0/(n1-1) + n1*e0/(n1-1);
                   x1s    = [-1-ee(i1)+(2+2*ee(i1))/Tm:(2+2*ee(i1))/Tm:1+ee(i1)];
                   for k1 = 1:Tm
                       x1     = x1s(k1)*ones(Tm,1); 
                       f1(k1) = x1'*H_Ray'*H_Ray*x1 - y'*H_Ray*x1 - x1'*H_Ray'*y + y'*y;
                   end
                   [g1(i1),xk1(i1)] = min(f1);
               end
               [g11,xk11] = min(g1);
               XK1        = y(xk1(xk11));
               %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
               %STEP2
               M = 64;
               for i2 = 1:n2
                   beta(i2)   = -i1*beta0/(n2-1) + n2*e0/(n2-1);
                   deltaa(i2) =  2*pi*(i2-1)/(M*(n2-1));
                   x2s        = [-1-beta(i2)+(2+2*beta(i2))/Tm:(2+2*beta(i2))/Tm:1+beta(i2)];
                   for k2 = 1:Tm
                       x2        = x2s(k2)*ones(Tm,1); 
                       f2(i2,k2) = x2'*H_Ray'*H_Ray*x2 - y'*H_Ray*x2 - x2'*H_Ray'*y + y'*y;
                   end
               end
               for k2 = 1:Tm
                   [g2,xk2] = min(f2(:,k2));
                   XK2(k2)  = y(xk2);
               end
               %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                %STEP3
               a5(:,k)  = XK2;
           end
           %接收
           MIMO_Rx     = a5;
           MIMO_Rx2    = ones(1,Tm)*MIMO_Rx(:,:);    
           Rec_data    =(sign(MIMO_Rx2)+1)/2; 
           [nberr,rat]  = biterr(Trans_data,Rec_data);
           Num_err     = Num_err+nberr;
           Numbers     = Numbers+1;    
    end 
    Bit_err(i)=Num_err/(data_Numbers*Numbers);
end
 
figure;
semilogy(SNR,Bit_err,'o-r');
xlabel('SNR(dB)');
ylabel('BER');
grid on;
% save BPSK_10_err.mat SNR Bit_err
01_108m

4.完整MATLAB

V

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱C编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值