基于BP译码和用户RMA解码的LT码实现及度分布设计matlab实现和误码仿真

目录

1.引言

2.算法测试效果

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

[3.1 LT码编码与度分布原理](#3.1 LT码编码与度分布原理)

[3.2 BP置信传播译码原理](#3.2 BP置信传播译码原理)

[3.3 多用户RMA解码原理](#3.3 多用户RMA解码原理)

[3.4 参数优化寻找最优接入概率](#3.4 参数优化寻找最优接入概率)

4.核心程序

5.完整算法代码文件获得


1.引言

LT码作为经典实用数字喷泉码,依托度分布控制编码输出符号的连接关系,在删除信道下无需反馈信道即可实现可靠数据传输。BP置信传播译码是LT码主流迭代译码算法,而RMA属于多用户场景下的随机多址译码框架,可支持两个及以上用户的LT码数据包叠加传输,在多用户接入场景,RMA解码与BP译码相互配合完成原始信息恢复,度分布直接决定编码开销、译码成功率与误码率性能。

2.算法测试效果

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

3.1 LT码编码与度分布原理

LT码编码核心是依靠度分布确定每个编码符号的度值d,度分布代表编码符号选取d个原始数据包参与异或运算的概率。编码阶段,每生成一个编码符号,首先依据度分布采样得到度d,从k个原始数据包中等概率随机选出d个源数据包,将选中数据包做模2异或,输出编码符号。

式中S_d为随机选出的d个原始数据包集合,e为输出的LT编码符号。

鲁棒孤波RSD分布是经典基准度分布,但最大度等于源数据包数目,运算开销大;CRS截短度分布对RSD做截断处理,舍弃大度数部分再归一化,降低最大度值;开关度分布结合二进制指数分布与CR 分布特性,编码前期输出更多低度编码符号,加快译码启动,后期沿用CRS分布控制冗余开销。开关度分布表达式:

phi(d)为二进制指数分布,phi(d)为CRS截短度分布,k是原始数据包数量,i为当前编码包序号,alpha为开关点参数。前alpha*k个编码包采用二进制指数分布,产生大量度为1、2的编码符号,为BP译码提供必要的度‑1节点;后续编码包采用CRS度分布,控制整体译码开销,避免冗余过多。

3.2 BP置信传播译码原理

BP译码依靠二部图迭代,二部图一侧是原始源数据包(信息节点),一侧是编码数据包(校验节点),边代表编码符号由哪些源包异或得到。BP译码的必要条件是二部图中存在度等于1的编码校验节点。

当检测到度为1的编码符号,该编码符号直接等于唯一相连的原始数据包,直接恢复源数据:

s=e

恢复源数据包s之后,把s模2异或到所有和s相连的其余编码符号上,同时删除二部图中和s相连全部的边,更新各个编码节点度数。迭代重复上述过程,不断寻找度‑1节点恢复源包,直到全部源数据包恢复,或者不再存在度‑1编码节点,译码终止。

BP译码优势是运算复杂度低;缺陷是一旦二部图不存在度‑1节点,迭代直接停止,会存在译码失败,需要接收更多编码符号才能完成译码。

3.3 多用户RMA解码原理

RMA为随机多址图译码框架,支持多用户信号叠加传输。两用户场景中,两个用户各自独立进行LT编码,编码信号在信道发生叠加,接收端收到叠加之后的混合信号。设用户1编码输出符号为e1,用户2编码输出符号为e2,经过信道叠加,接收端得到接收符号:

RMA解码构造联合二部图,CN代表约束节点,VN代表原始信息节点,REN代表接收叠加符号节点。RMA解码把多用户叠加的接收符号映射到二部图结构,将多用户混合译码问题拆解为单个用户的BP子译码问题。RMA解码外层完成多用户干扰消除,内层调用BP译码完成每个用户自身源数据包恢复。接入概率pk控制用户产生编码数据包的概率,接入概率会改变叠加冲突概率,冲突越多总error数量上升,解码成功率下降;接入概率过小信道利用率低下,因此存在最优接入概率,平衡信道利用率和解码成功率。

3.4 参数优化寻找最优接入概率

设置循环遍历接入概率pk取值区间0,1,步长取 0.1。每一个pk重复执行编码‑信道传输‑RMA+BP 译码完整流程。

统计两用户总的error数目,计算系统误码率。

记录每组接入概率对应的总error数量、RMA解码成功率。

以接入概率为横轴,总error数量/误码率为纵轴绘制凸/凹特性曲线。

根据曲线极值点确定最优接入概率,该点兼顾信道利用率与两用户RMA解码成功率。

4.核心程序

复制代码
%产生dk
dk        = [0.008,1,
             0.494,2,
             0.166,3,
             0.073,4,
             0.083,5,
             0.056,8,
             0.037,9,
             0.056,19,
             0.025,65,
             0.003,66]; 

for  snr=1:length(SNR)
     bit_errors1            = 0;
     bit_errors2            = 0;
     Ths2                   = 0;
     EsNo                   = 10.^(SNR(snr)/10);
     random_binary_variable = zeros(Muser,Times);
     [Vs,IIs] = max(Pk);
     bit_num   = 200; 
     sigma2 = 1 / EsNo;                                                  % calculate the noise power
     sigma = sqrt(sigma2/2);
     Xenc0=[];
     Ydec=[];
     iddd1=0;
     iddd2=0;
     for tt=1:Times
         rng(tt);
         %长概率值
         Per = rand(1,Muser);
         if Per(1)>Pk(1) & Per(2)>Pk(2)%当前时隙不发送
            Flag = 0;
            Ths  = 0;%统计信息传输率
         end
         if Per(1)<=Pk(1) & Per(2)>Pk(2)%当前时隙发送1
            Flag = 1;
            Ths  = 1/2;
         end 
         if Per(1)>Pk(1) & Per(2)<=Pk(2)%当前时隙发送2
            Flag = 2;
            Ths  = 1/2;
         end         
         if Per(1)<=Pk(1) & Per(2)<=Pk(2)%当前时隙叠加发送
            Flag = 3;
            Ths  = 1;
         end 
         [snr,tt]
         Dinsk= round(rand(bit_num,Muser));    
         %对每个?户 LT 码 encoder 成不同的 block
         %LT encode
         for jj = 1:Muser
             [GG{jj},Edges{jj},Jidx{jj},distw{jj},Len1]=func_Ggen(dk,jj,bit_num);
             Xenc0(:,jj) = LT_encs(Dinsk(:,jj),jj,Len1,GG{jj},distw{jj});
         end
         %根据接?概率随机选择在这?时间传送的 BLOCK, 
         II0 = 1:(Muser);
         II  = II0;
         random_binary_variable(II,tt) = 1; % 在这?时间段若?户传送记为 1,不传送记为 0)
         %同1时段传送的信息线性叠加
         if Flag==0
             Tbpsk0=-(2*Xenc0-1);  
             Tbpsk = [];
         end
         if Flag==1
             Tbpsk0=-(2*Xenc0-1);  
             Tbpsk = [];
             Tbpsk = Tbpsk0(:,1);
         end
         if Flag==2
             Tbpsk0=-(2*Xenc0-1);  
             Tbpsk = [];
             Tbpsk = Tbpsk0(:,2);
         end
         if Flag==3
             Tbpsk0=-(2*Xenc0-1);  
             Tbpsk = [];
             Tbpsk = Tbpsk0(:,1);
             Tbpsk = Tbpsk + Tbpsk0(:,2);
         end
         if Flag > 0
             %AWGN channel    
             %AWGN channel    
             Rec0 = Tbpsk+sigma*randn(size(Tbpsk));    
             %添加多径
             Rec  = Rec0 + 0.02*[zeros(10,1);Rec0(1:end-10)] + 0.01*[zeros(30,1);Rec0(1:end-30)];   
            %LT deccode
            Ydec = func_LT_dec(Rec,EsNo,GG,Edges,Jidx,distw,bit_num,Len1,itermax,Flag);
         end
end
figure;
semilogy(SNR,Errs1,'b-o')
hold on
semilogy(SNR,Errs2,'b-s')
grid on
xlabel('SNR');
ylabel('BER');
title('Fading');

save R.mat  SNR Errs1 Errs2 Errs3 Pk

5.完整算法代码文件获得

完整程序见博客首页左侧或者打开本文底部GZH名片

V关注后回复码: X150)

V

相关推荐
民乐团扒谱机1 天前
【微实验】物理启发神经网络(PINN):当AI学会遵守物理定律(附matlab代码))
人工智能·神经网络·matlab
NoteStream1 天前
MATLAB绘制带置信区间的折线散点图(科研绘图模板)
开发语言·matlab
简简单单做算法1 天前
基于遗传算法和贝叶斯联合优化的BiLSTM(GA-BO-BiLSTM)一维时间序列预测算法matlab仿真
matlab·一维时间序列预测·ga-bo-bilstm·遗传和贝叶斯联合优化
机器学习之心2 天前
MATLAB 实战复盘:集合覆盖模型 + 线性加权和法,搞定应急物流中心选址
matlab·集合覆盖模型·线性加权和法·应急物流中心选址
程高兴2 天前
三相两电平光伏MPPT定步长扰动观察法Simulink
matlab
CAE3202 天前
BPM-Matlab光束传播法光学仿真
matlab·bpm·光束传播法
Evand J3 天前
【MATLAB例程,车联网8】MPC网联车辆节能跟驰控制:速度跟踪、间距约束与能耗优化。附MATLAB完整代码的下载链接
开发语言·matlab·车联网·调度·mpc·节能·车辆控制
阿 才3 天前
Matlab(Simulink)使用详解
运维·网络·matlab
Evand J3 天前
【MATLAB例程,车联网12】基于模型预测控制(MPC)的网联车辆交叉口生态驾驶动态优化仿真分析。附完整代码的下载链接
物联网·matlab·车联网·mpc·模型预测控制·车辆·网联车辆