Imported Upstream version 3.2.2
[debian/gnuradio] / gr-trellis / src / lib / trellis_calc_metric.cc
index 365333c855447f890333d18c8aae14db4e197c11..0d03fd1a7e972aaa1423b1cd2062c6c709f6e49f 100644 (file)
 
 
 
-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;
+  
 
   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;
+        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 +49,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 +72,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 +124,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 +137,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 +164,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 +175,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,22 +203,25 @@ 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;
 
+
   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();
+        gr_complex s=in[m]-TABLE[o*D+m];
+        metric[o]+=s.real()*s.real()+s.imag()*s.imag();
       }
     }
     break;
@@ -207,9 +229,8 @@ 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();
       }
       if(metric[o]<minm) {
         minm=metric[o];
@@ -227,4 +248,3 @@ template <class T> void calc_metric(int O, int D, const std::vector<T> &TABLE, c
     throw std::runtime_error ("Invalid metric type.");
   }
 }
-*/