目录
[3.1 LT码编码与度分布原理](#3.1 LT码编码与度分布原理)
[3.2 BP置信传播译码原理](#3.2 BP置信传播译码原理)
[3.3 多用户RMA解码原理](#3.3 多用户RMA解码原理)
[3.4 参数优化寻找最优接入概率](#3.4 参数优化寻找最优接入概率)
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