diff options
Diffstat (limited to 'gr-trellis/src/lib')
-rw-r--r-- | gr-trellis/src/lib/interleaver.cc | 2 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_calc_metric.cc | 55 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_calc_metric.h | 12 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_metrics_X.cc.t | 3 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_metrics_c.cc | 3 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_metrics_f.cc | 3 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_metrics_i.cc | 3 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_metrics_s.cc | 3 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_siso_combined_f.cc | 2 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t | 2 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_viterbi_combined_b.cc | 2 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_viterbi_combined_i.cc | 2 | ||||
-rw-r--r-- | gr-trellis/src/lib/trellis_viterbi_combined_s.cc | 2 |
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; |