基于polar码和SCMA的多用户检测的联合检测译码matlab仿真,polar采用SCAN软译码,SCMA用MPA算法

165 阅读5分钟

1.算法描述

       构造的核心是通过信道极化(channel polarization)处理,在编码侧采用方法使各个子信道呈现出不同的可靠性,当码长持续增加时,部分信道将趋向于容量近于1的完美信道(无误码),另一部分信道趋向于容量接近于0的纯噪声信道,选择在容量接近于1的信道上直接传输信息以逼近信道容量,是唯一能够被严格证明可以达到香农极限的方法。

       构造的核心是通过信道极化(channel polarization)处理,在编码侧采用方法使各个子信道呈现出不同的可靠性,当码长持续增加时,部分信道将趋向于容量近于1的完美信道(无误码),另一部分信道趋向于容量接近于0的纯噪声信道,选择在容量接近于1的信道上直接传输信息以逼近信道容量,是唯一能够被严格证明可以达到香农极限的方法。

在解码侧,极化后的信道可用简单的逐次干扰抵消解码的方法,以较低的复杂度获得与最大似然解码相近的性能。

        2008年在国际信息论ISIT会议上,土耳其毕尔肯大学埃尔达尔·阿里坎(Erdal Arıkan)教授首次提出了这个信道极化的概念,基于该理论,他给出了人类已知的第一种能够被严格证明达到信道容量的信道编码方法,并命名为极化码

        华为2016宣布4月份率先完成中国IMT-2020(5G)推进组第一阶段的空口关键技术验证测试,在5G信道编码领域全部使用极化码,2016年11月17日国际无线标准化机构3GPP第87次会议在美国拉斯维加斯召开,中国华为主推PolarCode(极化码)方案,美国高通主推低密度奇偶检查码(LDPC)方案,法国主推Turbo2.0方案,最终控制信道编码由极化码胜出。

        极化码(Polar Codes)是一种新型编码方式,也是3GPP标准制定中的一种候选编码技术方案,通过对华为极化码试验样机在静止和移动场景下的性能测试,针对短码长和长码长两种场景,在相同信道条件下,相对于Turbo码,可以获得0.3~0.6dB的误包率性能增益,同时,华为还测试了极化码与高频段通信相结合,实现了20Gbps以上的数据传输速率,验证了极化码可有效支持ITU所定义的三大应用场景。

 

        Polar码的主要思想是将多个子信道合并成一个等效信道,然后将等效信道分裂成多个信道容量呈两极分化(信道容量接近0或者1)的子信道,最后将信息在信道容量接近1的无噪子信道发送信息,而在信道容量接近0的子信道上发送收发已知的比特信息,从而提高信息传输的可靠性。

       Polar码的极化过程主要由两步来完成,第一步:信道联合;第二步:信道分裂。下面对这两步进行简单介绍:

1.png  

      SCMA(Sparse Code Multiple Access,稀疏码分多址接入)技术是由华为公司所提出的第二个第五代移动通信网络全新空口核心技术,引入稀疏编码对照簿,通过实现多个用户在码域的多址接入来实现无线频谱资源利用效率的提升。SCMA码本设计是其核心,码本设计主要是两大部分:1.低密度扩频;2.高维QAM调制。将这两种技术结合,通过共轭、置换、相位旋转等操作选出具有最佳性能的码本集合,不同用户采用不同的码本进行信息传输。码本具有稀疏性是由于采用了低密度扩频方式,从而实现更有效的用户资源分配及更高的频谱利用;码本所采用的高维调制通过幅度和相位调制将星座点的欧式距离拉得更远,保证多用户占有资源的情况下利于接收端解调并且保证非正交复用用户之间的抗干扰能力。

 

2.仿真效果预览

matlab2013b仿真结果如下:

 

2.png

 

3.MATLAB核心程序 `thod will use it

crc_size = 0;

[FZlookup,bitreversedindices,F_kron_n] = initPC(polar_N,polar_K,polar_n,construction_method,design_snr_dB,sigma,crc_size);

 

alpha = 0.6;

iter_num = 5;

isInterleaver = 1;

 

load('codebook_6users_4chips_qpsk.mat','CB');

 

K = size(CB, 1); % number of orthogonal resources

M = size(CB, 2); % number of codewords in each codebook

V = size(CB, 3); % number of users (layers)

%polar initial and encoding

 

 

 

SCAN_ITER_NUM = 1;

N = polar_N/log2(M); %Number of scma symbols of each user

SNR  = EbN0 + 10log10(polar_K/polar_Nlog2(M)*V/K);

N0 = 1./10.^(SNR/10); % Noise variance

 

Nerr = zeros(1,length(EbN0));

Nbits = zeros(1,length(EbN0));

BER   = zeros(1, length(EbN0));

 

%maxNumErrs = 10000;

maxNumBits = 1e7; %total numer of bits

minNumBits = 50000;

minNumErrs = 50;

 

 

 

 

for iter_ebn0 = 1:length(EbN0)

 

    while ((min(Nerr(:,iter_ebn0)) < minNumErrs) && (Nbits(1,iter_ebn0) < maxNumBits) || (Nbits(1,iter_ebn0) <minNumBits) )%100 010 000

        infobits = randi([0 1],V,polar_K);

        c = zeros(V,polar_N);

        for user = 1:V

            c(user,:) = pencode(infobits(user,:),FZlookup,crc_size,bitreversedindices,F_kron_n);

        end

        

        if isInterleaver ~= 0

            interleaver = zeros(V,polar_N);

            interleavered_bits = zeros(size(c));

            for ii = 1:V

                interleaver(ii,:) = randperm(polar_N);

                interleavered_bits(ii,:) = c(ii, interleaver(ii,:));

            end

            

        else

            interleavered_bits = c;

        end

        

        temp1 = reshape(interleavered_bits',polar_N*V,1);

        temp2 = reshape(temp1,log2(M),N*V);

        x_temp = bi2de(temp2',log2(M),'left-msb');

        x = reshape(x_temp,N,V);

        x = x';

        %h = 1/sqrt(2)(randn(K, V, N)+1jrandn(K, V, N)); % Rayleigh channel

        h = ones(K, V, N);

        %h = 1/sqrt(2)(repmat(randn(1, V, N), K, 1)+1jrepmat(randn(1, V, N), K, 1));

        s = scmaenc(x, CB, h);

        y = awgn(s, SNR(iter_ebn0),'measured');

        

        %Factor graph calculation

        

        

        

        mhat_llr = JIDD(y,polar_N,polar_K,FZlookup,K,V,M,N,CB,N0(iter_ebn0),h,iter_num,isInterleaver,interleaver,alpha);

        

        %**********************************************************

        llr = reshape(mhat_llr',1,V*polar_K);

        m_reshape = reshape(infobits', 1, polar_K*V);

        m_hat = llr<0;

        err = sum(m_hat~=m_reshape);

        Nerr(iter_ebn0) = Nerr(iter_ebn0) + err;

        Nbits(iter_ebn0) = Nbits(iter_ebn0) + length(m_reshape);     

    end

    

    BER(iter_ebn0) = Nerr(iter_ebn0)/Nbits(iter_ebn0);

    fprintf('EbN0 is %d, have runned %d bits, found %d errors, BER=%.7f \n',EbN0(iter_ebn0),Nbits(iter_ebn0),Nerr(iter_ebn0),BER(iter_ebn0));

   

    

    

end`