Changed the viterbi equalizer output from hard to soft. The output values are branch metrics.
TODO: Check in the literature if this is correct choice of souft output values.
diff --git a/lib/viterbi_detector.cc b/lib/viterbi_detector.cc
index f3445cf..bee95ba 100644
--- a/lib/viterbi_detector.cc
+++ b/lib/viterbi_detector.cc
@@ -1,7 +1,7 @@
 /* -*- c++ -*- */
 /*
  * @file
- * @author Piotr Krysik <pkrysik@stud.elka.pw.edu.pl>
+ * @author Piotr Krysik <pkrysik@elka.pw.edu.pl>
  * @section LICENSE
  *
  * This program is free software; you can redistribute it and/or modify
@@ -57,6 +57,8 @@
 
 #include <gnuradio/gr_complex.h>
 #include <gsm_constants.h>
+#include <cmath>
+
 #define PATHS_NUM (1 << (CHAN_IMP_RESP_LENGTH-1))
 
 void viterbi_detector(const gr_complex * input, unsigned int samples_num, gr_complex * rhh, unsigned int start_state, const unsigned int * stop_states, unsigned int stops_num, float * output)
@@ -125,180 +127,180 @@
       real_imag=1;
       input_symbol_imag = input[sample_nr].imag();
 
-      pm_candidate1 = old_path_metrics[0] + input_symbol_imag - increment[2];
-      pm_candidate2 = old_path_metrics[8] + input_symbol_imag + increment[5];
+      pm_candidate1 = old_path_metrics[0] +input_symbol_imag -increment[2];
+      pm_candidate2 = old_path_metrics[8] +input_symbol_imag +increment[5];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[0] = pm_candidate1;
-         trans_table[sample_nr][0] = -1.0;
+         trans_table[sample_nr][0] = -std::abs( +input_symbol_imag -increment[2]);
       }
       else{
          new_path_metrics[0] = pm_candidate2;
-         trans_table[sample_nr][0] = 1.0;
+         trans_table[sample_nr][0] = std::abs( +input_symbol_imag +increment[5]);
       }
 
-      pm_candidate1 = old_path_metrics[0] - input_symbol_imag + increment[2];
-      pm_candidate2 = old_path_metrics[8] - input_symbol_imag - increment[5];
+      pm_candidate1 = old_path_metrics[0] -input_symbol_imag +increment[2];
+      pm_candidate2 = old_path_metrics[8] -input_symbol_imag -increment[5];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[1] = pm_candidate1;
-         trans_table[sample_nr][1] = -1.0;
+         trans_table[sample_nr][1] = -std::abs( -input_symbol_imag +increment[2]);
       }
       else{
          new_path_metrics[1] = pm_candidate2;
-         trans_table[sample_nr][1] = 1.0;
+         trans_table[sample_nr][1] = std::abs( -input_symbol_imag -increment[5]);
       }
 
-      pm_candidate1 = old_path_metrics[1] + input_symbol_imag - increment[3];
-      pm_candidate2 = old_path_metrics[9] + input_symbol_imag + increment[4];
+      pm_candidate1 = old_path_metrics[1] +input_symbol_imag -increment[3];
+      pm_candidate2 = old_path_metrics[9] +input_symbol_imag +increment[4];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[2] = pm_candidate1;
-         trans_table[sample_nr][2] = -1.0;
+         trans_table[sample_nr][2] = -std::abs( +input_symbol_imag -increment[3]);
       }
       else{
          new_path_metrics[2] = pm_candidate2;
-         trans_table[sample_nr][2] = 1.0;
+         trans_table[sample_nr][2] = std::abs( +input_symbol_imag +increment[4]);
       }
 
-      pm_candidate1 = old_path_metrics[1] - input_symbol_imag + increment[3];
-      pm_candidate2 = old_path_metrics[9] - input_symbol_imag - increment[4];
+      pm_candidate1 = old_path_metrics[1] -input_symbol_imag +increment[3];
+      pm_candidate2 = old_path_metrics[9] -input_symbol_imag -increment[4];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[3] = pm_candidate1;
-         trans_table[sample_nr][3] = -1.0;
+         trans_table[sample_nr][3] = -std::abs( -input_symbol_imag +increment[3]);
       }
       else{
          new_path_metrics[3] = pm_candidate2;
-         trans_table[sample_nr][3] = 1.0;
+         trans_table[sample_nr][3] = std::abs( -input_symbol_imag -increment[4]);
       }
 
-      pm_candidate1 = old_path_metrics[2] + input_symbol_imag - increment[0];
-      pm_candidate2 = old_path_metrics[10] + input_symbol_imag + increment[7];
+      pm_candidate1 = old_path_metrics[2] +input_symbol_imag -increment[0];
+      pm_candidate2 = old_path_metrics[10] +input_symbol_imag +increment[7];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[4] = pm_candidate1;
-         trans_table[sample_nr][4] = -1.0;
+         trans_table[sample_nr][4] = -std::abs( +input_symbol_imag -increment[0]);
       }
       else{
          new_path_metrics[4] = pm_candidate2;
-         trans_table[sample_nr][4] = 1.0;
+         trans_table[sample_nr][4] = std::abs( +input_symbol_imag +increment[7]);
       }
 
-      pm_candidate1 = old_path_metrics[2] - input_symbol_imag + increment[0];
-      pm_candidate2 = old_path_metrics[10] - input_symbol_imag - increment[7];
+      pm_candidate1 = old_path_metrics[2] -input_symbol_imag +increment[0];
+      pm_candidate2 = old_path_metrics[10] -input_symbol_imag -increment[7];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[5] = pm_candidate1;
-         trans_table[sample_nr][5] = -1.0;
+         trans_table[sample_nr][5] = -std::abs( -input_symbol_imag +increment[0]);
       }
       else{
          new_path_metrics[5] = pm_candidate2;
-         trans_table[sample_nr][5] = 1.0;
+         trans_table[sample_nr][5] = std::abs( -input_symbol_imag -increment[7]);
       }
 
-      pm_candidate1 = old_path_metrics[3] + input_symbol_imag - increment[1];
-      pm_candidate2 = old_path_metrics[11] + input_symbol_imag + increment[6];
+      pm_candidate1 = old_path_metrics[3] +input_symbol_imag -increment[1];
+      pm_candidate2 = old_path_metrics[11] +input_symbol_imag +increment[6];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[6] = pm_candidate1;
-         trans_table[sample_nr][6] = -1.0;
+         trans_table[sample_nr][6] = -std::abs( +input_symbol_imag -increment[1]);
       }
       else{
          new_path_metrics[6] = pm_candidate2;
-         trans_table[sample_nr][6] = 1.0;
+         trans_table[sample_nr][6] = std::abs( +input_symbol_imag +increment[6]);
       }
 
-      pm_candidate1 = old_path_metrics[3] - input_symbol_imag + increment[1];
-      pm_candidate2 = old_path_metrics[11] - input_symbol_imag - increment[6];
+      pm_candidate1 = old_path_metrics[3] -input_symbol_imag +increment[1];
+      pm_candidate2 = old_path_metrics[11] -input_symbol_imag -increment[6];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[7] = pm_candidate1;
-         trans_table[sample_nr][7] = -1.0;
+         trans_table[sample_nr][7] = -std::abs( -input_symbol_imag +increment[1]);
       }
       else{
          new_path_metrics[7] = pm_candidate2;
-         trans_table[sample_nr][7] = 1.0;
+         trans_table[sample_nr][7] = std::abs( -input_symbol_imag -increment[6]);
       }
 
-      pm_candidate1 = old_path_metrics[4] + input_symbol_imag - increment[6];
-      pm_candidate2 = old_path_metrics[12] + input_symbol_imag + increment[1];
+      pm_candidate1 = old_path_metrics[4] +input_symbol_imag -increment[6];
+      pm_candidate2 = old_path_metrics[12] +input_symbol_imag +increment[1];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[8] = pm_candidate1;
-         trans_table[sample_nr][8] = -1.0;
+         trans_table[sample_nr][8] = -std::abs( +input_symbol_imag -increment[6]);
       }
       else{
          new_path_metrics[8] = pm_candidate2;
-         trans_table[sample_nr][8] = 1.0;
+         trans_table[sample_nr][8] = std::abs( +input_symbol_imag +increment[1]);
       }
 
-      pm_candidate1 = old_path_metrics[4] - input_symbol_imag + increment[6];
-      pm_candidate2 = old_path_metrics[12] - input_symbol_imag - increment[1];
+      pm_candidate1 = old_path_metrics[4] -input_symbol_imag +increment[6];
+      pm_candidate2 = old_path_metrics[12] -input_symbol_imag -increment[1];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[9] = pm_candidate1;
-         trans_table[sample_nr][9] = -1.0;
+         trans_table[sample_nr][9] = -std::abs( -input_symbol_imag +increment[6]);
       }
       else{
          new_path_metrics[9] = pm_candidate2;
-         trans_table[sample_nr][9] = 1.0;
+         trans_table[sample_nr][9] = std::abs( -input_symbol_imag -increment[1]);
       }
 
-      pm_candidate1 = old_path_metrics[5] + input_symbol_imag - increment[7];
-      pm_candidate2 = old_path_metrics[13] + input_symbol_imag + increment[0];
+      pm_candidate1 = old_path_metrics[5] +input_symbol_imag -increment[7];
+      pm_candidate2 = old_path_metrics[13] +input_symbol_imag +increment[0];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[10] = pm_candidate1;
-         trans_table[sample_nr][10] = -1.0;
+         trans_table[sample_nr][10] = -std::abs( +input_symbol_imag -increment[7]);
       }
       else{
          new_path_metrics[10] = pm_candidate2;
-         trans_table[sample_nr][10] = 1.0;
+         trans_table[sample_nr][10] = std::abs( +input_symbol_imag +increment[0]);
       }
 
-      pm_candidate1 = old_path_metrics[5] - input_symbol_imag + increment[7];
-      pm_candidate2 = old_path_metrics[13] - input_symbol_imag - increment[0];
+      pm_candidate1 = old_path_metrics[5] -input_symbol_imag +increment[7];
+      pm_candidate2 = old_path_metrics[13] -input_symbol_imag -increment[0];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[11] = pm_candidate1;
-         trans_table[sample_nr][11] = -1.0;
+         trans_table[sample_nr][11] = -std::abs( -input_symbol_imag +increment[7]);
       }
       else{
          new_path_metrics[11] = pm_candidate2;
-         trans_table[sample_nr][11] = 1.0;
+         trans_table[sample_nr][11] = std::abs( -input_symbol_imag -increment[0]);
       }
 
-      pm_candidate1 = old_path_metrics[6] + input_symbol_imag - increment[4];
-      pm_candidate2 = old_path_metrics[14] + input_symbol_imag + increment[3];
+      pm_candidate1 = old_path_metrics[6] +input_symbol_imag -increment[4];
+      pm_candidate2 = old_path_metrics[14] +input_symbol_imag +increment[3];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[12] = pm_candidate1;
-         trans_table[sample_nr][12] = -1.0;
+         trans_table[sample_nr][12] = -std::abs( +input_symbol_imag -increment[4]);
       }
       else{
          new_path_metrics[12] = pm_candidate2;
-         trans_table[sample_nr][12] = 1.0;
+         trans_table[sample_nr][12] = std::abs( +input_symbol_imag +increment[3]);
       }
 
-      pm_candidate1 = old_path_metrics[6] - input_symbol_imag + increment[4];
-      pm_candidate2 = old_path_metrics[14] - input_symbol_imag - increment[3];
+      pm_candidate1 = old_path_metrics[6] -input_symbol_imag +increment[4];
+      pm_candidate2 = old_path_metrics[14] -input_symbol_imag -increment[3];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[13] = pm_candidate1;
-         trans_table[sample_nr][13] = -1.0;
+         trans_table[sample_nr][13] = -std::abs( -input_symbol_imag +increment[4]);
       }
       else{
          new_path_metrics[13] = pm_candidate2;
-         trans_table[sample_nr][13] = 1.0;
+         trans_table[sample_nr][13] = std::abs( -input_symbol_imag -increment[3]);
       }
 
-      pm_candidate1 = old_path_metrics[7] + input_symbol_imag - increment[5];
-      pm_candidate2 = old_path_metrics[15] + input_symbol_imag + increment[2];
+      pm_candidate1 = old_path_metrics[7] +input_symbol_imag -increment[5];
+      pm_candidate2 = old_path_metrics[15] +input_symbol_imag +increment[2];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[14] = pm_candidate1;
-         trans_table[sample_nr][14] = -1.0;
+         trans_table[sample_nr][14] = -std::abs( +input_symbol_imag -increment[5]);
       }
       else{
          new_path_metrics[14] = pm_candidate2;
-         trans_table[sample_nr][14] = 1.0;
+         trans_table[sample_nr][14] = std::abs( +input_symbol_imag +increment[2]);
       }
 
-      pm_candidate1 = old_path_metrics[7] - input_symbol_imag + increment[5];
-      pm_candidate2 = old_path_metrics[15] - input_symbol_imag - increment[2];
+      pm_candidate1 = old_path_metrics[7] -input_symbol_imag +increment[5];
+      pm_candidate2 = old_path_metrics[15] -input_symbol_imag -increment[2];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[15] = pm_candidate1;
-         trans_table[sample_nr][15] = -1.0;
+         trans_table[sample_nr][15] = -std::abs( -input_symbol_imag +increment[5]);
       }
       else{
          new_path_metrics[15] = pm_candidate2;
-         trans_table[sample_nr][15] = 1.0;
+         trans_table[sample_nr][15] = std::abs( -input_symbol_imag -increment[2]);
       }
       tmp=old_path_metrics;
       old_path_metrics=new_path_metrics;
@@ -312,180 +314,180 @@
       real_imag=0;
       input_symbol_real = input[sample_nr].real();
 
-      pm_candidate1 = old_path_metrics[0] - input_symbol_real - increment[7];
-      pm_candidate2 = old_path_metrics[8] - input_symbol_real + increment[0];
+      pm_candidate1 = old_path_metrics[0] -input_symbol_real -increment[7];
+      pm_candidate2 = old_path_metrics[8] -input_symbol_real +increment[0];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[0] = pm_candidate1;
-         trans_table[sample_nr][0] = -1.0;
+         trans_table[sample_nr][0] = -std::abs( -input_symbol_real -increment[7]);
       }
       else{
          new_path_metrics[0] = pm_candidate2;
-         trans_table[sample_nr][0] = 1.0;
+         trans_table[sample_nr][0] = std::abs( -input_symbol_real +increment[0]);
       }
 
-      pm_candidate1 = old_path_metrics[0] + input_symbol_real + increment[7];
-      pm_candidate2 = old_path_metrics[8] + input_symbol_real - increment[0];
+      pm_candidate1 = old_path_metrics[0] +input_symbol_real +increment[7];
+      pm_candidate2 = old_path_metrics[8] +input_symbol_real -increment[0];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[1] = pm_candidate1;
-         trans_table[sample_nr][1] = -1.0;
+         trans_table[sample_nr][1] = -std::abs( +input_symbol_real +increment[7]);
       }
       else{
          new_path_metrics[1] = pm_candidate2;
-         trans_table[sample_nr][1] = 1.0;
+         trans_table[sample_nr][1] = std::abs( +input_symbol_real -increment[0]);
       }
 
-      pm_candidate1 = old_path_metrics[1] - input_symbol_real - increment[6];
-      pm_candidate2 = old_path_metrics[9] - input_symbol_real + increment[1];
+      pm_candidate1 = old_path_metrics[1] -input_symbol_real -increment[6];
+      pm_candidate2 = old_path_metrics[9] -input_symbol_real +increment[1];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[2] = pm_candidate1;
-         trans_table[sample_nr][2] = -1.0;
+         trans_table[sample_nr][2] = -std::abs( -input_symbol_real -increment[6]);
       }
       else{
          new_path_metrics[2] = pm_candidate2;
-         trans_table[sample_nr][2] = 1.0;
+         trans_table[sample_nr][2] = std::abs( -input_symbol_real +increment[1]);
       }
 
-      pm_candidate1 = old_path_metrics[1] + input_symbol_real + increment[6];
-      pm_candidate2 = old_path_metrics[9] + input_symbol_real - increment[1];
+      pm_candidate1 = old_path_metrics[1] +input_symbol_real +increment[6];
+      pm_candidate2 = old_path_metrics[9] +input_symbol_real -increment[1];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[3] = pm_candidate1;
-         trans_table[sample_nr][3] = -1.0;
+         trans_table[sample_nr][3] = -std::abs( +input_symbol_real +increment[6]);
       }
       else{
          new_path_metrics[3] = pm_candidate2;
-         trans_table[sample_nr][3] = 1.0;
+         trans_table[sample_nr][3] = std::abs( +input_symbol_real -increment[1]);
       }
 
-      pm_candidate1 = old_path_metrics[2] - input_symbol_real - increment[5];
-      pm_candidate2 = old_path_metrics[10] - input_symbol_real + increment[2];
+      pm_candidate1 = old_path_metrics[2] -input_symbol_real -increment[5];
+      pm_candidate2 = old_path_metrics[10] -input_symbol_real +increment[2];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[4] = pm_candidate1;
-         trans_table[sample_nr][4] = -1.0;
+         trans_table[sample_nr][4] = -std::abs( -input_symbol_real -increment[5]);
       }
       else{
          new_path_metrics[4] = pm_candidate2;
-         trans_table[sample_nr][4] = 1.0;
+         trans_table[sample_nr][4] = std::abs( -input_symbol_real +increment[2]);
       }
 
-      pm_candidate1 = old_path_metrics[2] + input_symbol_real + increment[5];
-      pm_candidate2 = old_path_metrics[10] + input_symbol_real - increment[2];
+      pm_candidate1 = old_path_metrics[2] +input_symbol_real +increment[5];
+      pm_candidate2 = old_path_metrics[10] +input_symbol_real -increment[2];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[5] = pm_candidate1;
-         trans_table[sample_nr][5] = -1.0;
+         trans_table[sample_nr][5] = -std::abs( +input_symbol_real +increment[5]);
       }
       else{
          new_path_metrics[5] = pm_candidate2;
-         trans_table[sample_nr][5] = 1.0;
+         trans_table[sample_nr][5] = std::abs( +input_symbol_real -increment[2]);
       }
 
-      pm_candidate1 = old_path_metrics[3] - input_symbol_real - increment[4];
-      pm_candidate2 = old_path_metrics[11] - input_symbol_real + increment[3];
+      pm_candidate1 = old_path_metrics[3] -input_symbol_real -increment[4];
+      pm_candidate2 = old_path_metrics[11] -input_symbol_real +increment[3];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[6] = pm_candidate1;
-         trans_table[sample_nr][6] = -1.0;
+         trans_table[sample_nr][6] = -std::abs( -input_symbol_real -increment[4]);
       }
       else{
          new_path_metrics[6] = pm_candidate2;
-         trans_table[sample_nr][6] = 1.0;
+         trans_table[sample_nr][6] = std::abs( -input_symbol_real +increment[3]);
       }
 
-      pm_candidate1 = old_path_metrics[3] + input_symbol_real + increment[4];
-      pm_candidate2 = old_path_metrics[11] + input_symbol_real - increment[3];
+      pm_candidate1 = old_path_metrics[3] +input_symbol_real +increment[4];
+      pm_candidate2 = old_path_metrics[11] +input_symbol_real -increment[3];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[7] = pm_candidate1;
-         trans_table[sample_nr][7] = -1.0;
+         trans_table[sample_nr][7] = -std::abs( +input_symbol_real +increment[4]);
       }
       else{
          new_path_metrics[7] = pm_candidate2;
-         trans_table[sample_nr][7] = 1.0;
+         trans_table[sample_nr][7] = std::abs( +input_symbol_real -increment[3]);
       }
 
-      pm_candidate1 = old_path_metrics[4] - input_symbol_real - increment[3];
-      pm_candidate2 = old_path_metrics[12] - input_symbol_real + increment[4];
+      pm_candidate1 = old_path_metrics[4] -input_symbol_real -increment[3];
+      pm_candidate2 = old_path_metrics[12] -input_symbol_real +increment[4];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[8] = pm_candidate1;
-         trans_table[sample_nr][8] = -1.0;
+         trans_table[sample_nr][8] = -std::abs( -input_symbol_real -increment[3]);
       }
       else{
          new_path_metrics[8] = pm_candidate2;
-         trans_table[sample_nr][8] = 1.0;
+         trans_table[sample_nr][8] = std::abs( -input_symbol_real +increment[4]);
       }
 
-      pm_candidate1 = old_path_metrics[4] + input_symbol_real + increment[3];
-      pm_candidate2 = old_path_metrics[12] + input_symbol_real - increment[4];
+      pm_candidate1 = old_path_metrics[4] +input_symbol_real +increment[3];
+      pm_candidate2 = old_path_metrics[12] +input_symbol_real -increment[4];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[9] = pm_candidate1;
-         trans_table[sample_nr][9] = -1.0;
+         trans_table[sample_nr][9] = -std::abs( +input_symbol_real +increment[3]);
       }
       else{
          new_path_metrics[9] = pm_candidate2;
-         trans_table[sample_nr][9] = 1.0;
+         trans_table[sample_nr][9] = std::abs( +input_symbol_real -increment[4]);
       }
 
-      pm_candidate1 = old_path_metrics[5] - input_symbol_real - increment[2];
-      pm_candidate2 = old_path_metrics[13] - input_symbol_real + increment[5];
+      pm_candidate1 = old_path_metrics[5] -input_symbol_real -increment[2];
+      pm_candidate2 = old_path_metrics[13] -input_symbol_real +increment[5];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[10] = pm_candidate1;
-         trans_table[sample_nr][10] = -1.0;
+         trans_table[sample_nr][10] = -std::abs( -input_symbol_real -increment[2]);
       }
       else{
          new_path_metrics[10] = pm_candidate2;
-         trans_table[sample_nr][10] = 1.0;
+         trans_table[sample_nr][10] = std::abs( -input_symbol_real +increment[5]);
       }
 
-      pm_candidate1 = old_path_metrics[5] + input_symbol_real + increment[2];
-      pm_candidate2 = old_path_metrics[13] + input_symbol_real - increment[5];
+      pm_candidate1 = old_path_metrics[5] +input_symbol_real +increment[2];
+      pm_candidate2 = old_path_metrics[13] +input_symbol_real -increment[5];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[11] = pm_candidate1;
-         trans_table[sample_nr][11] = -1.0;
+         trans_table[sample_nr][11] = -std::abs( +input_symbol_real +increment[2]);
       }
       else{
          new_path_metrics[11] = pm_candidate2;
-         trans_table[sample_nr][11] = 1.0;
+         trans_table[sample_nr][11] = std::abs( +input_symbol_real -increment[5]);
       }
 
-      pm_candidate1 = old_path_metrics[6] - input_symbol_real - increment[1];
-      pm_candidate2 = old_path_metrics[14] - input_symbol_real + increment[6];
+      pm_candidate1 = old_path_metrics[6] -input_symbol_real -increment[1];
+      pm_candidate2 = old_path_metrics[14] -input_symbol_real +increment[6];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[12] = pm_candidate1;
-         trans_table[sample_nr][12] = -1.0;
+         trans_table[sample_nr][12] = -std::abs( -input_symbol_real -increment[1]);
       }
       else{
          new_path_metrics[12] = pm_candidate2;
-         trans_table[sample_nr][12] = 1.0;
+         trans_table[sample_nr][12] = std::abs( -input_symbol_real +increment[6]);
       }
 
-      pm_candidate1 = old_path_metrics[6] + input_symbol_real + increment[1];
-      pm_candidate2 = old_path_metrics[14] + input_symbol_real - increment[6];
+      pm_candidate1 = old_path_metrics[6] +input_symbol_real +increment[1];
+      pm_candidate2 = old_path_metrics[14] +input_symbol_real -increment[6];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[13] = pm_candidate1;
-         trans_table[sample_nr][13] = -1.0;
+         trans_table[sample_nr][13] = -std::abs( +input_symbol_real +increment[1]);
       }
       else{
          new_path_metrics[13] = pm_candidate2;
-         trans_table[sample_nr][13] = 1.0;
+         trans_table[sample_nr][13] = std::abs( +input_symbol_real -increment[6]);
       }
 
-      pm_candidate1 = old_path_metrics[7] - input_symbol_real - increment[0];
-      pm_candidate2 = old_path_metrics[15] - input_symbol_real + increment[7];
+      pm_candidate1 = old_path_metrics[7] -input_symbol_real -increment[0];
+      pm_candidate2 = old_path_metrics[15] -input_symbol_real +increment[7];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[14] = pm_candidate1;
-         trans_table[sample_nr][14] = -1.0;
+         trans_table[sample_nr][14] = -std::abs( -input_symbol_real -increment[0]);
       }
       else{
          new_path_metrics[14] = pm_candidate2;
-         trans_table[sample_nr][14] = 1.0;
+         trans_table[sample_nr][14] = std::abs( -input_symbol_real +increment[7]);
       }
 
-      pm_candidate1 = old_path_metrics[7] + input_symbol_real + increment[0];
-      pm_candidate2 = old_path_metrics[15] + input_symbol_real - increment[7];
+      pm_candidate1 = old_path_metrics[7] +input_symbol_real +increment[0];
+      pm_candidate2 = old_path_metrics[15] +input_symbol_real -increment[7];
       if(pm_candidate1 > pm_candidate2){
          new_path_metrics[15] = pm_candidate1;
-         trans_table[sample_nr][15] = -1.0;
+         trans_table[sample_nr][15] = -std::abs( +input_symbol_real +increment[0]);
       }
       else{
          new_path_metrics[15] = pm_candidate2;
-         trans_table[sample_nr][15] = 1.0;
+         trans_table[sample_nr][15] = std::abs( +input_symbol_real -increment[7]);
       }
       tmp=old_path_metrics;
       old_path_metrics=new_path_metrics;
@@ -541,12 +543,8 @@
    while(sample_nr>0){
       sample_nr--;
       decision = (trans_table[sample_nr][state_nr]>0);
-
-      if(decision != out_bit)
-         output[sample_nr]=-trans_table[sample_nr][state_nr];
-      else
-         output[sample_nr]=trans_table[sample_nr][state_nr];
-
+     
+      output[sample_nr] = (decision == out_bit ? trans_table[sample_nr][state_nr] : -trans_table[sample_nr][state_nr]);
       out_bit = out_bit ^ real_imag ^ parity_table[state_nr];
       state_nr = prev_table[state_nr][decision];
       real_imag = !real_imag;