@@ -64,7 +64,7 @@ log_bcjr::generate_PS_PI()
64
64
float
65
65
log_bcjr::max_star (const float *vec, size_t n_ele)
66
66
{
67
- float ret_val = std::numeric_limits<float >::min ();
67
+ float ret_val = - std::numeric_limits<float >::max ();
68
68
69
69
for (float *vec_it = (float *)vec ; vec_it < (vec + n_ele) ; ++vec_it) {
70
70
ret_val = max_star (ret_val, *vec_it);
77
77
log_bcjr::compute_fw_metrics (const std::vector<float > &G,
78
78
const std::vector<float > &A0, std::vector<float > &A, size_t K)
79
79
{
80
- A.resize (d_S*(K+1 ), std::numeric_limits<float >::max ());
80
+ A.resize (d_S*(K+1 ), - std::numeric_limits<float >::max ());
81
81
82
- float norm_A = std::numeric_limits<float >::min ();
82
+ float norm_A = - std::numeric_limits<float >::max ();
83
83
std::vector<float >::iterator A_prev, A_curr;
84
- std::vector<int >::const_iterator PS_it, PI_it;
84
+ std::vector<int >::iterator PS_it, PI_it;
85
85
86
86
// Integrate initial forward metrics
87
87
std::copy (A0.begin (), A0.end (), A.begin ());
@@ -109,59 +109,62 @@ log_bcjr::compute_fw_metrics(const std::vector<float> &G,
109
109
110
110
// Update iterators
111
111
++A_curr;
112
- ++A_prev;
113
112
}
114
113
114
+ // Advance A_prev
115
+ A_prev += d_S;
116
+
115
117
// Metrics normalization
116
- norm_A = max_star (&(*A_prev), d_S);
117
- std::transform (A_prev, A_curr- 1 , A_prev,
118
- std::bind2nd (std::minus<double >(), norm_A));
118
+ norm_A = max_star (&(*( A_prev) ), d_S);
119
+ std::transform (A_prev, A_curr, A_prev,
120
+ std::bind2nd (std::minus<float >(), norm_A));
119
121
}
120
122
}
121
123
122
124
void
123
125
log_bcjr::compute_bw_metrics (const std::vector<float > &G,
124
126
const std::vector<float > &BK, std::vector<float > &B, size_t K)
125
127
{
126
- B.resize (d_S*(K+1 ), std::numeric_limits<float >::max ());
128
+ B.resize (d_S*(K+1 ), - std::numeric_limits<float >::max ());
127
129
128
- float norm_B = std::numeric_limits<float >::min ();
129
- std::vector<float >::iterator B_next, B_curr;
130
- std::vector<int >::const_iterator NS_it, OS_it;
130
+ float norm_B = - std::numeric_limits<float >::max ();
131
+ std::vector<float >::reverse_iterator B_next, B_curr;
132
+ std::vector<int >::reverse_iterator NS_it, OS_it;
131
133
132
134
// Integrate initial forward metrics
133
- std::copy (BK.begin (), BK.end (), B.end () - d_S + 1 );
135
+ std::copy (BK.rbegin (), BK.rend (), B.rbegin () );
134
136
135
137
// Initialize iterators
136
- B_curr = B.end ();
137
- B_next = B.begin () - d_S;
138
- for (std::vector<float >::const_iterator G_k = G.end () ;
139
- G_k != G.begin () ; G_k -= d_O) {
140
-
141
- for (int s=d_S-1 ; s >= 0 ; --s) {
142
- // Iterators for next state and next output lists
143
- NS_it=d_NS.end ();
144
- OS_it=d_OS.end ();
145
-
138
+ B_curr = B.rbegin () + d_S;
139
+ B_next = B.rbegin ();
140
+ for (std::vector<float >::const_reverse_iterator G_k = G.rbegin () ;
141
+ G_k != G.rend () ; G_k += d_O) {
142
+
143
+ // Iterators for next state and next output lists
144
+ NS_it=d_NS.rbegin ();
145
+ OS_it=d_OS.rbegin ();
146
+ for (int s=0 ; s < d_S ; ++s) {
146
147
// Loop
147
- for (size_t i=d_I- 1 ; i >= 0 ; -- i) {
148
+ for (size_t i=0 ; i < d_I ; ++ i) {
148
149
*B_curr = max_star (*B_curr,
149
- B_next[*NS_it] + G_k[*OS_it]);
150
+ B_next[(d_S- 1 )- *NS_it] + G_k[(d_S- 1 )- *OS_it]);
150
151
151
152
// Update PS/PI iterators
152
- -- NS_it;
153
- -- OS_it;
153
+ ++ NS_it;
154
+ ++ OS_it;
154
155
}
155
156
156
157
// Update iterators
157
- --B_curr;
158
- --B_next;
158
+ ++B_curr;
159
159
}
160
160
161
+ // Advance B_next (go back, as it is a reverse iterator...)
162
+ B_next += d_S;
163
+
161
164
// Metrics normalization
162
- norm_B = max_star (&(*B_next) , d_S);
163
- std::transform (B_next, B_next + d_S- 1 , B_next,
164
- std::bind2nd (std::minus<double >(), norm_B));
165
+ norm_B = max_star (&(*B_curr)+ 1 , d_S);
166
+ std::transform (B_next, B_curr , B_next,
167
+ std::bind2nd (std::minus<float >(), norm_B));
165
168
}
166
169
}
167
170
@@ -179,7 +182,7 @@ log_bcjr::compute_app(const std::vector<float> &A, const std::vector<float> &B,
179
182
180
183
for (int s=0 ; s < d_S ; ++s) {
181
184
for (int i=0 ; i < d_I ; ++i) {
182
- out.push_back (B_it[d_NS[s*d_I+i]] + G_k[d_OS[s*d_I+i] + *A_it] );
185
+ out.push_back (B_it[d_NS[s*d_I+i]] + G_k[d_OS[s*d_I+i]] + *A_it);
183
186
}
184
187
185
188
// Update forward iterator
@@ -196,14 +199,14 @@ log_bcjr::log_bcjr_algorithm(const std::vector<float> &A0,
196
199
const std::vector<float > &BK, const std::vector<float > &in,
197
200
std::vector<float > &out)
198
201
{
199
- std::vector<float > G, A, B;
200
- size_t K = out .size ()/d_I ;
202
+ std::vector<float > A, B;
203
+ size_t K = in .size ()/d_O ;
201
204
202
205
// Forward recursion
203
- compute_fw_metrics (G , A0, A, K);
206
+ compute_fw_metrics (in , A0, A, K);
204
207
205
208
// Backward recursion
206
- compute_bw_metrics (G , BK, B, K);
209
+ compute_bw_metrics (in , BK, B, K);
207
210
208
211
// Compute branch APP
209
212
compute_app (A, B, in, K, out);
0 commit comments