From 2ed9e3bc58dacd41dff201d8365f7bd04fc56462 Mon Sep 17 00:00:00 2001
From: Achilleas Anastasopoulos <anastas@umich.edu>
Date: Thu, 17 Feb 2011 23:16:01 -0500
Subject: inital commit of turbo stuff: added sccc encoder block + minor fixes

---
 gr-trellis/src/examples/test_sccc_hard.py | 1 -
 1 file changed, 1 deletion(-)

(limited to 'gr-trellis/src/examples')

diff --git a/gr-trellis/src/examples/test_sccc_hard.py b/gr-trellis/src/examples/test_sccc_hard.py
index a7933a18e1..1a81bc59b7 100755
--- a/gr-trellis/src/examples/test_sccc_hard.py
+++ b/gr-trellis/src/examples/test_sccc_hard.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
-- 
cgit v1.2.3


From 4475307c9465514457dc16ad515508de560215eb Mon Sep 17 00:00:00 2001
From: Achilleas Anastasopoulos <anastas@umich.edu>
Date: Fri, 18 Feb 2011 20:43:55 -0500
Subject: removed "audio" dependencies from test files in gr-trellis

---
 gr-trellis/src/examples/test_sccc_soft.py             | 1 -
 gr-trellis/src/examples/test_sccc_turbo.py            | 1 -
 gr-trellis/src/examples/test_tcm.py                   | 1 -
 gr-trellis/src/examples/test_tcm1.py                  | 1 -
 gr-trellis/src/examples/test_tcm2.py                  | 1 -
 gr-trellis/src/examples/test_tcm_combined.py          | 1 -
 gr-trellis/src/examples/test_tcm_parallel.py          | 1 -
 gr-trellis/src/examples/test_turbo_equalization.py    | 1 -
 gr-trellis/src/examples/test_turbo_equalization1.py   | 1 -
 gr-trellis/src/examples/test_turbo_equalization2.py   | 1 -
 gr-trellis/src/examples/test_viterbi_equalization.py  | 1 -
 gr-trellis/src/examples/test_viterbi_equalization1.py | 1 -
 12 files changed, 12 deletions(-)

(limited to 'gr-trellis/src/examples')

diff --git a/gr-trellis/src/examples/test_sccc_soft.py b/gr-trellis/src/examples/test_sccc_soft.py
index d96d36e3fb..ea296e1e9f 100755
--- a/gr-trellis/src/examples/test_sccc_soft.py
+++ b/gr-trellis/src/examples/test_sccc_soft.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_sccc_turbo.py b/gr-trellis/src/examples/test_sccc_turbo.py
index f3a856de7f..bb20e937cf 100755
--- a/gr-trellis/src/examples/test_sccc_turbo.py
+++ b/gr-trellis/src/examples/test_sccc_turbo.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_tcm.py b/gr-trellis/src/examples/test_tcm.py
index 62e0c413ad..bd7fa0b3e5 100755
--- a/gr-trellis/src/examples/test_tcm.py
+++ b/gr-trellis/src/examples/test_tcm.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_tcm1.py b/gr-trellis/src/examples/test_tcm1.py
index 746bd93364..3c936155da 100755
--- a/gr-trellis/src/examples/test_tcm1.py
+++ b/gr-trellis/src/examples/test_tcm1.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_tcm2.py b/gr-trellis/src/examples/test_tcm2.py
index e527fc5ed7..7f61370179 100755
--- a/gr-trellis/src/examples/test_tcm2.py
+++ b/gr-trellis/src/examples/test_tcm2.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_tcm_combined.py b/gr-trellis/src/examples/test_tcm_combined.py
index d2d42b40b7..1e3eef0c7f 100755
--- a/gr-trellis/src/examples/test_tcm_combined.py
+++ b/gr-trellis/src/examples/test_tcm_combined.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_tcm_parallel.py b/gr-trellis/src/examples/test_tcm_parallel.py
index 8e2f5a230b..f1ed6f1b36 100755
--- a/gr-trellis/src/examples/test_tcm_parallel.py
+++ b/gr-trellis/src/examples/test_tcm_parallel.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_turbo_equalization.py b/gr-trellis/src/examples/test_turbo_equalization.py
index 612f6951c6..0bf6912223 100755
--- a/gr-trellis/src/examples/test_turbo_equalization.py
+++ b/gr-trellis/src/examples/test_turbo_equalization.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_turbo_equalization1.py b/gr-trellis/src/examples/test_turbo_equalization1.py
index 8d2feec8ad..feae4ce894 100755
--- a/gr-trellis/src/examples/test_turbo_equalization1.py
+++ b/gr-trellis/src/examples/test_turbo_equalization1.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_turbo_equalization2.py b/gr-trellis/src/examples/test_turbo_equalization2.py
index f1731016e0..ff14299c61 100755
--- a/gr-trellis/src/examples/test_turbo_equalization2.py
+++ b/gr-trellis/src/examples/test_turbo_equalization2.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_viterbi_equalization.py b/gr-trellis/src/examples/test_viterbi_equalization.py
index 86fc006742..eda692024c 100755
--- a/gr-trellis/src/examples/test_viterbi_equalization.py
+++ b/gr-trellis/src/examples/test_viterbi_equalization.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
diff --git a/gr-trellis/src/examples/test_viterbi_equalization1.py b/gr-trellis/src/examples/test_viterbi_equalization1.py
index d26f73bc0f..3a65b9363c 100755
--- a/gr-trellis/src/examples/test_viterbi_equalization1.py
+++ b/gr-trellis/src/examples/test_viterbi_equalization1.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 from gnuradio import gr
-from gnuradio import audio
 from gnuradio import trellis
 from gnuradio import eng_notation
 import math
-- 
cgit v1.2.3


From 00c5b9c5923b774b0a0a7ddd89737f4a64fd1903 Mon Sep 17 00:00:00 2001
From: Achilleas Anastasopoulos <anastas@umich.edu>
Date: Sat, 19 Feb 2011 11:42:42 -0500
Subject: added sccc turbo decoder block + example test_sccc_turbo1.py

---
 gr-trellis/src/examples/test_sccc_turbo.py         |   8 +-
 gr-trellis/src/examples/test_sccc_turbo1.py        |  99 ++++++++++++++
 gr-trellis/src/lib/.gitignore                      |  24 +++-
 gr-trellis/src/lib/core_algorithms.cc              | 150 +++++++++++++++++++--
 gr-trellis/src/lib/generate_trellis.py             |   2 +-
 .../src/lib/trellis_sccc_decoder_combined_XX.cc.t  |   5 +-
 6 files changed, 265 insertions(+), 23 deletions(-)
 create mode 100755 gr-trellis/src/examples/test_sccc_turbo1.py

(limited to 'gr-trellis/src/examples')

diff --git a/gr-trellis/src/examples/test_sccc_turbo.py b/gr-trellis/src/examples/test_sccc_turbo.py
index bb20e937cf..703ee410b3 100755
--- a/gr-trellis/src/examples/test_sccc_turbo.py
+++ b/gr-trellis/src/examples/test_sccc_turbo.py
@@ -91,13 +91,14 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,
 
 def main(args):
     nargs = len (args)
-    if nargs == 4:
+    if nargs == 5:
         fname_out=args[0]
         fname_in=args[1]
         esn0_db=float(args[2]) # Es/No in dB
-        rep=int(args[3]) # number of times the experiment is run to collect enough errors
+        IT=int(args[3])
+        rep=int(args[4]) # number of times the experiment is run to collect enough errors
     else:
-        sys.stderr.write ('usage: test_tcm.py fsm_name_out fsm_fname_in Es/No_db  repetitions\n')
+        sys.stderr.write ('usage: test_sccc_turbo.py fsm_name_out fsm_fname_in Es/No_db iterations repetitions\n')
         sys.exit (1)
 
     # system parameters
@@ -122,7 +123,6 @@ def main(args):
         Es = Es + constellation[i]**2
     Es = Es / (len(constellation)/dimensionality)
     N0=Es/pow(10.0,esn0_db/10.0); # calculate noise variance
-    IT = 3 # number of turbo iterations
     
     tot_s=0 # total number of transmitted shorts
     terr_s=0 # total number of shorts in error
diff --git a/gr-trellis/src/examples/test_sccc_turbo1.py b/gr-trellis/src/examples/test_sccc_turbo1.py
new file mode 100755
index 0000000000..59b2c2bfe0
--- /dev/null
+++ b/gr-trellis/src/examples/test_sccc_turbo1.py
@@ -0,0 +1,99 @@
+#!/usr/bin/env python
+
+from gnuradio import gr
+from gnuradio import trellis
+from gnuradio import eng_notation
+import math
+import sys
+import random
+import fsm_utils
+
+
+def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,seed):
+    tb = gr.top_block ()
+
+    # TX
+    src = gr.lfsr_32k_source_s()
+    src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
+    s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the outer FSM input cardinality
+    enc = trellis.sccc_encoder_ss(fo,0,fi,0,interleaver,K)
+    mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+
+    # CHANNEL
+    add = gr.add_ff()
+    noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+
+    # RX
+    dec = trellis.sccc_decoder_combined_fs(fo,0,-1,fi,0,-1,interleaver,K,IT,trellis.TRELLIS_MIN_SUM,dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN)
+    fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
+    dst = gr.check_lfsr_32k_s()
+    
+    #tb.connect (src,src_head,s2fsmi,enc_out,inter,enc_in,mod)
+    tb.connect (src,src_head,s2fsmi,enc,mod)
+    tb.connect (mod,(add,0))
+    tb.connect (noise,(add,1))
+    #tb.connect (add,head)
+    #tb.connect (tail,fsmi2s,dst)
+    tb.connect (add,dec,fsmi2s,dst)
+
+    tb.run()
+ 
+    #print enc_out.ST(), enc_in.ST()
+    
+    ntotal = dst.ntotal ()
+    nright = dst.nright ()
+    runlength = dst.runlength ()
+    return (ntotal,ntotal-nright)
+
+
+def main(args):
+    nargs = len (args)
+    if nargs == 5:
+        fname_out=args[0]
+        fname_in=args[1]
+        esn0_db=float(args[2]) # Es/No in dB
+        IT=int(args[3])
+        rep=int(args[4]) # number of times the experiment is run to collect enough errors
+    else:
+        sys.stderr.write ('usage: test_tcm.py fsm_name_out fsm_fname_in Es/No_db iterations repetitions\n')
+        sys.exit (1)
+
+    # system parameters
+    Kb=1024*16  # packet size in bits (make it multiple of 16 so it can be packed in a short)
+    fo=trellis.fsm(fname_out) # get the outer FSM specification from a file
+    fi=trellis.fsm(fname_in) # get the innner FSM specification from a file
+    bitspersymbol = int(round(math.log(fo.I())/math.log(2))) # bits per FSM input symbol
+    if fo.O() != fi.I():
+        sys.stderr.write ('Incompatible cardinality between outer and inner FSM.\n')
+        sys.exit (1)
+    K=Kb/bitspersymbol # packet size in trellis steps
+    interleaver=trellis.interleaver(K,666) # construct a random interleaver
+    modulation = fsm_utils.psk8 # see fsm_utlis.py for available predefined modulations
+    dimensionality = modulation[0]
+    constellation = modulation[1] 
+    if len(constellation)/dimensionality != fi.O():
+        sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n')
+        sys.exit (1)
+    # calculate average symbol energy
+    Es = 0
+    for i in range(len(constellation)):
+        Es = Es + constellation[i]**2
+    Es = Es / (len(constellation)/dimensionality)
+    N0=Es/pow(10.0,esn0_db/10.0); # calculate noise variance
+    
+    tot_s=0 # total number of transmitted shorts
+    terr_s=0 # total number of shorts in error
+    terr_p=0 # total number of packets in error
+    for i in range(rep):
+        (s,e)=run_test(fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,-long(666+i)) # run experiment with different seed to get different noise realizations
+        tot_s=tot_s+s
+        terr_s=terr_s+e
+        terr_p=terr_p+(terr_s!=0)
+        if ((i+1)%10==0): # display progress
+            print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
+    # estimate of the (short or bit) error rate
+    print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
+
+
+if __name__ == '__main__':
+    main (sys.argv[1:])
diff --git a/gr-trellis/src/lib/.gitignore b/gr-trellis/src/lib/.gitignore
index 35b6584c62..1ded7cffe5 100644
--- a/gr-trellis/src/lib/.gitignore
+++ b/gr-trellis/src/lib/.gitignore
@@ -113,12 +113,24 @@
 /trellis_viterbi_combined_ss.i
 /trellis_viterbi_combined_ib.cc
 /trellis_viterbi_combined_sb.cc
