基于matlab的多符号差分球形译码误码率仿真
1.算法描述
球形译码的基本思想是在以一个矢量x 为中心的半径为d的多维球内搜索格点,通过限制或者减少搜索半径从而减少搜索的点数,进而使得计算时间减少。球形译码算法带来的优点在于它不需要象传统的最大似然译码算法那样需要在整个格内对所有的格点进行搜索,而只需要在一个事先设定的有限球形区域进行搜索,如果该区域所包含的点数相对于整个格内的总点数是相当小的,搜索时间就会大大减少。
影响球形译码的关键问题有:(1) 怎样选择搜索半径d。如果d太大,则球内会包含太多的点,复杂度就会接近或者达到最大似然译码的指数级复杂度。如果d 太小,则球内可能一个格点都不包含,那么球形译码算法将得不到合理的解。(2) 怎样才能判断一个点是否在球内。如果这种判断需要借助每一个格点和矢量之间的距离来判断的话,那么这种方法就不太理想,因为我们需要考察所有的点,所产生的计算量也是指数级的。
球形译码解决了第2个问题,此处均考虑信号为实数,因为复数可以通过增加一倍的维数,将实部和虚部分开,要判断一个点是否在半径为d的m维球内比较困难。若将m变为1,则从球退化为一个间距,这个点就相当于某根天线发送信号的实部或虚部,这样操作就简单很多,可以知道这个点是否在这个距离内。多根发送天线上的信号的实部和虚部分成很多维,每一维上有可能取值。球形译码算法相当于构建了一棵树,树的第k层节点对应的是落在半径为d,维数为k的球内的格点。
如果要求性能完全符合最大似然检测的性能,则初始半径必须是一系列的值,选定初始值为d,如果在范围为d时寻找不到合适的点,则需要增大d的值,扩大的倍数为2倍;如果要求性能接近于最大似然检测的性能,则初始半径相比上面,要取较大,必须有一定的冗余。
对于只要求性能接近最大似然检测的性能的二范数的球形译码,初始半径的选取有公式如下:
对于性能要求达到最大似然检测的性能的二范数的球形译码,初始半径的的选取有公式如下:
在无线传感器网络分布式检测中,信道条件复杂,难于估计。比较相关检测,差分检测的优势是不需要信道估计,但总是付出一定的性能损失。为了缩短这一差距,本文提出多符号差分检测,并结合低复杂度球形译码算法,对多符号差分球形检测的迭代搜索过程进行了详细分析。算法检测性能和复杂度的分析表明,该检测算法不仅能有效降低计算复杂度,而且能保证较好的检测性能。结果证明该算法可作为一种有效检测算法应用于无线传感器网络分布式检测中。
在差分协作系统中,为了解决硬判决多符号差分检测(multi-symbol differential detection,MSDD)译码过程中,部分信息丢失导致性能损失以及该算法中最大似然检测计算复杂度高的问题,提出了一种软输入软输出的多符号差分球形译码(SISO-MSDSD)算法.该算法利用球形译码思想,在一定搜索范围内计算编码比特的对数似然比(LLR),去除先验信息可获得编码比特的外信息,经内部译码器判决得到源信息.
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
% multiple symbol sphere detection for k=1:N-1:Nd-N+1 rN=r(k:k+N-1).'; U=conj(Lh*diag(rN)); shat=MSDSD(U,M,R); vh_ms(k:k+N-2)=diff_detector(shat); end % conventional non-coherent detection vh_cdd=diff_detector(r); % binary detection bh_cdd=mpsk2bin(vh_cdd,M); bh_ms=mpsk2bin(vh_ms,M); % count number of errors and data err_ms=err_ms+sum(abs(xb-bh_ms)); err_cdd=err_cdd+sum(abs(xb-bh_cdd)); nbits=log2(M)*Ns+nbits;%Ns is number of symbols end % compute practical BER ber_ms(ind)=err_ms/nbits;% multiple symbol ber_cdd(ind)=err_cdd/nbits;% conventional end % BER theory value from book "digital comm on fading channels" page 293&259 Pb_coh=.5*(1-sqrt(EbN0./(1+EbN0))); roh=besselj(0,2*pi*fdTs); if M==2 Pb_cdd=0.5*(1+EbN0*(1-roh))./(1+EbN0); elseif M==4 Pb_cdd=.5*(1+EbN0*(1-roh))./(1+EbN0);% this is not exact! end for k=1:length(EsN0) N0=1/EsN0(k); Pb_ms(k)=ber_msd(M,N,N0,fdTs); end mk=['r-s';'k-*';'b-o';'m-x']; figure semilogy(EbN0_dB,ber_ms,mk(1,:),'LineWidth',1,'MarkerSize',5); hold on semilogy(EbN0_dB,Pb_ms,mk(3,:),'LineWidth',1,'MarkerSize',5); grid on xlabel('E_b/N_0') ylabel('Bit Error Rate') leg1=['MSD ',stats_opt,', N=',num2str(N)]; legend(leg1,'Theory MSDD'); set(gca,'XTick',EbN0_dB(1):5:EbN0_dB(end)) figure semilogy(EbN0_dB,ber_cdd,mk(1,:),'LineWidth',1,'MarkerSize',5); hold on semilogy(EbN0_dB,Pb_cdd,mk(3,:),'LineWidth',1,'MarkerSize',5); grid on xlabel('E_b/N_0') ylabel('Bit Error Rate') leg1=['MSD ',stats_opt,', N=',num2str(N)]; legend('Simulation CDD','Theory CDD'); set(gca,'XTick',EbN0_dB(1):5:EbN0_dB(end))