Statistics
| Branch: | Tag: | Revision:

root / gr-trellis / src / lib / core_algorithms.cc @ f737dc44

History | View | Annotate | Download (23 kB)

1 ea767612 Achilleas Anastasopoulos
/* -*- c++ -*- */
2 ea767612 Achilleas Anastasopoulos
/*
3 ea767612 Achilleas Anastasopoulos
 * Copyright 2004 Free Software Foundation, Inc.
4 ea767612 Achilleas Anastasopoulos
 * 
5 ea767612 Achilleas Anastasopoulos
 * This file is part of GNU Radio
6 ea767612 Achilleas Anastasopoulos
 * 
7 ea767612 Achilleas Anastasopoulos
 * GNU Radio is free software; you can redistribute it and/or modify
8 ea767612 Achilleas Anastasopoulos
 * it under the terms of the GNU General Public License as published by
9 ea767612 Achilleas Anastasopoulos
 * the Free Software Foundation; either version 3, or (at your option)
10 ea767612 Achilleas Anastasopoulos
 * any later version.
11 ea767612 Achilleas Anastasopoulos
 * 
12 ea767612 Achilleas Anastasopoulos
 * GNU Radio is distributed in the hope that it will be useful,
13 ea767612 Achilleas Anastasopoulos
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ea767612 Achilleas Anastasopoulos
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ea767612 Achilleas Anastasopoulos
 * GNU General Public License for more details.
16 ea767612 Achilleas Anastasopoulos
 * 
17 ea767612 Achilleas Anastasopoulos
 * You should have received a copy of the GNU General Public License
18 ea767612 Achilleas Anastasopoulos
 * along with GNU Radio; see the file COPYING.  If not, write to
19 ea767612 Achilleas Anastasopoulos
 * the Free Software Foundation, Inc., 51 Franklin Street,
20 ea767612 Achilleas Anastasopoulos
 * Boston, MA 02110-1301, USA.
21 ea767612 Achilleas Anastasopoulos
 */
22 ea767612 Achilleas Anastasopoulos
23 ea767612 Achilleas Anastasopoulos
#include <float.h>
24 ea767612 Achilleas Anastasopoulos
#include <stdexcept>
25 ea767612 Achilleas Anastasopoulos
#include "core_algorithms.h"
26 ea767612 Achilleas Anastasopoulos
#include "calc_metric.h"
27 ea767612 Achilleas Anastasopoulos
28 ea767612 Achilleas Anastasopoulos
static const float INF = 1.0e9;
29 ea767612 Achilleas Anastasopoulos
30 f737dc44 Achilleas Anastasopoulos
float min(float a, float b)
31 f737dc44 Achilleas Anastasopoulos
{
32 f737dc44 Achilleas Anastasopoulos
  return a <= b ? a : b;
33 f737dc44 Achilleas Anastasopoulos
}
34 f737dc44 Achilleas Anastasopoulos
35 f737dc44 Achilleas Anastasopoulos
float min_star(float a, float b)
36 f737dc44 Achilleas Anastasopoulos
{
37 f737dc44 Achilleas Anastasopoulos
  return (a <= b ? a : b)-log(1+exp(a <= b ? a-b : b-a));
38 f737dc44 Achilleas Anastasopoulos
}
39 f737dc44 Achilleas Anastasopoulos
40 f737dc44 Achilleas Anastasopoulos
41 f737dc44 Achilleas Anastasopoulos
42 f737dc44 Achilleas Anastasopoulos
43 ea767612 Achilleas Anastasopoulos
template <class T> 
44 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm(int I, int S, int O, 
45 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
46 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
47 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
48 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
49 ea767612 Achilleas Anastasopoulos
             int K,
50 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
51 ea767612 Achilleas Anastasopoulos
             const float *in, T *out)//,
52 ea767612 Achilleas Anastasopoulos
             //std::vector<int> &trace) 
53 ea767612 Achilleas Anastasopoulos
{
54 ea767612 Achilleas Anastasopoulos
  std::vector<int> trace(S*K);
55 ea767612 Achilleas Anastasopoulos
  std::vector<float> alpha(S*2);
56 ea767612 Achilleas Anastasopoulos
  int alphai;
57 ea767612 Achilleas Anastasopoulos
  float norm,mm,minm;
58 ea767612 Achilleas Anastasopoulos
  int minmi;
59 ea767612 Achilleas Anastasopoulos
  int st;
60 ea767612 Achilleas Anastasopoulos
61 ea767612 Achilleas Anastasopoulos
62 ea767612 Achilleas Anastasopoulos
  if(S0<0) { // initial state not specified
63 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) alpha[0*S+i]=0;
64 ea767612 Achilleas Anastasopoulos
  }
65 ea767612 Achilleas Anastasopoulos
  else {
66 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) alpha[0*S+i]=INF;
67 ea767612 Achilleas Anastasopoulos
      alpha[0*S+S0]=0.0;
68 ea767612 Achilleas Anastasopoulos
  }
69 ea767612 Achilleas Anastasopoulos
70 ea767612 Achilleas Anastasopoulos
  alphai=0;
71 ea767612 Achilleas Anastasopoulos
  for(int k=0;k<K;k++) {
72 ea767612 Achilleas Anastasopoulos
      norm=INF;
73 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++) { // for each next state do ACS
74 ea767612 Achilleas Anastasopoulos
          minm=INF;
75 ea767612 Achilleas Anastasopoulos
          minmi=0;
76 ea767612 Achilleas Anastasopoulos
          for(unsigned int i=0;i<PS[j].size();i++) {
77 ea767612 Achilleas Anastasopoulos
              //int i0 = j*I+i;
78 ea767612 Achilleas Anastasopoulos
              if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
79 ea767612 Achilleas Anastasopoulos
                  minm=mm,minmi=i;
80 ea767612 Achilleas Anastasopoulos
          }
81 ea767612 Achilleas Anastasopoulos
          trace[k*S+j]=minmi;
82 ea767612 Achilleas Anastasopoulos
          alpha[((alphai+1)%2)*S+j]=minm;
83 ea767612 Achilleas Anastasopoulos
          if(minm<norm) norm=minm;
84 ea767612 Achilleas Anastasopoulos
      }
85 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++) 
86 ea767612 Achilleas Anastasopoulos
          alpha[((alphai+1)%2)*S+j]-=norm; // normalize total metrics so they do not explode
87 ea767612 Achilleas Anastasopoulos
      alphai=(alphai+1)%2;
88 ea767612 Achilleas Anastasopoulos
  }
89 ea767612 Achilleas Anastasopoulos
90 ea767612 Achilleas Anastasopoulos
  if(SK<0) { // final state not specified
91 ea767612 Achilleas Anastasopoulos
      minm=INF;
92 ea767612 Achilleas Anastasopoulos
      minmi=0;
93 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++)
94 ea767612 Achilleas Anastasopoulos
          if((mm=alpha[alphai*S+i])<minm) minm=mm,minmi=i;
95 ea767612 Achilleas Anastasopoulos
      st=minmi;
96 ea767612 Achilleas Anastasopoulos
  }
97 ea767612 Achilleas Anastasopoulos
  else {
98 ea767612 Achilleas Anastasopoulos
      st=SK;
99 ea767612 Achilleas Anastasopoulos
  }
100 ea767612 Achilleas Anastasopoulos
101 ea767612 Achilleas Anastasopoulos
  for(int k=K-1;k>=0;k--) { // traceback
102 ea767612 Achilleas Anastasopoulos
      int i0=trace[k*S+st];
103 ea767612 Achilleas Anastasopoulos
      out[k]= (T) PI[st][i0];
104 ea767612 Achilleas Anastasopoulos
      st=PS[st][i0];
105 ea767612 Achilleas Anastasopoulos
  }
106 ea767612 Achilleas Anastasopoulos
107 ea767612 Achilleas Anastasopoulos
}
108 ea767612 Achilleas Anastasopoulos
109 ea767612 Achilleas Anastasopoulos
110 ea767612 Achilleas Anastasopoulos
template
111 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm<unsigned char>(int I, int S, int O,
112 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
113 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
114 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
115 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
116 ea767612 Achilleas Anastasopoulos
             int K,
117 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
118 ea767612 Achilleas Anastasopoulos
             const float *in, unsigned char *out);
119 ea767612 Achilleas Anastasopoulos
120 ea767612 Achilleas Anastasopoulos
121 ea767612 Achilleas Anastasopoulos
template
122 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm<short>(int I, int S, int O,
123 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
124 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
125 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
126 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
127 ea767612 Achilleas Anastasopoulos
             int K,
128 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
129 ea767612 Achilleas Anastasopoulos
             const float *in, short *out);
130 ea767612 Achilleas Anastasopoulos
131 ea767612 Achilleas Anastasopoulos
template
132 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm<int>(int I, int S, int O,
133 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
134 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
135 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
136 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
137 ea767612 Achilleas Anastasopoulos
             int K,
138 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
139 ea767612 Achilleas Anastasopoulos
             const float *in, int *out);
140 ea767612 Achilleas Anastasopoulos
141 ea767612 Achilleas Anastasopoulos
142 ea767612 Achilleas Anastasopoulos
143 ea767612 Achilleas Anastasopoulos
//==============================================
144 ea767612 Achilleas Anastasopoulos
145 ea767612 Achilleas Anastasopoulos
template <class Ti, class To>
146 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined(int I, int S, int O,
147 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
148 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
149 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
150 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
151 ea767612 Achilleas Anastasopoulos
             int K,
152 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
153 ea767612 Achilleas Anastasopoulos
             int D,
154 ea767612 Achilleas Anastasopoulos
             const std::vector<Ti> &TABLE,
155 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
156 ea767612 Achilleas Anastasopoulos
             const Ti *in, To *out
157 ea767612 Achilleas Anastasopoulos
)
158 ea767612 Achilleas Anastasopoulos
{
159 ea767612 Achilleas Anastasopoulos
  std::vector<int> trace(S*K);
160 ea767612 Achilleas Anastasopoulos
  std::vector<float> alpha(S*2);
161 ea767612 Achilleas Anastasopoulos
  float *metric = new float[O];
162 ea767612 Achilleas Anastasopoulos
  int alphai;
163 ea767612 Achilleas Anastasopoulos
  float norm,mm,minm;
164 ea767612 Achilleas Anastasopoulos
  int minmi;
165 ea767612 Achilleas Anastasopoulos
  int st;
166 ea767612 Achilleas Anastasopoulos
167 ea767612 Achilleas Anastasopoulos
  if(S0<0) { // initial state not specified
168 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) alpha[0*S+i]=0;
169 ea767612 Achilleas Anastasopoulos
  }
170 ea767612 Achilleas Anastasopoulos
  else {
171 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) alpha[0*S+i]=INF;
172 ea767612 Achilleas Anastasopoulos
      alpha[0*S+S0]=0.0;
173 ea767612 Achilleas Anastasopoulos
  }
174 ea767612 Achilleas Anastasopoulos
175 ea767612 Achilleas Anastasopoulos
  alphai=0;
176 ea767612 Achilleas Anastasopoulos
  for(int k=0;k<K;k++) {
177 ea767612 Achilleas Anastasopoulos
      calc_metric(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
178 ea767612 Achilleas Anastasopoulos
      norm=INF;
179 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++) { // for each next state do ACS
180 ea767612 Achilleas Anastasopoulos
          minm=INF;
181 ea767612 Achilleas Anastasopoulos
          minmi=0;
182 ea767612 Achilleas Anastasopoulos
          for(unsigned int i=0;i<PS[j].size();i++) {
183 ea767612 Achilleas Anastasopoulos
              //int i0 = j*I+i;
184 ea767612 Achilleas Anastasopoulos
              if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
185 ea767612 Achilleas Anastasopoulos
                  minm=mm,minmi=i;
186 ea767612 Achilleas Anastasopoulos
          }
187 ea767612 Achilleas Anastasopoulos
          trace[k*S+j]=minmi;
188 ea767612 Achilleas Anastasopoulos
          alpha[((alphai+1)%2)*S+j]=minm;
189 ea767612 Achilleas Anastasopoulos
          if(minm<norm) norm=minm;
190 ea767612 Achilleas Anastasopoulos
      }
191 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++) 
192 ea767612 Achilleas Anastasopoulos
          alpha[((alphai+1)%2)*S+j]-=norm; // normalize total metrics so they do not explode
193 ea767612 Achilleas Anastasopoulos
      alphai=(alphai+1)%2;
194 ea767612 Achilleas Anastasopoulos
  }
195 ea767612 Achilleas Anastasopoulos
196 ea767612 Achilleas Anastasopoulos
  if(SK<0) { // final state not specified
197 ea767612 Achilleas Anastasopoulos
      minm=INF;
198 ea767612 Achilleas Anastasopoulos
      minmi=0;
199 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++)
200 ea767612 Achilleas Anastasopoulos
          if((mm=alpha[alphai*S+i])<minm) minm=mm,minmi=i;
201 ea767612 Achilleas Anastasopoulos
      st=minmi;
202 ea767612 Achilleas Anastasopoulos
  }
203 ea767612 Achilleas Anastasopoulos
  else {
204 ea767612 Achilleas Anastasopoulos
      st=SK;
205 ea767612 Achilleas Anastasopoulos
  }