-/trellis_sccc_decoder_combined_ii.h
-/trellis_sccc_decoder_combined_ii.i
-/trellis_sccc_decoder_combined_ii.cc
-/trellis_sccc_decoder_combined_ss.h
-/trellis_sccc_decoder_combined_ss.i
-/trellis_sccc_decoder_combined_ss.cc
+/trellis_sccc_decoder_combined_fb.h
+/trellis_sccc_decoder_combined_fb.i
+/trellis_sccc_decoder_combined_fb.cc
+/trellis_sccc_decoder_combined_fs.h
+/trellis_sccc_decoder_combined_fs.i
+/trellis_sccc_decoder_combined_fs.cc
+/trellis_sccc_decoder_combined_fi.h
+/trellis_sccc_decoder_combined_fi.i
+/trellis_sccc_decoder_combined_fi.cc
+/trellis_sccc_decoder_combined_cb.h
+/trellis_sccc_decoder_combined_cb.i
+/trellis_sccc_decoder_combined_cb.cc
+/trellis_sccc_decoder_combined_cs.h
+/trellis_sccc_decoder_combined_cs.i
+/trellis_sccc_decoder_combined_cs.cc
+/trellis_sccc_decoder_combined_ci.h
+/trellis_sccc_decoder_combined_ci.i
+/trellis_sccc_decoder_combined_ci.cc
 /trellis_generated.i
 /generate-stamp
 /stamp-*
diff --git a/gr-trellis/src/lib/core_algorithms.cc b/gr-trellis/src/lib/core_algorithms.cc
index 6c7187cff2..b81e149652 100644
--- a/gr-trellis/src/lib/core_algorithms.cc
+++ b/gr-trellis/src/lib/core_algorithms.cc
@@ -20,7 +20,7 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#include <float.h>
+#include <cstring>
 #include <stdexcept>
 #include "core_algorithms.h"
 #include "calc_metric.h"
@@ -790,33 +790,167 @@ void sccc_decoder_combined(
 )
 {
 
-// to be implemented 
+//allocate space for priori, prioro and posti of inner FSM
+std::vector<float> ipriori(blocklength*FSMi.I(),0.0);
+std::vector<float> iprioro(blocklength*FSMi.O());
+std::vector<float> iposti(blocklength*FSMi.I());
+
+//allocate space for priori, prioro and posto of outer FSM
+std::vector<float> opriori(blocklength*FSMo.I(),0.0);
+std::vector<float> oprioro(blocklength*FSMo.O());
+std::vector<float> oposti(blocklength*FSMo.I());
+std::vector<float> oposto(blocklength*FSMo.O());
+
+// turn observations to neg-log-priors
+for(int k=0;k<blocklength;k++)
+  calc_metric(FSMi.O(), D, TABLE, &(observations[k*D]), &(iprioro[k*FSMi.O()]),METRIC_TYPE);
+
+for(int rep=0;rep<repetitions;rep++) {
+  // run inner SISO
+  siso_algorithm(FSMi.I(),FSMi.S(),FSMi.O(),
+             FSMi.NS(), FSMi.OS(), FSMi.PS(), FSMi.PI(),
+             blocklength,
+             STi0,STiK,
+             true, false,
+             p2mymin,
+             &(ipriori[0]),  &(iprioro[0]), &(iposti[0])
+  );
+
+  //interleave soft info inner -> outer
+  for(int k=0;k<blocklength;k++) {
+    int ki = INTERLEAVER.DEINTER()[k];
+    //for(int i=0;i<FSMi.I();i++) {
+      //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
+    //}
+    memcpy(&(oprioro[k*FSMi.I()]),&(iposti[ki*FSMi.I()]),FSMi.I()*sizeof(float));
+  } 
+
+  // run outer SISO
+
+  if(rep<repetitions-1) { // do not produce posti
+    siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+             FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+             blocklength,
+             STo0,SToK,
+             false, true,
+             p2mymin,
+             &(opriori[0]),  &(oprioro[0]), &(oposto[0])
+    );
+
+    //interleave soft info outer --> inner
+    for(int k=0;k<blocklength;k++) {
+      int ki = INTERLEAVER.DEINTER()[k];
+      //for(int i=0;i<FSMi.I();i++) {
+        //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
+      //}
+      memcpy(&(ipriori[ki*FSMi.I()]),&(oposto[k*FSMi.I()]),FSMi.I()*sizeof(float));
+    } 
+  }
+  else // produce posti but not posto
+    
+    siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+             FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+             blocklength,
+             STo0,SToK,
+             true, false,
+             p2mymin,
+             &(opriori[0]),  &(oprioro[0]), &(oposti[0])
+    );
+   
+    /*
+    viterbi_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+             FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+             blocklength,
+             STo0,SToK,
+             &(oprioro[0]), data
+    );
+    */
+
+}
+
+
+// generate hard decisions
+for(int k=0;k<blocklength;k++) {
+  float min=INF;
+  int mini=0;
+  for(int i=0;i<FSMo.I();i++) {
+    if(oposti[k*FSMo.I()+i]<min) {
+      min=oposti[k*FSMo.I()+i];
+      mini=i;
+    }
+  }
+  data[k]=(To)mini;
+}
+
+
 
 }
 
 //-------
 
 template
-void sccc_decoder_combined<short,short>(
+void sccc_decoder_combined<float,unsigned char>(
+      const fsm &FSMo, int STo0, int SToK,
+      const fsm &FSMi, int STi0, int STiK,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<float> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      const float *observations, unsigned char *data
+);
+
+template
+void sccc_decoder_combined<float,short>(
+      const fsm &FSMo, int STo0, int SToK,
+      const fsm &FSMi, int STi0, int STiK,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<float> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      const float *observations, short *data
+);
+
+template
+void sccc_decoder_combined<float,int>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
       const interleaver &INTERLEAVER, int blocklength, int repetitions,
       float (*p2mymin)(float,float),
-      int D, const std::vector<short> &TABLE,
+      int D, const std::vector<float> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
-      const short *observations, short *data
+      const float *observations, int *data
 );
 
 template
-void sccc_decoder_combined<int,int>(
+void sccc_decoder_combined<gr_complex,unsigned char>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
       const interleaver &INTERLEAVER, int blocklength, int repetitions,
       float (*p2mymin)(float,float),
-      int D, const std::vector<int> &TABLE,
+      int D, const std::vector<gr_complex> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
-      const int *observations, int *data
+      const gr_complex *observations, unsigned char *data
 );
 
+template
+void sccc_decoder_combined<gr_complex,short>(
+      const fsm &FSMo, int STo0, int SToK,
+      const fsm &FSMi, int STi0, int STiK,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<gr_complex> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      const gr_complex *observations, short *data
+);
 
+template
+void sccc_decoder_combined<gr_complex,int>(
+      const fsm &FSMo, int STo0, int SToK,
+      const fsm &FSMi, int STi0, int STiK,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<gr_complex> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      const gr_complex *observations, int *data
+);
 
diff --git a/gr-trellis/src/lib/generate_trellis.py b/gr-trellis/src/lib/generate_trellis.py
index 82cacba709..691276cc85 100644
--- a/gr-trellis/src/lib/generate_trellis.py
+++ b/gr-trellis/src/lib/generate_trellis.py
@@ -41,7 +41,7 @@ other_signatures = (
     ['s','i','f','c'],
     ['b','s','i'],
     ['sb','ss','si','ib','is','ii','fb','fs','fi','cb','cs','ci'],
-    ['ss','ii'],
+    ['fb','fs','fi','cb','cs','ci'],
     )
 
 
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t
index f354197dd1..ce8df037ac 100644
--- a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t
+++ b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t
@@ -94,10 +94,7 @@ void
 {
   assert (noutput_items % d_blocklength == 0);
   int input_required =  d_D * noutput_items ;
-  unsigned ninputs = ninput_items_required.size();
-  for (unsigned int i = 0; i < ninputs; i++) {
-    ninput_items_required[i] = input_required;
-  }
+  ninput_items_required[0] = input_required;
 }
 
 
-- 
cgit v1.2.3


From 9bc24753ce556492bb222ca4b91e15fb1fcf0f32 Mon Sep 17 00:00:00 2001
From: Achilleas Anastasopoulos <anastas@umich.edu>
Date: Sun, 20 Feb 2011 09:22:32 -0500
Subject: added a scaling parameter in trellis_sccc_decoder, needed for
 sum-product metric calculation

---
 gr-trellis/src/examples/test_sccc_turbo1.py            |  2 +-
 gr-trellis/src/lib/core_algorithms.cc                  | 11 ++++++++++-
 gr-trellis/src/lib/core_algorithms.h                   |  1 +
 .../src/lib/trellis_sccc_decoder_combined_XX.cc.t      | 18 ++++++++++++++----
 .../src/lib/trellis_sccc_decoder_combined_XX.h.t       | 12 +++++++++---
 .../src/lib/trellis_sccc_decoder_combined_XX.i.t       |  8 ++++++--
 6 files changed, 41 insertions(+), 11 deletions(-)

(limited to 'gr-trellis/src/examples')

diff --git a/gr-trellis/src/examples/test_sccc_turbo1.py b/gr-trellis/src/examples/test_sccc_turbo1.py
index 59b2c2bfe0..8a630c0d4c 100755
--- a/gr-trellis/src/examples/test_sccc_turbo1.py
+++ b/gr-trellis/src/examples/test_sccc_turbo1.py
@@ -24,7 +24,7 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,
     noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
 
     # RX
-    dec = trellis.sccc_decoder_combined_fs(fo,0,-1,fi,0,-1,interleaver,K,IT,trellis.TRELLIS_MIN_SUM,dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN)
+    dec = trellis.sccc_decoder_combined_fs(fo,0,-1,fi,0,-1,interleaver,K,IT,trellis.TRELLIS_MIN_SUM,dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN,1.0)
     fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
     dst = gr.check_lfsr_32k_s()
     
