-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmpaMIMO.m
225 lines (213 loc) · 8.1 KB
/
mpaMIMO.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
%% MPA MIMO scma decoder is for 2 transmitter (Tx) and 1 receiver (Rx)system.
% The algorithm produces LLRs given the received vector of dimension K.
% For two Tx system we create joint factor graph (size KxMx(2J)) by
% concatinating of two factor graphs F (size KxMxJ).
% Author:
% Michel Kulhandjian
% Research Scientist
% School of Electrical Engineering and Computer Science
% University of Ottawa, Ottawa, Ontario, K1N 6N5, Canada
% Email: mkk6@buffalo.edu or cdamours@uottawa.ca
% Web: http://mkulhandjian.x10host.com/main/
%
% Date: December 2017
%
% References:
% 1) M. Kulhandjian and C. D'Amours, "Design of Permutation-Based Sparse
% Code Multiple Access System," accepted for publication in Proc. IEEE
% Pers., Indoor, Mobile Radio Conf. (PIMRC) 2017, Montreal, Canada, Oct. 2017.
%
% **Any feedback of comments regarding the source code are welcomed.
% This source code is publically shared in the hope that it will be useful
% for researchers. If you may implement the source even partially please
% cite the reference article above.**
function [LLR] = mpaMIMO(Y,C, K, M, N, J, df, VN, FN, VNdf, FNn, IndRowOne, IndRowZer, N0, Nit)
% MPA MIMO SCMA decoder (Log-MPA)
%
% Input arguments:
%
% Y - received SCMA signal at Rx1 after fading channel (size Kx1)
% C - SCMA codebooks (size KxMx(2J)) undergone with fast fading channel
% K - number of orthogonal resources (4)
% M - number of codewords in each codebook (4)
% N - number of non-zero element in the codebook (2)
% J - number of users (layers) (12)
% df - is the number branches arriving to a resource node (6)
% VN - variable node matrix (size (2J)x2), each row r of column in F
% connected to resource nodes
% FN - function node matrix (size Kx(2df)) each row r of row in F
% connected to variable nodes
% VNdf - matrix (size (2J)x2) each row r shows r at which columns appear in FN
% FNn - matrix (size Kx(2df)) each row r indicates the number of connection
% at FN(r,k) variable node
% IndRowOne - position of +1 bits in all B (size Mx1)
% IndRowZer - position of -1 bits in all B (size Mx1)
% N0 - variance of noise (in AWGN channel)
% Nit - number of MPA iterations
%
% Output arguments:
%
% LLR - Log-Likelihood Ratio (size (log2(M)*J)x1)
EF = zeros(df, M, K);
EF2 = zeros(df, M, K);
EV = zeros(N, M, J);
FF = zeros(M, M, M, M, M, M, K);
dMf = M^(df-1);
mM = zeros(1,df);
% Step 1: Initial calculations
for k = 1:K % resourses
for m1 = 1:M
for m2 = 1:M
for m3 = 1:M
for m4 = 1:M
for m5 = 1:M
for m6 = 1:M
FF(m1,m2,m3,m4,m5,m6,k) = -(1/(2*N0))*abs(Y(k)-(C(k,m1,FN(k,1))+C(k,m2,FN(k,2))+C(k,m3,FN(k,3))+C(k,m4,FN(k,4))+C(k,m5,FN(k,5))+C(k,m6,FN(k,6))))^2;
end
end
end
end
end
end
end
% Step 2: Iterative procedure
for nmMPA = 1: Nit
%% EF computaiton
for k=1:K
% df = 1
for m1 = 1:M
sIgv = zeros(1,M^5);
for m2 = 1:M
for m3 = 1:M
for m4 = 1:M
for m5 = 1:M
for m6 = 1:M
sIgv((m2-1)*M^4+(m3-1)*M^3+(m4-1)*M^2+(m5-1)*M+m6) = EV(FNn(k,2),m2,FN(k,2))+...
EV(FNn(k,3),m3,FN(k,3))+EV(FNn(k,4),m4,FN(k,4))+EV(FNn(k,5),m5,FN(k,5))+...
EV(FNn(k,6),m6,FN(k,6))+FF(m1,m2,m3,m4,m5,m6,k);
end
end
end
end
end
EF(1,m1,k) = max(sIgv);
end
% df = 2
for m2 = 1:M
sIgv = zeros(1,M^5);
for m1 = 1:M
for m3 = 1:M
for m4 = 1:M
for m5 = 1:M
for m6 = 1:M
sIgv((m1-1)*M^4+(m3-1)*M^3+(m4-1)*M^2+(m5-1)*M+m6) = EV(FNn(k,1),m1,FN(k,1))+...
EV(FNn(k,3),m3,FN(k,3))+EV(FNn(k,4),m4,FN(k,4))+EV(FNn(k,5),m5,FN(k,5))+...
EV(FNn(k,6),m6,FN(k,6))+FF(m1,m2,m3,m4,m5,m6,k);
end
end
end
end
end
EF(2,m2,k) = max(sIgv);
end
% df = 3
for m3 = 1:M
sIgv = zeros(1,M^5);
for m1 = 1:M
for m2 = 1:M
for m4 = 1:M
for m5 = 1:M
for m6 = 1:M
sIgv((m1-1)*M^4+(m2-1)*M^3+(m4-1)*M^2+(m5-1)*M+m6) = EV(FNn(k,1),m1,FN(k,1))+...
EV(FNn(k,2),m2,FN(k,2))+EV(FNn(k,4),m4,FN(k,4))+EV(FNn(k,5),m5,FN(k,5))+...
EV(FNn(k,6),m6,FN(k,6))+FF(m1,m2,m3,m4,m5,m6,k);
end
end
end
end
end
EF(3,m3,k) = max(sIgv);
end
% df = 4
for m4 = 1:M
sIgv = zeros(1,M^5);
for m1 = 1:M
for m2 = 1:M
for m3 = 1:M
for m5 = 1:M
for m6 = 1:M
sIgv((m1-1)*M^4+(m2-1)*M^3+(m3-1)*M^2+(m5-1)*M+m6) = EV(FNn(k,1),m1,FN(k,1))+...
EV(FNn(k,2),m2,FN(k,2))+EV(FNn(k,3),m3,FN(k,3))+EV(FNn(k,5),m5,FN(k,5))+...
EV(FNn(k,6),m6,FN(k,6))+FF(m1,m2,m3,m4,m5,m6,k);
end
end
end
end
end
EF(4,m4,k) = max(sIgv);
end
% df = 5
for m5 = 1:M
sIgv = zeros(1,M^5);
for m1 = 1:M
for m2 = 1:M
for m3 = 1:M
for m4 = 1:M
for m6 = 1:M
sIgv((m1-1)*M^4+(m2-1)*M^3+(m3-1)*M^2+(m4-1)*M+m6) = EV(FNn(k,1),m1,FN(k,1))+...
EV(FNn(k,2),m2,FN(k,2))+EV(FNn(k,3),m3,FN(k,3))+EV(FNn(k,4),m4,FN(k,4))+...
EV(FNn(k,6),m6,FN(k,6))+FF(m1,m2,m3,m4,m5,m6,k);
end
end
end
end
end
EF(5,m5,k) = max(sIgv);
end
% df = 6
for m6 = 1:M
sIgv = zeros(1,M^5);
for m1 = 1:M
for m2 = 1:M
for m3 = 1:M
for m4 = 1:M
for m5 = 1:M
sIgv((m1-1)*M^4+(m2-1)*M^3+(m3-1)*M^2+(m4-1)*M+m5) = EV(FNn(k,1),m1,FN(k,1))+...
EV(FNn(k,2),m2,FN(k,2))+EV(FNn(k,3),m3,FN(k,3))+EV(FNn(k,4),m4,FN(k,4))+...
EV(FNn(k,5),m5,FN(k,5))+FF(m1,m2,m3,m4,m5,m6,k);
end
end
end
end
end
EF(6,m6,k) = max(sIgv);
end
end
%% EV computaiton
for j= 1: J
for nk = 1 : N
for m = 1 : M
for ni = 1 : N
if (ni ~= nk)
EV(nk, m, j) = EF(VNdf(j,ni), m, VN(j,ni));
end
end
end
end
end
end
IV = zeros(J,M);
Nbits = log2(M);
B = zeros(Nbits,J);
ym = zeros(1,J);
llr =[];
for j = 1 : J
IV(j,:) = sum( EV(:, :, j), 1);
for bi = Nbits:-1:1
llr = [llr ; max(IV(j,IndRowOne((bi-1)*M/2+1:bi*M/2)))-max(IV(j,IndRowZer((bi-1)*M/2+1:bi*M/2))) ];
end
end
LLR =[];
for j = 1 : J/2
LLL =[LLR; [llr((j-1)*2+1); llr(j*2); llr((j-1)*2+1+J); llr(j*2+J)]; ];
end