commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] gr-error-correcting-codes/src/lib/libecc code_c...


From: Michael Dickens
Subject: [Commit-gnuradio] gr-error-correcting-codes/src/lib/libecc code_c...
Date: Wed, 02 Aug 2006 02:55:09 +0000

CVSROOT:        /sources/gnuradio
Module name:    gr-error-correcting-codes
Changes by:     Michael Dickens <michaelld>     06/08/02 02:55:09

Modified files:
        src/lib/libecc : code_convolutional_trellis.cc 
                         code_convolutional_trellis.h code_metrics.h 

Log message:
        Changed trellis output bits storage from a std::vector<char>, 1 bit
        per entry, to a single "memory_t" (unsigned long) in order to make
        decoding easier and faster.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gr-error-correcting-codes/src/lib/libecc/code_convolutional_trellis.cc?cvsroot=gnuradio&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/gr-error-correcting-codes/src/lib/libecc/code_convolutional_trellis.h?cvsroot=gnuradio&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/gr-error-correcting-codes/src/lib/libecc/code_metrics.h?cvsroot=gnuradio&r1=1.5&r2=1.6

Patches:
Index: code_convolutional_trellis.cc
===================================================================
RCS file: 
/sources/gnuradio/gr-error-correcting-codes/src/lib/libecc/code_convolutional_trellis.cc,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- code_convolutional_trellis.cc       2 Aug 2006 02:03:20 -0000       1.4
+++ code_convolutional_trellis.cc       2 Aug 2006 02:55:09 -0000       1.5
@@ -555,10 +555,6 @@
 
   for (size_t m = 0; m < d_n_states; m++) {
     d_trellis[m].resize (d_n_input_combinations);
-    for (size_t n = 0; n < d_n_input_combinations; n++) {
-      connection_t_ptr t_connection = &(d_trellis[m][n]);
-      t_connection->d_output_bits.resize (d_n_code_outputs);
-    }
   }
 
   // fill in the trellis
@@ -571,7 +567,9 @@
       if (DO_PRINT_DEBUG_ENCODE) {
        std::cout << "set d_t[" << n2bs(m,d_total_n_delays) << "][" <<
          n2bs(n,d_n_code_inputs) << "] : to_st = " <<
-         n2bs(t_connection->d_to_state,d_total_n_delays) << "\n";
+         n2bs(t_connection->d_to_state,d_total_n_delays) <<
+         ", o_b = " << n2bs(t_connection->d_output_bits,d_n_code_outputs) <<
+         "\n";
       }
     }
   }
@@ -643,11 +641,33 @@
 }
 
 void
+code_convolutional_trellis::demux_outputs
+(memory_t outputs,
+ std::vector<char>& out_vec)
+{
+  for (size_t m = 0; m < d_n_code_outputs; m++, outputs >>= 1) {
+    out_vec[m] = (char)(outputs & 1);
+  }
+}
+
+memory_t
+code_convolutional_trellis::mux_outputs
+(const std::vector<char>& out_vec)
+{
+  size_t bit_shift = 0;
+  memory_t outputs = 0;
+  for (size_t m = 0; m < out_vec.size(); m++, bit_shift++) {
+    outputs |= (((memory_t)(out_vec[m]&1)) << bit_shift);
+  }
+  return (outputs);
+}
+
+void
 code_convolutional_trellis::encode_single
 (memory_t in_state,
  memory_t inputs,
  memory_t& out_state,
- std::vector<char>& out_bits)
+ memory_t& out_bits)
 {
   // set input parameters
 
@@ -673,39 +693,39 @@
   // retrieve the output parameters
 
   out_state = mux_state (d_memory);
-  out_bits = d_current_outputs;
+  out_bits = mux_outputs (d_current_outputs);
 }
 
 void
 code_convolutional_trellis::encode_lookup
 (memory_t& state,
  const std::vector<char>& inputs,
- std::vector<char>& out_bits)
+ memory_t& out_bits)
 {
-  if (DO_PRINT_DEBUG_ENCODE) {
-    std::cout << "using d_t[" << state << "][" << mux_inputs(inputs) <<
-      "] = ";
-    std::cout.flush ();
-  }
-
   connection_t_ptr t_connection = &(d_trellis[state][mux_inputs(inputs)]);
-
-  if (DO_PRINT_DEBUG_ENCODE) {
-    std::cout << t_connection << ": to_state = "
-             << t_connection->d_to_state << "\n";
-  }
-
   state = t_connection->d_to_state;
   out_bits = t_connection->d_output_bits;
 }
 
 void