diff --git a/gr-trellis/src/lib/core_algorithms.cc b/gr-trellis/src/lib/core_algorithms.cc
index b81e149652..c1bafa379d 100644
--- a/gr-trellis/src/lib/core_algorithms.cc
+++ b/gr-trellis/src/lib/core_algorithms.cc
@@ -786,6 +786,7 @@ void sccc_decoder_combined(
       float (*p2mymin)(float,float),
       int D, const std::vector<Ti> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
+      float scaling,
       const Ti *observations, To *data
 )
 {
@@ -802,8 +803,10 @@ std::vector<float> oposti(blocklength*FSMo.I());
 std::vector<float> oposto(blocklength*FSMo.O());
 
 // turn observations to neg-log-priors
-for(int k=0;k<blocklength;k++)
+for(int k=0;k<blocklength;k++) {
   calc_metric(FSMi.O(), D, TABLE, &(observations[k*D]), &(iprioro[k*FSMi.O()]),METRIC_TYPE);
+  iprioro[k*FSMi.O()] *= scaling;
+}
 
 for(int rep=0;rep<repetitions;rep++) {
   // run inner SISO
@@ -896,6 +899,7 @@ void sccc_decoder_combined<float,unsigned char>(
       float (*p2mymin)(float,float),
       int D, const std::vector<float> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
+      float scaling,
       const float *observations, unsigned char *data
 );
 
@@ -907,6 +911,7 @@ void sccc_decoder_combined<float,short>(
       float (*p2mymin)(float,float),
       int D, const std::vector<float> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
+      float scaling,
       const float *observations, short *data
 );
 
@@ -918,6 +923,7 @@ void sccc_decoder_combined<float,int>(
       float (*p2mymin)(float,float),
       int D, const std::vector<float> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
+      float scaling,
       const float *observations, int *data
 );
 
@@ -929,6 +935,7 @@ void sccc_decoder_combined<gr_complex,unsigned char>(
       float (*p2mymin)(float,float),
       int D, const std::vector<gr_complex> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
+      float scaling,
       const gr_complex *observations, unsigned char *data
 );
 
@@ -940,6 +947,7 @@ void sccc_decoder_combined<gr_complex,short>(
       float (*p2mymin)(float,float),
       int D, const std::vector<gr_complex> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
+      float scaling,
       const gr_complex *observations, short *data
 );
 
@@ -951,6 +959,7 @@ void sccc_decoder_combined<gr_complex,int>(
       float (*p2mymin)(float,float),
       int D, const std::vector<gr_complex> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
+      float scaling,
       const gr_complex *observations, int *data
 );
 
diff --git a/gr-trellis/src/lib/core_algorithms.h b/gr-trellis/src/lib/core_algorithms.h
index ad1b480571..8e4ffe522f 100644
--- a/gr-trellis/src/lib/core_algorithms.h
+++ b/gr-trellis/src/lib/core_algorithms.h
@@ -99,6 +99,7 @@ void sccc_decoder_combined(
       float (*p2mymin)(float,float),
       int D, const std::vector<Ti> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
+      float scaling,
       const Ti *observations, To *data
 );
 
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t
index ce8df037ac..62532bd4e8 100644
--- a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t
+++ b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t
@@ -45,7 +45,8 @@ trellis_make_@BASE_NAME@ (
   trellis_siso_type_t SISO_TYPE,
   int D,
   const std::vector<@I_TYPE@> &TABLE,
-  trellis_metric_type_t METRIC_TYPE
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
 )
 {
   return gnuradio::get_initial_sptr (new @NAME@ (
@@ -56,7 +57,8 @@ trellis_make_@BASE_NAME@ (
     repetitions,
     SISO_TYPE,
     D,
-    TABLE,METRIC_TYPE
+    TABLE,METRIC_TYPE,
+    scaling
     ));
 }
 
@@ -69,7 +71,8 @@ trellis_make_@BASE_NAME@ (
   trellis_siso_type_t SISO_TYPE,
   int D,
   const std::vector<@I_TYPE@> &TABLE,
-  trellis_metric_type_t METRIC_TYPE
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
 )
   : gr_block ("@BASE_NAME@",
 			  gr_make_io_signature (1, 1, sizeof (@I_TYPE@)),
@@ -82,12 +85,18 @@ trellis_make_@BASE_NAME@ (
   d_SISO_TYPE (SISO_TYPE),
   d_D (D),
   d_TABLE (TABLE),
-  d_METRIC_TYPE (METRIC_TYPE)
+  d_METRIC_TYPE (METRIC_TYPE),
+  d_scaling (scaling)
 {
     set_relative_rate (1.0 / ((double) d_D));
     set_output_multiple (d_blocklength);
 }
 
+void @NAME@::set_scaling(float scaling)
+{
+  d_scaling = scaling;
+}
+
 
 void
 @NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
@@ -127,6 +136,7 @@ int
       p2min, 
       d_D,d_TABLE, 
       d_METRIC_TYPE, 
+      d_scaling,
       &(in[n*d_blocklength*d_D]),&(out[n*d_blocklength])
     );
   }
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.h.t b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.h.t
index e878c4d6e9..146c265167 100644
--- a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.h.t
+++ b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.h.t
@@ -44,7 +44,8 @@ typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
   trellis_siso_type_t SISO_TYPE, // perform "min-sum" or "sum-product" combining 
   int D,
   const std::vector<@I_TYPE@> &TABLE,
-  trellis_metric_type_t METRIC_TYPE
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
 );
 
 
@@ -66,6 +67,7 @@ class @NAME@ : public gr_block
   int d_D;
   std::vector<@I_TYPE@> d_TABLE;
   trellis_metric_type_t d_METRIC_TYPE;
+  float d_scaling;
   std::vector<float> d_buffer;
 
   friend @SPTR_NAME@ trellis_make_@BASE_NAME@ (
@@ -77,7 +79,8 @@ class @NAME@ : public gr_block
     trellis_siso_type_t SISO_TYPE,
     int D,
     const std::vector<@I_TYPE@> &TABLE,
-    trellis_metric_type_t METRIC_TYPE
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
   );
 
   @NAME@ (
@@ -89,7 +92,8 @@ class @NAME@ : public gr_block
     trellis_siso_type_t SISO_TYPE, 
     int D,
     const std::vector<@I_TYPE@> &TABLE,
-    trellis_metric_type_t METRIC_TYPE
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
   );
 
 public:
@@ -106,6 +110,8 @@ public:
   std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
   trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
   trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling () const { return d_scaling; }
+  void set_scaling (float scaling);
 
   void forecast (int noutput_items,
                  gr_vector_int &ninput_items_required);
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.i.t b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.i.t
index 80c906401b..84f2eb07d9 100644
--- a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.i.t
+++ b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.i.t
@@ -33,7 +33,8 @@ GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
   trellis_siso_type_t SISO_TYPE,
   int D,
   const std::vector<@I_TYPE@> &TABLE,
-  trellis_metric_type_t METRIC_TYPE
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
 );
 
 
@@ -49,7 +50,8 @@ private:
     trellis_siso_type_t SISO_TYPE,
     int D,
     const std::vector<@I_TYPE@> &TABLE,
-    trellis_metric_type_t METRIC_TYPE
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
   );
 
 public:
@@ -66,4 +68,6 @@ public:
   std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
   trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
   trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling() const { return d_scaling; }
+  void set_scaling (float scaling);
 };
-- 
cgit v1.2.3


From 6454b7f23db35e87d7ab9a6d7a266e846277191e Mon Sep 17 00:00:00 2001
From: Achilleas Anastasopoulos <anastas@umich.edu>
Date: Sun, 20 Feb 2011 10:13:46 -0500
Subject: added sccc_decoder block (without the metrics part)

---
 gr-trellis/src/examples/test_sccc_turbo2.py    | 101 +++++++++++++++++++
 gr-trellis/src/lib/.gitignore                  |   9 ++
 gr-trellis/src/lib/Makefile.am                 |   3 +
 gr-trellis/src/lib/core_algorithms.cc          | 134 +++++++++++++++++++++++++
 gr-trellis/src/lib/core_algorithms.h           |   9 ++
 gr-trellis/src/lib/generate_trellis.py         |   2 +
 gr-trellis/src/lib/trellis_sccc_decoder_X.cc.t | 123 +++++++++++++++++++++++
 gr-trellis/src/lib/trellis_sccc_decoder_X.h.t  | 102 +++++++++++++++++++
 gr-trellis/src/lib/trellis_sccc_decoder_X.i.t  |  60 +++++++++++
 9 files changed, 543 insertions(+)
 create mode 100755 gr-trellis/src/examples/test_sccc_turbo2.py
 create mode 100644 gr-trellis/src/lib/trellis_sccc_decoder_X.cc.t
 create mode 100644 gr-trellis/src/lib/trellis_sccc_decoder_X.h.t
 create mode 100644 gr-trellis/src/lib/trellis_sccc_decoder_X.i.t

(limited to 'gr-trellis/src/examples')

diff --git a/gr-trellis/src/examples/test_sccc_turbo2.py b/gr-trellis/src/examples/test_sccc_turbo2.py
new file mode 100755
index 0000000000..a47f6400e6
--- /dev/null
+++ b/gr-trellis/src/examples/test_sccc_turbo2.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+
+from gnuradio import gr
+from gnuradio import trellis
+from gnuradio import eng_notation
+import math
+import sys
+import random
+import fsm_utils
+
+
+def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,seed):
+    tb = gr.top_block ()
+
+    # TX
+    src = gr.lfsr_32k_source_s()
+    src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
+    s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the outer FSM input cardinality
+    enc = trellis.sccc_encoder_ss(fo,0,fi,0,interleaver,K)
+    mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+
+    # CHANNEL
+    add = gr.add_ff()
+    noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+
+    # RX
+    metrics_in = trellis.metrics_f(fi.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner SISO
+    scale = gr.multiply_const_ff(1.0/N0)
+    dec = trellis.sccc_decoder_s(fo,0,-1,fi,0,-1,interleaver,K,IT,trellis.TRELLIS_MIN_SUM)
+    fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
+    dst = gr.check_lfsr_32k_s()
+    
+    #tb.connect (src,src_head,s2fsmi,enc_out,inter,enc_in,mod)
+    tb.connect (src,src_head,s2fsmi,enc,mod)
+    tb.connect (mod,(add,0))
+    tb.connect (noise,(add,1))
+    #tb.connect (add,head)
+    #tb.connect (tail,fsmi2s,dst)
+    tb.connect (add,metrics_in,scale,dec,fsmi2s,dst)
+
+    tb.run()
+ 
+    #print enc_out.ST(), enc_in.ST()
+    
+    ntotal = dst.ntotal ()
+    nright = dst.nright ()
+    runlength = dst.runlength ()
+    return (ntotal,ntotal-nright)
+
+
+def main(args):
+    nargs = len (args)
+    if nargs == 5:
+        fname_out=args[0]
+        fname_in=args[1]
+        esn0_db=float(args[2]) # Es/No in dB
+        IT=int(args[3])
+        rep=int(args[4]) # number of times the experiment is run to collect enough errors
+    else:
+        sys.stderr.write ('usage: test_tcm.py fsm_name_out fsm_fname_in Es/No_db iterations repetitions\n')
+        sys.exit (1)
+
+    # system parameters
+    Kb=1024*16  # packet size in bits (make it multiple of 16 so it can be packed in a short)
+    fo=trellis.fsm(fname_out) # get the outer FSM specification from a file
+    fi=trellis.fsm(fname_in) # get the innner FSM specification from a file
+    bitspersymbol = int(round(math.log(fo.I())/math.log(2))) # bits per FSM input symbol
+    if fo.O() != fi.I():
+        sys.stderr.write ('Incompatible cardinality between outer and inner FSM.\n')
+        sys.exit (1)
+    K=Kb/bitspersymbol # packet size in trellis steps
+    interleaver=trellis.interleaver(K,666) # construct a random interleaver
+    modulation = fsm_utils.psk8 # see fsm_utlis.py for available predefined modulations
+    dimensionality = modulation[0]
+    constellation = modulation[1] 
+    if len(constellation)/dimensionality != fi.O():
+        sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n')
+        sys.exit (1)
+    # calculate average symbol energy
+    Es = 0
+    for i in range(len(constellation)):
+        Es = Es + constellation[i]**2
+    Es = Es / (len(constellation)/dimensionality)
+    N0=Es/pow(10.0,esn0_db/10.0); # calculate noise variance
+    
+    tot_s=0 # total number of transmitted shorts
+    terr_s=0 # total number of shorts in error
+    terr_p=0 # total number of packets in error
+    for i in range(rep):
+        (s,e)=run_test(fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,-long(666+i)) # run experiment with different seed to get different noise realizations
+        tot_s=tot_s+s
+        terr_s=terr_s+e
+        terr_p=terr_p+(terr_s!=0)
+        if ((i+1)%10==0): # display progress
+            print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
+    # estimate of the (short or bit) error rate
+    print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
+
+
+if __name__ == '__main__':
+    main (sys.argv[1:])
diff --git a/gr-trellis/src/lib/.gitignore b/gr-trellis/src/lib/.gitignore
index 1ded7cffe5..2a544a56f1 100644
--- a/gr-trellis/src/lib/.gitignore
+++ b/gr-trellis/src/lib/.gitignore
@@ -131,6 +131,15 @@
 /trellis_sccc_decoder_combined_ci.h
 /trellis_sccc_decoder_combined_ci.i
 /trellis_sccc_decoder_combined_ci.cc
+/trellis_sccc_decoder_b.h
+/trellis_sccc_decoder_b.i
+/trellis_sccc_decoder_b.cc
+/trellis_sccc_decoder_s.h
+/trellis_sccc_decoder_s.i
+/trellis_sccc_decoder_s.cc
+/trellis_sccc_decoder_i.h
+/trellis_sccc_decoder_i.i
+/trellis_sccc_decoder_i.cc
 /trellis_generated.i
 /generate-stamp
 /stamp-*
diff --git a/gr-trellis/src/lib/Makefile.am b/gr-trellis/src/lib/Makefile.am
index 809efdcb3f..5b47c5a320 100644
--- a/gr-trellis/src/lib/Makefile.am
+++ b/gr-trellis/src/lib/Makefile.am
@@ -44,6 +44,9 @@ core_generator = 				\
 	trellis_sccc_decoder_combined_XX.cc.t	\
 	trellis_sccc_decoder_combined_XX.h.t		\
 	trellis_sccc_decoder_combined_XX.i.t		\
+	trellis_sccc_decoder_X.cc.t	\
+	trellis_sccc_decoder_X.h.t		\
+	trellis_sccc_decoder_X.i.t		\
 	trellis_viterbi_X.cc.t			\
 	trellis_viterbi_X.h.t			\
 	trellis_viterbi_X.i.t
diff --git a/gr-trellis/src/lib/core_algorithms.cc b/gr-trellis/src/lib/core_algorithms.cc
index c1bafa379d..b7037926e5 100644
--- a/gr-trellis/src/lib/core_algorithms.cc
+++ b/gr-trellis/src/lib/core_algorithms.cc
@@ -963,3 +963,137 @@ void sccc_decoder_combined<gr_complex,int>(
       const gr_complex *observations, int *data
 );
 
+
+
+//=========================================================
+
+template<class T>
+void sccc_decoder(
+      const fsm &FSMo, int STo0, int SToK,
+      const fsm &FSMi, int STi0, int STiK,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      const float *iprioro, T *data
+)
+{
+
+//allocate space for priori, and posti of inner FSM
+std::vector<float> ipriori(blocklength*FSMi.I(),0.0);
+std::vector<float> iposti(blocklength*FSMi.I());
+
+//allocate space for priori, prioro and posto of outer FSM
+std::vector<float> opriori(blocklength*FSMo.I(),0.0);
+std::vector<float> oprioro(blocklength*FSMo.O());
+std::vector<float> oposti(blocklength*FSMo.I());
+std::vector<float> oposto(blocklength*FSMo.O());
+
+for(int rep=0;rep<repetitions;rep++) {
+  // run inner SISO
+  siso_algorithm(FSMi.I(),FSMi.S(),FSMi.O(),
+             FSMi.NS(), FSMi.OS(), FSMi.PS(), FSMi.PI(),
+             blocklength,
+             STi0,STiK,
+             true, false,
+             p2mymin,
+             &(ipriori[0]),  &(iprioro[0]), &(iposti[0])
+  );
+
+  //interleave soft info inner -> outer
+  for(int k=0;k<blocklength;k++) {
+    int ki = INTERLEAVER.DEINTER()[k];
+    //for(int i=0;i<FSMi.I();i++) {
+      //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
+    //}
+    memcpy(&(oprioro[k*FSMi.I()]),&(iposti[ki*FSMi.I()]),FSMi.I()*sizeof(float));
+  } 
+
+  // run outer SISO
+
+  if(rep<repetitions-1) { // do not produce posti
+    siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+             FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+             blocklength,
+             STo0,SToK,
+             false, true,
+             p2mymin,
+             &(opriori[0]),  &(oprioro[0]), &(oposto[0])
+    );
+
+    //interleave soft info outer --> inner
+    for(int k=0;k<blocklength;k++) {
+      int ki = INTERLEAVER.DEINTER()[k];
+      //for(int i=0;i<FSMi.I();i++) {
+        //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
+      //}
+      memcpy(&(ipriori[ki*FSMi.I()]),&(oposto[k*FSMi.I()]),FSMi.I()*sizeof(float));
+    } 
+  }
+  else // produce posti but not posto
+    
+    siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+             FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+             blocklength,
+             STo0,SToK,
+             true, false,
+             p2mymin,
+             &(opriori[0]),  &(oprioro[0]), &(oposti[0])
+    );
+   
+    /*
+    viterbi_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+             FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+             blocklength,
+             STo0,SToK,
+             &(oprioro[0]), data
+    );
+    */
+
+}
+
+
+// generate hard decisions
+for(int k=0;k<blocklength;k++) {
+  float min=INF;
+  int mini=0;
+  for(int i=0;i<FSMo.I();i++) {
+    if(oposti[k*FSMo.I()+i]<min) {
+      min=oposti[k*FSMo.I()+i];
+      mini=i;
+    }
+  }
+  data[k]=(T)mini;
+}
+
+
+
+}
+
+//-------
+
+template
+void sccc_decoder<unsigned char>(
+      const fsm &FSMo, int STo0, int SToK,
+      const fsm &FSMi, int STi0, int STiK,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      const float *iprioro, unsigned char *data
+);
+
+template
+void sccc_decoder<short>(
+      const fsm &FSMo, int STo0, int SToK,
+      const fsm &FSMi, int STi0, int STiK,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      const float *iprioro, short *data
+);
+
+template
+void sccc_decoder<int>(
+      const fsm &FSMo, int STo0, int SToK,
+      const fsm &FSMi, int STi0, int STiK,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      const float *iprioro, int *data
+);
+
diff --git a/gr-trellis/src/lib/core_algorithms.h b/gr-trellis/src/lib/core_algorithms.h
index 8e4ffe522f..e52a22b8e3 100644
--- a/gr-trellis/src/lib/core_algorithms.h
+++ b/gr-trellis/src/lib/core_algorithms.h
@@ -104,6 +104,15 @@ void sccc_decoder_combined(
 );
 
 
