-
Notifications
You must be signed in to change notification settings - Fork 25
/
polar_decode.m
62 lines (44 loc) · 1.16 KB
/
polar_decode.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
function [u, v] = polar_decode(y, frozen_bits_indicator)
N = length(y);
if N == 2
L_u_1 = f(y(1), y(2));
u = zeros(1, 2);
if frozen_bits_indicator(1) == 1
u(1) = 0;
elseif L_u_1 >= 0
u(1) = 0;
else
u(1) = 1;
end
L_u_2 = g(y(1), y(2), u(1));
if frozen_bits_indicator(2) == 1
u(2) = 0;
elseif L_u_2 >= 0
u(2) = 0;
else
u(2) = 1;
end
v = zeros(1, 2);
v(1) = bitxor(u(1), u(2));
v(2) = u(2);
else
L_w_odd = zeros(1, N/2);
for index = 1:(N/2)
L_w_odd(index) = f(y(2*index-1), y(2*index));
end
frozen_bits_indicator_1 = frozen_bits_indicator(1:(N/2));
[u_1, v_1] = polar_decode(L_w_odd, frozen_bits_indicator_1);
L_w_even = zeros(1, N/2);
for index = 1:(N/2)
L_w_even(index) = g(y(2*index-1), y(2*index), v_1(index));
end
frozen_bits_indicator_2 = frozen_bits_indicator((N/2 +1):N);
[u_2, v_2] = polar_decode(L_w_even, frozen_bits_indicator_2);
u = [u_1, u_2];
v = zeros(1, N);
for index = 1:(N/2)
v(2*index-1) = bitxor(v_1(index), v_2(index));
v(2*index) = v_2(index);
end
end
end