From f8ccc154d7f860d0b9c52c451a2ec7cf0fbc41d9 Mon Sep 17 00:00:00 2001
From: Nick McCarthy <namccart@gmail.com>
Date: Fri, 28 Mar 2014 14:54:55 -0700
Subject: fec: improved fecapi stuff.

Fixes for frame lengths, (de)interleave usage, generic conv volk kernel.
---
 gr-fec/lib/cc_decoder_impl.cc | 109 ++++++++++++++----------------------------
 1 file changed, 36 insertions(+), 73 deletions(-)

(limited to 'gr-fec/lib/cc_decoder_impl.cc')

diff --git a/gr-fec/lib/cc_decoder_impl.cc b/gr-fec/lib/cc_decoder_impl.cc
index e09064c3bc..e8d8671e5f 100644
--- a/gr-fec/lib/cc_decoder_impl.cc
+++ b/gr-fec/lib/cc_decoder_impl.cc
@@ -76,33 +76,18 @@ namespace gr {
 
         d_decision_t_size = d_numstates/8; //packed bit array
 
+        d_managed_in_size = 0;
         if(d_tailbiting) {
           d_end_state = &d_end_state_chaining;
           d_veclen = d_framebits + (6 * (d_k - 1));
           d_managed_in = (COMPUTETYPE*)volk_malloc(d_veclen*d_rate*sizeof(COMPUTETYPE),
                                                    volk_get_alignment());
-          if(d_managed_in) {
-            printf("allocation failed\n");
-            exit(1);
+          d_managed_in_size = d_veclen * d_rate;
+          if(d_managed_in == NULL) {
+            throw std::runtime_error("bad alloc for d_managed_in!\n");
           }
         }
-        /*
-        else if(d_trunc_intrinsic) {
-          d_end_state = &d_end_state_nonchaining;
-          d_veclen = d_framebits + d_k - 1;
-          if(posix_memalign((void**)&d_managed_in, 16, d_veclen * d_rate * sizeof(COMPUTETYPE))){
-            printf("allocation failed\n");
-            exit(1);
-          }
-          int cnt = 0;
-          for(int i = 0; i < d_rate; ++i) {
-            if (d_polys[i] != 1) {
-              cnt++;
-            }
-          }
-          d_partial_rate = cnt;
-        }
-        */
+        
         else if(d_truncated) {
           d_end_state = &d_end_state_chaining;
           d_veclen = d_framebits;
@@ -118,24 +103,30 @@ namespace gr {
           d_veclen = d_framebits + d_k - 1;
         }
 
-        if(posix_memalign((void**)&d_vp->metrics, 16, 2 * d_numstates * sizeof(COMPUTETYPE))) {
-          printf("allocation failed\n");
-          exit(1);
+        d_vp->metrics = (COMPUTETYPE*) volk_malloc(2 * sizeof(COMPUTETYPE) * d_numstates, volk_get_alignment());
+        if(d_vp->metrics == NULL) {
+          throw std::runtime_error("bad alloc for d_vp->metrics!\n");
         }
 
+        
+
         d_vp->metrics1.t = d_vp->metrics;
         d_vp->metrics2.t = d_vp->metrics + d_numstates;
 
-        if(posix_memalign((void**)&d_vp->decisions, 16,d_veclen*d_decision_t_size)) {
-          printf("allocation failed\n");
-          exit(1);
+        d_vp->decisions = (DECISIONTYPE*) volk_malloc(d_veclen*d_decision_t_size, volk_get_alignment());
+        if(d_vp->decisions == NULL) {
+          throw std::runtime_error("bad alloc for d_vp->decisions!\n");
         }
 
-        if(posix_memalign((void**)&Branchtab, 16, sizeof(COMPUTETYPE) * d_numstates/2*rate)) {
-          printf("allocation failed\n");
-          exit(1);
+        
+
+        Branchtab = (COMPUTETYPE*) volk_malloc(sizeof(COMPUTETYPE) * d_numstates/2*rate, volk_get_alignment());
+        if(Branchtab == NULL) {
+          throw std::runtime_error("bad alloc for d_vp->decisions!\n");
         }
 
+        
+
         create_viterbi();
 
         if(d_k-1<8) {
@@ -182,17 +173,7 @@ namespace gr {
         if(d_terminated) {
           return d_rate * (d_framebits + d_k - 1);
         }
-        /*
-        else if(d_trunc_intrinsic) {
-          int cnt = 0;
-          for(int i = 0; i < d_rate; ++i) {
-            if (d_polys[i] != 1) {
-              cnt++;
-            }
-          }
-          return (d_rate * (d_framebits)) + (cnt * (d_k - 1));
-        }
-        */
+        
         else {
           return d_rate * d_framebits;
         }
@@ -215,9 +196,7 @@ namespace gr {
         }
       }
 
-      /*const char* cc_decoder_impl::get_output_conversion() {
-        return "unpack";
-        }*/
+      
 
       float
       cc_decoder_impl::get_shift()
@@ -330,7 +309,8 @@ namespace gr {
       int
       cc_decoder_impl::find_endstate()
       {
-        COMPUTETYPE* met = (d_k%2 == 0)? d_vp->new_metrics.t : d_vp->old_metrics.t;
+        COMPUTETYPE* met = ((d_k + d_veclen)%2 == 0)? d_vp->new_metrics.t : d_vp->old_metrics.t;
+
         COMPUTETYPE min = met[0];
         int state = 0;
         for(int i = 1; i < d_numstates; ++i) {
@@ -338,7 +318,10 @@ namespace gr {
             min = met[i];
             state = i;
           }
+
+          
         }
+        //printf("min %d\n", state);
         return state;
       }
 
@@ -348,11 +331,11 @@ namespace gr {
         DECISIONTYPE *d;
 
         d = d_vp->decisions;
-        //going to have to use nbits for tailbiting?
-        //memset(d,0,d_decision_t_size * (d_framebits+d_k-1));//use volk here?
-        memset(d,0,d_decision_t_size * nbits);//use volk here?
 
-        //d_kernel( d_vp->new_metrics.t, d_vp->old_metrics.t, syms, d, d_framebits, d_k - 1, Branchtab);
+        
+        memset(d,0,d_decision_t_size * nbits);
+
+
         d_kernel( d_vp->new_metrics.t, d_vp->old_metrics.t, syms, d, nbits - (d_k - 1), d_k -1, Branchtab);
 
         return 0;
@@ -418,6 +401,9 @@ namespace gr {
         d_framebits = framebits;
         if(d_tailbiting) {
           d_veclen = d_framebits + (6 * (d_k - 1));
+          if(d_veclen * d_rate > d_managed_in_size) {
+            throw std::runtime_error("attempt to resize beyond d_managed_in buffer size!\n");
+          }
         }
         else if(d_truncated) {
           d_veclen = d_framebits;
@@ -446,30 +432,7 @@ namespace gr {
           init_viterbi_unbiased(d_vp);
         }
 
-        /*
-        else if(d_trunc_intrinsic) {
-          memcpy(d_managed_in, in, d_framebits * d_rate * sizeof(COMPUTETYPE));
-          for(int i = 0; i < (d_k - 1); ++i) {
-            int cnt = 0;
-            for(int j = 0; j < d_rate; ++j) {
-              if(d_polys[j] != 1) {
-
-                d_managed_in[(d_framebits * d_rate) + (i * d_rate) + j] =
-                  in[(d_framebits * d_rate) + (i * d_partial_rate) + cnt++];
-              }
-              else {
-
-                d_managed_in[(d_framebits * d_rate) + (i * d_rate) + j] =
-                  (((*d_end_state) >> (d_k - 2 - i)) & 1) * ((1 << (sizeof(COMPUTETYPE) * 8)) - 1);
-              }
-            }
-          }
-          update_viterbi_blk(d_managed_in, d_veclen);
-          d_end_state_chaining = find_endstate();
-          chainback_viterbi(&out[0], d_framebits, *d_end_state, d_veclen - d_framebits);
-          init_viterbi(d_vp, *d_start_state);
-        }
-        */
+        
 
         else if(d_truncated) {
           update_viterbi_blk((COMPUTETYPE*)(&in[0]), d_veclen);
@@ -490,7 +453,7 @@ namespace gr {
         else {
           update_viterbi_blk((COMPUTETYPE*)(&in[0]), d_veclen);
           d_end_state_chaining = find_endstate();
-          //printf("es: %d\n", d_end_state_chaining);
+          //printf("es: %d, %d\n", d_end_state_chaining, *d_end_state);
           d_start_state_chaining = chainback_viterbi(&out[0], d_framebits, *d_end_state,
                                                      d_veclen - d_framebits);
 
-- 
cgit v1.2.3