+code_convolutional_trellis::encode_lookup
+(memory_t& state,
+ const std::vector<char>& inputs,
+ std::vector<char>& out_bits)
+{
+  connection_t_ptr t_connection = &(d_trellis[state][mux_inputs(inputs)]);
+  state = t_connection->d_to_state;
+  demux_outputs (t_connection->d_output_bits, out_bits);
+}
+
+void
 code_convolutional_trellis::get_termination_inputs
 (memory_t term_start_state,
  size_t bit_num,
  std::vector<char>& inputs)
 {
 #if 1
+  // for now, just assign all 0's
   inputs.assign (d_n_code_inputs, 0);
 #else
   for (size_t m = 0; m < d_n_code_inputs; m++) {

Index: code_convolutional_trellis.h
===================================================================
RCS file: 
/sources/gnuradio/gr-error-correcting-codes/src/lib/libecc/code_convolutional_trellis.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- code_convolutional_trellis.h        1 Aug 2006 19:02:35 -0000       1.2
+++ code_convolutional_trellis.h        2 Aug 2006 02:55:09 -0000       1.3
@@ -32,12 +32,12 @@
  *
  * d_to_state: memory configuration of the "to" state
  *
- * d_output_bits: the output bits for this connection
+ * d_output_bits: the output bits for this connection, mux'ed
  */
 
 typedef struct connection_t {
   memory_t d_to_state;
-  std::vector<char> d_output_bits;
+  memory_t d_output_bits;
 } connection_t, *connection_t_ptr;
 
 /*
@@ -167,14 +167,25 @@
                               size_t bit_num,
                               std::vector<char>& inputs);
 
+  // encode_lookup: given the starting state and inputs, return the
+  // resulting state and output bits.  Two versions: the first is
+  // better for decoding, while the second is better for encoding.
+
+  void encode_lookup (memory_t& state,
+                     const std::vector<char>& inputs,
+                     memory_t& out_bits);
   void encode_lookup (memory_t& state,
                      const std::vector<char>& inputs,
                      std::vector<char>& out_bits);
 
+  // methods for setting and retrieving the state, inputs, and outputs.
+
   void demux_state (memory_t in_state, std::vector<memory_t>& memories);
   memory_t mux_state (const std::vector<memory_t>& memories);
   void demux_inputs (memory_t inputs, std::vector<char>& in_vec);
   memory_t mux_inputs (const std::vector<char>& in_vec);
+  void demux_outputs (memory_t outputs, std::vector<char>& out_vec);
+  memory_t mux_outputs (const std::vector<char>& out_vec);
 
 protected:
 #if 0
@@ -269,7 +280,7 @@
   void encode_single (memory_t in_state,
                      memory_t inputs,
                      memory_t& out_state,
-                     std::vector<char>& out_bits);
+                     memory_t& out_bits);
   virtual void encode_single_soai ();
   virtual void encode_single_siao ();
   virtual void encode_single_soai_fb ();

Index: code_metrics.h
===================================================================
RCS file: 
/sources/gnuradio/gr-error-correcting-codes/src/lib/libecc/code_metrics.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- code_metrics.h      2 Aug 2006 01:28:44 -0000       1.5
+++ code_metrics.h      2 Aug 2006 02:55:09 -0000       1.6
@@ -88,10 +88,6 @@
  * values below and above which symbol values are truncated.
  * Internally, a sub-n_samples value is determined and used to "sum"
  * the PDF functions to divide the probabilities into "bins".
- *
- * The "n_code_outputs" is needed to compute the trellis combined
- * metric for the given received code-output values (including any
- * noise and other channel effects) and all possible bit-output values.
  */
 
 public:




reply via email to

[Prev in Thread] Current Thread [Next in Thread]