206 ea767612 Achilleas Anastasopoulos
207 ea767612 Achilleas Anastasopoulos
  for(int k=K-1;k>=0;k--) { // traceback
208 ea767612 Achilleas Anastasopoulos
      int i0=trace[k*S+st];
209 ea767612 Achilleas Anastasopoulos
      out[k]= (To) PI[st][i0];
210 ea767612 Achilleas Anastasopoulos
      st=PS[st][i0];
211 ea767612 Achilleas Anastasopoulos
  }
212 ea767612 Achilleas Anastasopoulos
  
213 ea767612 Achilleas Anastasopoulos
  delete [] metric;
214 ea767612 Achilleas Anastasopoulos
215 ea767612 Achilleas Anastasopoulos
}
216 ea767612 Achilleas Anastasopoulos
217 ea767612 Achilleas Anastasopoulos
// Ti = s i f c
218 ea767612 Achilleas Anastasopoulos
// To = b s i
219 ea767612 Achilleas Anastasopoulos
220 ea767612 Achilleas Anastasopoulos
//---------------
221 ea767612 Achilleas Anastasopoulos
222 ea767612 Achilleas Anastasopoulos
template
223 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<short,unsigned char>(int I, int S, int O,
224 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
225 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
226 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
227 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
228 ea767612 Achilleas Anastasopoulos
             int K,
229 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
230 ea767612 Achilleas Anastasopoulos
             int D,
231 ea767612 Achilleas Anastasopoulos
             const std::vector<short> &TABLE,
232 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
233 ea767612 Achilleas Anastasopoulos
             const short *in, unsigned char *out
234 ea767612 Achilleas Anastasopoulos
);
235 ea767612 Achilleas Anastasopoulos
236 ea767612 Achilleas Anastasopoulos
template
237 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<int,unsigned char>(int I, int S, int O,
238 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
239 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
240 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
241 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
242 ea767612 Achilleas Anastasopoulos
             int K,
243 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
244 ea767612 Achilleas Anastasopoulos
             int D,
245 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &TABLE,
246 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
247 ea767612 Achilleas Anastasopoulos
             const int *in, unsigned char *out
248 ea767612 Achilleas Anastasopoulos
);
249 ea767612 Achilleas Anastasopoulos
250 ea767612 Achilleas Anastasopoulos
template
251 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<float,unsigned char>(int I, int S, int O,
252 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
253 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
254 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
255 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
256 ea767612 Achilleas Anastasopoulos
             int K,
257 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
258 ea767612 Achilleas Anastasopoulos
             int D,
259 ea767612 Achilleas Anastasopoulos
             const std::vector<float> &TABLE,
260 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
261 ea767612 Achilleas Anastasopoulos
             const float *in, unsigned char *out
262 ea767612 Achilleas Anastasopoulos
);
263 ea767612 Achilleas Anastasopoulos
264 ea767612 Achilleas Anastasopoulos
template
265 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<gr_complex,unsigned char>(int I, int S, int O,
266 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
267 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
268 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
269 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
270 ea767612 Achilleas Anastasopoulos
             int K,
271 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
272 ea767612 Achilleas Anastasopoulos
             int D,
273 ea767612 Achilleas Anastasopoulos
             const std::vector<gr_complex> &TABLE,
274 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
275 ea767612 Achilleas Anastasopoulos
             const gr_complex *in, unsigned char *out
276 ea767612 Achilleas Anastasopoulos
);
277 ea767612 Achilleas Anastasopoulos
278 ea767612 Achilleas Anastasopoulos
//---------------
279 ea767612 Achilleas Anastasopoulos
280 ea767612 Achilleas Anastasopoulos
template
281 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<short,short>(int I, int S, int O,
282 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
283 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
284 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
285 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
286 ea767612 Achilleas Anastasopoulos
             int K,
287 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
288 ea767612 Achilleas Anastasopoulos
             int D,
289 ea767612 Achilleas Anastasopoulos
             const std::vector<short> &TABLE,
290 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
291 ea767612 Achilleas Anastasopoulos
             const short *in, short *out
292 ea767612 Achilleas Anastasopoulos
);
293 ea767612 Achilleas Anastasopoulos
294 ea767612 Achilleas Anastasopoulos
template
295 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<int,short>(int I, int S, int O,
296 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
297 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
298 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
299 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
300 ea767612 Achilleas Anastasopoulos
             int K,
301 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
302 ea767612 Achilleas Anastasopoulos
             int D,
303 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &TABLE,
304 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
305 ea767612 Achilleas Anastasopoulos
             const int *in, short *out
306 ea767612 Achilleas Anastasopoulos
);
307 ea767612 Achilleas Anastasopoulos
308 ea767612 Achilleas Anastasopoulos
template
309 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<float,short>(int I, int S, int O,
310 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
311 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
312 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
313 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
314 ea767612 Achilleas Anastasopoulos
             int K,
315 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
316 ea767612 Achilleas Anastasopoulos
             int D,
317 ea767612 Achilleas Anastasopoulos
             const std::vector<float> &TABLE,
318 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
319 ea767612 Achilleas Anastasopoulos
             const float *in, short *out
320 ea767612 Achilleas Anastasopoulos
);
321 ea767612 Achilleas Anastasopoulos
322 ea767612 Achilleas Anastasopoulos
template
323 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<gr_complex,short>(int I, int S, int O,
324 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
325 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
326 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
327 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
328 ea767612 Achilleas Anastasopoulos
             int K,
329 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
330 ea767612 Achilleas Anastasopoulos
             int D,
331 ea767612 Achilleas Anastasopoulos
             const std::vector<gr_complex> &TABLE,
332 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
333 ea767612 Achilleas Anastasopoulos
             const gr_complex *in, short *out
334 ea767612 Achilleas Anastasopoulos
);
335 ea767612 Achilleas Anastasopoulos
336 ea767612 Achilleas Anastasopoulos
//--------------
337 ea767612 Achilleas Anastasopoulos
338 ea767612 Achilleas Anastasopoulos
template
339 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<short,int>(int I, int S, int O,
340 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
341 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
342 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
343 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
344 ea767612 Achilleas Anastasopoulos
             int K,
345 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
346 ea767612 Achilleas Anastasopoulos
             int D,
347 ea767612 Achilleas Anastasopoulos
             const std::vector<short> &TABLE,
348 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
349 ea767612 Achilleas Anastasopoulos
             const short *in, int *out
350 ea767612 Achilleas Anastasopoulos
);
351 ea767612 Achilleas Anastasopoulos
352 ea767612 Achilleas Anastasopoulos
template
353 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<int,int>(int I, int S, int O,
354 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
355 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
356 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
357 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
358 ea767612 Achilleas Anastasopoulos
             int K,
359 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
360 ea767612 Achilleas Anastasopoulos
             int D,
361 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &TABLE,
362 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
363 ea767612 Achilleas Anastasopoulos
             const int *in, int *out
364 ea767612 Achilleas Anastasopoulos
);
365 ea767612 Achilleas Anastasopoulos
366 ea767612 Achilleas Anastasopoulos
template
367 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<float,int>(int I, int S, int O,
368 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
369 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
370 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
371 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
372 ea767612 Achilleas Anastasopoulos
             int K,
373 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
374 ea767612 Achilleas Anastasopoulos
             int D,
375 ea767612 Achilleas Anastasopoulos
             const std::vector<float> &TABLE,
376 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
377 ea767612 Achilleas Anastasopoulos
             const float *in, int *out
378 ea767612 Achilleas Anastasopoulos
);
379 ea767612 Achilleas Anastasopoulos
380 ea767612 Achilleas Anastasopoulos
template
381 ea767612 Achilleas Anastasopoulos
void viterbi_algorithm_combined<gr_complex,int>(int I, int S, int O,
382 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
383 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
384 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
385 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
386 ea767612 Achilleas Anastasopoulos
             int K,
387 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
388 ea767612 Achilleas Anastasopoulos
             int D,
389 ea767612 Achilleas Anastasopoulos
             const std::vector<gr_complex> &TABLE,
390 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
391 ea767612 Achilleas Anastasopoulos
             const gr_complex *in, int *out
392 ea767612 Achilleas Anastasopoulos
);
393 ea767612 Achilleas Anastasopoulos
394 ea767612 Achilleas Anastasopoulos
395 ea767612 Achilleas Anastasopoulos
396 ea767612 Achilleas Anastasopoulos
397 ea767612 Achilleas Anastasopoulos
398 ea767612 Achilleas Anastasopoulos
399 ea767612 Achilleas Anastasopoulos
400 ea767612 Achilleas Anastasopoulos
401 ea767612 Achilleas Anastasopoulos
402 ea767612 Achilleas Anastasopoulos
403 ea767612 Achilleas Anastasopoulos
404 ea767612 Achilleas Anastasopoulos
405 ea767612 Achilleas Anastasopoulos
406 ea767612 Achilleas Anastasopoulos
407 ea767612 Achilleas Anastasopoulos
408 ea767612 Achilleas Anastasopoulos
409 ea767612 Achilleas Anastasopoulos
410 ea767612 Achilleas Anastasopoulos
411 ea767612 Achilleas Anastasopoulos
412 ea767612 Achilleas Anastasopoulos
413 ea767612 Achilleas Anastasopoulos
//===============================================
414 ea767612 Achilleas Anastasopoulos
415 ea767612 Achilleas Anastasopoulos
416 ea767612 Achilleas Anastasopoulos
void siso_algorithm(int I, int S, int O, 
417 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
418 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
419 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
420 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
421 ea767612 Achilleas Anastasopoulos
             int K,
422 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
423 ea767612 Achilleas Anastasopoulos
             bool POSTI, bool POSTO,
424 ea767612 Achilleas Anastasopoulos
             float (*p2mymin)(float,float),
425 ea767612 Achilleas Anastasopoulos
             const float *priori, const float *prioro, float *post//,
426 ea767612 Achilleas Anastasopoulos
             //std::vector<float> &alpha,
427 ea767612 Achilleas Anastasopoulos
             //std::vector<float> &beta
428 ea767612 Achilleas Anastasopoulos
             ) 
