function u1_N = scl_decoder(L,LLR_init,A)
% L为路径搜索宽度,
% LLR_init为各个码字比特的的对数似然比的初始化值
% A为位置矩阵,指示信息比特和固定比特的位置
% delta为信道高斯噪声的标准差
% 输出u1_N为译码得到的信息比特和固定比特的混合序列
N = length(LLR_init);
Flag = log2(L); %Flag用于指示L条路径的选取方法的切换
u_matrix = zeros(L,N+1); %该矩阵是一个(L*(N+1))的二维矩阵,u_matrix的每一行的前N列存放一串保留的路径度量值所对应的码字,而u_matrix(:,N+1)则对应着候选路径的度量值
reserve_all = path_matrix(L); %存放当需要保留全部路径的时候的路径矩阵
flag = 0; %表示当前还没有遇到第一个信息位
PM_temp = zeros(2*L,2); %存放2L个码字串的判断位置,用于选出L个码字串的临时矩阵
PM_temp(1:2:2*L,1) = ones(L,1); %把临时矩阵的第一列奇数行的值设为1
for i = 1:N
if A(i)==0 %固定位
if i==1 %当译码码字为固定比特且是第一个码字时
uu = []; %存放前i-1个码字
u_matrix(:,i) = zeros(L,1);%第一个码字为固定比特时,L条译码序列第一个码字全部赋值为0
u = 0; %判断第i个比特(此时为第一个比特)
LLR_matrix = LLR_init;
LLR = likelihood(N,i,uu,LLR_matrix);%计算第一个译码码字的对数似然比
PM_former = 0;%初始化路径度量值
for j = 1:L
u_matrix(j,N+1) = path_metric( i,u,PM_former,LLR,A );%计算第一个译码码字的路径度量值
end
else
u_matrix(:,i) = zeros(L,1);%当译码码字为固定比特且不是是第一个码字时,L条译码序列第i个码字全部赋值为0
u = 0; %判断第i个比特
for j = 1:L
uu = u_matrix(j,1:i-1);%将前i-1个译码码字提取出来
LLR_matrix = LLR_init;
LLR = likelihood(N,i,uu,LLR_matrix);%计算第i个译码码字的对数似然比
PM_former = u_matrix(j,N+1);%将前i-1个译码码字对应的路径度量值提取出来
u_matrix(j,N+1) = path_metric( i,u,PM_former,LLR,A );%计算第i个译码码字对应的节点的路径度量值
end
end
else %信息位
flag = flag+1;%用于判断是否要保留所有路径
if flag<=Flag %此时要保留所有路径(Flag=log2(L))
u_matrix(:,i) = reserve_all(:,flag);%将0和1两种结果分别赋值给第i个码字
for j = 1:L
uu = u_matrix(j,1:i-1);%将前i-1个译码码字提取出来
u = u_matrix(j,i); %判断第i个比特,其值为reserve_all(:,flag)所赋值的两种结果(0或1)
LLR_matrix = LLR_init;
LLR = likelihood(N,i,uu,LLR_matrix);%计算第i个译码码字的对数似然比
PM_former = u_matrix(j,N+1);%将前i-1个译码码字对应的路径度量值提取出来
u_matrix(j,N+1) = path_metric( i,u,PM_former,LLR,A );%计算第i个译码码字对应的节点的路径度量值
end
else %此时只能保留L条路径
for j = 1:L
uu = u_matrix(j,1:i-1);%将前i-1个译码码字提取出来
LLR_matrix = LLR_init;
LLR = likelihood(N,i,uu,LLR_matrix);%计算第i个译码码字的对数似然比
PM_former = u_matrix(j,N+1);%将前i-1个译码码字对应的路径度量值提取出来
%PM_temp矩阵为2*L行2列,
%PM_temp每两行对应前一个译码序列
%PM_temp第一列的每两行为第i个译码码字(为1和0);第二列的每两行分别为选择位1或0所对应的节点的路径度量值
PM_temp(2*j-1,2) = path_metric(i,1,PM_former,LLR,A); %PM_temp矩阵奇数行存判定比特为1的路径度量值
PM_temp(2*j,2) = path_metric(i,0,PM_former,LLR,A); %PM_temp矩阵偶数行存判定比特为0的路径度量值
[vals,inds] = sort(PM_temp(:,2),'descend');%计算出路径度量值后进行排序以供选择出L条较大路径度量值所对应的译码序列
temp=[];%临时存放经过排序后选择出来的L条较大路径度量值所对应的译码序列
for k=1:L %%%这个循坏用于从2*L个度量值中选取较优的L个
if mod(inds(k),2)==1 %索引值inds(k)为奇数表示最后一位是1,tempcode最后一位是该路径的度量值
tempcode=[u_matrix((inds(k)+1)/2,1:i-1),1,vals(k)];%(inds(k)+1)/2的值为经过排序后选出来的路径度量值对应的前i-1个码字
temp=[temp;tempcode];
else %索引值inds(k)为偶数表示最后一位是0 ,tempcode最后一位是该路径的概率
tempcode=[u_matrix(inds(k)/2,1:i-1),0,vals(k)]; %inds(k)/2的值为经过排序后选出来的路径度量值对应的前i-1个码字
temp=[temp;tempcode];
end
end %%end of k_cycle
end %%end of j_cycle
u_matrix(:,1:i)=temp(:,1:i);%将临时矩阵中的前N列赋值给u_matrix的前N列,每一行为一条译码序列,共L行
u_matrix(:,N+1)=temp(:,i+1);%将临时矩阵中的第N+1列赋值给u_matrix的第N+1列,也就是L条路径对应的路径度量值
end
end
end
[~,index]=sort(u_matrix(:,N+1),'descend');%对矩阵u_matrix中的路径度量值按从大到小进行排序
u_matrix(1,1:N) = u_matrix(index(1),1:N)%排序后的第一行前N列就为最终的译码结果
u1 = u_matrix(1,1:N);
u1_N=u1(find(A==1));%将译码结果的信息位提取出来
end
scl decoding.rar_SCL 译码_expressvvw_极化码_极化码编码_极化码译码
版权申诉
5星 · 超过95%的资源 38 浏览量
2022-07-14
19:24:08
上传
评论
收藏 6KB RAR 举报
weixin_42653672
- 粉丝: 93
- 资源: 1万+
评论4