-
Notifications
You must be signed in to change notification settings - Fork 0
/
PolarDecode2.m
78 lines (66 loc) · 2.15 KB
/
PolarDecode2.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
function [x] = PolarDecode2(bits,K,N)
n = log2(N);
load('Q.mat','Q');
Q1 = Q(Q<=N);
F = Q1(1:N-K); %frozen pos
L = zeros(n+1,N);
ucap = zeros(n+1,N);
ns = zeros(1,2*N - 1); %The Tree
f = @(a,b) (1-2*(a<0)).*(1-2*(b<0)).*min(abs(a),abs(b));
%f = @(a,b) sign(a).*sign(b).*min(abs(a),abs(b));
g = @(a,b,c) b+(1-2*c).*a;
L(1,:) = bits;
node = 0; depth = 0;
flag = 0;
while (flag == 0)
if depth == n
if any(F==(node+1))
ucap(n+1,node+1) = 0;
else
if L(n+1,node+1) >= 0
ucap(n+1,node+1) = 0;
else
ucap(n+1,node+1) = 1;
end
end
if node == (N-1)
flag = 1;
else
node = floor(node/2); depth = depth - 1;
end
else
npos = (2^depth) + node + 1;
if ns(npos) == 0
temp = 2^(n-depth);
Ln = L(depth+1,temp*node+1:temp*(node+1));
a = Ln(1:temp/2);b= Ln(temp/2+1:end);
node = node * 2; depth = depth +1;
temp = temp/2;
L(depth+1,temp*node+1:temp*(node+1))= f(a,b);
ns(npos) = 1;
else
if ns(npos) == 1
temp = 2^(n-depth);
Ln = L(depth+1,temp*node+1:temp*(node+1));
a = Ln(1:temp/2);b= Ln(temp/2+1:end);
lnode = 2 * node; ldepth = depth + 1;
ltemp = temp/2;
ucapn = ucap(ldepth+1,ltemp*lnode+1:ltemp*(lnode+1));
node = node * 2 + 1; depth = depth +1;
temp = temp/2;
L(depth+1,temp*node+1:temp*(node+1))= g(a,b,ucapn);
ns(npos) = 2;
else
temp = 2^(n-depth);
lnode = 2 * node; rnode = 2 * node +1; cdepth = depth + 1;
ctemp = temp/2;
ucapl =ucap(cdepth+1,ctemp*lnode+1:ctemp*(lnode+1));
ucapr =ucap(cdepth+1,ctemp*rnode+1:ctemp*(rnode+1));
ucap(depth+1,temp*node+1:temp*(node+1)) = [mod(ucapl+ucapr,2) ucapr];
node = floor(node/2);depth =depth -1;
end
end
end
end
x = ucap(n+1,Q1(N-K+1:end));
end