SCS译码

        SCS译码的算法原理如下图展示: 

         相比于SCL,SCS的优点就是每次都去寻找最优的待选路径,而SCL每个信息比特进行扩展,即使PM足够大的候选路径也会扩展(最不可能的路径),计算就出现了冗余。

        但SCS译码的难点在于构造一个数据栈来存候选路径的各个信息,在仿真中,这是容易做到的,但是在硬件中,维护一个大的数据栈是难以实现的(这也是SCS的缺点)。我在matlab仿真时构造了如下的数据结构:

        PM_and_path是一个结构体,其成员有PM(存储候选路径的度量值)、path(存储路径的比特、P(存储候选路径的计算LLRs数组)、C(存储候选路径的计算比特数组)。

        PM为一个double型变量;

        path为一个N*1的数组,其中取值为(0,1);

        P为一个(N-1) *1的double型数组;

        C为一个(2N-1)*2的数组,取值为(0,1);

 PM_and_path的结构

PM_and_path存储中的情况

         依靠上述的结构体,就可以构造出一个堆栈,相比于C语言,matlab构造一个栈比较简单,我们只需构造一个结构体数组,将第一个结构体作为栈底,最后一个结构体作为栈顶,依靠栈大小D和数组大小进行判断是否满栈,这里就不再赘述,详细可以查看代码。

栈内的数据存储情况

 入栈和出栈的代码如下所示:

function  PM_and_path=push_stack(PM_and_path,PM,path,first_flag,D,P,C)
%push stack%
%PM_and_path(1) is the bottom of stack and PM_and_path(D) is the top of stack
%PM_and_path is the structure block;The smaller the PM, the higher the accuracy
%PM is the PM num;
%path is the path num eg.[0 0 1 1]
% P is internal LLRs of active path
% C is internal bit values of active path
    if length(PM_and_path)==D
        sprintf('%s ','Full Stack,Failed to push stack!')
    else
        if first_flag==1
            PM_and_path(1).PM=PM;
            PM_and_path(1).path=path;
            PM_and_path(1).P=P;
            PM_and_path(1).C=C;
        else
            PM_and_path(end+1).PM=PM;
            PM_and_path(end).path=path;
            PM_and_path(end).P=P;
            PM_and_path(end).C=C;
        end 
    [~,index]=sort([PM_and_path.PM],'descend');
    PM_and_path=PM_and_path(index);
    end

end

function [PM_and_path,P,C]= pop_stack(PM_and_path)
%pop stack%
    if isempty(PM_and_path)
        sprintf('%s ','Empty Stack,Failed to pop stack!')
    else
        P=PM_and_path(end).P;
        C=PM_and_path(end).C;
        PM_and_path(end)=[];
    end
end

         在构造完数据结构后,只需调用之前的SC译码函数就可以进行译码,译码的具体算法和本文开头的算法一样,下面我使用了极化码讲义中的一个例子来说明SCS的译码过程。

编码和信道的具体情况
算法中的一些变量声明

例子译码问题的抽象

译码(1)

译码(2)

译码(3)

        由此,整个SCS的内容已经全部阐述完毕,依据上述的内容,我现在的理解如下:

        (1)P、C数组的存储和维护。

                如果我们选择使用将P、C数组入栈的方法,这将在硬件上对栈的存储空间提出挑战,尤其是在栈的大小D很大时,N也很大时,这个数据栈的大小将十分大(但这对仿真几乎没有特别大的影响)。对此,我结合SCL的译码特点,给出的一个解决方案就维护一个P数组、和C数组,这两个数组不进行出入栈,其中P的大小为(N-1)*D,C的大小为(2N-1)*2D,且排列顺序与栈的相对应,即栈中的第i条路径在P中为(:)*i,在C中为:(:)*2i-1,(:)*2i。出栈时激活对应列即可。

        (2)Lazy Copy的不适用。

                因为栈中的候选路径的长度不再相同,这带来每条译码路径都是相对独立的,即P、C数组的生成都是独立的,因此就没有必要使用Lazy Copy。

        (3)原算法中c_{1}^{N}的判断存在问题。

                计数器c_{1}^{N},记录了堆栈中长度为i的路径数量,但依据上述过程并不能记录栈内的长度为i的路径数量,因此我认为可以在第(5)步时在统计数量即可。

        (4)D、L的选择问题。

                当D\rightarrow +\infty,L\rightarrow +\infty,我们可以知道,这将遍历全部的译码情况,实现最准确的译码,但这是不切实际的,因此我们必须要合理的选择D和L的大小。在参考CA-SCL后,可以使用自适应的栈大小,即CA-SCS,将栈的大小从小向大进行译码,当译码成功时即可停止译码。

                当我们将D=1时,SCS译码会退回为SC译码。相应的,在SCS算法原理,入栈时我们将栈内的排序的标准设置为PM的大小,若我们将排序标准设置为候选路径已译码的长度时,SCS将退化为SCL。

        SCS的具体代码,我完成时将开源在GitHub和CSDN,为其他学习极化码的朋友提供方便。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值