implementation using templates
authoranastas <anastas@221aa14e-8319-0410-a670-987f0aec2ac5>
Tue, 13 Feb 2007 05:06:56 +0000 (05:06 +0000)
committeranastas <anastas@221aa14e-8319-0410-a670-987f0aec2ac5>
Tue, 13 Feb 2007 05:06:56 +0000 (05:06 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@4464 221aa14e-8319-0410-a670-987f0aec2ac5

gr-trellis/src/lib/trellis_calc_metric.cc
gr-trellis/src/lib/trellis_calc_metric.h

index 238e506b8422cc134eb5efb9bcff154e5821eca9..ec2ed794d3e42ea50fcb5a1371fbb754d13a431e 100644 (file)
@@ -26,7 +26,8 @@
 
 
 
-void calc_metric(int O, int D, const std::vector<short> &TABLE, const short *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)
 {
   float minm = FLT_MAX;
   int minmi = 0;
@@ -36,8 +37,10 @@ void calc_metric(int O, int D, const std::vector<short> &TABLE, const short *in,
     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;
+        T s=in[m]-TABLE[o*D+m];
+        //gr_complex sc(1.0*s,0);
+        //metric[o]+=(sc*conj(sc)).real();
+        metric[o]+= s * s;
       }
     }
     break;
@@ -45,8 +48,10 @@ void calc_metric(int O, int D, const std::vector<short> &TABLE, const short *in,
     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;
+        T s=in[m]-TABLE[o*D+m];
+        //gr_complex sc(1.0*s,0);
+        //metric[o]+=(sc*conj(sc)).real();
+        metric[o]+= s * s;
       }
       if(metric[o]<minm) {
         minm=metric[o];
@@ -66,7 +71,19 @@ void calc_metric(int O, int D, const std::vector<short> &TABLE, const short *in,
 }
 
 
-void calc_metric(int O, int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type)
+
+template
+void calc_metric<short>(int O, int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type);
+
+template
+void calc_metric<int>(int O, int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type);
+
+template
+void calc_metric<float>(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<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type)
 {
   float minm = FLT_MAX;
   int minmi = 0;
@@ -106,8 +123,7 @@ void calc_metric(int O, int D, const std::vector<int> &TABLE, const int *in, flo
 }
 
 
-
-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<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type)
 {
   float minm = FLT_MAX;
   int minmi = 0;
@@ -120,7 +136,7 @@ void calc_metric(int O, int D, const std::vector<float> &TABLE, const float *in,
         float s=in[m]-TABLE[o*D+m];
         metric[o]+=s*s;
       }
-    } 
+    }
     break;
   case TRELLIS_HARD_SYMBOL:
     for(int o=0;o<O;o++) {
@@ -147,7 +163,8 @@ void calc_metric(int O, int D, const std::vector<float> &TABLE, const float *in,
 }
 
 
-void calc_metric(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)
 {
   float minm = FLT_MAX;
   int minmi = 0;
@@ -157,16 +174,17 @@ void calc_metric(int O, int D, const std::vector<gr_complex> &TABLE, const gr_co
     for(int o=0;o<O;o++) {
       metric[o]=0.0;
       for (int m=0;m<D;m++) {
-        gr_complex s=in[m]-TABLE[o*D+m];
-        metric[o]+=s.real()*s.real()+s.imag()*s.imag();
+        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++) {
-        gr_complex s=in[m]-TABLE[o*D+m];
-        metric[o]+=s.real()*s.real()+s.imag()*s.imag();
+        float s=in[m]-TABLE[o*D+m];
+        metric[o]+=s*s;
       }
       if(metric[o]<minm) {
         minm=metric[o];
@@ -184,10 +202,13 @@ void calc_metric(int O, int D, const std::vector<gr_complex> &TABLE, const gr_co
     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)
+
+
+
+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;
@@ -197,19 +218,16 @@ template <class T> void calc_metric(int O, int D, const std::vector<T> &TABLE, c
     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();
+        gr_complex s=in[m]-TABLE[o*D+m];
+        metric[o]+=s.real()*s.real()+s.imag()*s.imag();
       }
     }
-    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();
+        gr_complex s=in[m]-TABLE[o*D+m];
+        metric[o]+=s.real()*s.real()+s.imag()*s.imag();
       }
       if(metric[o]<minm) {
         minm=metric[o];
@@ -227,4 +245,3 @@ template <class T> void calc_metric(int O, int D, const std::vector<T> &TABLE, c
     throw std::runtime_error ("Invalid metric type.");
   }
 }
-*/
index 2a4a78824a506a9127e6bb5b50f5d0e9e5df9076..5e9f3efbf5fbead9089a0fc4d70872430d50b77a 100644 (file)
 #include <trellis_metric_type.h>
 
 
+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);
+
+/*
 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(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<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