+template<class T>
+void sccc_decoder(
+      const fsm &FSMo, int STo0, int SToK,
+      const fsm &FSMi, int STi0, int STiK,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      const float *iprioro, T *data
+);
+
 
 
 
diff --git a/gr-trellis/src/lib/generate_trellis.py b/gr-trellis/src/lib/generate_trellis.py
index 691276cc85..9d2c593b41 100644
--- a/gr-trellis/src/lib/generate_trellis.py
+++ b/gr-trellis/src/lib/generate_trellis.py
@@ -33,6 +33,7 @@ other_roots = [
     'trellis_viterbi_X',
     'trellis_viterbi_combined_XX',
     'trellis_sccc_decoder_combined_XX',
+    'trellis_sccc_decoder_X',
     ]
 
 other_signatures = (
@@ -42,6 +43,7 @@ other_signatures = (
     ['b','s','i'],
     ['sb','ss','si','ib','is','ii','fb','fs','fi','cb','cs','ci'],
     ['fb','fs','fi','cb','cs','ci'],
+    ['b','s','i'],
     )
 
 
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_X.cc.t b/gr-trellis/src/lib/trellis_sccc_decoder_X.cc.t
new file mode 100644
index 0000000000..da853f2eac
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_sccc_decoder_X.cc.t
@@ -0,0 +1,123 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <@NAME@.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <iostream>
+#include "core_algorithms.h"
+
+  
+static const float INF = 1.0e9;
+
+@SPTR_NAME@ 
+trellis_make_@BASE_NAME@ (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE
+)
+{
+  return gnuradio::get_initial_sptr (new @NAME@ (
+    FSMo, STo0, SToK,
+    FSMi, STi0, STiK,
+    INTERLEAVER,
+    blocklength,
+    repetitions,
+    SISO_TYPE
+    ));
+}
+
+@NAME@::@NAME@ (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE
+)
+  : gr_block ("@BASE_NAME@",
+			  gr_make_io_signature (1, 1, sizeof (float)),
+			  gr_make_io_signature (1, 1, sizeof (@O_TYPE@))),  
+  d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
+  d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
+  d_INTERLEAVER (INTERLEAVER),
+  d_blocklength (blocklength),
+  d_repetitions (repetitions),
+  d_SISO_TYPE (SISO_TYPE)
+{
+    set_relative_rate (1.0 / ((double) d_FSMi.O()));
+    set_output_multiple (d_blocklength);
+}
+
+
+void
+@NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int input_required =  d_FSMi.O() * noutput_items ;
+  ninput_items_required[0] = input_required;
+}
+
+
+
+//===========================================================
+
+int
+@NAME@::general_work (int noutput_items,
+                        gr_vector_int &ninput_items,
+                        gr_vector_const_void_star &input_items,
+                        gr_vector_void_star &output_items)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int nblocks = noutput_items / d_blocklength;
+
+  float (*p2min)(float, float) = NULL;
+  if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+    p2min = &min;
+  else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+    p2min = &min_star;
+
+
+  const float *in = (const float *) input_items[0];
+  @O_TYPE@ *out = (@O_TYPE@ *) output_items[0];
+  for (int n=0;n<nblocks;n++) {
+    sccc_decoder(
+      d_FSMo, d_STo0, d_SToK,
+      d_FSMi, d_STi0, d_STiK,
+      d_INTERLEAVER, d_blocklength, d_repetitions,
+      p2min, 
+      &(in[n*d_blocklength*d_FSMi.O()]),&(out[n*d_blocklength])
+    );
+  }
+
+  consume_each (d_FSMi.O() * noutput_items );
+  return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_X.h.t b/gr-trellis/src/lib/trellis_sccc_decoder_X.h.t
new file mode 100644
index 0000000000..3adb8a5b7e
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_sccc_decoder_X.h.t
@@ -0,0 +1,102 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include "fsm.h"
+#include "interleaver.h"
+#include <gr_block.h>
+#include <vector>
+#include "siso_type.h"
+
+class @NAME@;
+typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
+
+@SPTR_NAME@ trellis_make_@BASE_NAME@ (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE // perform "min-sum" or "sum-product" combining 
+);
+
+
+/*!
+ *  \ingroup coding_blk
+ */
+class @NAME@ : public gr_block
+{
+  fsm d_FSMo;
+  fsm d_FSMi;
+  int d_STo0;
+  int d_SToK;
+  int d_STi0;
+  int d_STiK;
+  interleaver d_INTERLEAVER;
+  int d_blocklength;
+  int d_repetitions;
+  trellis_siso_type_t d_SISO_TYPE;
+  std::vector<float> d_buffer;
+
+  friend @SPTR_NAME@ trellis_make_@BASE_NAME@ (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE
+  );
+
+  @NAME@ (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE 
+  );
+
+public:
+  fsm FSMo () const { return d_FSMo; }
+  fsm FSMi () const { return d_FSMi; }
+  int STo0 () const { return d_STo0; }
+  int SToK () const { return d_SToK; }
+  int STi0 () const { return d_STi0; }
+  int STiK () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+
+  void forecast (int noutput_items,
+                 gr_vector_int &ninput_items_required);
+  int general_work (int noutput_items,
+                    gr_vector_int &ninput_items,
+                    gr_vector_const_void_star &input_items,
+                    gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_X.i.t b/gr-trellis/src/lib/trellis_sccc_decoder_X.i.t
new file mode 100644
index 0000000000..a4392ee6fa
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_sccc_decoder_X.i.t
@@ -0,0 +1,60 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// @WARNING@
+
+GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
+
+@SPTR_NAME@ trellis_make_@BASE_NAME@ (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE
+);
+
+
+class @NAME@ : public gr_block
+{
+private:
+  @NAME@ (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE
+  );
+
+public:
+  fsm FSMo () const { return d_FSMo; }
+  fsm FSMi () const { return d_FSMi; }
+  int STo0 () const { return d_STo0; }
+  int SToK () const { return d_SToK; }
+  int STi0 () const { return d_STi0; }
+  int STiK () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+};
-- 
cgit v1.2.3


From 96a174f10af9b9b16cbb921622672ab6fedc822d Mon Sep 17 00:00:00 2001
From: Achilleas Anastasopoulos <anastas@umich.edu>
Date: Mon, 21 Feb 2011 18:58:58 -0500
Subject: added pccc decoder + examples

---
 gr-trellis/src/examples/test_pccc_turbo1.py    | 119 ++++++++++++
 gr-trellis/src/lib/.gitignore                  |   9 +
 gr-trellis/src/lib/Makefile.am                 |   3 +
 gr-trellis/src/lib/core_algorithms.cc          | 252 +++++++++++++++++++------
 gr-trellis/src/lib/core_algorithms.h           |   9 +
 gr-trellis/src/lib/generate_trellis.py         |   2 +
 gr-trellis/src/lib/trellis_pccc_decoder_X.cc.t | 124 ++++++++++++
 gr-trellis/src/lib/trellis_pccc_decoder_X.h.t  | 102 ++++++++++
 gr-trellis/src/lib/trellis_pccc_decoder_X.i.t  |  60 ++++++
 9 files changed, 624 insertions(+), 56 deletions(-)
 create mode 100755 gr-trellis/src/examples/test_pccc_turbo1.py
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_X.cc.t
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_X.h.t
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_X.i.t

(limited to 'gr-trellis/src/examples')

diff --git a/gr-trellis/src/examples/test_pccc_turbo1.py b/gr-trellis/src/examples/test_pccc_turbo1.py
new file mode 100755
index 0000000000..1173d0734d
--- /dev/null
+++ b/gr-trellis/src/examples/test_pccc_turbo1.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python
+
+from gnuradio import gr
+from gnuradio import trellis
+from gnuradio import eng_notation
+import math
+import sys
+import random
+import fsm_utils
+
+
+def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,seed):
+    tb = gr.top_block ()
+
+
+    # TX
+    src = gr.lfsr_32k_source_s()
+    src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
+    s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the outer FSM input cardinality
+    #src = gr.vector_source_s([0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],False)
+    enc = trellis.pccc_encoder_ss(fo,0,fi,0,interleaver,K)
+    code = gr.vector_sink_s()
+    mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+
+    # CHANNEL
+    add = gr.add_ff()
+    noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+
+    # RX
+    metrics_in = trellis.metrics_f(fi.O()*fo.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner SISO
+    scale = gr.multiply_const_ff(1.0/N0)
+    dec = trellis.pccc_decoder_s(fo,0,-1,fi,0,-1,interleaver,K,IT,trellis.TRELLIS_MIN_SUM)
+ 
+    fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
+    dst = gr.check_lfsr_32k_s()
+    
+    tb.connect (src,src_head,s2fsmi,enc,mod)
+    #tb.connect (src,enc,mod)
+    #tb.connect(enc,code)
+    tb.connect (mod,(add,0))
+    tb.connect (noise,(add,1))
+    tb.connect (add,metrics_in,scale,dec,fsmi2s,dst)
+
+    tb.run()
+ 
+    #print code.data()
+    
+    ntotal = dst.ntotal ()
+    nright = dst.nright ()
+    runlength = dst.runlength ()
+    return (ntotal,ntotal-nright)
+
+
+def main(args):
+    nargs = len (args)
+    if nargs == 5:
+        fname_out=args[0]
+        fname_in=args[1]
+        esn0_db=float(args[2]) # Es/No in dB
+        IT=int(args[3])
+        rep=int(args[4]) # number of times the experiment is run to collect enough errors
+    else:
+        sys.stderr.write ('usage: test_pccc_turbo.py fsm_name_1 fsm_fname_2 Es/No_db iterations repetitions\n')
+        sys.exit (1)
+
+    # system parameters
+    Kb=1024*16  # packet size in bits (make it multiple of 16 so it can be packed in a short)
+    fo=trellis.fsm(fname_out) # get the outer FSM specification from a file
+    fi=trellis.fsm(fname_in) # get the innner FSM specification from a file
+    bitspersymbol = int(round(math.log(fo.I())/math.log(2))) # bits per FSM input symbol
+    if fo.I() != fi.I():
+        sys.stderr.write ('Incompatible input cardinality between two FSMs.\n')
+        sys.exit (1)
+    K=Kb/bitspersymbol # packet size in trellis steps
+    interleaver=trellis.interleaver(K,666) # construct a random interleaver
+    #modulation = fsm_utils.psk8 # see fsm_utlis.py for available predefined modulations
+    dimensionality = 4
+    constellation = [ 1, 0, 1, 0,\
+                      1, 0,-1, 0,\
+                      1, 0, 0, 1,\
+                      1, 0, 0,-1,\
+                     -1, 0, 1, 0,\
+                     -1, 0,-1, 0,\
+                     -1, 0, 0, 1,\
+                     -1, 0, 0,-1,\
+                      0, 1, 1, 0,\
+                      0, 1,-1, 0,\
+                      0, 1, 0, 1,\
+                      0, 1, 0,-1,\
+                      0,-1, 1, 0,\
+                      0,-1,-1, 0,\
+                      0,-1, 0, 1,\
+                      0,-1, 0,-1,] # equivalent to 2 QPSK symbols
+    if len(constellation)/dimensionality != fi.O()*fo.O():
+        sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n')
+        sys.exit (1)
+    # calculate average symbol energy
+    Es = 0
+    for i in range(len(constellation)):
+        Es = Es + constellation[i]**2
+    Es = Es / (len(constellation)/dimensionality)
+    N0=Es/pow(10.0,esn0_db/10.0); # calculate noise variance
+    
+    tot_s=0 # total number of transmitted shorts
+    terr_s=0 # total number of shorts in error
+    terr_p=0 # total number of packets in error
+    for i in range(rep):
+        (s,e)=run_test(fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,-long(666+i)) # run experiment with different seed to get different noise realizations
+        tot_s=tot_s+s
+        terr_s=terr_s+e
+        terr_p=terr_p+(terr_s!=0)
+        if ((i+1)%10==0): # display progress
+            print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
+    # estimate of the (short or bit) error rate
+    print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
+
+
+if __name__ == '__main__':
+    main (sys.argv[1:])
diff --git a/gr-trellis/src/lib/.gitignore b/gr-trellis/src/lib/.gitignore
index 8120aad94d..40e0ebd748 100644
--- a/gr-trellis/src/lib/.gitignore
+++ b/gr-trellis/src/lib/.gitignore
@@ -140,6 +140,15 @@
 /trellis_sccc_decoder_i.h
 /trellis_sccc_decoder_i.i
 /trellis_sccc_decoder_i.cc
+/trellis_pccc_decoder_b.h
+/trellis_pccc_decoder_b.i
+/trellis_pccc_decoder_b.cc
+/trellis_pccc_decoder_s.h
+/trellis_pccc_decoder_s.i
+/trellis_pccc_decoder_s.cc
+/trellis_pccc_decoder_i.h
+/trellis_pccc_decoder_i.i
+/trellis_pccc_decoder_i.cc
 /trellis_pccc_encoder_bb.cc
 /trellis_pccc_encoder_bb.h
 /trellis_pccc_encoder_bb.i
diff --git a/gr-trellis/src/lib/Makefile.am b/gr-trellis/src/lib/Makefile.am
index 42ea17aca7..05cffb7b13 100644
--- a/gr-trellis/src/lib/Makefile.am
+++ b/gr-trellis/src/lib/Makefile.am
@@ -50,6 +50,9 @@ core_generator = 				\
 	trellis_sccc_decoder_X.cc.t	\
 	trellis_sccc_decoder_X.h.t		\
 	trellis_sccc_decoder_X.i.t		\
+	trellis_pccc_decoder_X.cc.t	\
+	trellis_pccc_decoder_X.h.t		\
+	trellis_pccc_decoder_X.i.t		\
 	trellis_viterbi_X.cc.t			\
 	trellis_viterbi_X.h.t			\
 	trellis_viterbi_X.i.t
diff --git a/gr-trellis/src/lib/core_algorithms.cc b/gr-trellis/src/lib/core_algorithms.cc
index b7037926e5..91ac8fbdf9 100644
--- a/gr-trellis/src/lib/core_algorithms.cc
+++ b/gr-trellis/src/lib/core_algorithms.cc
@@ -22,6 +22,8 @@
 
 #include <cstring>
 #include <stdexcept>
+//#include <cstdio>
+#include <iostream>
 #include "core_algorithms.h"
 #include "calc_metric.h"
 
@@ -976,93 +978,92 @@ void sccc_decoder(
       const float *iprioro, T *data
 )
 {
-
-//allocate space for priori, and posti of inner FSM
-std::vector<float> ipriori(blocklength*FSMi.I(),0.0);
-std::vector<float> iposti(blocklength*FSMi.I());
-
-//allocate space for priori, prioro and posto of outer FSM
-std::vector<float> opriori(blocklength*FSMo.I(),0.0);
-std::vector<float> oprioro(blocklength*FSMo.O());
-std::vector<float> oposti(blocklength*FSMo.I());
-std::vector<float> oposto(blocklength*FSMo.O());
-
-for(int rep=0;rep<repetitions;rep++) {
-  // run inner SISO
-  siso_algorithm(FSMi.I(),FSMi.S(),FSMi.O(),
+  //allocate space for priori, and posti of inner FSM
+  std::vector<float> ipriori(blocklength*FSMi.I(),0.0);
+  std::vector<float> iposti(blocklength*FSMi.I());
+
+  //allocate space for priori, prioro and posto of outer FSM
+  std::vector<float> opriori(blocklength*FSMo.I(),0.0);
+  std::vector<float> oprioro(blocklength*FSMo.O());
+  std::vector<float> oposti(blocklength*FSMo.I());
+  std::vector<float> oposto(blocklength*FSMo.O());
+
+  for(int rep=0;rep<repetitions;rep++) {
+    // run inner SISO
+    siso_algorithm(FSMi.I(),FSMi.S(),FSMi.O(),
              FSMi.NS(), FSMi.OS(), FSMi.PS(), FSMi.PI(),
              blocklength,
              STi0,STiK,
              true, false,
              p2mymin,
              &(ipriori[0]),  &(iprioro[0]), &(iposti[0])
-  );
+    );
 
-  //interleave soft info inner -> outer
-  for(int k=0;k<blocklength;k++) {
-    int ki = INTERLEAVER.DEINTER()[k];
-    //for(int i=0;i<FSMi.I();i++) {
-      //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
-    //}
-    memcpy(&(oprioro[k*FSMi.I()]),&(iposti[ki*FSMi.I()]),FSMi.I()*sizeof(float));
-  } 
+    //interleave soft info inner -> outer
+    for(int k=0;k<blocklength;k++) {
+      int ki = INTERLEAVER.DEINTER()[k];
+      //for(int i=0;i<FSMi.I();i++) {
+        //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
+      //}
+      memcpy(&(oprioro[k*FSMi.I()]),&(iposti[ki*FSMi.I()]),FSMi.I()*sizeof(float));
+    } 
 
-  // run outer SISO
+    // run outer SISO
 
-  if(rep<repetitions-1) { // do not produce posti
-    siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+    if(rep<repetitions-1) { // do not produce posti
+      siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
              FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
              blocklength,
              STo0,SToK,
              false, true,
              p2mymin,
              &(opriori[0]),  &(oprioro[0]), &(oposto[0])
-    );
-
-    //interleave soft info outer --> inner
-    for(int k=0;k<blocklength;k++) {
-      int ki = INTERLEAVER.DEINTER()[k];
-      //for(int i=0;i<FSMi.I();i++) {
-        //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
-      //}
-      memcpy(&(ipriori[ki*FSMi.I()]),&(oposto[k*FSMi.I()]),FSMi.I()*sizeof(float));
-    } 
-  }
-  else // produce posti but not posto
+      );
+
+      //interleave soft info outer --> inner
+      for(int k=0;k<blocklength;k++) {
+        int ki = INTERLEAVER.DEINTER()[k];
+        //for(int i=0;i<FSMi.I();i++) {
+          //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
+        //}
+        memcpy(&(ipriori[ki*FSMi.I()]),&(oposto[k*FSMi.I()]),FSMi.I()*sizeof(float));
+      } 
+    }
+    else {// produce posti but not posto
     
-    siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+      siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
              FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
              blocklength,
              STo0,SToK,
              true, false,
              p2mymin,
              &(opriori[0]),  &(oprioro[0]), &(oposti[0])
-    );
+      );
    
-    /*
-    viterbi_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+      /*
+      viterbi_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
              FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
              blocklength,
              STo0,SToK,
              &(oprioro[0]), data
-    );
-    */
-
-}
+      );
+      */
+    }
 