429 ea767612 Achilleas Anastasopoulos
{
430 ea767612 Achilleas Anastasopoulos
  float norm,mm,minm;
431 ea767612 Achilleas Anastasopoulos
  std::vector<float> alpha(S*(K+1));
432 ea767612 Achilleas Anastasopoulos
  std::vector<float> beta(S*(K+1));
433 ea767612 Achilleas Anastasopoulos
434 ea767612 Achilleas Anastasopoulos
435 ea767612 Achilleas Anastasopoulos
  if(S0<0) { // initial state not specified
436 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) alpha[0*S+i]=0;
437 ea767612 Achilleas Anastasopoulos
  }
438 ea767612 Achilleas Anastasopoulos
  else {
439 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) alpha[0*S+i]=INF;
440 ea767612 Achilleas Anastasopoulos
      alpha[0*S+S0]=0.0;
441 ea767612 Achilleas Anastasopoulos
  }
442 ea767612 Achilleas Anastasopoulos
443 ea767612 Achilleas Anastasopoulos
  for(int k=0;k<K;k++) { // forward recursion
444 ea767612 Achilleas Anastasopoulos
      norm=INF;
445 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++) {
446 ea767612 Achilleas Anastasopoulos
          minm=INF;
447 ea767612 Achilleas Anastasopoulos
          for(unsigned int i=0;i<PS[j].size();i++) {
448 ea767612 Achilleas Anastasopoulos
              //int i0 = j*I+i;
449 ea767612 Achilleas Anastasopoulos
              mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
450 ea767612 Achilleas Anastasopoulos
              minm=(*p2mymin)(minm,mm);
451 ea767612 Achilleas Anastasopoulos
          }
452 ea767612 Achilleas Anastasopoulos
          alpha[(k+1)*S+j]=minm;
453 ea767612 Achilleas Anastasopoulos
          if(minm<norm) norm=minm;
454 ea767612 Achilleas Anastasopoulos
      }
455 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++) 
456 ea767612 Achilleas Anastasopoulos
          alpha[(k+1)*S+j]-=norm; // normalize total metrics so they do not explode
457 ea767612 Achilleas Anastasopoulos
  }
458 ea767612 Achilleas Anastasopoulos
459 ea767612 Achilleas Anastasopoulos
  if(SK<0) { // final state not specified
460 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) beta[K*S+i]=0;
461 ea767612 Achilleas Anastasopoulos
  }
462 ea767612 Achilleas Anastasopoulos
  else {
463 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) beta[K*S+i]=INF;
464 ea767612 Achilleas Anastasopoulos
      beta[K*S+SK]=0.0;
465 ea767612 Achilleas Anastasopoulos
  }
466 ea767612 Achilleas Anastasopoulos
467 ea767612 Achilleas Anastasopoulos
  for(int k=K-1;k>=0;k--) { // backward recursion
468 ea767612 Achilleas Anastasopoulos
      norm=INF;
469 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++) { 
470 ea767612 Achilleas Anastasopoulos
          minm=INF;
471 ea767612 Achilleas Anastasopoulos
          for(int i=0;i<I;i++) {
472 ea767612 Achilleas Anastasopoulos
              int i0 = j*I+i;
473 ea767612 Achilleas Anastasopoulos
              mm=beta[(k+1)*S+NS[i0]]+priori[k*I+i]+prioro[k*O+OS[i0]];
474 ea767612 Achilleas Anastasopoulos
              minm=(*p2mymin)(minm,mm);
475 ea767612 Achilleas Anastasopoulos
          }
476 ea767612 Achilleas Anastasopoulos
          beta[k*S+j]=minm;
477 ea767612 Achilleas Anastasopoulos
          if(minm<norm) norm=minm;
478 ea767612 Achilleas Anastasopoulos
      }
