Skip to content

Commit 2f6c995

Browse files
author
Alexandre Marquet
committed
Update example to include max_log_bcjr.
1 parent f919a02 commit 2f6c995

File tree

1 file changed

+43
-3
lines changed

1 file changed

+43
-3
lines changed

examples/75_cc.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from PyTurbo import PyLogBCJR as bcjr
2+
from PyTurbo import PyMaxLogBCJR as max_log_bcjr
23
from PyTurbo import PyViterbi as viterbi
34
from matplotlib import pyplot as plt
45

@@ -46,8 +47,20 @@ def log_bcjr_branch_metrics(bits_rcvd, nbits_cw, sigma_b2):
4647

4748
return ret_val.flatten()
4849

50+
def max_log_bcjr_branch_metrics(bits_rcvd, nbits_cw, sigma_b2):
51+
N_cw = (2**nbits_cw)
52+
K = int(len(bits_rcvd)/nbits_cw)
53+
ret_val = numpy.zeros((K, N_cw), dtype=numpy.float32);
54+
cw = numpy.array([[0.0,0.0], [0.0,1.0], [1.0,0.0], [1.0,1.0]]) #The 4 different codewords
55+
56+
bits_rcvd = numpy.array(bits_rcvd).reshape((K, nbits_cw))
57+
for k in range(0, K):
58+
ret_val[k][:] = -numpy.sum(numpy.abs(bits_rcvd[k][:]-cw)**2, axis=1)
59+
60+
return ret_val.flatten()
61+
4962
#Compute bit LLR from a posteriori-probabilities
50-
def compute_llr(app, K, S):
63+
def log_bcjr_compute_llr(app, K, S):
5164
llr = numpy.zeros(K, dtype=numpy.float32)
5265

5366
app = app.reshape((K, S, 2))
@@ -57,6 +70,16 @@ def compute_llr(app, K, S):
5770

5871
return llr
5972

73+
def max_log_bcjr_compute_llr(app, K, S):
74+
llr = numpy.zeros(K, dtype=numpy.float32)
75+
76+
app = app.reshape((K, S, 2))
77+
llr = numpy.max(app[:,:,0], axis=1) - numpy.max(app[:,:,1], axis=1)
78+
#for k in range(0, K):
79+
# llr[k] = numpy.max(app[k,:,0]) - numpy.max(app[k,:,1])
80+
81+
return llr
82+
6083
#Define trellis
6184
I=2
6285
S=4
@@ -86,9 +109,11 @@ def compute_llr(app, K, S):
86109
#Create decoder instance
87110
dec_vit = viterbi(I, S, O, NS, OS)
88111
dec_log_bcjr = bcjr(I, S, O, NS, OS)
112+
dec_max_log_bcjr = max_log_bcjr(I, S, O, NS, OS)
89113

90114
BER_viterbi = numpy.zeros(len(EbN0dB))
91115
BER_log_bcjr = numpy.zeros(len(EbN0dB))
116+
BER_max_log_bcjr = numpy.zeros(len(EbN0dB))
92117
for i in range(0, len(EbN0dB)):
93118
#Generate message
94119
m = numpy.random.randint(0, 2, K_m, dtype=numpy.bool)
@@ -120,17 +145,32 @@ def compute_llr(app, K, S):
120145
post_log_bcjr = dec_log_bcjr.log_bcjr_algorithm(A0, BK, bm_log_bcjr);
121146

122147
#Compute bit LLR and take decisions
123-
llr = compute_llr(post_log_bcjr, K_m, S)
124-
m_hat_log_bcjr = (llr<0)
148+
llr_log_bcjr = log_bcjr_compute_llr(post_log_bcjr, K_m, S)
149+
m_hat_log_bcjr = (llr_log_bcjr<0)
150+
151+
## Max-Log BCJR
152+
#Compute branch metrics
153+
bm_max_log_bcjr = max_log_bcjr_branch_metrics(r, int(1/R), sigma_b2[i])
154+
155+
#Compute posterior probabilities of codewords
156+
post_max_log_bcjr = dec_max_log_bcjr.log_bcjr_algorithm(A0, BK, bm_max_log_bcjr);
157+
158+
#Compute bit LLR and take decisions
159+
llr_max_log_bcjr = max_log_bcjr_compute_llr(post_max_log_bcjr, K_m, S)
160+
m_hat_max_log_bcjr = (llr_max_log_bcjr<0)
125161

126162
##Compute BER
127163
BER_viterbi[i] = numpy.mean(numpy.abs(m!=m_hat_viterbi))
128164
print('BER For viterbi at Eb/N0 = ' + str(EbN0dB[i]) + 'dB: ' + str(BER_viterbi[i]))
129165
BER_log_bcjr[i] = numpy.mean(numpy.abs(m!=m_hat_log_bcjr))
130166
print('BER For log_bcjr at Eb/N0 = ' + str(EbN0dB[i]) + 'dB: ' + str(BER_log_bcjr[i]))
167+
BER_max_log_bcjr[i] = numpy.mean(numpy.abs(m!=m_hat_max_log_bcjr))
168+
print('BER For max_log_bcjr at Eb/N0 = ' + str(EbN0dB[i]) + 'dB: ' + str(BER_max_log_bcjr[i]))
169+
print('')
131170

132171
plt.semilogy(EbN0dB, BER_viterbi, label="Viterbi")
133172
plt.semilogy(EbN0dB, BER_log_bcjr, label="Log-BCJR")
173+
plt.semilogy(EbN0dB, BER_max_log_bcjr, label="Max-Log-BCJR")
134174
plt.legend()
135175
plt.xlabel("E_b/N_0 (dB)")
136176
plt.ylabel("BER")

0 commit comments

Comments
 (0)