[Top][All Lists]
[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: