summaryrefslogtreecommitdiff
path: root/gr-fec/lib/tpc_common.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-fec/lib/tpc_common.cc')
-rw-r--r--gr-fec/lib/tpc_common.cc82
1 files changed, 82 insertions, 0 deletions
diff --git a/gr-fec/lib/tpc_common.cc b/gr-fec/lib/tpc_common.cc
new file mode 100644
index 0000000000..d8b2e17a75
--- /dev/null
+++ b/gr-fec/lib/tpc_common.cc
@@ -0,0 +1,82 @@
+/**
+ * This code borrows from the CML library for the CC Encode functionality,
+ * and for the RSC_Encode functionality. Please have a look @:
+ * https://code.google.com/p/iscml
+ *
+ */
+
+#include <gnuradio/fec/tpc_common.h>
+
+namespace gr {
+ namespace fec {
+
+int tpc_common::parity_counter( int symbol, int length ) {
+ int counter;
+ int temp_parity = 0;
+
+ for (counter=0;counter<length;counter++) {
+ temp_parity = temp_parity^(symbol&1);
+ symbol = symbol>>1;
+ }
+
+ return( temp_parity );
+}
+
+void tpc_common::rsc_enc_bit(int input, int state_in, std::vector<int> g, int KK, int nn,
+ std::vector< std::vector<int> > &outputVec, std::vector< std::vector<int> > &nextStateVec) {
+ int state, i, out, a_k;
+
+ // systematic output
+ out = input;
+
+ // determine feedback bit
+ a_k = input^tpc_common::parity_counter( g[0]&state_in, KK );
+
+ // create a word made up of state and feedback bit
+ state = (a_k<<(KK-1))^state_in;
+
+ // AND the word with the generators
+ for (i=1;i<nn;i++) {
+ // update output symbol
+ out = (out<<1) + tpc_common::parity_counter( state&g[i], KK );
+ }
+
+ outputVec[input][state_in] = out;
+ nextStateVec[input][state_in] = (state>>1);
+}
+
+void tpc_common::precomputeStateTransitionMatrix_RSCPoly(
+ int numStates,
+ std::vector<int> g,
+ int KK,
+ int nn,
+ std::vector< std::vector<int> > &output,
+ std::vector< std::vector<int> > &nextStates) {
+
+ for(int input=0; input<2; input++) {
+ for(int state=0; state<numStates; state++) {
+ tpc_common::rsc_enc_bit(input, state, g, KK, nn, output, nextStates);
+ }
+ }
+}
+
+void tpc_common::rsc_tail( std::vector<int> &tail_p, std::vector<int> g, int max_states, int mm ) {
+ // Determine the tail for each state
+ for(int state=0;state<max_states;state++) {
+ // determine feedback word
+ tail_p[state] = tpc_common::parity_counter( g[0]&state, mm );
+ }
+ return;
+}
+
+void tpc_common::itob(std::vector<int> &binVec, int symbol, int length) {
+ /// Go through each bit in the vector
+ for (int counter=0;counter<length;counter++) {
+ binVec[length-counter-1] = (symbol&1);
+ symbol = symbol>>1;
+ }
+
+}
+
+}
+}