479 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++)
480 ea767612 Achilleas Anastasopoulos
          beta[k*S+j]-=norm; // normalize total metrics so they do not explode
481 ea767612 Achilleas Anastasopoulos
  }
482 ea767612 Achilleas Anastasopoulos
483 ea767612 Achilleas Anastasopoulos
484 ea767612 Achilleas Anastasopoulos
if (POSTI && POSTO)
485 ea767612 Achilleas Anastasopoulos
{
486 ea767612 Achilleas Anastasopoulos
  for(int k=0;k<K;k++) { // input combining
487 ea767612 Achilleas Anastasopoulos
      norm=INF;
488 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<I;i++) {
489 ea767612 Achilleas Anastasopoulos
          minm=INF;
490 ea767612 Achilleas Anastasopoulos
          for(int j=0;j<S;j++) {
491 ea767612 Achilleas Anastasopoulos
              mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
492 ea767612 Achilleas Anastasopoulos
              minm=(*p2mymin)(minm,mm);
493 ea767612 Achilleas Anastasopoulos
          }
494 ea767612 Achilleas Anastasopoulos
          post[k*(I+O)+i]=minm;
495 ea767612 Achilleas Anastasopoulos
          if(minm<norm) norm=minm;
496 ea767612 Achilleas Anastasopoulos
      }
497 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<I;i++)
498 ea767612 Achilleas Anastasopoulos
          post[k*(I+O)+i]-=norm; // normalize metrics
499 ea767612 Achilleas Anastasopoulos
  }
500 ea767612 Achilleas Anastasopoulos
501 ea767612 Achilleas Anastasopoulos
502 ea767612 Achilleas Anastasopoulos
  for(int k=0;k<K;k++) { // output combining
503 ea767612 Achilleas Anastasopoulos
      norm=INF;
504 ea767612 Achilleas Anastasopoulos
      for(int n=0;n<O;n++) {
505 ea767612 Achilleas Anastasopoulos
          minm=INF;
506 ea767612 Achilleas Anastasopoulos
          for(int j=0;j<S;j++) {
507 ea767612 Achilleas Anastasopoulos
              for(int i=0;i<I;i++) {
508 ea767612 Achilleas Anastasopoulos
                  mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
509 ea767612 Achilleas Anastasopoulos
                  minm=(*p2mymin)(minm,mm);
510 ea767612 Achilleas Anastasopoulos
              }
511 ea767612 Achilleas Anastasopoulos
          }
512 ea767612 Achilleas Anastasopoulos
          post[k*(I+O)+I+n]=minm;
513 ea767612 Achilleas Anastasopoulos
          if(minm<norm) norm=minm;
514 ea767612 Achilleas Anastasopoulos
      }
515 ea767612 Achilleas Anastasopoulos
      for(int n=0;n<O;n++)
516 ea767612 Achilleas Anastasopoulos
          post[k*(I+O)+I+n]-=norm; // normalize metrics
517 ea767612 Achilleas Anastasopoulos
  }
518 ea767612 Achilleas Anastasopoulos
} 
519 ea767612 Achilleas Anastasopoulos
else if(POSTI) 
520 ea767612 Achilleas Anastasopoulos
{
521 ea767612 Achilleas Anastasopoulos
  for(int k=0;k<K;k++) { // input combining
522 ea767612 Achilleas Anastasopoulos
      norm=INF;
523 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<I;i++) {
524 ea767612 Achilleas Anastasopoulos
          minm=INF;
525 ea767612 Achilleas Anastasopoulos
          for(int j=0;j<S;j++) {
526 ea767612 Achilleas Anastasopoulos
              mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
527 ea767612 Achilleas Anastasopoulos
              minm=(*p2mymin)(minm,mm);
528 ea767612 Achilleas Anastasopoulos
          }
529 ea767612 Achilleas Anastasopoulos
          post[k*I+i]=minm;
530 ea767612 Achilleas Anastasopoulos
          if(minm<norm) norm=minm;
531 ea767612 Achilleas Anastasopoulos
      }
532 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<I;i++)
533 ea767612 Achilleas Anastasopoulos
          post[k*I+i]-=norm; // normalize metrics
534 ea767612 Achilleas Anastasopoulos
  }
535 ea767612 Achilleas Anastasopoulos
}
536 ea767612 Achilleas Anastasopoulos
else if(POSTO)
537 ea767612 Achilleas Anastasopoulos
{
538 ea767612 Achilleas Anastasopoulos
  for(int k=0;k<K;k++) { // output combining
539 ea767612 Achilleas Anastasopoulos
      norm=INF;
540 ea767612 Achilleas Anastasopoulos
      for(int n=0;n<O;n++) {
541 ea767612 Achilleas Anastasopoulos
          minm=INF;
542 ea767612 Achilleas Anastasopoulos
          for(int j=0;j<S;j++) {
543 ea767612 Achilleas Anastasopoulos
              for(int i=0;i<I;i++) {
544 ea767612 Achilleas Anastasopoulos
                  mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
545 ea767612 Achilleas Anastasopoulos
                  minm=(*p2mymin)(minm,mm);
546 ea767612 Achilleas Anastasopoulos
              }
547 ea767612 Achilleas Anastasopoulos
          }
548 ea767612 Achilleas Anastasopoulos
          post[k*O+n]=minm;
549 ea767612 Achilleas Anastasopoulos
          if(minm<norm) norm=minm;
550 ea767612 Achilleas Anastasopoulos
      }
551 ea767612 Achilleas Anastasopoulos
      for(int n=0;n<O;n++)
552 ea767612 Achilleas Anastasopoulos
          post[k*O+n]-=norm; // normalize metrics
553 ea767612 Achilleas Anastasopoulos
  }
554 ea767612 Achilleas Anastasopoulos
}
555 ea767612 Achilleas Anastasopoulos
else
556 ea767612 Achilleas Anastasopoulos
    throw std::runtime_error ("Not both POSTI and POSTO can be false.");
