% 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_num,1)); % 随机生成信道
tx_data = 0;
for ueid = 1:user_num
index(ueid) = randi([1 4]);
data = mod_map(index(ueid),:);
tmp = zeros(4,1);
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(N,K,4); % 初始化信息节点到校验节点的传递信息
R = 1/4*ones(N,K,4); % 初始化校验节点到信息节点的传递信息
for iter = 1:iter_num
for n = 1:N
k = find(S(n,:)~=0);
tone_idx = S(n,k);
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(n,k(1),search_space(m,1)) ...
* Q(n,k(2),search_space(m,2)) ...
* Q(n,k(3),search_space(m,3)) ...
* 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(n,k(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(4,1);
p(1) = prod(R(flag,k,1));
p(2) = prod(R(flag,k,2));
p(3) = prod(R(flag,k,3));
p(4) = prod(R(flag,k,4));
p = p/sum(p);
Q(n,k,:) = p;
end
end
end
tmp = prod(R);
[~,result] = max(tmp, [], 3);
err_tb_cnt = err_tb_cnt + ~all(index==result);
end
err_tb_cnt