+  } // end repetitions
 
-// generate hard decisions
-for(int k=0;k<blocklength;k++) {
-  float min=INF;
-  int mini=0;
-  for(int i=0;i<FSMo.I();i++) {
-    if(oposti[k*FSMo.I()+i]<min) {
-      min=oposti[k*FSMo.I()+i];
-      mini=i;
+  // generate hard decisions
+  for(int k=0;k<blocklength;k++) {
+    float min=INF;
+    int mini=0;
+    for(int i=0;i<FSMo.I();i++) {
+      if(oposti[k*FSMo.I()+i]<min) {
+        min=oposti[k*FSMo.I()+i];
+        mini=i;
+      }
     }
+    data[k]=(T)mini;
   }
-  data[k]=(T)mini;
-}
 
 
 
@@ -1097,3 +1098,142 @@ void sccc_decoder<int>(
       const float *iprioro, int *data
 );
 
+
+//====================================================
+
+template<class T>
+void pccc_decoder(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      const float *cprioro, T *data
+)
+{
+
+  //allocate space for priori, prioro and posti of FSM1
+  std::vector<float> priori1(blocklength*FSM1.I(),0.0);
+  std::vector<float> prioro1(blocklength*FSM1.O());
+  std::vector<float> posti1(blocklength*FSM1.I());
+
+  //allocate space for priori, prioro and posti of FSM2
+  std::vector<float> priori2(blocklength*FSM2.I(),0.0);
+  std::vector<float> prioro2(blocklength*FSM2.O());
+  std::vector<float> posti2(blocklength*FSM2.I());
+ 
+  //generate prioro1,2 (metrics are not updated per iteration: this is not the best you can do...)
+  for (int k=0;k<blocklength;k++) {
+    //std::cout << k << std::endl;
+    for(int i=0;i<FSM1.O();i++) {
+      float x=cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+0];
+      for(int j=1;j<FSM2.O();j++)
+        x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+j]);
+      prioro1[k*FSM1.O()+i]=x;
+      //std::cout <<  prioro1[k*FSM1.O()+i] << ", ";
+    }
+    //std::cout << std::endl;
+    for(int i=0;i<FSM2.O();i++) {
+      float x=cprioro[k*FSM1.O()*FSM2.O()+0*FSM1.O()+i];
+      for(int j=1;j<FSM1.O();j++)
+        x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+j*FSM1.O()+i]);
+      prioro2[k*FSM2.O()+i]=x;
+    }
+  }
+
+  for(int rep=0;rep<repetitions;rep++) {
+    // run  SISO 1
+    siso_algorithm(FSM1.I(),FSM1.S(),FSM1.O(),
+             FSM1.NS(), FSM1.OS(), FSM1.PS(), FSM1.PI(),
+             blocklength,
+             ST10,ST1K,
+             true, false,
+             p2mymin,
+             &(priori1[0]),  &(prioro1[0]), &(posti1[0])
+    );
+   
+    //for(int k=0;k<blocklength;k++){
+      //for(int i=0;i<FSM1.I();i++)
+        //std::cout << posti1[k*FSM1.I()+i] << ", ";
+      //std::cout << std::endl;
+    //}
+
+    //interleave soft info 1 -> 2
+    for(int k=0;k<blocklength;k++) {
+      int ki = INTERLEAVER.INTER()[k];
+      //for(int i=0;i<FSMi.I();i++) {
+        //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
+      //}
+      memcpy(&(priori2[k*FSM2.I()]),&(posti1[ki*FSM1.I()]),FSM1.I()*sizeof(float));
+    } 
+
+    // run SISO 2
+    siso_algorithm(FSM2.I(),FSM2.S(),FSM2.O(),
+           FSM2.NS(), FSM2.OS(), FSM2.PS(), FSM2.PI(),
+           blocklength,
+           ST20,ST2K,
+           true, false,
+           p2mymin,
+           &(priori2[0]),  &(prioro2[0]), &(posti2[0])
+    );
+
+    //interleave soft info 2 --> 1
+    for(int k=0;k<blocklength;k++) {
+      int ki = INTERLEAVER.INTER()[k];
+      //for(int i=0;i<FSMi.I();i++) {
+        //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
+      //}
+      memcpy(&(priori1[ki*FSM1.I()]),&(posti2[k*FSM2.I()]),FSM1.I()*sizeof(float));
+    }
+
+  } // end repetitions
+
+  // generate hard decisions
+  for(int k=0;k<blocklength;k++) {
+    for(int i=0;i<FSM1.I();i++)
+      posti1[k*FSM1.I()+i]  = (*p2mymin)(priori1[k*FSM1.I()+i],posti1[k*FSM1.I()+i]);
+    float min=INF;
+    int mini=0;
+    for(int i=0;i<FSM1.I();i++) {
+      if(posti1[k*FSM1.I()+i]<min) {
+        min=posti1[k*FSM1.I()+i];
+        mini=i;
+      }
+    }
+    data[k]=(T)mini;
+    //std::cout << data[k] << ", "<< std::endl;
+  }
+  //std::cout << std::endl;
+
+
+
+}
+
+//----------------
+
+template
+void pccc_decoder<unsigned char>(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      const float *cprioro, unsigned char *data
+);
+
+template
+void pccc_decoder<short>(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      const float *cprioro, short *data
+);
+
+template
+void pccc_decoder<int>(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      const float *cprioro, int *data
+);
+
diff --git a/gr-trellis/src/lib/core_algorithms.h b/gr-trellis/src/lib/core_algorithms.h
index e52a22b8e3..fdb5f398ec 100644
--- a/gr-trellis/src/lib/core_algorithms.h
+++ b/gr-trellis/src/lib/core_algorithms.h
@@ -114,6 +114,15 @@ void sccc_decoder(
 );
 
 