557 ea767612 Achilleas Anastasopoulos
558 ea767612 Achilleas Anastasopoulos
}
559 ea767612 Achilleas Anastasopoulos
560 ea767612 Achilleas Anastasopoulos
561 ea767612 Achilleas Anastasopoulos
//===========================================================
562 ea767612 Achilleas Anastasopoulos
563 f737dc44 Achilleas Anastasopoulos
template <class T>
564 ea767612 Achilleas Anastasopoulos
void siso_algorithm_combined(int I, int S, int O, 
565 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &NS,
566 ea767612 Achilleas Anastasopoulos
             const std::vector<int> &OS,
567 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
568 ea767612 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
569 ea767612 Achilleas Anastasopoulos
             int K,
570 ea767612 Achilleas Anastasopoulos
             int S0,int SK,
571 ea767612 Achilleas Anastasopoulos
             bool POSTI, bool POSTO,
572 ea767612 Achilleas Anastasopoulos
             float (*p2mymin)(float,float),
573 ea767612 Achilleas Anastasopoulos
             int D,
574 f737dc44 Achilleas Anastasopoulos
             const std::vector<T> &TABLE,
575 ea767612 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
576 f737dc44 Achilleas Anastasopoulos
             const float *priori, const T *observations, float *post
577 f737dc44 Achilleas Anastasopoulos
) 
578 ea767612 Achilleas Anastasopoulos
{
579 ea767612 Achilleas Anastasopoulos
  float norm,mm,minm;
580 ea767612 Achilleas Anastasopoulos
  std::vector<float> alpha(S*(K+1));
581 ea767612 Achilleas Anastasopoulos
  std::vector<float> beta(S*(K+1));
582 ea767612 Achilleas Anastasopoulos
  float *prioro = new float[O*K];
583 ea767612 Achilleas Anastasopoulos
584 ea767612 Achilleas Anastasopoulos
585 ea767612 Achilleas Anastasopoulos
  if(S0<0) { // initial state not specified
586 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) alpha[0*S+i]=0;
587 ea767612 Achilleas Anastasopoulos
  }
588 ea767612 Achilleas Anastasopoulos
  else {
589 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) alpha[0*S+i]=INF;
590 ea767612 Achilleas Anastasopoulos
      alpha[0*S+S0]=0.0;
591 ea767612 Achilleas Anastasopoulos
  }
592 ea767612 Achilleas Anastasopoulos
593 ea767612 Achilleas Anastasopoulos
  for(int k=0;k<K;k++) { // forward recursion
594 ea767612 Achilleas Anastasopoulos
      calc_metric(O, D, TABLE, &(observations[k*D]), &(prioro[k*O]),TYPE); // calc metrics
595 ea767612 Achilleas Anastasopoulos
      norm=INF;
596 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++) {
597 ea767612 Achilleas Anastasopoulos
          minm=INF;
598 ea767612 Achilleas Anastasopoulos
          for(unsigned int i=0;i<PS[j].size();i++) {
599 ea767612 Achilleas Anastasopoulos
              //int i0 = j*I+i;
600 ea767612 Achilleas Anastasopoulos
              mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
601 ea767612 Achilleas Anastasopoulos
              minm=(*p2mymin)(minm,mm);
602 ea767612 Achilleas Anastasopoulos
          }
603 ea767612 Achilleas Anastasopoulos
          alpha[(k+1)*S+j]=minm;
604 ea767612 Achilleas Anastasopoulos
          if(minm<norm) norm=minm;
605 ea767612 Achilleas Anastasopoulos
      }
606 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++) 
607 ea767612 Achilleas Anastasopoulos
          alpha[(k+1)*S+j]-=norm; // normalize total metrics so they do not explode
608 ea767612 Achilleas Anastasopoulos
  }
609 ea767612 Achilleas Anastasopoulos
610 ea767612 Achilleas Anastasopoulos
  if(SK<0) { // final state not specified
611 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) beta[K*S+i]=0;
612 ea767612 Achilleas Anastasopoulos
  }
613 ea767612 Achilleas Anastasopoulos
  else {
614 ea767612 Achilleas Anastasopoulos
      for(int i=0;i<S;i++) beta[K*S+i]=INF;
615 ea767612 Achilleas Anastasopoulos
      beta[K*S+SK]=0.0;
616 ea767612 Achilleas Anastasopoulos
  }
617 ea767612 Achilleas Anastasopoulos
618 ea767612 Achilleas Anastasopoulos
  for(int k=K-1;k>=0;k--) { // backward recursion
619 ea767612 Achilleas Anastasopoulos
      norm=INF;
620 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++) { 
621 ea767612 Achilleas Anastasopoulos
          minm=INF;
622 ea767612 Achilleas Anastasopoulos
          for(int i=0;i<I;i++) {
623 ea767612 Achilleas Anastasopoulos
              int i0 = j*I+i;
624 ea767612 Achilleas Anastasopoulos
              mm=beta[(k+1)*S+NS[i0]]+priori[k*I+i]+prioro[k*O+OS[i0]];
625 ea767612 Achilleas Anastasopoulos
              minm=(*p2mymin)(minm,mm);
626 ea767612 Achilleas Anastasopoulos
          }
627 ea767612 Achilleas Anastasopoulos
          beta[k*S+j]=minm;
628 ea767612 Achilleas Anastasopoulos
          if(minm<norm) norm=minm;
629 ea767612 Achilleas Anastasopoulos
      }
630 ea767612 Achilleas Anastasopoulos
      for(int j=0;j<S;j++)
631 ea767612 Achilleas Anastasopoulos
          beta[k*S+j]-=norm; // normalize total metrics so they do not explode
632 ea767612 Achilleas Anastasopoulos
  }
633 ea767612 Achilleas Anastasopoulos
634 ea767612 Achilleas Anastasopoulos
635 ea767612 Achilleas Anastasopoulos
  if (POSTI && POSTO)
