[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r4371 - gnuradio/trunk/gr-trellis/src/lib
From: |
anastas |
Subject: |
[Commit-gnuradio] r4371 - gnuradio/trunk/gr-trellis/src/lib |
Date: |
Sun, 4 Feb 2007 16:09:12 -0700 (MST) |
Author: anastas
Date: 2007-02-04 16:09:12 -0700 (Sun, 04 Feb 2007)
New Revision: 4371
Modified:
gnuradio/trunk/gr-trellis/src/lib/fsm.cc
gnuradio/trunk/gr-trellis/src/lib/fsm.h
gnuradio/trunk/gr-trellis/src/lib/fsm.i
gnuradio/trunk/gr-trellis/src/lib/trellis_siso_combined_f.cc
gnuradio/trunk/gr-trellis/src/lib/trellis_siso_f.cc
gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_X.cc.t
gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_b.cc
gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t
gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_b.cc
gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_i.cc
gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_s.cc
gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_i.cc
gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_s.cc
Log:
added support for irregular FSMs
Modified: gnuradio/trunk/gr-trellis/src/lib/fsm.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/fsm.cc 2007-02-04 20:12:37 UTC (rev
4370)
+++ gnuradio/trunk/gr-trellis/src/lib/fsm.cc 2007-02-04 23:09:12 UTC (rev
4371)
@@ -47,7 +47,7 @@
d_O=FSM.O();
d_NS=FSM.NS();
d_OS=FSM.OS();
- d_PS=FSM.PS();
+ d_PS=FSM.PS(); // is this going to make a deep copy?
d_PI=FSM.PI();
d_TMi=FSM.TMi();
d_TMl=FSM.TMl();
@@ -241,17 +241,21 @@
//######################################################################
void fsm::generate_PS_PI()
{
- d_PS.resize(d_I*d_S);
- d_PI.resize(d_I*d_S);
+ d_PS.resize(d_S);
+ d_PI.resize(d_S);
for(int i=0;i<d_S;i++) {
+ d_PS[i].resize(d_I*d_S); // max possible size
+ d_PI[i].resize(d_I*d_S);
int j=0;
for(int ii=0;ii<d_S;ii++) for(int jj=0;jj<d_I;jj++) {
if(d_NS[ii*d_I+jj]!=i) continue;
- d_PS[i*d_I+j]=ii;
- d_PI[i*d_I+j]=jj;
+ d_PS[i][j]=ii;
+ d_PI[i][j]=jj;
j++;
}
+ d_PS[i].resize(j);
+ d_PI[i].resize(j);
}
}
@@ -278,9 +282,11 @@
done = find_es(s);
attempts ++;
}
- if (done == false)
+ if (done == false) {
//throw std::runtime_error ("fsm::generate_TM(): FSM appears to be
disconnected\n");
printf("fsm::generate_TM(): FSM appears to be disconnected\n");
+ printf("state %d cannot be reached from all other states\n",s);
+ }
}
}
Modified: gnuradio/trunk/gr-trellis/src/lib/fsm.h
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/fsm.h 2007-02-04 20:12:37 UTC (rev
4370)
+++ gnuradio/trunk/gr-trellis/src/lib/fsm.h 2007-02-04 23:09:12 UTC (rev
4371)
@@ -35,8 +35,8 @@
int d_O;
std::vector<int> d_NS;
std::vector<int> d_OS;
- std::vector<int> d_PS;
- std::vector<int> d_PI;
+ std::vector< std::vector<int> > d_PS;
+ std::vector< std::vector<int> > d_PI;
std::vector<int> d_TMi;
std::vector<int> d_TMl;
void generate_PS_PI ();
@@ -54,8 +54,8 @@
int O () const { return d_O; }
const std::vector<int> & NS () const { return d_NS; }
const std::vector<int> & OS () const { return d_OS; }
- const std::vector<int> & PS () const { return d_PS; }
- const std::vector<int> & PI () const { return d_PI; }
+ const std::vector< std::vector<int> > & PS () const { return d_PS; }
+ const std::vector< std::vector<int> > & PI () const { return d_PI; }
const std::vector<int> & TMi () const { return d_TMi; }
const std::vector<int> & TMl () const { return d_TMl; }
};
Modified: gnuradio/trunk/gr-trellis/src/lib/fsm.i
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/fsm.i 2007-02-04 20:12:37 UTC (rev
4370)
+++ gnuradio/trunk/gr-trellis/src/lib/fsm.i 2007-02-04 23:09:12 UTC (rev
4371)
@@ -27,8 +27,8 @@
int d_O;
std::vector<int> d_NS;
std::vector<int> d_OS;
- std::vector<int> d_PS;
- std::vector<int> d_PI;
+ std::vector< std::vector<int> > d_PS;
+ std::vector< std::vector<int> > d_PI;
std::vector<int> d_TMi;
std::vector<int> d_TMl;
void generate_PS_PI ();
@@ -45,8 +45,8 @@
int O () const { return d_O; }
const std::vector<int> & NS () const { return d_NS; }
const std::vector<int> & OS () const { return d_OS; }
- const std::vector<int> & PS () const { return d_PS; }
- const std::vector<int> & PI () const { return d_PI; }
+ const std::vector< std::vector<int> > & PS () const { return d_PS; }
+ const std::vector< std::vector<int> > & PI () const { return d_PI; }
const std::vector<int> & TMi () const { return d_TMi; }
const std::vector<int> & TMl () const { return d_TMl; }
};
Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_siso_combined_f.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_siso_combined_f.cc
2007-02-04 20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_siso_combined_f.cc
2007-02-04 23:09:12 UTC (rev 4371)
@@ -138,8 +138,8 @@
void siso_algorithm_combined(int I, int S, int O,
const std::vector<int> &NS,
const std::vector<int> &OS,
- const std::vector<int> &PS,
- const std::vector<int> &PI,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
int K,
int S0,int SK,
bool POSTI, bool POSTO,
@@ -171,9 +171,9 @@
norm=INF;
for(int j=0;j<S;j++) {
minm=INF;
- for(int i=0;i<I;i++) {
+ for(int i=0;i<PS[j].size();i++) {
int i0 = j*I+i;
-
mm=alpha[k*S+PS[i0]]+priori[k*I+PI[i0]]+prioro[k*O+OS[PS[i0]*I+PI[i0]]];
+
mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
minm=(*p2mymin)(minm,mm);
}
alpha[(k+1)*S+j]=minm;
Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_siso_f.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_siso_f.cc 2007-02-04 20:12:37 UTC
(rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_siso_f.cc 2007-02-04 23:09:12 UTC
(rev 4371)
@@ -129,8 +129,8 @@
void siso_algorithm(int I, int S, int O,
const std::vector<int> &NS,
const std::vector<int> &OS,
- const std::vector<int> &PS,
- const std::vector<int> &PI,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
int K,
int S0,int SK,
bool POSTI, bool POSTO,
@@ -157,9 +157,9 @@
norm=INF;
for(int j=0;j<S;j++) {
minm=INF;
- for(int i=0;i<I;i++) {
- int i0 = j*I+i;
-
mm=alpha[k*S+PS[i0]]+priori[k*I+PI[i0]]+prioro[k*O+OS[PS[i0]*I+PI[i0]]];
+ for(int i=0;i<PS[j].size();i++) {
+ //int i0 = j*I+i;
+
mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
minm=(*p2mymin)(minm,mm);
}
alpha[(k+1)*S+j]=minm;
Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_X.cc.t
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_X.cc.t 2007-02-04
20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_X.cc.t 2007-02-04
23:09:12 UTC (rev 4371)
@@ -77,8 +77,8 @@
void viterbi_algorithm(int I, int S, int O,
const std::vector<int> &NS,
const std::vector<int> &OS,
- const std::vector<int> &PS,
- const std::vector<int> &PI,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
int K,
int S0,int SK,
const float *in, @TYPE@ *out)//,
@@ -106,9 +106,9 @@
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
minmi=0;
- for(int i=0;i<I;i++) {
- int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[i0]]+in[k*O+OS[PS[i0]*I+PI[i0]]])<minm)
+ for(int i=0;i<PS[j].size();i++) {
+ //int i0 = j*I+i;
+
if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
minm=mm,minmi=i;
}
trace[k*S+j]=minmi;
@@ -132,9 +132,9 @@
}
for(int k=K-1;k>=0;k--) { // traceback
- int i0=st*I+trace[k*S+st];
- out[k]= (@TYPE@) PI[i0];
- st=PS[i0];
+ int i0=trace[k*S+st];
+ out[k]= (@TYPE@) PI[st][i0];
+ st=PS[st][i0];
}
}
Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_b.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_b.cc 2007-02-04
20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_b.cc 2007-02-04
23:09:12 UTC (rev 4371)
@@ -77,8 +77,8 @@
void viterbi_algorithm(int I, int S, int O,
const std::vector<int> &NS,
const std::vector<int> &OS,
- const std::vector<int> &PS,
- const std::vector<int> &PI,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
int K,
int S0,int SK,
const float *in, unsigned char *out)//,
@@ -106,9 +106,9 @@
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
minmi=0;
- for(int i=0;i<I;i++) {
- int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[i0]]+in[k*O+OS[PS[i0]*I+PI[i0]]])<minm)
+ for(int i=0;i<PS[j].size();i++) {
+ //int i0 = j*I+i;
+
if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
minm=mm,minmi=i;
}
trace[k*S+j]=minmi;
@@ -132,9 +132,9 @@
}
for(int k=K-1;k>=0;k--) { // traceback
- int i0=st*I+trace[k*S+st];
- out[k]= (unsigned char) PI[i0];
- st=PS[i0];
+ int i0=trace[k*S+st];
+ out[k]= (unsigned char) PI[st][i0];
+ st=PS[st][i0];
}
}
Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t
2007-02-04 20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t
2007-02-04 23:09:12 UTC (rev 4371)
@@ -86,8 +86,8 @@
void viterbi_algorithm_combined(int I, int S, int O,
const std::vector<int> &NS,
const std::vector<int> &OS,
- const std::vector<int> &PS,
- const std::vector<int> &PI,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
int K,
int S0,int SK,
int D,
@@ -119,9 +119,9 @@
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
minmi=0;
- for(int i=0;i<I;i++) {
+ for(int i=0;i<PS[j].size();i++) {
int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[i0]]+metric[OS[PS[i0]*I+PI[i0]]])<minm)
+
if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
minm=mm,minmi=i;
}
trace[k*S+j]=minmi;
@@ -145,9 +145,9 @@
}
for(int k=K-1;k>=0;k--) { // traceback
- int i0=st*I+trace[k*S+st];
- out[k]= (@TYPE@) PI[i0];
- st=PS[i0];
+ int i0=trace[k*S+st];
+ out[k]= (@TYPE@) PI[st][i0];
+ st=PS[st][i0];
}
delete [] metric;
Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_b.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_b.cc
2007-02-04 20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_b.cc
2007-02-04 23:09:12 UTC (rev 4371)
@@ -86,8 +86,8 @@
void viterbi_algorithm_combined(int I, int S, int O,
const std::vector<int> &NS,
const std::vector<int> &OS,
- const std::vector<int> &PS,
- const std::vector<int> &PI,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
int K,
int S0,int SK,
int D,
@@ -119,9 +119,9 @@
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
minmi=0;
- for(int i=0;i<I;i++) {
+ for(int i=0;i<PS[j].size();i++) {
int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[i0]]+metric[OS[PS[i0]*I+PI[i0]]])<minm)
+
if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
minm=mm,minmi=i;
}
trace[k*S+j]=minmi;
@@ -145,9 +145,9 @@
}
for(int k=K-1;k>=0;k--) { // traceback
- int i0=st*I+trace[k*S+st];
- out[k]= (unsigned char) PI[i0];
- st=PS[i0];
+ int i0=trace[k*S+st];
+ out[k]= (unsigned char) PI[st][i0];
+ st=PS[st][i0];
}
delete [] metric;
Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_i.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_i.cc
2007-02-04 20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_i.cc
2007-02-04 23:09:12 UTC (rev 4371)
@@ -86,8 +86,8 @@
void viterbi_algorithm_combined(int I, int S, int O,
const std::vector<int> &NS,
const std::vector<int> &OS,
- const std::vector<int> &PS,
- const std::vector<int> &PI,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
int K,
int S0,int SK,
int D,
@@ -119,9 +119,9 @@
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
minmi=0;
- for(int i=0;i<I;i++) {
+ for(int i=0;i<PS[j].size();i++) {
int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[i0]]+metric[OS[PS[i0]*I+PI[i0]]])<minm)
+
if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
minm=mm,minmi=i;
}
trace[k*S+j]=minmi;
@@ -145,9 +145,9 @@
}
for(int k=K-1;k>=0;k--) { // traceback
- int i0=st*I+trace[k*S+st];
- out[k]= (int) PI[i0];
- st=PS[i0];
+ int i0=trace[k*S+st];
+ out[k]= (int) PI[st][i0];
+ st=PS[st][i0];
}
delete [] metric;
Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_s.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_s.cc
2007-02-04 20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_combined_s.cc
2007-02-04 23:09:12 UTC (rev 4371)
@@ -86,8 +86,8 @@
void viterbi_algorithm_combined(int I, int S, int O,
const std::vector<int> &NS,
const std::vector<int> &OS,
- const std::vector<int> &PS,
- const std::vector<int> &PI,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
int K,
int S0,int SK,
int D,
@@ -119,9 +119,9 @@
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
minmi=0;
- for(int i=0;i<I;i++) {
+ for(int i=0;i<PS[j].size();i++) {
int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[i0]]+metric[OS[PS[i0]*I+PI[i0]]])<minm)
+
if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
minm=mm,minmi=i;
}
trace[k*S+j]=minmi;
@@ -145,9 +145,9 @@
}
for(int k=K-1;k>=0;k--) { // traceback
- int i0=st*I+trace[k*S+st];
- out[k]= (short) PI[i0];
- st=PS[i0];
+ int i0=trace[k*S+st];
+ out[k]= (short) PI[st][i0];
+ st=PS[st][i0];
}
delete [] metric;
Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_i.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_i.cc 2007-02-04
20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_i.cc 2007-02-04
23:09:12 UTC (rev 4371)
@@ -77,8 +77,8 @@
void viterbi_algorithm(int I, int S, int O,
const std::vector<int> &NS,
const std::vector<int> &OS,
- const std::vector<int> &PS,
- const std::vector<int> &PI,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
int K,
int S0,int SK,
const float *in, int *out)//,
@@ -106,9 +106,9 @@
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
minmi=0;
- for(int i=0;i<I;i++) {
- int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[i0]]+in[k*O+OS[PS[i0]*I+PI[i0]]])<minm)
+ for(int i=0;i<PS[j].size();i++) {
+ //int i0 = j*I+i;
+
if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
minm=mm,minmi=i;
}
trace[k*S+j]=minmi;
@@ -132,9 +132,9 @@
}
for(int k=K-1;k>=0;k--) { // traceback
- int i0=st*I+trace[k*S+st];
- out[k]= (int) PI[i0];
- st=PS[i0];
+ int i0=trace[k*S+st];
+ out[k]= (int) PI[st][i0];
+ st=PS[st][i0];
}
}
Modified: gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_s.cc
===================================================================
--- gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_s.cc 2007-02-04
20:12:37 UTC (rev 4370)
+++ gnuradio/trunk/gr-trellis/src/lib/trellis_viterbi_s.cc 2007-02-04
23:09:12 UTC (rev 4371)
@@ -77,8 +77,8 @@
void viterbi_algorithm(int I, int S, int O,
const std::vector<int> &NS,
const std::vector<int> &OS,
- const std::vector<int> &PS,
- const std::vector<int> &PI,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
int K,
int S0,int SK,
const float *in, short *out)//,
@@ -106,9 +106,9 @@
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
minmi=0;
- for(int i=0;i<I;i++) {
- int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[i0]]+in[k*O+OS[PS[i0]*I+PI[i0]]])<minm)
+ for(int i=0;i<PS[j].size();i++) {
+ //int i0 = j*I+i;
+
if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
minm=mm,minmi=i;
}
trace[k*S+j]=minmi;
@@ -132,9 +132,9 @@
}
for(int k=K-1;k>=0;k--) { // traceback
- int i0=st*I+trace[k*S+st];
- out[k]= (short) PI[i0];
- st=PS[i0];
+ int i0=trace[k*S+st];
+ out[k]= (short) PI[st][i0];
+ st=PS[st][i0];
}
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r4371 - gnuradio/trunk/gr-trellis/src/lib,
anastas <=