1
1
from PyTurbo import PyLogBCJR as bcjr
2
+ from PyTurbo import PyMaxLogBCJR as max_log_bcjr
2
3
from PyTurbo import PyViterbi as viterbi
3
4
from matplotlib import pyplot as plt
4
5
@@ -46,8 +47,20 @@ def log_bcjr_branch_metrics(bits_rcvd, nbits_cw, sigma_b2):
46
47
47
48
return ret_val .flatten ()
48
49
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
+
49
62
#Compute bit LLR from a posteriori-probabilities
50
- def compute_llr (app , K , S ):
63
+ def log_bcjr_compute_llr (app , K , S ):
51
64
llr = numpy .zeros (K , dtype = numpy .float32 )
52
65
53
66
app = app .reshape ((K , S , 2 ))
@@ -57,6 +70,16 @@ def compute_llr(app, K, S):
57
70
58
71
return llr
59
72
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
+
60
83
#Define trellis
61
84
I = 2
62
85
S = 4
@@ -86,9 +109,11 @@ def compute_llr(app, K, S):
86
109
#Create decoder instance
87
110
dec_vit = viterbi (I , S , O , NS , OS )
88
111
dec_log_bcjr = bcjr (I , S , O , NS , OS )
112
+ dec_max_log_bcjr = max_log_bcjr (I , S , O , NS , OS )
89
113
90
114
BER_viterbi = numpy .zeros (len (EbN0dB ))
91
115
BER_log_bcjr = numpy .zeros (len (EbN0dB ))
116
+ BER_max_log_bcjr = numpy .zeros (len (EbN0dB ))
92
117
for i in range (0 , len (EbN0dB )):
93
118
#Generate message
94
119
m = numpy .random .randint (0 , 2 , K_m , dtype = numpy .bool )
@@ -120,17 +145,32 @@ def compute_llr(app, K, S):
120
145
post_log_bcjr = dec_log_bcjr .log_bcjr_algorithm (A0 , BK , bm_log_bcjr );
121
146
122
147
#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 )
125
161
126
162
##Compute BER
127
163
BER_viterbi [i ] = numpy .mean (numpy .abs (m != m_hat_viterbi ))
128
164
print ('BER For viterbi at Eb/N0 = ' + str (EbN0dB [i ]) + 'dB: ' + str (BER_viterbi [i ]))
129
165
BER_log_bcjr [i ] = numpy .mean (numpy .abs (m != m_hat_log_bcjr ))
130
166
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 ('' )
131
170
132
171
plt .semilogy (EbN0dB , BER_viterbi , label = "Viterbi" )
133
172
plt .semilogy (EbN0dB , BER_log_bcjr , label = "Log-BCJR" )
173
+ plt .semilogy (EbN0dB , BER_max_log_bcjr , label = "Max-Log-BCJR" )
134
174
plt .legend ()
135
175
plt .xlabel ("E_b/N_0 (dB)" )
136
176
plt .ylabel ("BER" )
0 commit comments