summaryrefslogtreecommitdiff
path: root/gr-trellis/src
diff options
context:
space:
mode:
Diffstat (limited to 'gr-trellis/src')
-rw-r--r--gr-trellis/src/lib/interleaver.cc2
-rw-r--r--gr-trellis/src/lib/trellis_calc_metric.cc55
-rw-r--r--gr-trellis/src/lib/trellis_calc_metric.h12
-rw-r--r--gr-trellis/src/lib/trellis_metrics_X.cc.t3
-rw-r--r--gr-trellis/src/lib/trellis_metrics_c.cc3
-rw-r--r--gr-trellis/src/lib/trellis_metrics_f.cc3
-rw-r--r--gr-trellis/src/lib/trellis_metrics_i.cc3
-rw-r--r--gr-trellis/src/lib/trellis_metrics_s.cc3
-rw-r--r--gr-trellis/src/lib/trellis_siso_combined_f.cc2
-rw-r--r--gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t2
-rw-r--r--gr-trellis/src/lib/trellis_viterbi_combined_b.cc2
-rw-r--r--gr-trellis/src/lib/trellis_viterbi_combined_i.cc2
-rw-r--r--gr-trellis/src/lib/trellis_viterbi_combined_s.cc2
13 files changed, 79 insertions, 15 deletions
diff --git a/gr-trellis/src/lib/interleaver.cc b/gr-trellis/src/lib/interleaver.cc
index b17fae54c6..5e8a912d94 100644
--- a/gr-trellis/src/lib/interleaver.cc
+++ b/gr-trellis/src/lib/interleaver.cc
@@ -97,7 +97,7 @@ interleaver::interleaver(int K, unsigned int seed)
d_INTER[i]=i;
tmp[i] = rand();
}
- //quicksort_index <int> (tmp,d_INTER,0,d_K-1); got to resolve this...
+ //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
diff --git a/gr-trellis/src/lib/trellis_calc_metric.cc b/gr-trellis/src/lib/trellis_calc_metric.cc
index 5faa4b7c70..4c502b81ba 100644
--- a/gr-trellis/src/lib/trellis_calc_metric.cc
+++ b/gr-trellis/src/lib/trellis_calc_metric.cc
@@ -24,7 +24,9 @@
#include <stdexcept>
#include "trellis_calc_metric.h"
-void calc_metric_s(int O, int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type)
+
+
+void calc_metric(int O, int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type)
{
float minm = FLT_MAX;
int minmi = 0;
@@ -64,8 +66,7 @@ void calc_metric_s(int O, int D, const std::vector<short> &TABLE, const short *i
}
-
-void calc_metric_i(int O, int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type)
+void calc_metric(int O, int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type)
{
float minm = FLT_MAX;
int minmi = 0;
@@ -106,7 +107,7 @@ void calc_metric_i(int O, int D, const std::vector<int> &TABLE, const int *in, f
-void calc_metric_f(int O, int D, const std::vector<float> &TABLE, const float *in, float *metric, trellis_metric_type_t type)
+void calc_metric(int O, int D, const std::vector<float> &TABLE, const float *in, float *metric, trellis_metric_type_t type)
{
float minm = FLT_MAX;
int minmi = 0;
@@ -146,7 +147,7 @@ void calc_metric_f(int O, int D, const std::vector<float> &TABLE, const float *i
}
-void calc_metric_c(int O, int D, const std::vector<gr_complex> &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type)
+void calc_metric(int O, int D, const std::vector<gr_complex> &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type)
{
float minm = FLT_MAX;
int minmi = 0;
@@ -183,3 +184,47 @@ void calc_metric_c(int O, int D, const std::vector<gr_complex> &TABLE, const gr_
throw std::runtime_error ("Invalid metric type.");
}
}
+
+
+/*
+template <class T> void calc_metric(int O, int D, const std::vector<T> &TABLE, const T *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++) {
+ T s=in[m]-TABLE[o*D+m];
+ gr_complex sc(1.0*s,0);
+ metric[o]+=(s*conj(s)).real();
+ }
+ }
+ break;
+ case TRELLIS_HARD_SYMBOL:
+ for(int o=0;o<O;o++) {
+ metric[o]=0.0;
+ for (int m=0;m<D;m++) {
+ T s=in[m]-TABLE[o*D+m];
+ gr_complex sc(1.0*s,0);
+ metric[o]+=(s*conj(s)).real();
+ }
+ 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.");
+ }
+}
+*/
diff --git a/gr-trellis/src/lib/trellis_calc_metric.h b/gr-trellis/src/lib/trellis_calc_metric.h
index 0f66d82d87..4c090584b1 100644
--- a/gr-trellis/src/lib/trellis_calc_metric.h
+++ b/gr-trellis/src/lib/trellis_calc_metric.h
@@ -27,12 +27,16 @@
#include <gr_complex.h>
#include <trellis_metric_type.h>
-void calc_metric_s(int O, int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type);
-void calc_metric_i(int O, int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type);
+void calc_metric(int O, int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type);
-void calc_metric_f(int O, int D, const std::vector<float> &TABLE, const float *in, float *metric, trellis_metric_type_t type);
+void calc_metric(int O, int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type);
-void calc_metric_c(int O, int D, const std::vector<gr_complex> &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type);
+void calc_metric(int O, int D, const std::vector<float> &TABLE, const float *in, float *metric, trellis_metric_type_t type);
+
+void calc_metric(int O, int D, const std::vector<gr_complex> &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type);
+
+
+//template <class T> void calc_metric(int O, int D, const std::vector<T> &TABLE, const T *in, float *metric, trellis_metric_type_t type);
#endif
diff --git a/gr-trellis/src/lib/trellis_metrics_X.cc.t b/gr-trellis/src/lib/trellis_metrics_X.cc.t
index 7ace0298a5..cd11dc9c7f 100644
--- a/gr-trellis/src/lib/trellis_metrics_X.cc.t
+++ b/gr-trellis/src/lib/trellis_metrics_X.cc.t
@@ -83,6 +83,7 @@ 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_SHORT@
calc_metric_s(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
#elif @IS_INT@
@@ -92,6 +93,8 @@ for (int m=0;m<nstreams;m++) {
#elif @IS_COMPLEX@
calc_metric_c(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
#endif
+*/
+ calc_metric(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 d80f2e7d7b..59d35bd6d8 100644
--- a/gr-trellis/src/lib/trellis_metrics_c.cc
+++ b/gr-trellis/src/lib/trellis_metrics_c.cc
@@ -83,6 +83,7 @@ for (int m=0;m<nstreams;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 0
@@ -92,6 +93,8 @@ for (int m=0;m<nstreams;m++) {
#elif 1
calc_metric_c(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
#endif
+*/
+ calc_metric(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 69e4a99df6..58d4d41c22 100644
--- a/gr-trellis/src/lib/trellis_metrics_f.cc
+++ b/gr-trellis/src/lib/trellis_metrics_f.cc
@@ -83,6 +83,7 @@ for (int m=0;m<nstreams;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 0
@@ -92,6 +93,8 @@ for (int m=0;m<nstreams;m++) {
#elif 0
calc_metric_c(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
#endif
+*/
+ calc_metric(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
index b0fa85fa0b..edd628c0f9 100644
--- a/gr-trellis/src/lib/trellis_metrics_i.cc
+++ b/gr-trellis/src/lib/trellis_metrics_i.cc
@@ -83,6 +83,7 @@ for (int m=0;m<nstreams;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
@@ -92,6 +93,8 @@ for (int m=0;m<nstreams;m++) {
#elif 0
calc_metric_c(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
#endif
+*/
+ calc_metric(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_s.cc b/gr-trellis/src/lib/trellis_metrics_s.cc
index 07b4097262..4c04169a59 100644
--- a/gr-trellis/src/lib/trellis_metrics_s.cc
+++ b/gr-trellis/src/lib/trellis_metrics_s.cc
@@ -83,6 +83,7 @@ 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
calc_metric_s(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
#elif 0
@@ -92,6 +93,8 @@ for (int m=0;m<nstreams;m++) {
#elif 0
calc_metric_c(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
#endif
+*/
+ calc_metric(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
}
}
diff --git a/gr-trellis/src/lib/trellis_siso_combined_f.cc b/gr-trellis/src/lib/trellis_siso_combined_f.cc
index 61cf6f8bf4..6d9c013a85 100644
--- a/gr-trellis/src/lib/trellis_siso_combined_f.cc
+++ b/gr-trellis/src/lib/trellis_siso_combined_f.cc
@@ -167,7 +167,7 @@ void siso_algorithm_combined(int I, int S, int O,
}
for(int k=0;k<K;k++) { // forward recursion
- calc_metric_f(O, D, TABLE, &(observations[k*D]), &(prioro[k*O]),TYPE); // calc metrics
+ calc_metric(O, D, TABLE, &(observations[k*D]), &(prioro[k*O]),TYPE); // calc metrics
norm=INF;
for(int j=0;j<S;j++) {
minm=INF;
diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t b/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t
index 76b7fb38af..14ea0d17ce 100644
--- a/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t
+++ b/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t
@@ -114,7 +114,7 @@ void viterbi_algorithm_combined(int I, int S, int O,
alphai=0;
for(int k=0;k<K;k++) {
- calc_metric_f(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
+ calc_metric(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
norm=INF;
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_b.cc b/gr-trellis/src/lib/trellis_viterbi_combined_b.cc
index 86501ac765..e91d48ff9c 100644
--- a/gr-trellis/src/lib/trellis_viterbi_combined_b.cc
+++ b/gr-trellis/src/lib/trellis_viterbi_combined_b.cc
@@ -114,7 +114,7 @@ void viterbi_algorithm_combined(int I, int S, int O,
alphai=0;
for(int k=0;k<K;k++) {
- calc_metric_f(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
+ calc_metric(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
norm=INF;
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_i.cc b/gr-trellis/src/lib/trellis_viterbi_combined_i.cc
index a92e7b35db..150f80a14e 100644
--- a/gr-trellis/src/lib/trellis_viterbi_combined_i.cc
+++ b/gr-trellis/src/lib/trellis_viterbi_combined_i.cc
@@ -114,7 +114,7 @@ void viterbi_algorithm_combined(int I, int S, int O,
alphai=0;
for(int k=0;k<K;k++) {
- calc_metric_f(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
+ calc_metric(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
norm=INF;
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;
diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_s.cc b/gr-trellis/src/lib/trellis_viterbi_combined_s.cc
index b664f6e955..320189296e 100644
--- a/gr-trellis/src/lib/trellis_viterbi_combined_s.cc
+++ b/gr-trellis/src/lib/trellis_viterbi_combined_s.cc
@@ -114,7 +114,7 @@ void viterbi_algorithm_combined(int I, int S, int O,
alphai=0;
for(int k=0;k<K;k++) {
- calc_metric_f(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
+ calc_metric(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
norm=INF;
for(int j=0;j<S;j++) { // for each next state do ACS
minm=INF;