3 * Copyright 2004 Free Software Foundation, Inc.
5 * This file is part of GNU Radio
7 * GNU Radio is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
12 * GNU Radio is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Radio; see the file COPYING. If not, write to
19 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
25 #include "trellis_calc_metric.h"
27 // soft decisions (Euclidean distance squared)
28 void calc_metric_s(const int O, const int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type)
34 case TRELLIS_EUCLIDEAN:
35 for(int o=0;o<O;o++) {
37 for (int m=0;m<D;m++) {
38 float s=in[m]-TABLE[o*D+m];
43 case TRELLIS_HARD_SYMBOL:
44 for(int o=0;o<O;o++) {
46 for (int m=0;m<D;m++) {
47 float s=in[m]-TABLE[o*D+m];
55 for(int o=0;o<O;o++) {
56 metric[o] = (o==minmi?0.0:1.0);
59 case TRELLIS_HARD_BIT:
60 throw std::runtime_error ("Invalid metric type (not yet implemented).");
63 throw std::runtime_error ("Invalid metric type.");
69 // soft decisions (Euclidean distance squared)
70 void calc_metric_i(const int O, const int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type)
76 case TRELLIS_EUCLIDEAN:
77 for(int o=0;o<O;o++) {
79 for (int m=0;m<D;m++) {
80 float s=in[m]-TABLE[o*D+m];
85 case TRELLIS_HARD_SYMBOL:
86 for(int o=0;o<O;o++) {
88 for (int m=0;m<D;m++) {
89 float s=in[m]-TABLE[o*D+m];
97 for(int o=0;o<O;o++) {
98 metric[o] = (o==minmi?0.0:1.0);
101 case TRELLIS_HARD_BIT:
102 throw std::runtime_error ("Invalid metric type (not yet implemented).");
105 throw std::runtime_error ("Invalid metric type.");
115 // soft decisions (Euclidean distance squared)
116 void calc_metric_f(const int O, const int D, const std::vector<float> &TABLE, const float *in, float *metric, trellis_metric_type_t type)
118 float minm = FLT_MAX;
122 case TRELLIS_EUCLIDEAN:
123 for(int o=0;o<O;o++) {
125 for (int m=0;m<D;m++) {
126 float s=in[m]-TABLE[o*D+m];
131 case TRELLIS_HARD_SYMBOL:
132 for(int o=0;o<O;o++) {
134 for (int m=0;m<D;m++) {
135 float s=in[m]-TABLE[o*D+m];
143 for(int o=0;o<O;o++) {
144 metric[o] = (o==minmi?0.0:1.0);
147 case TRELLIS_HARD_BIT:
148 throw std::runtime_error ("Invalid metric type (not yet implemented).");
151 throw std::runtime_error ("Invalid metric type.");
156 // soft decisions (Euclidean distance squared)
157 void calc_metric_c(const int O, const int D, const std::vector<gr_complex> &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type)
159 float minm = FLT_MAX;
163 case TRELLIS_EUCLIDEAN:
164 for(int o=0;o<O;o++) {
166 for (int m=0;m<D;m++) {
167 gr_complex s=in[m]-TABLE[o*D+m];
168 metric[o]+=s.real()*s.real()+s.imag()*s.imag();
171 case TRELLIS_HARD_SYMBOL:
172 throw std::runtime_error ("Invalid metric type (not yet implemented).");
174 case TRELLIS_HARD_BIT:
175 throw std::runtime_error ("Invalid metric type (not yet implemented).");
178 throw std::runtime_error ("Invalid metric type.");