+template<class T>
+void pccc_decoder(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      float (*p2mymin)(float,float),
+      const float *cprioro, T *data
+);
+
 
 
 #endif
diff --git a/gr-trellis/src/lib/generate_trellis.py b/gr-trellis/src/lib/generate_trellis.py
index 32cf54db7c..9f845f74a4 100644
--- a/gr-trellis/src/lib/generate_trellis.py
+++ b/gr-trellis/src/lib/generate_trellis.py
@@ -35,6 +35,7 @@ other_roots = [
     'trellis_viterbi_combined_XX',
     'trellis_sccc_decoder_combined_XX',
     'trellis_sccc_decoder_X',
+    'trellis_pccc_decoder_X',
     ]
 
 other_signatures = (
@@ -46,6 +47,7 @@ other_signatures = (
     ['sb','ss','si','ib','is','ii','fb','fs','fi','cb','cs','ci'],
     ['fb','fs','fi','cb','cs','ci'],
     ['b','s','i'],
+    ['b','s','i'],
     )
 
 
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_X.cc.t b/gr-trellis/src/lib/trellis_pccc_decoder_X.cc.t
new file mode 100644
index 0000000000..34dd2eb878
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_X.cc.t
@@ -0,0 +1,124 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <@NAME@.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <iostream>
+#include "core_algorithms.h"
+
+  
+static const float INF = 1.0e9;
+
+@SPTR_NAME@ 
+trellis_make_@BASE_NAME@ (
+  const fsm &FSM1, int ST10, int ST1K,
+  const fsm &FSM2, int ST20, int ST2K,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE
+)
+{
+  return gnuradio::get_initial_sptr (new @NAME@ (
+    FSM1, ST10, ST1K,
+    FSM2, ST20, ST2K,
+    INTERLEAVER,
+    blocklength,
+    repetitions,
+    SISO_TYPE
+    ));
+}
+
+@NAME@::@NAME@ (
+  const fsm &FSM1, int ST10, int ST1K,
+  const fsm &FSM2, int ST20, int ST2K,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE
+)
+  : gr_block ("@BASE_NAME@",
+			  gr_make_io_signature (1, 1, sizeof (float)),
+			  gr_make_io_signature (1, 1, sizeof (@O_TYPE@))),  
+  d_FSM1 (FSM1), d_ST10 (ST10), d_ST1K (ST1K),
+  d_FSM2 (FSM2), d_ST20 (ST20), d_ST2K (ST2K),
+  d_INTERLEAVER (INTERLEAVER),
+  d_blocklength (blocklength),
+  d_repetitions (repetitions),
+  d_SISO_TYPE (SISO_TYPE)
+{
+    assert(d_FSM1.I() == d_FSM2.I());
+    set_relative_rate (1.0 / ((double) d_FSM1.O() * d_FSM2.O()));
+    set_output_multiple (d_blocklength);
+}
+
+
+void
+@NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int input_required =  d_FSM1.O() * d_FSM2.O() * noutput_items ;
+  ninput_items_required[0] = input_required;
+}
+
+
+
+//===========================================================
+
+int
+@NAME@::general_work (int noutput_items,
+                        gr_vector_int &ninput_items,
+                        gr_vector_const_void_star &input_items,
+                        gr_vector_void_star &output_items)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int nblocks = noutput_items / d_blocklength;
+
+  float (*p2min)(float, float) = NULL;
+  if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+    p2min = &min;
+  else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+    p2min = &min_star;
+
+
+  const float *in = (const float *) input_items[0];
+  @O_TYPE@ *out = (@O_TYPE@ *) output_items[0];
+  for (int n=0;n<nblocks;n++) {
+    pccc_decoder(
+      d_FSM1, d_ST10, d_ST1K,
+      d_FSM2, d_ST20, d_ST2K,
+      d_INTERLEAVER, d_blocklength, d_repetitions,
+      p2min, 
+      &(in[n*d_blocklength*d_FSM1.O()*d_FSM2.O()]),&(out[n*d_blocklength])
+    );
+  }
+
+  consume_each (d_FSM1.O() * d_FSM2.O() * noutput_items );
+  return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_X.h.t b/gr-trellis/src/lib/trellis_pccc_decoder_X.h.t
new file mode 100644
index 0000000000..ff4b7a1f8c
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_X.h.t
@@ -0,0 +1,102 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include "fsm.h"
+#include "interleaver.h"
+#include <gr_block.h>
+#include <vector>
+#include "siso_type.h"
+
+class @NAME@;
+typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
+
+@SPTR_NAME@ trellis_make_@BASE_NAME@ (
+  const fsm &FSM1, int ST10, int ST1K,
+  const fsm &FSM2, int ST20, int ST2K,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE // perform "min-sum" or "sum-product" combining 
+);
+
+
+/*!
+ *  \ingroup coding_blk
+ */
+class @NAME@ : public gr_block
+{
+  fsm d_FSM1;
+  fsm d_FSM2;
+  int d_ST10;
+  int d_ST1K;
+  int d_ST20;
+  int d_ST2K;
+  interleaver d_INTERLEAVER;
+  int d_blocklength;
+  int d_repetitions;
+  trellis_siso_type_t d_SISO_TYPE;
+  std::vector<float> d_buffer;
+
+  friend @SPTR_NAME@ trellis_make_@BASE_NAME@ (
+    const fsm &FSM1, int ST10, int ST1K,
+    const fsm &FSM2, int ST20, int ST2K,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE
+  );
+
+  @NAME@ (
+    const fsm &FSM1, int ST10, int ST1K,
+    const fsm &FSM2, int ST20, int ST2K,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE 
+  );
+
+public:
+  fsm FSM1 () const { return d_FSM1; }
+  fsm FSM2 () const { return d_FSM2; }
+  int ST10 () const { return d_ST10; }
+  int ST1K () const { return d_ST1K; }
+  int ST20 () const { return d_ST20; }
+  int ST2K () const { return d_ST2K; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+
+  void forecast (int noutput_items,
+                 gr_vector_int &ninput_items_required);
+  int general_work (int noutput_items,
+                    gr_vector_int &ninput_items,
+                    gr_vector_const_void_star &input_items,
+                    gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_X.i.t b/gr-trellis/src/lib/trellis_pccc_decoder_X.i.t
new file mode 100644
index 0000000000..83d7fe969d
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_X.i.t
@@ -0,0 +1,60 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// @WARNING@
+
+GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
+
+@SPTR_NAME@ trellis_make_@BASE_NAME@ (
+  const fsm &FSM1, int ST10, int ST1K,
+  const fsm &FSM2, int ST20, int ST2K,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE
+);
+
+
+class @NAME@ : public gr_block
+{
+private:
+  @NAME@ (
+    const fsm &FSM1, int ST10, int ST1K,
+    const fsm &FSM2, int ST20, int ST2K,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE
+  );
+
+public:
+  fsm FSM1 () const { return d_FSM1; }
+  fsm FSM2 () const { return d_FSM2; }
+  int ST10 () const { return d_ST10; }
+  int ST1K () const { return d_ST1K; }
+  int ST20 () const { return d_ST20; }
+  int ST2K () const { return d_ST2K; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+};
-- 
cgit v1.2.3


From 12e4796cd3a7830759c8961bc7ebb1fd0d3673cc Mon Sep 17 00:00:00 2001
From: Achilleas Anastasopoulos <anastas@umich.edu>
Date: Thu, 2 Jun 2011 18:26:33 -0400
Subject: Updated some of the examples in gr-trellis to use the options parser

---
 gr-trellis/src/examples/README               |  24 +----
 gr-trellis/src/examples/test_tcm.py          |  29 +++---
 gr-trellis/src/examples/test_tcm1.py         | 120 -------------------------
 gr-trellis/src/examples/test_tcm2.py         | 115 ------------------------
 gr-trellis/src/examples/test_tcm_bit.py      | 129 +++++++++++++++++++++++++++
 gr-trellis/src/examples/test_tcm_combined.py |  28 +++---
 gr-trellis/src/examples/test_tcm_parallel.py |  28 +++---
 7 files changed, 187 insertions(+), 286 deletions(-)
 delete mode 100755 gr-trellis/src/examples/test_tcm1.py
 delete mode 100755 gr-trellis/src/examples/test_tcm2.py
 create mode 100755 gr-trellis/src/examples/test_tcm_bit.py

(limited to 'gr-trellis/src/examples')

diff --git a/gr-trellis/src/examples/README b/gr-trellis/src/examples/README
index d5bad85f57..bd28e3d615 100644
--- a/gr-trellis/src/examples/README
+++ b/gr-trellis/src/examples/README
@@ -6,28 +6,10 @@ fsm_utils.py contains several useful functions.
 
 fsm_files is a directory with some FSM definitions
 
-If you just want to see what these programs do, run each of the following:
+If you just want to see what these programs do run them;
+in your terminal you will see something like this:
 
-./test_tcm.py  fsm_files/awgn1o2_4.fsm 6.0 1000
-./test_tcm1.py fsm_files/awgn1o2_4.fsm 6.0 1000
-./test_tcm2.py 6.0 1000
-./test_tcm_combined.py fsm_files/awgn1o2_4.fsm 6.0 1000
-./test_tcm_parallel.py fsm_files/awgn1o2_4.fsm 6.0 1000
-
-./test_sccc_hard.py  fsm_files/awgn1o2_4.fsm fsm_files/awgn2o3_4_msb.fsm 10.0 100
-./test_sccc_soft.py  fsm_files/awgn1o2_4.fsm fsm_files/awgn2o3_4_msb.fsm  8.0 100
-./test_sccc_turbo.py fsm_files/awgn1o2_4.fsm fsm_files/awgn2o3_4_msb.fsm  5.0 100
-
-./test_viterbi_equalization.py  12.0 100
-./test_viterbi_equalization1.py 12.0 100
-./test_turbo_equalization1.py fsm_files/awgn1o2_4.fsm 8.0 100
-./test_turbo_equalization2.py fsm_files/awgn1o2_4.fsm 8.0 100
-
-
-In your terminal you will see something like this:
-
-
-$ ./test_tcm.py fsm_files/awgn1o2_4.fsm 6.0 1000
+$ ./test_tcm.py --esn0 6.0 --repetitions 1000
 100 98 9.80e-01 102400 9 8.79e-05
 200 198 9.90e-01 204800 20 9.77e-05
 300 298 9.93e-01 307200 40 1.30e-04
diff --git a/gr-trellis/src/examples/test_tcm.py b/gr-trellis/src/examples/test_tcm.py
index bd7fa0b3e5..d2e3c62716 100755
--- a/gr-trellis/src/examples/test_tcm.py
+++ b/gr-trellis/src/examples/test_tcm.py
@@ -7,6 +7,8 @@ import math
 import sys
 import random
 import fsm_utils
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
 
 def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
     tb = gr.top_block ()
@@ -70,18 +72,25 @@ def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
 
 
 
-def main(args):
-    nargs = len (args)
-    if nargs == 3:
-        fname=args[0]
-        esn0_db=float(args[1]) # Es/No in dB
-        rep=int(args[2]) # number of times the experiment is run to collect enough errors
-    else:
-        sys.stderr.write ('usage: test_tcm.py fsm_fname Es/No_db  repetitions\n')
-        sys.exit (1)
+def main():
+    parser = OptionParser(option_class=eng_option)
+    parser.add_option("-f", "--fsm_file", type="string", default="fsm_files/awgn1o2_4.fsm", help="Filename containing the fsm specification, e.g. -f fsm_files/awgn1o2_4.fsm (default=fsm_files/awgn1o2_4.fsm)")
+    parser.add_option("-e", "--esn0", type="eng_float", default=10.0, help="Symbol energy to noise PSD level ratio in dB, e.g., -e 10.0 (default=10.0)")
+    parser.add_option("-r", "--repetitions", type="int", default=100, help="Number of packets to be generated for the simulation, e.g., -r 100 (default=100)")
+
+    (options, args) = parser.parse_args ()
+    if len(args) != 0:
+        parser.print_help()
+        raise SystemExit, 1
+
+    fname=options.fsm_file
+    esn0_db=float(options.esn0)
+    rep=int(options.repetitions)
 
     # system parameters
     f=trellis.fsm(fname) # get the FSM specification from a file
+    # alternatively you can specify the fsm from its generator matrix
+    #f=trellis.fsm(1,2,[5,7]) 
     Kb=1024*16  # packet size in bits (make it multiple of 16 so it can be packed in a short)
     bitspersymbol = int(round(math.log(f.I())/math.log(2))) # bits per FSM input symbol
     K=Kb/bitspersymbol # packet size in trellis steps
@@ -114,4 +123,4 @@ def main(args):
 
 
 if __name__ == '__main__':
-    main (sys.argv[1:])
+    main()
diff --git a/gr-trellis/src/examples/test_tcm1.py b/gr-trellis/src/examples/test_tcm1.py
deleted file mode 100755
index 3c936155da..0000000000
--- a/gr-trellis/src/examples/test_tcm1.py
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python
-
-from gnuradio import gr
-from gnuradio import trellis
-from gnuradio import eng_notation
-import math
-import sys
-import random
-import fsm_utils
-
-def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
-    tb = gr.top_block ()
-
-    # TX
-    packet = [0]*Kb
-    # this for loop is TOO slow!!!
-    for i in range(Kb-1*16): # last 16 bits = 0 to drive the final state to 0
-        packet[i] = random.randint(0, 1) # random 0s and 1s
-    src = gr.vector_source_s(packet,False)
-    #src = gr.lfsr_32k_source_s()
-    #src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
-    b2s = gr.unpacked_to_packed_ss(1,gr.GR_MSB_FIRST) # pack bits in shorts
-    s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the FSM input cardinality
-    enc = trellis.encoder_ss(f,0) # initial state = 0
-    mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
-
-    
-    # CHANNEL
-    add = gr.add_ff()
-    noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
-
-
-    # RX
-    metrics = trellis.metrics_f(f.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for Viterbi
-    va = trellis.viterbi_s(f,K,0,-1) # Put -1 if the Initial/Final states are not set.
-    fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
-    s2b = gr.packed_to_unpacked_ss(1,gr.GR_MSB_FIRST) # unpack shorts to bits
-    dst = gr.vector_sink_s(); 
-    #dst = gr.check_lfsr_32k_s(); 
-    
-
-    #tb.connect (src,src_head,s2fsmi,enc,mod)
-    tb.connect (src,b2s,s2fsmi,enc,mod)
-    tb.connect (mod,(add,0))
-    tb.connect (noise,(add,1))
-    tb.connect (add,metrics)
-    #tb.connect (metrics,va,fsmi2s,dst)
-    tb.connect (metrics,va,fsmi2s,s2b,dst)
-    
-
-    tb.run()
-    
-    # A bit of cheating: run the program once and print the 
-    # final encoder state..
-    # Then put it as the last argument in the viterbi block
-    #print "final state = " , enc.ST()
-
-    #ntotal = dst.ntotal ()
-    #nright = dst.nright ()
-    #runlength = dst.runlength ()
-    ntotal = len(packet)
-    if len(dst.data()) != ntotal:
-        print "Error: not enough data\n"
-    nright = 0;
-    # this for loop is TOO slow!!!
-    for i in range(ntotal):
-        if packet[i]==dst.data()[i]:
-            nright=nright+1
-        #else:
-            #print "Error in ", i
-    return (ntotal,ntotal-nright)
-
-
-
-
-def main(args):
-    nargs = len (args)
-    if nargs == 3:
-        fname=args[0]
-        esn0_db=float(args[1]) # Es/No in dB
-        rep=int(args[2]) # number of times the experiment is run to collect enough errors
-    else:
-        sys.stderr.write ('usage: test_tcm.py fsm_fname Es/No_db  repetitions\n')
-        sys.exit (1)
-
-    # system parameters
-    f=trellis.fsm(fname) # get the FSM specification from a file
-    Kb=1024*16  # packet size in bits (make it multiple of 16 so it can be packed in a short)
-    bitspersymbol = int(round(math.log(f.I())/math.log(2))) # bits per FSM input symbol
-    K=Kb/bitspersymbol # packet size in trellis steps
-    modulation = fsm_utils.psk4 # see fsm_utlis.py for available predefined modulations
-    dimensionality = modulation[0]
-    constellation = modulation[1] 
-    if len(constellation)/dimensionality != f.O():
-        sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n')
-        sys.exit (1)
-    # calculate average symbol energy
-    Es = 0
-    for i in range(len(constellation)):
-        Es = Es + constellation[i]**2
-    Es = Es / (len(constellation)/dimensionality)
-    N0=Es/pow(10.0,esn0_db/10.0); # noise variance
-    
-    tot_s=0 # total number of transmitted shorts
-    terr_s=0 # total number of shorts in error
-    terr_p=0 # total number of packets in error
-    for i in range(rep):
-        (s,e)=run_test(f,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations
-        tot_s=tot_s+s
-        terr_s=terr_s+e
-        terr_p=terr_p+(terr_s!=0)
-        if ((i+1)%1==0) : # display progress
-            print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
-    # estimate of the (short or bit) error rate
-    print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
-
-
-
-if __name__ == '__main__':
-    main (sys.argv[1:])
diff --git a/gr-trellis/src/examples/test_tcm2.py b/gr-trellis/src/examples/test_tcm2.py
deleted file mode 100755
index 7f61370179..0000000000
--- a/gr-trellis/src/examples/test_tcm2.py
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/usr/bin/env python
-
-from gnuradio import gr
-from gnuradio import trellis
-from gnuradio import eng_notation
-import math
-import sys
-import random
-import fsm_utils
-
-def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
-    tb = gr.top_block ()
-
-
-    # TX
-    #packet = [0]*Kb
-    #for i in range(Kb-1*16): # last 16 bits = 0 to drive the final state to 0
-        #packet[i] = random.randint(0, 1) # random 0s and 1s
-    #src = gr.vector_source_s(packet,False)
-    src = gr.lfsr_32k_source_s()
-    src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
-    #b2s = gr.unpacked_to_packed_ss(1,gr.GR_MSB_FIRST) # pack bits in shorts
-    s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the FSM input cardinality
-    enc = trellis.encoder_ss(f,0) # initial state = 0
-    mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
-
-    # CHANNEL
-    add = gr.add_ff()
-    noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
-
-    # RX
-    metrics = trellis.metrics_f(f.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for Viterbi
-    va = trellis.viterbi_s(f,K,0,-1) # Put -1 if the Initial/Final states are not set.
-    fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
-    #s2b = gr.packed_to_unpacked_ss(1,gr.GR_MSB_FIRST) # unpack shorts to bits
-    #dst = gr.vector_sink_s(); 
-    dst = gr.check_lfsr_32k_s()
-    
-
-    tb.connect (src,src_head,s2fsmi,enc,mod)
-    #tb.connect (src,b2s,s2fsmi,enc,mod)
-    tb.connect (mod,(add,0))
-    tb.connect (noise,(add,1))
-    tb.connect (add,metrics)
-    tb.connect (metrics,va,fsmi2s,dst)
-    #tb.connect (metrics,va,fsmi2s,s2b,dst)
-    
-
-    tb.run()
-    
-    # A bit of cheating: run the program once and print the 
-    # final encoder state..
-    # Then put it as the last argument in the viterbi block
-    #print "final state = " , enc.ST()
-
-    ntotal = dst.ntotal ()
-    nright = dst.nright ()
-    runlength = dst.runlength ()
-    #ntotal = len(packet)
-    #if len(dst.data()) != ntotal:
-        #print "Error: not enough data\n"
-    #nright = 0;
-    #for i in range(ntotal):
-        #if packet[i]==dst.data()[i]:
-            #nright=nright+1
-        #else:
-            #print "Error in ", i
-    return (ntotal,ntotal-nright)
-
-
-
-
-def main(args):
-    nargs = len (args)
-    if nargs == 2:
-        esn0_db=float(args[0]) # Es/No in dB
-        rep=int(args[1]) # number of times the experiment is run to collect enough errors
-    else:
-        sys.stderr.write ('usage: test_tcm2.py Es/No_db  repetitions\n')
-        sys.exit (1)
-
-    # system parameters
-    f=trellis.fsm(1,2,[5,7]) # generate FSM specification from the generator matrix
-    Kb=1024*16  # packet size in bits (make it multiple of 16 so it can be packed in a short)
-    bitspersymbol = int(round(math.log(f.I())/math.log(2))) # bits per FSM input symbol
-    K=Kb/bitspersymbol # packet size in trellis steps
-    modulation = fsm_utils.psk4 # see fsm_utlis.py for available predefined modulations
-    dimensionality = modulation[0]
-    constellation = modulation[1] 
-    if len(constellation)/dimensionality != f.O():
-        sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n')
-        sys.exit (1)
-    # calculate average symbol energy
-    Es = 0
-    for i in range(len(constellation)):
-        Es = Es + constellation[i]**2
-    Es = Es / (len(constellation)/dimensionality)
-    N0=Es/pow(10.0,esn0_db/10.0); # calculate noise variance
-    
-    tot_s=0 # total number of transmitted shorts
-    terr_s=0 # total number of shorts in error
-    terr_p=0 # total number of packets in error
-    for i in range(rep):
-        (s,e)=run_test(f,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations
-        tot_s=tot_s+s
-        terr_s=terr_s+e
-        terr_p=terr_p+(terr_s!=0)
-        if ((i+1)%100==0) : # display progress
-            print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
-    # estimate of the (short or bit) error rate
-    print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
-
-
-if __name__ == '__main__':
-    main (sys.argv[1:])
diff --git a/gr-trellis/src/examples/test_tcm_bit.py b/gr-trellis/src/examples/test_tcm_bit.py
new file mode 100755
index 0000000000..008e1e6f0e
--- /dev/null
+++ b/gr-trellis/src/examples/test_tcm_bit.py
@@ -0,0 +1,129 @@
+#!/usr/bin/env python
+
+from gnuradio import gr
+from gnuradio import trellis
+from gnuradio import eng_notation
+import math
+import sys
+import random
+import fsm_utils
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+
+
+def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
+    tb = gr.top_block ()
+
+    # TX
+    packet = [0]*Kb
+    # this for loop is TOO slow!!!
+    for i in range(Kb-1*16): # last 16 bits = 0 to drive the final state to 0
+        packet[i] = random.randint(0, 1) # random 0s and 1s
+    src = gr.vector_source_s(packet,False)
+    #src = gr.lfsr_32k_source_s()
+    #src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
+    b2s = gr.unpacked_to_packed_ss(1,gr.GR_MSB_FIRST) # pack bits in shorts
+    s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the FSM input cardinality
+    enc = trellis.encoder_ss(f,0) # initial state = 0
+    mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+
+    
+    # CHANNEL
+    add = gr.add_ff()
+    noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+
+
+    # RX
+    metrics = trellis.metrics_f(f.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for Viterbi
+    va = trellis.viterbi_s(f,K,0,-1) # Put -1 if the Initial/Final states are not set.
+    fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
+    s2b = gr.packed_to_unpacked_ss(1,gr.GR_MSB_FIRST) # unpack shorts to bits
+    dst = gr.vector_sink_s(); 
+    #dst = gr.check_lfsr_32k_s(); 
+    
+
+    #tb.connect (src,src_head,s2fsmi,enc,mod)
+    tb.connect (src,b2s,s2fsmi,enc,mod)
+    tb.connect (mod,(add,0))
+    tb.connect (noise,(add,1))
+    tb.connect (add,metrics)
+    #tb.connect (metrics,va,fsmi2s,dst)
+    tb.connect (metrics,va,fsmi2s,s2b,dst)
+    
+
+    tb.run()
+    
+    # A bit of cheating: run the program once and print the 
+    # final encoder state..
+    # Then put it as the last argument in the viterbi block
+    #print "final state = " , enc.ST()
+
+    #ntotal = dst.ntotal ()
+    #nright = dst.nright ()
+    #runlength = dst.runlength ()
+    ntotal = len(packet)
+    if len(dst.data()) != ntotal:
+        print "Error: not enough data\n"
+    nright = 0;
+    # this for loop is TOO slow!!!
+    for i in range(ntotal):
+        if packet[i]==dst.data()[i]:
+            nright=nright+1
+        #else:
+            #print "Error in ", i
+    return (ntotal,ntotal-nright)
+
+
+
+
+def main():
+    parser = OptionParser(option_class=eng_option)
+    parser.add_option("-f", "--fsm_file", type="string", default="fsm_files/awgn1o2_4.fsm", help="Filename containing the fsm specification, e.g. -f fsm_files/awgn1o2_4.fsm (default=fsm_files/awgn1o2_4.fsm)")
+    parser.add_option("-e", "--esn0", type="eng_float", default=10.0, help="Symbol energy to noise PSD level ratio in dB, e.g., -e 10.0 (default=10.0)")
+    parser.add_option("-r", "--repetitions", type="int", default=100, help="Number of packets to be generated for the simulation, e.g., -r 100 (default=100)")
+
+    (options, args) = parser.parse_args ()
+    if len(args) != 0:
+        parser.print_help()
+        raise SystemExit, 1
+
+    fname=options.fsm_file
+    esn0_db=float(options.esn0)
+    rep=int(options.repetitions)
+
+
+    # system parameters
+    f=trellis.fsm(fname) # get the FSM specification from a file
+    Kb=1024*16  # packet size in bits (make it multiple of 16 so it can be packed in a short)
+    bitspersymbol = int(round(math.log(f.I())/math.log(2))) # bits per FSM input symbol
+    K=Kb/bitspersymbol # packet size in trellis steps
+    modulation = fsm_utils.psk4 # see fsm_utlis.py for available predefined modulations
+    dimensionality = modulation[0]
+    constellation = modulation[1] 
+    if len(constellation)/dimensionality != f.O():
+        sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n')
+        sys.exit (1)
+    # calculate average symbol energy
+    Es = 0
+    for i in range(len(constellation)):
+        Es = Es + constellation[i]**2
+    Es = Es / (len(constellation)/dimensionality)
+    N0=Es/pow(10.0,esn0_db/10.0); # calculate noise variance
+    
+    tot_s=0 # total number of transmitted shorts
+    terr_s=0 # total number of shorts in error
+    terr_p=0 # total number of packets in error
+    for i in range(rep):
+        (s,e)=run_test(f,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations
+        tot_s=tot_s+s
+        terr_s=terr_s+e
+        terr_p=terr_p+(terr_s!=0)
+        if ((i+1)%1==0) : # display progress
+            print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
+    # estimate of the (short or bit) error rate
+    print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s)
+
+
+
+if __name__ == '__main__':
+    main()
diff --git a/gr-trellis/src/examples/test_tcm_combined.py b/gr-trellis/src/examples/test_tcm_combined.py
index 1e3eef0c7f..f9b698ae96 100755
--- a/gr-trellis/src/examples/test_tcm_combined.py
+++ b/gr-trellis/src/examples/test_tcm_combined.py
@@ -6,6 +6,9 @@ from gnuradio import eng_notation
 import math
 import sys
 import fsm_utils
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+
 
 def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
     tb = gr.top_block ()
@@ -51,15 +54,20 @@ def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
 
 
 
-def main(args):
-    nargs = len (args)
-    if nargs == 3:
-        fname=args[0]
-        esn0_db=float(args[1]) # Es/No in dB
-        rep=int(args[2]) # number of times the experiment is run to collect enough errors
-    else:
-        sys.stderr.write ('usage: test_tcm_combined.py fsm_fname  Es/No_db  repetitions\n')
-        sys.exit (1)
+def main():
+    parser = OptionParser(option_class=eng_option)
+    parser.add_option("-f", "--fsm_file", type="string", default="fsm_files/awgn1o2_4.fsm", help="Filename containing the fsm specification, e.g. -f fsm_files/awgn1o2_4.fsm (default=fsm_files/awgn1o2_4.fsm)")
+    parser.add_option("-e", "--esn0", type="eng_float", default=10.0, help="Symbol energy to noise PSD level ratio in dB, e.g., -e 10.0 (default=10.0)")
+    parser.add_option("-r", "--repetitions", type="int", default=100, help="Number of packets to be generated for the simulation, e.g., -r 100 (default=100)")
+
+    (options, args) = parser.parse_args ()
+    if len(args) != 0:
+        parser.print_help()
+        raise SystemExit, 1
+
+    fname=options.fsm_file
+    esn0_db=float(options.esn0)
+    rep=int(options.repetitions)
 
     # system parameters
     f=trellis.fsm(fname) # get the FSM specification from a file (will hopefully be automated in the future...)
@@ -95,5 +103,5 @@ def main(args):
 
 
 if __name__ == '__main__':
-    main (sys.argv[1:])
+    main()
 
diff --git a/gr-trellis/src/examples/test_tcm_parallel.py b/gr-trellis/src/examples/test_tcm_parallel.py
index f1ed6f1b36..94761fd011 100755
--- a/gr-trellis/src/examples/test_tcm_parallel.py
+++ b/gr-trellis/src/examples/test_tcm_parallel.py
@@ -6,6 +6,9 @@ from gnuradio import eng_notation
 import math
 import sys
 import fsm_utils
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+
 
 def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed,P):
     tb = gr.top_block ()
@@ -57,15 +60,20 @@ def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed,P):
 
 
 
-def main(args):
-    nargs = len (args)
-    if nargs == 3:
-        fname=args[0]
-        esn0_db=float(args[1]) # Es/No in dB
-        rep=int(args[2]) # number of times the experiment is run to collect enough errors
-    else:
-        sys.stderr.write ('usage: test_tcm.py fsm_fname Es/No_db  repetitions\n')
-        sys.exit (1)
+def main():
+    parser = OptionParser(option_class=eng_option)
+    parser.add_option("-f", "--fsm_file", type="string", default="fsm_files/awgn1o2_4.fsm", help="Filename containing the fsm specification, e.g. -f fsm_files/awgn1o2_4.fsm (default=fsm_files/awgn1o2_4.fsm)")
+    parser.add_option("-e", "--esn0", type="eng_float", default=10.0, help="Symbol energy to noise PSD level ratio in dB, e.g., -e 10.0 (default=10.0)")
+    parser.add_option("-r", "--repetitions", type="int", default=100, help="Number of packets to be generated for the simulation, e.g., -r 100 (default=100)")
+
+    (options, args) = parser.parse_args ()
+    if len(args) != 0:
+        parser.print_help()
+        raise SystemExit, 1
+
+    fname=options.fsm_file
+    esn0_db=float(options.esn0)
+    rep=int(options.repetitions)
 
     # system parameters
     f=trellis.fsm(fname) # get the FSM specification from a file
@@ -101,5 +109,5 @@ def main(args):
 
 
 if __name__ == '__main__':
-    main (sys.argv[1:])
+    main()
 
-- 
cgit v1.2.3


From 024c79a7fb13c08bae7b97079a245f711ecf12a7 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sun, 5 Jun 2011 15:36:00 -0400
Subject: trellis: fixed Makefile by removing non-existant file names.

---
 gr-trellis/src/examples/Makefile.am | 2 --
 1 file changed, 2 deletions(-)

(limited to 'gr-trellis/src/examples')

diff --git a/gr-trellis/src/examples/Makefile.am b/gr-trellis/src/examples/Makefile.am
index 8fb727acd2..92aeadfad0 100644
--- a/gr-trellis/src/examples/Makefile.am
+++ b/gr-trellis/src/examples/Makefile.am
@@ -31,8 +31,6 @@ dist_ourdata_DATA =	\
 dist_ourdata_SCRIPTS =			\
 	fsm_utils.py			\
 	test_tcm.py			\
-	test_tcm1.py			\
-	test_tcm2.py          		\
 	test_tcm_parallel.py		\
 	test_tcm_combined.py		\
 	test_sccc_hard.py		\
-- 
cgit v1.2.3