636 ea767612 Achilleas Anastasopoulos
  {
637 ea767612 Achilleas Anastasopoulos
    for(int k=0;k<K;k++) { // input combining
638 ea767612 Achilleas Anastasopoulos
        norm=INF;
639 ea767612 Achilleas Anastasopoulos
        for(int i=0;i<I;i++) {
640 ea767612 Achilleas Anastasopoulos
            minm=INF;
641 ea767612 Achilleas Anastasopoulos
            for(int j=0;j<S;j++) {
642 ea767612 Achilleas Anastasopoulos
                mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
643 ea767612 Achilleas Anastasopoulos
                minm=(*p2mymin)(minm,mm);
644 ea767612 Achilleas Anastasopoulos
            }
645 ea767612 Achilleas Anastasopoulos
            post[k*(I+O)+i]=minm;
646 ea767612 Achilleas Anastasopoulos
            if(minm<norm) norm=minm;
647 ea767612 Achilleas Anastasopoulos
        }
648 ea767612 Achilleas Anastasopoulos
        for(int i=0;i<I;i++)
649 ea767612 Achilleas Anastasopoulos
            post[k*(I+O)+i]-=norm; // normalize metrics
650 ea767612 Achilleas Anastasopoulos
    }
651 ea767612 Achilleas Anastasopoulos
652 ea767612 Achilleas Anastasopoulos
653 ea767612 Achilleas Anastasopoulos
    for(int k=0;k<K;k++) { // output combining
654 ea767612 Achilleas Anastasopoulos
        norm=INF;
655 ea767612 Achilleas Anastasopoulos
        for(int n=0;n<O;n++) {
656 ea767612 Achilleas Anastasopoulos
            minm=INF;
657 ea767612 Achilleas Anastasopoulos
            for(int j=0;j<S;j++) {
658 ea767612 Achilleas Anastasopoulos
                for(int i=0;i<I;i++) {
659 ea767612 Achilleas Anastasopoulos
                    mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
660 ea767612 Achilleas Anastasopoulos
                    minm=(*p2mymin)(minm,mm);
661 ea767612 Achilleas Anastasopoulos
                }
662 ea767612 Achilleas Anastasopoulos
            }
663 ea767612 Achilleas Anastasopoulos
            post[k*(I+O)+I+n]=minm;
664 ea767612 Achilleas Anastasopoulos
            if(minm<norm) norm=minm;
665 ea767612 Achilleas Anastasopoulos
        }
666 ea767612 Achilleas Anastasopoulos
        for(int n=0;n<O;n++)
667 ea767612 Achilleas Anastasopoulos
            post[k*(I+O)+I+n]-=norm; // normalize metrics
668 ea767612 Achilleas Anastasopoulos
    }
669 ea767612 Achilleas Anastasopoulos
  } 
670 ea767612 Achilleas Anastasopoulos
  else if(POSTI) 
671 ea767612 Achilleas Anastasopoulos
  {
672 ea767612 Achilleas Anastasopoulos
    for(int k=0;k<K;k++) { // input combining
673 ea767612 Achilleas Anastasopoulos
        norm=INF;
674 ea767612 Achilleas Anastasopoulos
        for(int i=0;i<I;i++) {
675 ea767612 Achilleas Anastasopoulos
            minm=INF;
676 ea767612 Achilleas Anastasopoulos
            for(int j=0;j<S;j++) {
677 ea767612 Achilleas Anastasopoulos
                mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
678 ea767612 Achilleas Anastasopoulos
                minm=(*p2mymin)(minm,mm);
679 ea767612 Achilleas Anastasopoulos
            }
680 ea767612 Achilleas Anastasopoulos
            post[k*I+i]=minm;
681 ea767612 Achilleas Anastasopoulos
            if(minm<norm) norm=minm;
682 ea767612 Achilleas Anastasopoulos
        }
683 ea767612 Achilleas Anastasopoulos
        for(int i=0;i<I;i++)
684 ea767612 Achilleas Anastasopoulos
            post[k*I+i]-=norm; // normalize metrics
685 ea767612 Achilleas Anastasopoulos
    }
686 ea767612 Achilleas Anastasopoulos
  }
687 ea767612 Achilleas Anastasopoulos
  else if(POSTO)
688 ea767612 Achilleas Anastasopoulos
  {
689 ea767612 Achilleas Anastasopoulos
    for(int k=0;k<K;k++) { // output combining
690 ea767612 Achilleas Anastasopoulos
        norm=INF;
691 ea767612 Achilleas Anastasopoulos
        for(int n=0;n<O;n++) {
692 ea767612 Achilleas Anastasopoulos
            minm=INF;
693 ea767612 Achilleas Anastasopoulos
            for(int j=0;j<S;j++) {
694 ea767612 Achilleas Anastasopoulos
                for(int i=0;i<I;i++) {
695 ea767612 Achilleas Anastasopoulos
                    mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
696 ea767612 Achilleas Anastasopoulos
                    minm=(*p2mymin)(minm,mm);
697 ea767612 Achilleas Anastasopoulos
                }
698 ea767612 Achilleas Anastasopoulos
            }
699 ea767612 Achilleas Anastasopoulos
            post[k*O+n]=minm;
700 ea767612 Achilleas Anastasopoulos
            if(minm<norm) norm=minm;
701 ea767612 Achilleas Anastasopoulos
        }
702 ea767612 Achilleas Anastasopoulos
        for(int n=0;n<O;n++)
703 ea767612 Achilleas Anastasopoulos
            post[k*O+n]-=norm; // normalize metrics
704 ea767612 Achilleas Anastasopoulos
    }
705 ea767612 Achilleas Anastasopoulos
  }
706 ea767612 Achilleas Anastasopoulos
  else
707 ea767612 Achilleas Anastasopoulos
    throw std::runtime_error ("Not both POSTI and POSTO can be false.");
708 ea767612 Achilleas Anastasopoulos
709 ea767612 Achilleas Anastasopoulos
  delete [] prioro;
