• 大小: 3KB
    文件类型: .zip
    金币: 2
    下载: 0 次
    发布日期: 2024-01-06
  • 语言: Matlab
  • 标签: NOMA  SCMA  MPA  

资源简介

华为的5G非正交多址(NOMA)方案SCMA的仿真,采用MPA检测算法,matlab代码实现

资源截图

代码片段和文件信息

% HuaWei 5G非正交多址方案SCMA仿真
clear;
rng(3);

frame_num = 1000;
iter_num = 10;   % 3~15
M = 2;          % 2/3/4

S = [
    1 1 1 0 0 0
    2 0 0 1 1 0
    0 2 0 2 0 1
    0 0 2 0 2 2];                  % SCMA签名矩阵

% 调制图案
switch M
    case 2
        mod_map = [1 1; 1 -1; -1 1; -1 -1]/sqrt(2);
    case 3
        mod_map = [1 0; 0 1; 0 -1; -1 0];
    case 4
        mod_map = [1+1i 1+1i; 1-1i 1-1i; -1+1i -1+1i; -1-1i -1-1i]/2;
end

N = 4;                             % 校验节点数量
K = 6;                             % 信息节点数量
sigma2 = 1;
search_space = fullfact([4 4 4]);  % 全搜索空间
search_depth = 4*4*4;              % 搜索空间大小

err_tb_cnt = 0;
for frame_id = 1:frame_num
    
    frame_id
    
    user_num = 6;
    snr = randi([4 20] user_num 1);
    h = sqrt(db2pow(snr)).*exp(1i*2*pi*rand(user_num1));  % 随机生成信道
    
    tx_data = 0;
    for ueid = 1:user_num
        index(ueid) = randi([1 4]);
        data = mod_map(index(ueid):);
        tmp = zeros(41);
        tmp(S(:ueid)==1) = data(1);
        tmp(S(:ueid)==2) = data(2);
        tx_data = tx_data + h(ueid)*tmp;
    end
    
    y = awgn(tx_data 0);      % AWGN信道
    
    Q = 1/4*ones(NK4);       % 初始化信息节点到校验节点的传递信息
    R = 1/4*ones(NK4);       % 初始化校验节点到信息节点的传递信息
    
    for iter = 1:iter_num
        for n = 1:N
            k = find(S(n:)~=0);
            tone_idx = S(nk);
            tmp_h = h(k);
            p = zeros(search_depth 1);
            for m = 1:search_depth
                x = diag(mod_map(search_space(m:) tone_idx)).‘*tmp_h;
                p(m) = Q(nk(1)search_space(m1)) ...
                    * Q(nk(2)search_space(m2)) ...
                    * Q(nk(3)search_space(m3)) ...
                    * 1/(pi*sigma2)*exp(-abs(y(n)-x)^2/sigma2);
            end
            p = p/sum(p);
            
            for ii = 1:3
                for m = 1:4
                    idx1 = search_space(:ii)==m;
                    R(nk(ii)m) = sum(p(idx1));
                end
            end
        end
        
        for k = 1:K
            for n = 1:N
                flag = S(:k)~=0;
                flag(n) = 0;       % 去掉本校验节点
                p = zeros(41);
                p(1) = prod(R(flagk1));
                p(2) = prod(R(flagk2));
                p(3) = prod(R(flagk3));
                p(4) = prod(R(flagk4));
                p = p/sum(p);
                Q(nk:) = p;
            end
        end
    end
    
    tmp = prod(R);
    [~result] = max(tmp [] 3);
    
    err_tb_cnt = err_tb_cnt + ~all(index==result);
end

err_tb_cnt


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-12-23 12:25  SCMA\
     文件        2747  2018-12-23 12:25  SCMA\main.m
     文件        1179  2018-12-23 12:25  SCMA\SCMA.zip

评论

共有 条评论