基于LDPC编译码和FP-MAP球形检测算法的协作MIMO系统误码率matlab仿真
1.算法运行效果图预览
2.算法运行软件版本
matlab2017b
3.算法理论概述
在无线通信领域,多输入多输出(MIMO)技术因能提高频谱利用率和系统容量而受到广泛关注。而在协作通信中,多个终端共享彼此的天线以形成虚拟MIMO系统,进一步提高了传输可靠性。然而,随着天线数量的增加,接收机的复杂度也显著上升。为此,基于低密度奇偶校验(LDPC)编译码和固定点最大后验概率(FP-MAP)球形检测算法的协作MIMO系统被提出,以在保持系统性能的同时降低复杂度。接下来将详细介绍这一系统的原理和数学公式。
3.1 LDPC码
LDPC码是一种线性分组码,它的校验矩阵是稀疏的,即大部分元素为0。这种稀疏性使得LDPC码的译码复杂度相对较低,同时具有良好的纠错性能。在编码过程中,信息位通过生成矩阵转换为码字;在译码过程中,接收到的信号通过校验矩阵进行纠错。常用的LDPC译码算法包括置信传播(BP)算法和最小和(Min-Sum)算法。
3.1 Fincke-Pohst-MAP球形检测算法
FP-MAP(Fincke-Pohst-MAP)球形检测算法是一种用于MIMO系统接收端的信号检测算法。球形检测算法的基本思想是在接收信号空间中搜索一个“球形”区域,以找到最接近发送信号的点。而FP-MAP算法则通过固定点的迭代方式,逼近最大后验概率(MAP)检测的性能,同时降低了计算的复杂度。Fincke-Pohst算法的原理如下:
基本思想:Fincke-Pohst算法是一种用于格点问题的求解方法,而MAP则是最大后验概率的缩写。结合这两者,Fincke-Pohst-MAP球形检测算法的核心思想是在一个限定的“球形”区域内搜索可能的发送信号,并利用最大后验概率原则进行决策。
球形区域:该算法首先确定一个球形区域,该区域包含了所有可能的发送信号。这个区域的大小和形状可以根据实际情境进行调整。
搜索策略:在确定了球形区域后,算法并不直接对这个区域内的所有点进行搜索,而是采用了一种更有效的策略——Fincke-Pohst算法。这种算法能够按照一定的顺序,逐层地对区域内的点进行搜索,从而确保首先找到的点是最优的或接近最优的。
后验概率决策:对于每一个搜索到的点,算法计算其后验概率。最终选择的点不仅是搜索过程中首先找到的,而且其后验概率也是最大的。
该算法涉及到一系列的递归和迭代公式,其核心是利用格点的性质进行高效搜索,具体的公式和策略较为复杂,需要配合相应的数据结构和计算机程序实现。
在协作MIMO系统中,多个终端通过共享天线形成虚拟MIMO,提高了系统的分集增益和容量。同时,利用LDPC编译码进行前向纠错,提高了信号的传输可靠性。在接收端,采用FP-MAP球形检测算法对接收信号进行处理,可以在保证性能的同时降低计算的复杂度。整个系统的性能优化和复杂度降低是通过联合优化LDPC编译码和FP-MAP球形检测算法实现的。
综上所述,基于LDPC编译码和FP-MAP球形检测算法的协作MIMO系统通过共享天线、采用纠错编码以及优化信号检测算法等方式提高了无线通信的性能和效率。这些技术在4G、5G等移动通信标准中得到了广泛应用,对于推动无线通信技术的发展具有重要意义。未来,随着技术的进步和创新,我们有理由相信,无线通信将会更加高效、可靠
4.部分核心程序
for kk = 1:length(EbNo) while (totalNumErr < Error_Num(kk)) totalNumErr %% %下面开始联合迭代 %下面开始联合迭代 rr = r; %初始半径,这里将搜索的范围变大,就是将系数alpha定为12. RR =(12*Nt)*(2/(10^(SNR/10))); %按英文论文所示转变为实信号 rev1=[real(rr);imag(rr)]; H1 = RayleighMat; %按英文论文所示信道转变为实矩阵 HH=[real(H1(:,:)) -imag(H1(:,:)); imag(H1(:,:)) real(H1(:,:))]; LA = zeros(1,Frame_Length/2); LDs = 0; LD = zeros(1,Frame_Length/2); LE = zeros(1,Frame_Length/2); for Nout = 1:OUT_Iter if Nout == 1 LA = zeros(1,Frame_Length/2); else LA = LA2; end %球形map for J=1:Frame_Length/2 rev = rev1(:,J); %先计算|r-g*Si|^2 [y_norm,LDs] = func_FP_MAP(rev,RR,HH,[-1,1],SNR); for jj=1:Nt y_2norm(Nt*J+jj-Nt)=y_norm(jj)+j*y_norm(jj+Nt); end %每一个比特的后验似然比信息为 LD(J) = LDs; end %外部迭代主要计算 LE = LD - LA; %解交织 LE_itrlac_code = de_interlace(LE,16,16); %用于LDPC译码节点更新 DM_msg = reshape(real(y_2norm),log2(P),Nt*Frame_Length/2); for ii2 = 1:length(DM_msg) if DM_msg(ii2)~=0 DM_msg2(ii2) = abs(DM_msg(ii2)-1)/2; else DM_msg2(ii2) = 0; end end DM_msg3 = de_interlace(DM_msg2,16,16); %用于LDPC译码节点更新 %内部迭代协作LDPC里面 [z_hat,LQ] = func_Dec(-2*DM_msg3 + 1,N0,H,IN_Iter,LE_itrlac_code',Frame_Length); x_hat = z_hat(size(G,2)+1-size(G,1):size(G,2)); %交织 tmp = LQ(size(G,2)+1-size(G,1):size(G,2))' - LE_itrlac_code; %交织 LA2 = interlace(tmp,16,16); end %=========================================================================== count = count + 1; totalNumErr = totalNumErr + biterr(x_hat', data); end BERs(kk) = totalNumErr/(count*Frame_Length); end figure; semilogy(EbNo,BERs,'r-o'); grid on; if IN_Iter==2 save R1.mat EbNo BERs end if IN_Iter==5 save R2.mat EbNo BERs end if IN_Iter==20 save R3.mat EbNo BERs end