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/lib/core_algorithms.cc | 134 ++++++++++++++++++++++++++++++++++
 1 file changed, 134 insertions(+)

(limited to 'gr-trellis/src/lib/core_algorithms.cc')

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
+);
+
-- 
cgit v1.2.3