summaryrefslogtreecommitdiff
path: root/gr-trellis/src
diff options
context:
space:
mode:
authoranastas2006-08-11 10:27:46 +0000
committeranastas2006-08-11 10:27:46 +0000
commit8e8f22dda66b63ee58a25f1052cd197779f164dc (patch)
treec4c317c44a7c2984f846f54153a3470656f69e9e /gr-trellis/src
parent954e2976e43507479e0bc5d1526e555627117125 (diff)
downloadgnuradio-8e8f22dda66b63ee58a25f1052cd197779f164dc.tar.gz
gnuradio-8e8f22dda66b63ee58a25f1052cd197779f164dc.tar.bz2
gnuradio-8e8f22dda66b63ee58a25f1052cd197779f164dc.zip
Added support for concatenated codes
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@3234 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'gr-trellis/src')
-rw-r--r--gr-trellis/src/lib/Makefile.gen6
-rw-r--r--gr-trellis/src/lib/generate_common.py2
-rw-r--r--gr-trellis/src/lib/interleaver.cc12
-rw-r--r--gr-trellis/src/lib/quicksort_index.cc37
-rw-r--r--gr-trellis/src/lib/quicksort_index.h1
-rw-r--r--gr-trellis/src/lib/trellis.i1
-rw-r--r--gr-trellis/src/lib/trellis_calc_metric.cc92
-rw-r--r--gr-trellis/src/lib/trellis_calc_metric.h4
-rw-r--r--gr-trellis/src/lib/trellis_generated.i4
-rw-r--r--gr-trellis/src/lib/trellis_metrics_X.cc.t6
-rw-r--r--gr-trellis/src/lib/trellis_metrics_c.cc4
-rw-r--r--gr-trellis/src/lib/trellis_metrics_f.cc6
-rw-r--r--gr-trellis/src/lib/trellis_metrics_i.cc100
-rw-r--r--gr-trellis/src/lib/trellis_metrics_i.h65
-rw-r--r--gr-trellis/src/lib/trellis_metrics_i.i39
-rw-r--r--gr-trellis/src/lib/trellis_metrics_i.lo12
-rw-r--r--gr-trellis/src/lib/trellis_metrics_s.cc100
-rw-r--r--gr-trellis/src/lib/trellis_metrics_s.h65
-rw-r--r--gr-trellis/src/lib/trellis_metrics_s.i39
-rw-r--r--gr-trellis/src/lib/trellis_metrics_s.lo12
-rwxr-xr-xgr-trellis/src/python/qa_trellis.py14
21 files changed, 605 insertions, 16 deletions
diff --git a/gr-trellis/src/lib/Makefile.gen b/gr-trellis/src/lib/Makefile.gen
index 9c0ddf9ea..7a47ea3a7 100644
--- a/gr-trellis/src/lib/Makefile.gen
+++ b/gr-trellis/src/lib/Makefile.gen
@@ -10,6 +10,8 @@ GENERATED_H = \
trellis_encoder_ss.h \
trellis_metrics_c.h \
trellis_metrics_f.h \
+ trellis_metrics_i.h \
+ trellis_metrics_s.h \
trellis_viterbi_b.h \
trellis_viterbi_combined_b.h \
trellis_viterbi_combined_i.h \
@@ -26,6 +28,8 @@ GENERATED_I = \
trellis_encoder_ss.i \
trellis_metrics_c.i \
trellis_metrics_f.i \
+ trellis_metrics_i.i \
+ trellis_metrics_s.i \
trellis_viterbi_b.i \
trellis_viterbi_combined_b.i \
trellis_viterbi_combined_i.i \
@@ -42,6 +46,8 @@ GENERATED_CC = \
trellis_encoder_ss.cc \
trellis_metrics_c.cc \
trellis_metrics_f.cc \
+ trellis_metrics_i.cc \
+ trellis_metrics_s.cc \
trellis_viterbi_b.cc \
trellis_viterbi_combined_b.cc \
trellis_viterbi_combined_i.cc \
diff --git a/gr-trellis/src/lib/generate_common.py b/gr-trellis/src/lib/generate_common.py
index c7bb6c865..ee744b8e1 100644
--- a/gr-trellis/src/lib/generate_common.py
+++ b/gr-trellis/src/lib/generate_common.py
@@ -35,7 +35,7 @@ other_roots = [
]
other_signatures = (
['bb','bs','bi','ss','si','ii'],
- ['f','c'],
+ ['s','i','f','c'],
['b','s','i'],
['b','s','i'],
)
diff --git a/gr-trellis/src/lib/interleaver.cc b/gr-trellis/src/lib/interleaver.cc
index 427db72e3..042dc04ba 100644
--- a/gr-trellis/src/lib/interleaver.cc
+++ b/gr-trellis/src/lib/interleaver.cc
@@ -22,6 +22,7 @@
#include <cstdlib>
#include <cstdio>
+#include <iostream>
#include <stdexcept>
#include <cmath>
#include "quicksort_index.h"
@@ -90,19 +91,18 @@ interleaver::interleaver(const int K, unsigned int seed)
d_INTER.resize(d_K);
d_DEINTER.resize(d_K);
- std::runtime_error ("Not yet implemented: something wrong with quicksort\n");
-/*
srand(seed);
std::vector<int> tmp(d_K);
- for(int i=0;i<d_K;i++)
- //d_INTER[i]=i;
+ for(int i=0;i<d_K;i++) {
+ d_INTER[i]=i;
tmp[i] = rand();
- quicksort_index <int> (tmp,d_INTER,0,d_K);
+ }
+ //quicksort_index <int> (tmp,d_INTER,0,d_K-1); got to resolve this...
+ quicksort_index1 (tmp,d_INTER,0,d_K-1);
// generate DEINTER table
for(int i=0;i<d_K;i++) {
d_DEINTER[d_INTER[i]]=i;
}
-*/
}
diff --git a/gr-trellis/src/lib/quicksort_index.cc b/gr-trellis/src/lib/quicksort_index.cc
index 705aeebed..0ab63ebbe 100644
--- a/gr-trellis/src/lib/quicksort_index.cc
+++ b/gr-trellis/src/lib/quicksort_index.cc
@@ -29,14 +29,14 @@ a=b;
b=temp;
}
+
template <class T> void quicksort_index(std::vector<T> & p, std::vector<int> & index, int left, int right)
{
-T pivot;
if (left < right) {
int i = left;
int j = right + 1;
- pivot = p[left];
+ T pivot = p[left];
do {
do
i++;
@@ -51,7 +51,36 @@ if (left < right) {
} while (i < j);
SWAP <T> (p[left], p[j]);
SWAP <int> (index[left], index[j]);
- quicksort_index(p,index, left, j-1);
- quicksort_index(p,index, j+1, right);
+ quicksort_index <T> (p,index, left, j-1);
+ quicksort_index <T> (p,index, j+1, right);
+}
+}
+
+
+
+void quicksort_index1(std::vector<int> & p, std::vector<int> & index, int left, int right)
+{
+
+if (left < right) {
+ int i = left;
+ int j = right + 1;
+ int pivot = p[left];
+ do {
+ do
+ i++;
+ while ((p[i] < pivot) && (i < right));
+ do
+ j--;
+ while ((p[j] > pivot) && (j > left));
+ if (i < j) {
+ SWAP <int> (p[i],p[j]);
+ SWAP <int> (index[i],index[j]);
+ }
+ } while (i < j);
+ SWAP <int> (p[left], p[j]);
+ SWAP <int> (index[left], index[j]);
+ quicksort_index1 (p,index, left, j-1);
+ quicksort_index1 (p,index, j+1, right);
}
}
+
diff --git a/gr-trellis/src/lib/quicksort_index.h b/gr-trellis/src/lib/quicksort_index.h
index 9a0e65905..10d36f619 100644
--- a/gr-trellis/src/lib/quicksort_index.h
+++ b/gr-trellis/src/lib/quicksort_index.h
@@ -27,5 +27,6 @@
template <class T> void SWAP (T & a, T & b);
template <class T> void quicksort_index(std::vector<T> & p, std::vector<int> & index, int left, int right);
+void quicksort_index1(std::vector<int> & p, std::vector<int> & index, int left, int right);
#endif
diff --git a/gr-trellis/src/lib/trellis.i b/gr-trellis/src/lib/trellis.i
index 2db07ed1d..bd3144119 100644
--- a/gr-trellis/src/lib/trellis.i
+++ b/gr-trellis/src/lib/trellis.i
@@ -8,7 +8,6 @@
%{
#include "gnuradio_swig_bug_workaround.h" // mandatory bug fix
#include "fsm.h"
-#include "quicksort_index.h"
#include "interleaver.h"
#include "trellis_permutation.h"
#include <stdexcept>
diff --git a/gr-trellis/src/lib/trellis_calc_metric.cc b/gr-trellis/src/lib/trellis_calc_metric.cc
index c6d2ce98c..ae25a67ba 100644
--- a/gr-trellis/src/lib/trellis_calc_metric.cc
+++ b/gr-trellis/src/lib/trellis_calc_metric.cc
@@ -24,7 +24,95 @@
#include <stdexcept>
#include "trellis_calc_metric.h"
-// soft decisions (Eucledean distance squared)
+// soft decisions (Euclidean distance squared)
+void calc_metric_s(const int O, const int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type)
+{
+ float minm = FLT_MAX;
+ int minmi = 0;
+
+ switch (type){
+ case TRELLIS_EUCLIDEAN:
+ for(int o=0;o<O;o++) {
+ metric[o]=0.0;
+ for (int m=0;m<D;m++) {
+ float s=in[m]-TABLE[o*D+m];
+ metric[o]+=s*s;
+ }
+ }
+ break;
+ case TRELLIS_HARD_SYMBOL:
+ for(int o=0;o<O;o++) {
+ metric[o]=0.0;
+ for (int m=0;m<D;m++) {
+ float s=in[m]-TABLE[o*D+m];
+ metric[o]+=s*s;
+ }
+ if(metric[o]<minm) {
+ minm=metric[o];
+ minmi=o;
+ }
+ }
+ for(int o=0;o<O;o++) {
+ metric[o] = (o==minmi?0.0:1.0);
+ }
+ break;
+ case TRELLIS_HARD_BIT:
+ throw std::runtime_error ("Invalid metric type (not yet implemented).");
+ break;
+ default:
+ throw std::runtime_error ("Invalid metric type.");
+ }
+}
+
+
+
+// soft decisions (Euclidean distance squared)
+void calc_metric_i(const int O, const int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type)
+{
+ float minm = FLT_MAX;
+ int minmi = 0;
+
+ switch (type){
+ case TRELLIS_EUCLIDEAN:
+ for(int o=0;o<O;o++) {
+ metric[o]=0.0;
+ for (int m=0;m<D;m++) {
+ float s=in[m]-TABLE[o*D+m];
+ metric[o]+=s*s;
+ }
+ }
+ break;
+ case TRELLIS_HARD_SYMBOL:
+ for(int o=0;o<O;o++) {
+ metric[o]=0.0;
+ for (int m=0;m<D;m++) {
+ float s=in[m]-TABLE[o*D+m];
+ metric[o]+=s*s;
+ }
+ if(metric[o]<minm) {
+ minm=metric[o];
+ minmi=o;
+ }
+ }
+ for(int o=0;o<O;o++) {
+ metric[o] = (o==minmi?0.0:1.0);
+ }
+ break;
+ case TRELLIS_HARD_BIT:
+ throw std::runtime_error ("Invalid metric type (not yet implemented).");
+ break;
+ default:
+ throw std::runtime_error ("Invalid metric type.");
+ }
+}
+
+
+
+
+
+
+
+// soft decisions (Euclidean distance squared)
void calc_metric_f(const int O, const int D, const std::vector<float> &TABLE, const float *in, float *metric, trellis_metric_type_t type)
{
float minm = FLT_MAX;
@@ -65,7 +153,7 @@ void calc_metric_f(const int O, const int D, const std::vector<float> &TABLE, co
}
-// soft decisions (Eucledean distance squared)
+// soft decisions (Euclidean distance squared)
void calc_metric_c(const int O, const int D, const std::vector<gr_complex> &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type)
{
float minm = FLT_MAX;
diff --git a/gr-trellis/src/lib/trellis_calc_metric.h b/gr-trellis/src/lib/trellis_calc_metric.h
index 5375070f8..1e1805322 100644
--- a/gr-trellis/src/lib/trellis_calc_metric.h
+++ b/gr-trellis/src/lib/trellis_calc_metric.h
@@ -27,6 +27,10 @@
#include <gr_complex.h>
#include <trellis_metric_type.h>
+void calc_metric_s(const int O, const int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type);
+
+void calc_metric_i(const int O, const int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type);
+
void calc_metric_f(const int O, const int D, const std::vector<float> &TABLE, const float *in, float *metric, trellis_metric_type_t type);
void calc_metric_c(const int O, const int D, const std::vector<gr_complex> &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type);
diff --git a/gr-trellis/src/lib/trellis_generated.i b/gr-trellis/src/lib/trellis_generated.i
index c76e79c5c..464ffacb3 100644
--- a/gr-trellis/src/lib/trellis_generated.i
+++ b/gr-trellis/src/lib/trellis_generated.i
@@ -10,6 +10,8 @@
#include <trellis_encoder_ss.h>
#include <trellis_metrics_c.h>
#include <trellis_metrics_f.h>
+#include <trellis_metrics_i.h>
+#include <trellis_metrics_s.h>
#include <trellis_viterbi_b.h>
#include <trellis_viterbi_combined_b.h>
#include <trellis_viterbi_combined_i.h>
@@ -26,6 +28,8 @@
%include <trellis_encoder_ss.i>
%include <trellis_metrics_c.i>
%include <trellis_metrics_f.i>
+%include <trellis_metrics_i.i>
+%include <trellis_metrics_s.i>
%include <trellis_viterbi_b.i>
%include <trellis_viterbi_combined_b.i>
%include <trellis_viterbi_combined_i.i>
diff --git a/gr-trellis/src/lib/trellis_metrics_X.cc.t b/gr-trellis/src/lib/trellis_metrics_X.cc.t
index d5347e12d..2dd1adb12 100644
--- a/gr-trellis/src/lib/trellis_metrics_X.cc.t
+++ b/gr-trellis/src/lib/trellis_metrics_X.cc.t
@@ -83,7 +83,11 @@ for (int m=0;m<nstreams;m++) {
float *out = (float *) output_items[m];
for (int i = 0; i < noutput_items / d_O ; i++){
-#if @IS_FLOAT@
+#if @IS_SHORT@
+ calc_metric_s(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif @IS_INT@
+ calc_metric_i(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif @IS_FLOAT@
calc_metric_f(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
#elif @IS_COMPLEX@
calc_metric_c(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
diff --git a/gr-trellis/src/lib/trellis_metrics_c.cc b/gr-trellis/src/lib/trellis_metrics_c.cc
index 1ff5f4540..ea1808e83 100644
--- a/gr-trellis/src/lib/trellis_metrics_c.cc
+++ b/gr-trellis/src/lib/trellis_metrics_c.cc
@@ -84,6 +84,10 @@ for (int m=0;m<nstreams;m++) {
for (int i = 0; i < noutput_items / d_O ; i++){
#if 0
+ calc_metric_s(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif 0
+ calc_metric_i(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif 0
calc_metric_f(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
#elif 1
calc_metric_c(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
diff --git a/gr-trellis/src/lib/trellis_metrics_f.cc b/gr-trellis/src/lib/trellis_metrics_f.cc
index 472ec5942..2e148bbd5 100644
--- a/gr-trellis/src/lib/trellis_metrics_f.cc
+++ b/gr-trellis/src/lib/trellis_metrics_f.cc
@@ -83,7 +83,11 @@ for (int m=0;m<nstreams;m++) {
float *out = (float *) output_items[m];
for (int i = 0; i < noutput_items / d_O ; i++){
-#if 1
+#if 0
+ calc_metric_s(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif 0
+ calc_metric_i(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif 1
calc_metric_f(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
#elif 0
calc_metric_c(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
diff --git a/gr-trellis/src/lib/trellis_metrics_i.cc b/gr-trellis/src/lib/trellis_metrics_i.cc
new file mode 100644
index 000000000..5901c5513
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_metrics_i.cc
@@ -0,0 +1,100 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <trellis_metrics_i.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <stdexcept>
+#include <iostream>
+
+
+trellis_metrics_i_sptr
+trellis_make_metrics_i (const int O, const int D, const std::vector<int> &TABLE, trellis_metric_type_t TYPE)
+{
+ return trellis_metrics_i_sptr (new trellis_metrics_i (O,D,TABLE,TYPE));
+}
+
+
+
+trellis_metrics_i::trellis_metrics_i (const int O, const int D, const std::vector<int> &TABLE, trellis_metric_type_t TYPE)
+ : gr_block ("metrics_i",
+ gr_make_io_signature (1, -1, sizeof (int)),
+ gr_make_io_signature (1, -1, sizeof (float))),
+ d_O (O),
+ d_D (D),
+ d_TYPE (TYPE),
+ d_TABLE (TABLE)
+{
+ set_relative_rate (1.0 * d_O / ((double) d_D));
+ set_output_multiple ((int)d_O);
+}
+
+
+
+
+void
+trellis_metrics_i::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+ assert (noutput_items % d_O == 0);
+ int input_required = d_D * noutput_items / d_O;
+ unsigned ninputs = ninput_items_required.size();
+ for (unsigned int i = 0; i < ninputs; i++)
+ ninput_items_required[i] = input_required;
+}
+
+
+
+int
+trellis_metrics_i::general_work (int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+{
+
+ assert (noutput_items % d_O == 0);
+ assert (input_items.size() == output_items.size());
+ int nstreams = input_items.size();
+
+for (int m=0;m<nstreams;m++) {
+ const int *in = (int *) input_items[m];
+ float *out = (float *) output_items[m];
+
+ for (int i = 0; i < noutput_items / d_O ; i++){
+#if 0
+ calc_metric_s(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif 1
+ calc_metric_i(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif 0
+ calc_metric_f(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif 0
+ calc_metric_c(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#endif
+ }
+}
+
+ consume_each (d_D * noutput_items / d_O);
+ return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_metrics_i.h b/gr-trellis/src/lib/trellis_metrics_i.h
new file mode 100644
index 000000000..c51e377e7
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_metrics_i.h
@@ -0,0 +1,65 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+// WARNING: this file is machine generated. Edits will be over written
+
+#ifndef INCLUDED_TRELLIS_METRICS_I_H
+#define INCLUDED_TRELLIS_METRICS_I_H
+
+#include <gr_block.h>
+#include "trellis_calc_metric.h"
+
+class trellis_metrics_i;
+typedef boost::shared_ptr<trellis_metrics_i> trellis_metrics_i_sptr;
+
+trellis_metrics_i_sptr trellis_make_metrics_i (const int O, const int D, const std::vector<int> &TABLE, trellis_metric_type_t TYPE);
+
+/*!
+ * \brief Evaluate metrics for use by the Viterbi algorithm.
+ * \ingroup block
+ *
+ */
+class trellis_metrics_i : public gr_block
+{
+ int d_O;
+ int d_D;
+ trellis_metric_type_t d_TYPE;
+ std::vector<int> d_TABLE;
+
+ friend trellis_metrics_i_sptr trellis_make_metrics_i (const int O, const int D, const std::vector<int> &TABLE, trellis_metric_type_t TYPE);
+ trellis_metrics_i (const int O, const int D, const std::vector<int> &TABLE, trellis_metric_type_t TYPE);
+
+public:
+ int O () const { return d_O; }
+ int D () const { return d_D; }
+ trellis_metric_type_t TYPE () const { return d_TYPE; }
+ std::vector<int> TABLE () const { return d_TABLE; }
+ void forecast (int noutput_items,
+ gr_vector_int &ninput_items_required);
+ int general_work (int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+};
+
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_metrics_i.i b/gr-trellis/src/lib/trellis_metrics_i.i
new file mode 100644
index 000000000..dadd06577
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_metrics_i.i
@@ -0,0 +1,39 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+// WARNING: this file is machine generated. Edits will be over written
+
+GR_SWIG_BLOCK_MAGIC(trellis,metrics_i);
+
+trellis_metrics_i_sptr trellis_make_metrics_i (const int O, const int D, const std::vector<int> &TABLE, trellis_metric_type_t TYPE);
+
+class trellis_metrics_i : public gr_block
+{
+private:
+ trellis_metrics_i (const int O, const int D, const std::vector<int> &TABLE, trellis_metric_type_t TYPE);
+
+public:
+ int O () const { return d_O; }
+ int D () const { return d_D; }
+ trellis_metric_type_t TYPE () const { return d_TYPE; }
+ std::vector<int> TABLE () const { return d_TABLE; }
+};
diff --git a/gr-trellis/src/lib/trellis_metrics_i.lo b/gr-trellis/src/lib/trellis_metrics_i.lo
new file mode 100644
index 000000000..ce7227bf5
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_metrics_i.lo
@@ -0,0 +1,12 @@
+# trellis_metrics_i.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.6 (1.1220.2.95 2004/04/11 05:50:42)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/trellis_metrics_i.o'
+
+# Name of the non-PIC object.
+non_pic_object=none
+
diff --git a/gr-trellis/src/lib/trellis_metrics_s.cc b/gr-trellis/src/lib/trellis_metrics_s.cc
new file mode 100644
index 000000000..3bee2cc92
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_metrics_s.cc
@@ -0,0 +1,100 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <trellis_metrics_s.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <stdexcept>
+#include <iostream>
+
+
+trellis_metrics_s_sptr
+trellis_make_metrics_s (const int O, const int D, const std::vector<short> &TABLE, trellis_metric_type_t TYPE)
+{
+ return trellis_metrics_s_sptr (new trellis_metrics_s (O,D,TABLE,TYPE));
+}
+
+
+
+trellis_metrics_s::trellis_metrics_s (const int O, const int D, const std::vector<short> &TABLE, trellis_metric_type_t TYPE)
+ : gr_block ("metrics_s",
+ gr_make_io_signature (1, -1, sizeof (short)),
+ gr_make_io_signature (1, -1, sizeof (float))),
+ d_O (O),
+ d_D (D),
+ d_TYPE (TYPE),
+ d_TABLE (TABLE)
+{
+ set_relative_rate (1.0 * d_O / ((double) d_D));
+ set_output_multiple ((int)d_O);
+}
+
+
+
+
+void
+trellis_metrics_s::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+ assert (noutput_items % d_O == 0);
+ int input_required = d_D * noutput_items / d_O;
+ unsigned ninputs = ninput_items_required.size();
+ for (unsigned int i = 0; i < ninputs; i++)
+ ninput_items_required[i] = input_required;
+}
+
+
+
+int
+trellis_metrics_s::general_work (int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+{
+
+ assert (noutput_items % d_O == 0);
+ assert (input_items.size() == output_items.size());
+ int nstreams = input_items.size();
+
+for (int m=0;m<nstreams;m++) {
+ const short *in = (short *) input_items[m];
+ float *out = (float *) output_items[m];
+
+ for (int i = 0; i < noutput_items / d_O ; i++){
+#if 1
+ calc_metric_s(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif 0
+ calc_metric_i(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif 0
+ calc_metric_f(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#elif 0
+ calc_metric_c(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
+#endif
+ }
+}
+
+ consume_each (d_D * noutput_items / d_O);
+ return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_metrics_s.h b/gr-trellis/src/lib/trellis_metrics_s.h
new file mode 100644
index 000000000..b4332bcc3
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_metrics_s.h
@@ -0,0 +1,65 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+// WARNING: this file is machine generated. Edits will be over written
+
+#ifndef INCLUDED_TRELLIS_METRICS_S_H
+#define INCLUDED_TRELLIS_METRICS_S_H
+
+#include <gr_block.h>
+#include "trellis_calc_metric.h"
+
+class trellis_metrics_s;
+typedef boost::shared_ptr<trellis_metrics_s> trellis_metrics_s_sptr;
+
+trellis_metrics_s_sptr trellis_make_metrics_s (const int O, const int D, const std::vector<short> &TABLE, trellis_metric_type_t TYPE);
+
+/*!
+ * \brief Evaluate metrics for use by the Viterbi algorithm.
+ * \ingroup block
+ *
+ */
+class trellis_metrics_s : public gr_block
+{
+ int d_O;
+ int d_D;
+ trellis_metric_type_t d_TYPE;
+ std::vector<short> d_TABLE;
+
+ friend trellis_metrics_s_sptr trellis_make_metrics_s (const int O, const int D, const std::vector<short> &TABLE, trellis_metric_type_t TYPE);
+ trellis_metrics_s (const int O, const int D, const std::vector<short> &TABLE, trellis_metric_type_t TYPE);
+
+public:
+ int O () const { return d_O; }
+ int D () const { return d_D; }
+ trellis_metric_type_t TYPE () const { return d_TYPE; }
+ std::vector<short> TABLE () const { return d_TABLE; }
+ void forecast (int noutput_items,
+ gr_vector_int &ninput_items_required);
+ int general_work (int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+};
+
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_metrics_s.i b/gr-trellis/src/lib/trellis_metrics_s.i
new file mode 100644
index 000000000..d7529a3e1
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_metrics_s.i
@@ -0,0 +1,39 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+// WARNING: this file is machine generated. Edits will be over written
+
+GR_SWIG_BLOCK_MAGIC(trellis,metrics_s);
+
+trellis_metrics_s_sptr trellis_make_metrics_s (const int O, const int D, const std::vector<short> &TABLE, trellis_metric_type_t TYPE);
+
+class trellis_metrics_s : public gr_block
+{
+private:
+ trellis_metrics_s (const int O, const int D, const std::vector<short> &TABLE, trellis_metric_type_t TYPE);
+
+public:
+ int O () const { return d_O; }
+ int D () const { return d_D; }
+ trellis_metric_type_t TYPE () const { return d_TYPE; }
+ std::vector<short> TABLE () const { return d_TABLE; }
+};
diff --git a/gr-trellis/src/lib/trellis_metrics_s.lo b/gr-trellis/src/lib/trellis_metrics_s.lo
new file mode 100644
index 000000000..844c4bf29
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_metrics_s.lo
@@ -0,0 +1,12 @@
+# trellis_metrics_s.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.6 (1.1220.2.95 2004/04/11 05:50:42)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/trellis_metrics_s.o'
+
+# Name of the non-PIC object.
+non_pic_object=none
+
diff --git a/gr-trellis/src/python/qa_trellis.py b/gr-trellis/src/python/qa_trellis.py
index e4866e7f9..fe98177be 100755
--- a/gr-trellis/src/python/qa_trellis.py
+++ b/gr-trellis/src/python/qa_trellis.py
@@ -58,5 +58,19 @@ class qa_trellis (gr_unittest.TestCase):
OS = (0, 3, 3, 0, 1, 2, 2, 1)
f = trellis.fsm("awgn1o2_4.fsm")
self.assertEqual((I,S,O,NS,OS),(f.I(),f.S(),f.O(),f.NS(),f.OS()))
+
+ def test_001_interleaver (self):
+ K = 5
+ IN = (1,2,3,4,0)
+ DIN = (4,0,1,2,3)
+ i = trellis.interleaver(K,IN)
+ self.assertEqual((K,IN,DIN),(i.K(),i.INTER(),i.DEINTER()))
+
+
+
+
+
+
+
if __name__ == '__main__':
gr_unittest.main ()