added a radix-n fsm constructor
authoranastas <anastas@221aa14e-8319-0410-a670-987f0aec2ac5>
Tue, 24 Mar 2009 13:11:18 +0000 (13:11 +0000)
committeranastas <anastas@221aa14e-8319-0410-a670-987f0aec2ac5>
Tue, 24 Mar 2009 13:11:18 +0000 (13:11 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10673 221aa14e-8319-0410-a670-987f0aec2ac5

gr-trellis/src/examples/fsm_utils.py
gr-trellis/src/lib/fsm.cc
gr-trellis/src/lib/fsm.h
gr-trellis/src/lib/fsm.i

index ab7b4e9468f20daeb71a4fc0d50d47411db35dec..e3426637cd1eca1de9847f761ba7dab416ab28be 100755 (executable)
@@ -61,33 +61,6 @@ def base2dec(s,base):
 
 
 
-######################################################################
-# Generate a new FSM representing n stages through the original FSM
-######################################################################
-def fsm_radix(f,n):
-    I=f.I()**n
-    S=f.S()
-    O=f.O()**n
-    nsm=list([0]*I*S)
-    osm=list([0]*I*S)
-    for s in range(f.S()):
-        for i in range(I):
-            ii=dec2base(i,f.I(),n) 
-            oo=list([0]*n)
-            ns=s
-            for k in range(n):
-                oo[k]=f.OS()[ns*f.I()+ii[k]]
-                ns=f.NS()[ns*f.I()+ii[k]]
-
-            nsm[s*I+i]=ns
-            osm[s*I+i]=base2dec(oo,f.O())
-
-
-    f=trellis.fsm(I,S,O,nsm,osm)
-    return f
-
-
-
 
 ######################################################################
 # Automatically generate the lookup table that maps the FSM outputs
index 550674ad5fd31bef23d5d0788a8ac6405857bfa8..c65b134562a8e17edd7671cf62a40129ec792ca6 100644 (file)
@@ -315,6 +315,48 @@ fsm::fsm(const fsm &FSM1, const fsm &FSM2)
 }
 
 
+
+
+//######################################################################
+//# Generate a new FSM representing n stages through the original FSM
+//# AKA radix-n FSM
+//######################################################################
+fsm::fsm(const fsm &FSM, int n)
+{
+  d_I=(int) (pow(1.0*FSM.I(),1.0*n)+0.5);
+  d_S=FSM.S();
+  d_O=(int) (pow(1.0*FSM.O(),1.0*n)+0.5);
+
+  d_NS.resize(d_I*d_S);
+  d_OS.resize(d_I*d_S);
+
+  for(int s=0;s<d_S;s++ ) {
+    for(int i=0;i<d_I;i++ ) {
+      std::vector<int> ii(n);
+      dec2base(i,FSM.I(),ii);
+      std::vector<int> oo(n);
+      int ns=s;
+      for(int k=0;k<n;k++) {
+        oo[k]=FSM.OS()[ns*FSM.I()+ii[k]];
+        ns=FSM.NS()[ns*FSM.I()+ii[k]];
+      }
+      d_NS[s*d_I+i]=ns;
+      d_OS[s*d_I+i]=base2dec(oo,FSM.O());
+    }
+  }
+
+  generate_PS_PI();
+  generate_TM();
+}
+
+
+
+
+
+
+
+
+
 //######################################################################
 //# generate the PS and PI tables for later use
 //######################################################################
index b91dc2ab1fc01ef8321deab1f1414d1a08623f91..0a90b2cd332587d3552a14f385ddea0d2387aab0 100644 (file)
@@ -52,6 +52,7 @@ public:
   fsm(int mod_size, int ch_length);
   fsm(int P, int M, int L);
   fsm(const fsm &FSM1, const fsm &FSM2);
+  fsm(const fsm &FSM, int n);
   int I () const { return d_I; }
   int S () const { return d_S; }
   int O () const { return d_O; }
index e9db804a0cf885df37e10cdb255baa9237ec3902..1e9c7ad8f52e4d8c86671eff88a748a095ab2db3 100644 (file)
@@ -42,6 +42,7 @@ public:
   fsm(int mod_size, int ch_length);
   fsm(int P, int M, int L);
   fsm(const fsm &FSM1, const fsm &FSM2);
+  fsm(const fsm &FSM, int n);
   int I () const { return d_I; }
   int S () const { return d_S; }
   int O () const { return d_O; }