Skip to content

Commit e014f43

Browse files
committed
Refactored code to make it more pythonic.
1 parent 1022071 commit e014f43

File tree

1 file changed

+16
-23
lines changed

1 file changed

+16
-23
lines changed

commpy/channelcoding/ldpc.py

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ def ldpc_bp_decode(llr_vec, ldpc_code_params, n_iters):
136136
cnode_msgs = np.zeros(n_cnodes*max_cnode_deg)
137137
vnode_msgs = np.zeros(n_vnodes*max_vnode_deg)
138138

139+
_limit_llr_v = np.vectorize(_limit_llr)
140+
139141
# Initialize vnode messages with the LLR values received
140142
for vnode_idx in xrange(n_vnodes):
141143
start_idx = vnode_idx*max_vnode_deg
@@ -149,39 +151,30 @@ def ldpc_bp_decode(llr_vec, ldpc_code_params, n_iters):
149151

150152
# Check Node Update
151153
for cnode_idx in xrange(n_cnodes):
152-
#start_idx = cnode_idx*max_cnode_deg
153-
#offset = cnode_deg_list[cnode_idx]
154-
#vnode_list = cnode_adj_list[start_idx:start_idx+offset]
155-
#msg_prod = np.prod(np.tanh(vnode_msgs[vnode_list*max_vnode_deg + cnode_vnode_map[cnode_idx*max_cnode_deg + np.arange(cnode_deg_list[cnode_idx], int)]]/2.0))
156154

157-
msg_prod = 1.0
158-
for i in xrange(cnode_deg_list[cnode_idx]):
159-
vnode = cnode_adj_list[cnode_idx*max_cnode_deg + i]
160-
msg_prod *= np.tanh(vnode_msgs[vnode*max_vnode_deg +
161-
cnode_vnode_map[cnode_idx*max_cnode_deg + i]]/2.0)
155+
start_idx = cnode_idx*max_cnode_deg
156+
offset = cnode_deg_list[cnode_idx]
157+
vnode_list = cnode_adj_list[start_idx:start_idx+offset]
158+
vnode_list_msgs_tanh = np.tanh(vnode_msgs[vnode_list*max_vnode_deg +
159+
cnode_vnode_map[start_idx:start_idx+offset]]/2.0)
160+
msg_prod = np.prod(vnode_list_msgs_tanh)
162161

163162
# Compute messages on outgoing edges using the incoming message product
164-
for i in xrange(cnode_deg_list[cnode_idx]):
165-
vnode = cnode_adj_list[cnode_idx*max_cnode_deg + i]
166-
c_msg = 2.0*np.arctanh(msg_prod/np.tanh(vnode_msgs[vnode*max_vnode_deg +
167-
cnode_vnode_map[cnode_idx*max_cnode_deg + i]]/2.0))
168-
cnode_msgs[cnode_idx*max_cnode_deg + i] = c_msg
169-
163+
cnode_msgs[start_idx:start_idx+offset]= 2.0*np.arctanh(msg_prod/vnode_list_msgs_tanh)
170164

171165
# Variable Node Update
172166
for vnode_idx in xrange(n_vnodes):
173167

174-
msg_sum = 0
175168
# Compute sum of all incoming messages at the variable node
176-
for i in xrange(vnode_deg_list[vnode_idx]):
177-
cnode = vnode_adj_list[vnode_idx*max_vnode_deg + i]
178-
msg_sum += cnode_msgs[cnode*max_cnode_deg + vnode_cnode_map[vnode_idx*max_vnode_deg + i]]
169+
start_idx = vnode_idx*max_vnode_deg
170+
offset = vnode_deg_list[vnode_idx]
171+
cnode_list = vnode_adj_list[start_idx:start_idx+offset]
172+
cnode_list_msgs = cnode_msgs[cnode_list*max_cnode_deg + vnode_cnode_map[start_idx:start_idx+offset]]
173+
msg_sum = np.sum(cnode_list_msgs)
179174

180175
# Compute messages on outgoing edges using the incoming message sum
181-
for i in xrange(vnode_deg_list[vnode_idx]):
182-
cnode = vnode_adj_list[vnode_idx*max_vnode_deg + i]
183-
v_msg = _limit_llr(llr_vec[vnode_idx] + msg_sum - cnode_msgs[cnode*max_cnode_deg + vnode_cnode_map[vnode_idx*max_vnode_deg + i]])
184-
vnode_msgs[vnode_idx*max_vnode_deg + i] = v_msg
176+
vnode_msgs[start_idx:start_idx+offset] = _limit_llr_v(llr_vec[vnode_idx] + msg_sum -
177+
cnode_list_msgs)
185178

186179
# Update output LLRs and decoded word
187180
out_llrs[vnode_idx] = llr_vec[vnode_idx] + msg_sum

0 commit comments

Comments
 (0)