710 ea767612 Achilleas Anastasopoulos
711 ea767612 Achilleas Anastasopoulos
}
712 ea767612 Achilleas Anastasopoulos
713 f737dc44 Achilleas Anastasopoulos
//---------
714 f737dc44 Achilleas Anastasopoulos
715 f737dc44 Achilleas Anastasopoulos
template
716 f737dc44 Achilleas Anastasopoulos
void siso_algorithm_combined<short>(int I, int S, int O,
717 f737dc44 Achilleas Anastasopoulos
             const std::vector<int> &NS,
718 f737dc44 Achilleas Anastasopoulos
             const std::vector<int> &OS,
719 f737dc44 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
720 f737dc44 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
721 f737dc44 Achilleas Anastasopoulos
             int K,
722 f737dc44 Achilleas Anastasopoulos
             int S0,int SK,
723 f737dc44 Achilleas Anastasopoulos
             bool POSTI, bool POSTO,
724 f737dc44 Achilleas Anastasopoulos
             float (*p2mymin)(float,float),
725 f737dc44 Achilleas Anastasopoulos
             int D,
726 f737dc44 Achilleas Anastasopoulos
             const std::vector<short> &TABLE,
727 f737dc44 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
728 f737dc44 Achilleas Anastasopoulos
             const float *priori, const short *observations, float *post
729 f737dc44 Achilleas Anastasopoulos
);
730 f737dc44 Achilleas Anastasopoulos
731 f737dc44 Achilleas Anastasopoulos
template
732 f737dc44 Achilleas Anastasopoulos
void siso_algorithm_combined<int>(int I, int S, int O,
733 f737dc44 Achilleas Anastasopoulos
             const std::vector<int> &NS,
734 f737dc44 Achilleas Anastasopoulos
             const std::vector<int> &OS,
735 f737dc44 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
736 f737dc44 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
737 f737dc44 Achilleas Anastasopoulos
             int K,
738 f737dc44 Achilleas Anastasopoulos
             int S0,int SK,
739 f737dc44 Achilleas Anastasopoulos
             bool POSTI, bool POSTO,
740 f737dc44 Achilleas Anastasopoulos
             float (*p2mymin)(float,float),
741 f737dc44 Achilleas Anastasopoulos
             int D,
742 f737dc44 Achilleas Anastasopoulos
             const std::vector<int> &TABLE,
743 f737dc44 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
744 f737dc44 Achilleas Anastasopoulos
             const float *priori, const int *observations, float *post
745 f737dc44 Achilleas Anastasopoulos
);
746 f737dc44 Achilleas Anastasopoulos
747 f737dc44 Achilleas Anastasopoulos
template
748 f737dc44 Achilleas Anastasopoulos
void siso_algorithm_combined<float>(int I, int S, int O,
749 f737dc44 Achilleas Anastasopoulos
             const std::vector<int> &NS,
750 f737dc44 Achilleas Anastasopoulos
             const std::vector<int> &OS,
751 f737dc44 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
752 f737dc44 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
753 f737dc44 Achilleas Anastasopoulos
             int K,
754 f737dc44 Achilleas Anastasopoulos
             int S0,int SK,
755 f737dc44 Achilleas Anastasopoulos
             bool POSTI, bool POSTO,
756 f737dc44 Achilleas Anastasopoulos
             float (*p2mymin)(float,float),
757 f737dc44 Achilleas Anastasopoulos
             int D,
758 f737dc44 Achilleas Anastasopoulos
             const std::vector<float> &TABLE,
759 f737dc44 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
760 f737dc44 Achilleas Anastasopoulos
             const float *priori, const float *observations, float *post
761 f737dc44 Achilleas Anastasopoulos
);
762 f737dc44 Achilleas Anastasopoulos
763 f737dc44 Achilleas Anastasopoulos
template
764 f737dc44 Achilleas Anastasopoulos
void siso_algorithm_combined<gr_complex>(int I, int S, int O,
765 f737dc44 Achilleas Anastasopoulos
             const std::vector<int> &NS,
766 f737dc44 Achilleas Anastasopoulos
             const std::vector<int> &OS,
767 f737dc44 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PS,
768 f737dc44 Achilleas Anastasopoulos
             const std::vector< std::vector<int> > &PI,
769 f737dc44 Achilleas Anastasopoulos
             int K,
770 f737dc44 Achilleas Anastasopoulos
             int S0,int SK,
771 f737dc44 Achilleas Anastasopoulos
             bool POSTI, bool POSTO,
772 f737dc44 Achilleas Anastasopoulos
             float (*p2mymin)(float,float),
773 f737dc44 Achilleas Anastasopoulos
             int D,
774 f737dc44 Achilleas Anastasopoulos
             const std::vector<gr_complex> &TABLE,
775 f737dc44 Achilleas Anastasopoulos
             trellis_metric_type_t TYPE,
776 f737dc44 Achilleas Anastasopoulos
             const float *priori, const gr_complex *observations, float *post
777 f737dc44 Achilleas Anastasopoulos
);
778 f737dc44 Achilleas Anastasopoulos
779 f737dc44 Achilleas Anastasopoulos
//=========================================================
780 f737dc44 Achilleas Anastasopoulos
781 f737dc44 Achilleas Anastasopoulos
template<class Ti, class To>
782 f737dc44 Achilleas Anastasopoulos
void sccc_decoder_combined(
783 f737dc44 Achilleas Anastasopoulos
      const fsm &FSMo, int STo0, int SToK,
784 f737dc44 Achilleas Anastasopoulos
      const fsm &FSMi, int STi0, int STiK,
785 f737dc44 Achilleas Anastasopoulos
      const interleaver &INTERLEAVER, int blocklength, int repetitions,
786 f737dc44 Achilleas Anastasopoulos
      float (*p2mymin)(float,float),
787 f737dc44 Achilleas Anastasopoulos
      int D, const std::vector<Ti> &TABLE,
788 f737dc44 Achilleas Anastasopoulos
      trellis_metric_type_t METRIC_TYPE,
789 f737dc44 Achilleas Anastasopoulos
      const Ti *observations, To *data
790 f737dc44 Achilleas Anastasopoulos
)
791 f737dc44 Achilleas Anastasopoulos
{
792 f737dc44 Achilleas Anastasopoulos
793 f737dc44 Achilleas Anastasopoulos
// to be implemented 
794 f737dc44 Achilleas Anastasopoulos
795 f737dc44 Achilleas Anastasopoulos
}
796 f737dc44 Achilleas Anastasopoulos
797 f737dc44 Achilleas Anastasopoulos
//-------
798 f737dc44 Achilleas Anastasopoulos
799 f737dc44 Achilleas Anastasopoulos
template
800 f737dc44 Achilleas Anastasopoulos
void sccc_decoder_combined<short,short>(
801 f737dc44 Achilleas Anastasopoulos
      const fsm &FSMo, int STo0, int SToK,
802 f737dc44 Achilleas Anastasopoulos
      const fsm &FSMi, int STi0, int STiK,
803 f737dc44 Achilleas Anastasopoulos
      const interleaver &INTERLEAVER, int blocklength, int repetitions,
804 f737dc44 Achilleas Anastasopoulos
      float (*p2mymin)(float,float),
805 f737dc44 Achilleas Anastasopoulos
      int D, const std::vector<short> &TABLE,
806 f737dc44 Achilleas Anastasopoulos
      trellis_metric_type_t METRIC_TYPE,
807 f737dc44 Achilleas Anastasopoulos
      const short *observations, short *data
808 f737dc44 Achilleas Anastasopoulos
);
809 f737dc44 Achilleas Anastasopoulos
810 f737dc44 Achilleas Anastasopoulos
template
811 f737dc44 Achilleas Anastasopoulos
void sccc_decoder_combined<int,int>(
812 f737dc44 Achilleas Anastasopoulos
      const fsm &FSMo, int STo0, int SToK,
813 f737dc44 Achilleas Anastasopoulos
      const fsm &FSMi, int STi0, int STiK,
814 f737dc44 Achilleas Anastasopoulos
      const interleaver &INTERLEAVER, int blocklength, int repetitions,
815 f737dc44 Achilleas Anastasopoulos
      float (*p2mymin)(float,float),
816 f737dc44 Achilleas Anastasopoulos
      int D, const std::vector<int> &TABLE,
817 f737dc44 Achilleas Anastasopoulos
      trellis_metric_type_t METRIC_TYPE,
818 f737dc44 Achilleas Anastasopoulos
      const int *observations, int *data
819 f737dc44 Achilleas Anastasopoulos
);
820 f737dc44 Achilleas Anastasopoulos
821 f737dc44 Achilleas Anastasopoulos