summaryrefslogtreecommitdiff
path: root/gr-trellis/src/lib/trellis_calc_metric.cc
diff options
context:
space:
mode:
authoranastas <anastas@221aa14e-8319-0410-a670-987f0aec2ac5>2006-09-03 20:27:42 +0000
committeranastas <anastas@221aa14e-8319-0410-a670-987f0aec2ac5>2006-09-03 20:27:42 +0000
commitd4697a07812be9e1f91a03b0a2dd61b1948f9925 (patch)
tree28a75b0693f92d044d8d33284da7e8cc0708fc62 /gr-trellis/src/lib/trellis_calc_metric.cc
parent21abdfb3f1ba6520a7911a0787adab664d9a790f (diff)
Refactored some common functions for metric calculations. Updated the documentation.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@3469 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'gr-trellis/src/lib/trellis_calc_metric.cc')
-rw-r--r--gr-trellis/src/lib/trellis_calc_metric.cc55
1 files changed, 50 insertions, 5 deletions
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.");
+ }
+}
+*/