基于BP神经网络的CoSaMP信道估计算法matlab性能仿真,对比LS,OMP,MOMP,CoSaMP

154 阅读3分钟

1.算法仿真效果

matlab2022a仿真结果如下(完整代码运行后无水印):

 

1.jpeg

2.jpeg  

仿真操作步骤可参考程序配套的操作视频。

 

2.算法涉及理论知识概要

        LS估计法实现方式较为简单,其估计过程没有考虑实际信道的噪声因素。因此,特别当毫米波MIMO信道干扰较大时,其估计性能较差,只适用于对信道估计精度要求较低,且信噪比较大的情况。

 

        OMP估计法是一种自适应的信道估计方法,其不需要预先获得信道矩阵H的稀疏解的原子数K。为了获得预设的信道估计精度时,OMP估计法需要比CoSaMP估计法更多的迭代次数。但是过多的迭代次数,会导致信道估计误差的不断累积,从而影响最终的信道估计性能。

 

        CoSaMP估计法具有较优的信道估计性能,但其在低信噪比下性能较差。但是,CoSaMP估计法性能依赖于在原子数K的取值,且CoSaMP信道估计的计算过程较为复杂,对计算效率有着较高的要求。

 

       NOMP估计法的性能较优,其同时具备OMP和CoSaMP两种方法的优点。因此,改算法可以通过较小的计算规模和少量的迭代次数完成毫米波MIMO信道的估计。但是该方法的使用场合存在一定的局限性,其适用于窄带毫米波群簇信道模型,而对于其他类型的毫米波MIMO信道模型,其性能将受到影响。

 

      基于BP神经网络的改进CoSaMP信道估计算法,通过BP神经网络运行得到的训练后的最优参数权重参数:

 

766f5578a759ef9c48dacecec6122d96_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

在BP神经网络训练结束之后,可以得到BP神经网络训练得到的hcmp值。

 

再假设CoSaMP估计法得到的信道估计值:

53fee3fd017509eb579733578390cb47_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

       CoSaMP算法的毫米波MIMO信道估计输出值hcosamp和BP神经网络信道估计补偿输出值hcmp进行加权得到当前信道估计值,即:

29f0937b0dd4d1b220fc031e7995bde8_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

3.MATLAB核心程序 `for i1=1:MTKL

    rng(i1);

    for j1=1:length(SNR)

        [i1,j1]

        [Noise0,sigma0] = func_whitenoise(seqdH,SNR(j1),V1);   

        %OFDM机制

        seqdH_ifft      = ifft(seqdH);

        

         Y              = seqdH_ifft+Noise0;

         Yfft           = fft(Y);

         %LS算法

         MSE_LS        = func_LS(seqd,H,Yfft,N);

         %OMP

         MSE_OMP       = func_OMP(Yfft,seqd,H,invH,N,L,K);

         %NOOMP

         MSE_NOMP      = func_NOMP(Yfft,seqd,H,invH,N,L,K);

         %CoSaMP

         MSE_CoSaMP    = func_CoSaMP(Yfft,seqd,H,invH,N,L);         

         %CoSaMP

         MSE_CoSaMPnew = func_CoSaMPnew(Yfft,seqd,H,invH,N,L,K);

               

    end

end

 

figure;

semilogy(SNR,mean(R_LS),'-bs',...

    'LineWidth',1,...

    'MarkerSize',6,...

    'MarkerEdgeColor','k',...

    'MarkerFaceColor',[0.9,0.0,0.0]);

hold on;

semilogy(SNR,mean(R_OMP),'-mo',...

    'LineWidth',1,...

    'MarkerSize',6,...

    'MarkerEdgeColor','k',...

    'MarkerFaceColor',[0.5,0.9,0.0]);

hold on;

semilogy(SNR,mean(R_NOMP),'-b^',...

    'LineWidth',1,...

    'MarkerSize',6,...

    'MarkerEdgeColor','k',...

    'MarkerFaceColor',[0.2,0.9,0.5]);

hold on;

semilogy(SNR,mean(R_CoSaMP),'-r>',...

    'LineWidth',1,...

    'MarkerSize',6,...

    'MarkerEdgeColor','k',...

    'MarkerFaceColor',[0.9,0.9,0.0]);

hold on;

semilogy(SNR,mean(R_CoSaMPNEW),'-k<',...

    'LineWidth',1,...

    'MarkerSize',6,...

    'MarkerEdgeColor','k',...

    'MarkerFaceColor',[0.9,0.3,0.3]);

hold on;

 

xlabel('SNR');

ylabel('MSE');

grid on

legend('LS','OMP','MOMP','CoSaMP','BP+CoSaMP');

0X_070m`