function [LLR_out] = SCMA_decoder(y,sigma2, config, h)
%% SCMA解码器
% @params y 接收信号(K*Nsyms矩阵)
% @params sigma2 接收端噪声功率
% @params config 配置数据
% @params h 瑞利衰落(K*V*Nsyms矩阵),假设完美信道估计
% @return LLR 比特对数似然比(V*N矩阵)
% @ps dr=3,即资源节点的度等于3,一般情况以后再更新
% @ps dv=2, 即用户节点的度等于2
% @ps M=4, 即调制指数等于4
LLR_out = zeros(config.V, config.N);
LLR = zeros(config.V*log2(config.M),config.Nsyms); % 用于parfor的输出(输出向量
% 减小parfor输入communication overhead
M = config.M;
K = config.K;
V = config.V;
F = config.F;
Niter = config.Niter;
CB = config.CB;
parfor n = 1:config.Nsyms
% 计算接收信号的条件概率密度指数部分,P(yn|xn)
f = zeros(M, M, M, K);
for k = 1:K
ind = find(F(k,:)==1);% 与资源块k相连的用户index
for m1 = 1:M
for m2 = 1:M
for m3 = 1:M
f(m1,m2,m3,k) = -(1/2/sigma2)*abs(y(k,n)- ...
(CB(k,m1,ind(1))*h(k,ind(1),n)+ ...
CB(k,m2,ind(2))*h(k,ind(2),n)+ ...
CB(k,m3,ind(3))*h(k,ind(3),n)) )^2;
end
end
end
end
% step1: 外信息初始化,后验概率对数向量
Ivg = log(1/M*ones(K, V, M));
Igv = zeros(K, V, M); % 仅是为了预先分配内存提高程序效率
Igv_tmp = zeros(K, V, M);% 归一化前
% step2: 迭代过程
for iter = 1:Niter
% 信息传递v->g,源程序把资源节点表示为g,这里沿用之前的变量符号
for k = 1:K % 每一个资源节点单独计算
ind = find(F(k,:)==1); % 与资源节点k相连的用户节点index
% 资源节点k到ind(1)的外信息传递
for m1 = 1:M % 外信息向量的每一个元素单独计算
sIgv = zeros(M, M);
for m2 = 1:M
for m3 = 1:M
sIgv(m2,m3) = f(m1,m2,m3,k)+Ivg(k,ind(2),m2)+Ivg(k,ind(3),m3);
end
end
Igv_tmp(k,ind(1),m1) = log_sum_exp(reshape(sIgv,1,[]));
end
% 归一化
for m1 = 1:M
Igv(k,ind(1),m1) = Igv_tmp(k,ind(1),m1) - ...
log(sum(exp(Igv_tmp(k,ind(1),:))));
end
% 资源节点k到ind(2)的外信息传递
for m2 = 1:M
sIgv = zeros(M, M);
for m1 = 1:M
for m3 = 1:M
sIgv(m1,m3) = f(m1,m2,m3,k)+Ivg(k,ind(1),m1)+Ivg(k,ind(3),m3);
end
end
Igv_tmp(k,ind(2),m2) = log_sum_exp(reshape(sIgv,1,[]));
end
% 归一化
for m2 = 1:M
Igv(k,ind(2),m2) = Igv_tmp(k,ind(2),m2) - ...
log(sum(exp(Igv_tmp(k,ind(2),:))));
end
% 资源节点k到ind(3)的外信息传递
for m3 = 1:M
sIgv = zeros(M, M);
for m1 = 1:M
for m2 = 1:M
sIgv(m1,m2) = f(m1,m2,m3,k)+Ivg(k,ind(1),m1)+Ivg(k,ind(2),m2);
end
end
Igv_tmp(k,ind(3),m3) = log_sum_exp(reshape(sIgv,1,[]));
end
% 归一化
for m3 = 1:M
Igv(k,ind(3),m3) = Igv_tmp(k,ind(3),m3) - ...
log(sum(exp(Igv_tmp(k,ind(3),:))));
end
end
% 信息传递g->v
for v = 1:V % 每一个用户节点单独计算
ind = find(F(:,v)==1); % 与用户节点v相连的资源节点index
% 用户节点v到ind(1)的外信息传递
for m = 1:M
Ivg(ind(1),v,m) = Igv(ind(2),v,m);
% 因为dv=2,所以不用归一化
end
% 用户节点v到ind(2)的外信息传递
for m = 1:M
Ivg(ind(2),v,m) = Igv(ind(1),v,m);
% 不用归一化
end
end
end
% step3: 计算比特对数似然比
Q = zeros(M, V); ...
% 所有用户组成的,每一个符号取值后验概率对数构成的矩阵
LLR_tmp = zeros(V*log2(M),1);% 用于parfor的输出
for v = 1:V
ind = find(F(:,v)==1);
for m = 1:M
Q(m,v) = Igv(ind(1),v,m) + Igv(ind(2),v,m);
end
Q(:,v) = Q(:,v) - log(sum(exp(Q(:,v)))); % 归一化
LLR_tmp(log2(M)*(v-1)+1) = log(exp(Q(1,v))+exp(Q(2,v))) - ...
log(exp(Q(3,v))+exp(Q(4,v))); % 第一个bit
LLR_tmp(log2(M)*(v-1)+2) = log(exp(Q(1,v))+exp(Q(3,v))) - ...
log(exp(Q(2,v))+exp(Q(4,v))); % 第二个bit
end
LLR(:,n) = LLR_tmp;
end % parfor
for n = 1:config.Nsyms
LLR_out(:,log2(config.M)*(n-1)+1) = downsample(LLR(:,n),log2(config.M),0);
LLR_out(:,log2(config.M)*(n-1)+2) = downsample(LLR(:,n),log2(config.M),1);
end
end
function y = log_sum_exp(x)
%% log(exp(a)+exp(b)+...)的近似公式,简化计算
% @params x 由a,b,...组成的行向量
xm = max(x);
x = x-repmat(xm, size(x,1), 1);
y = xm + log(sum(exp(x)));
end
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
算法思路参考自github项目klimentyev/scma 代码结构重新自己编写,更容易读懂,并且加入了很多中文注释 使用方法: 1、先运行begin把文件夹加入到路径 2、运行configFile文件,生成配置文件CONFIGDATA.mat 3、留意main中仿真case设定,以及saveflag的设置 4、运行main.m
资源推荐
资源详情
资源评论
收起资源包目录
SimWork.zip (76个子文件)
SimWork
.gitignore 51B
show.m 840B
Ray.mat 3KB
CONFIGDATA.mat 802B
main
main.m 819B
simPerPoint.m 640B
configFile.m 4KB
AWGN.mat 3KB
simPerFrame.m 992B
begin.m 451B
SCMA_decoder.m 5KB
.git
HEAD 23B
index 646B
COMMIT_EDITMSG 13B
objects
f6
8992a45957b2ee92f5049c88d06fa4b18d9827 452B
d5
f9096c6d5fba8187909ee7895e056ee42a7c7b 157B
14493440e030607575c0b2f95fce3d410a5053 51B
4d
a84853f978894cd93d38b55d85c0527306e3d6 149B
3c
484fa2f2d32ccc0de391d715bb6552b83d1d63 283B
a9
f7fc8d28d7256ba62e9261e9b926f06a40e16c 283B
aa
b8031eb8eb611b3765f5608dec11f372326c93 2KB
0f
35251c9af808fe5d497ef99bae937d2202adeb 283B
eb
55c7175b82ef86973ef4e4fbb9cc6b986b55d4 578B
b8
f55e6c5f795da30e41c2394d48513062f75802 255B
41086f35fde13df2ad30f92ea3bae85a165576 283B
df
61883feccb1efe725c00c0dafbfe4351439506 283B
d6
4676e0ab888a902c4c5e5205c1748e2cf104ac 180B
42
725e9663a6bf76c4238e063d2b3ce69d9a1373 1KB
67
afa621e1ad8ad8a2703dcfd3e4cb3fa0778202 480B
e0
e232a72d486ddcf365bb44ce95d57e0c7f2416 255B
c4
24b1758a9e160d3cc602d83a346f35603282b8 152B
ba
8c7c93859023b0212819a2d73f2212545b49d6 1KB
50
15fb4a524498229d8d83e8c41c82847cab9a2e 469B
51
bd120b1e1d287be91bd751af0d07b4aeacd773 54B
21
1da51291f7177c63af692073c12ad284ff14e4 164B
69
b8c730c883c31354b6ac0043f851242ab98cb4 155B
4f
9b6ed012ee535023435532663d979e9706b669 448B
91
8ef65fc1d505e6ef64bf51f9f46200c1c5dc03 267B
pack
23
042bee5116472e9e204d352aea3bb74ed4ca51 162B
68
ac970a2b1c4e162ddded3857998a09bcf453bb 51B
cc
9626a4af5a7d06a0b3a0bb3d6b55baed4df3f4 284B
0e1e96956b321f8553831cd292e22cbe7e79a6 62B
2a
437e90e937577062b2e7d2588952689e28a09a 418B
6f
8cc4e9b534e386232e713ad834835ef08f8320 2KB
ea
8aaf641f9b5c874b08daf15266a642b76aaad4 470B
cd
c80956aaff0c554f05051ce21b9906c5cde95f 479B
47
06a71294de2669746a77486099169f29cbf660 1KB
03
8398870edf2e28792c95fb6c18c5221c52a706 2KB
ff
44969c47277655d13e034709f387ac2daed619 51B
bf
e7c63bb80f963430124a46d940530390935789 189B
be
d2f799edd56f4322076e7c42511c04a8d90a8a 1KB
15
383c9fbcb69cc13e87081e58ad31c518fd54f2 479B
25
e1a6c056cf19ee645141aadc0d60cfdd7d355d 132B
7b
1539340366eb41f038da5a78a281f340bc3102 921B
c2
5ed0316d0d219d72b5b0d48c5a2008cb1b0f18 255B
5f
a8216922c8653feb0b1ab80d4880e1b49fabfe 167B
info
a6
101843cfe77b4ee344d1bfacf7a0cae786bbac 478B
fd
95508b0d2e2d06859bfe419ad5e532268630ce 51B
62
73e8708e83d046969e29f3c6a1d485c3f0c624 453B
description 73B
config 175B
info
exclude 240B
hooks
pre-applypatch.sample 424B
pre-commit.sample 2KB
applypatch-msg.sample 478B
pre-rebase.sample 5KB
commit-msg.sample 896B
prepare-commit-msg.sample 1KB
update.sample 4KB
pre-receive.sample 544B
fsmonitor-watchman.sample 3KB
post-update.sample 189B
pre-push.sample 1KB
logs
HEAD 2KB
refs
heads
master 1KB
refs
tags
heads
master 41B
共 76 条
- 1
资源评论
- ARIA的微笑2019-09-20你好,关于解码部分MPA您有好的资料推荐吗,我一直看不懂MPA部分qh48692019-12-21好久没有登录CSDN才看见,我接触到通信里的MPA最早主要是turbo和LDPC的解码,你要是懂得信道解码中的MPA,SCMA都是差不多的。或者你想速成就只看有关论文的推导和相关的数学基础,像是和积算法这些
qh4869
- 粉丝: 5
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功