diff options
Diffstat (limited to 'gr-trellis/lib/metrics_impl.cc')
-rw-r--r-- | gr-trellis/lib/metrics_impl.cc | 185 |
1 files changed, 93 insertions, 92 deletions
diff --git a/gr-trellis/lib/metrics_impl.cc b/gr-trellis/lib/metrics_impl.cc index 1ed6c69803..f3ebb4f5d3 100644 --- a/gr-trellis/lib/metrics_impl.cc +++ b/gr-trellis/lib/metrics_impl.cc @@ -32,104 +32,105 @@ #include <iostream> namespace gr { - namespace trellis { - - template <class T> - typename metrics<T>::sptr - metrics<T>::make(int O, int D, const std::vector<T> &TABLE, - digital::trellis_metric_type_t TYPE) - { - return gnuradio::get_initial_sptr - (new metrics_impl<T>(O,D,TABLE,TYPE)); - } - - template <class T> - metrics_impl<T>::metrics_impl(int O, int D, const std::vector<T> &TABLE, - digital::trellis_metric_type_t TYPE) +namespace trellis { + +template <class T> +typename metrics<T>::sptr metrics<T>::make(int O, + int D, + const std::vector<T>& TABLE, + digital::trellis_metric_type_t TYPE) +{ + return gnuradio::get_initial_sptr(new metrics_impl<T>(O, D, TABLE, TYPE)); +} + +template <class T> +metrics_impl<T>::metrics_impl(int O, + int D, + const std::vector<T>& TABLE, + digital::trellis_metric_type_t TYPE) : block("metrics", - io_signature::make(1, -1, sizeof (T)), - io_signature::make(1, -1, sizeof (float))), - d_O(O), d_D(D), d_TYPE(TYPE), d_TABLE(TABLE) - { - this->set_relative_rate ((uint64_t)d_O, (uint64_t)d_D); - this->set_output_multiple ((int)d_O); - } - - template <class T> - void metrics_impl<T>::set_O(int O) - { - gr::thread::scoped_lock guard(this->d_setlock); - d_O = O; - this->set_relative_rate ((uint64_t)d_O, (uint64_t)d_D); - this->set_output_multiple ((int)d_O); - } - - template <class T> - void metrics_impl<T>::set_D(int D) - { - gr::thread::scoped_lock guard(this->d_setlock); - d_D = D; - this->set_relative_rate ((uint64_t)d_O, (uint64_t)d_D); - } - - template <class T> - void - metrics_impl<T>::set_TYPE(digital::trellis_metric_type_t type) - { - gr::thread::scoped_lock guard(this->d_setlock); - d_TYPE = type; + io_signature::make(1, -1, sizeof(T)), + io_signature::make(1, -1, sizeof(float))), + d_O(O), + d_D(D), + d_TYPE(TYPE), + d_TABLE(TABLE) +{ + this->set_relative_rate((uint64_t)d_O, (uint64_t)d_D); + this->set_output_multiple((int)d_O); +} + +template <class T> +void metrics_impl<T>::set_O(int O) +{ + gr::thread::scoped_lock guard(this->d_setlock); + d_O = O; + this->set_relative_rate((uint64_t)d_O, (uint64_t)d_D); + this->set_output_multiple((int)d_O); +} + +template <class T> +void metrics_impl<T>::set_D(int D) +{ + gr::thread::scoped_lock guard(this->d_setlock); + d_D = D; + this->set_relative_rate((uint64_t)d_O, (uint64_t)d_D); +} + +template <class T> +void metrics_impl<T>::set_TYPE(digital::trellis_metric_type_t type) +{ + gr::thread::scoped_lock guard(this->d_setlock); + d_TYPE = type; +} + +template <class T> +void metrics_impl<T>::set_TABLE(const std::vector<T>& table) +{ + gr::thread::scoped_lock guard(this->d_setlock); + d_TABLE = table; +} + +template <class T> +metrics_impl<T>::~metrics_impl() +{ +} + + +template <class T> +void metrics_impl<T>::forecast(int noutput_items, gr_vector_int& ninput_items_required) +{ + int input_required = d_D * noutput_items / d_O; + unsigned ninputs = ninput_items_required.size(); + for (unsigned int i = 0; i < ninputs; i++) + ninput_items_required[i] = input_required; +} + +template <class T> +int metrics_impl<T>::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ + gr::thread::scoped_lock guard(this->d_setlock); + int nstreams = input_items.size(); + + for (int m = 0; m < nstreams; m++) { + const T* in = (T*)input_items[m]; + float* out = (float*)output_items[m]; + + for (int i = 0; i < noutput_items / d_O; i++) { + calc_metric(d_O, d_D, d_TABLE, &(in[i * d_D]), &(out[i * d_O]), d_TYPE); + } } - template <class T> - void - metrics_impl<T>::set_TABLE(const std::vector<T> &table) - { - gr::thread::scoped_lock guard(this->d_setlock); - d_TABLE = table; - } - - template <class T> - metrics_impl<T>::~metrics_impl() - { - } - - - template <class T> - void - metrics_impl<T>::forecast(int noutput_items, gr_vector_int &ninput_items_required) - { - int input_required = d_D * noutput_items / d_O; - unsigned ninputs = ninput_items_required.size(); - for(unsigned int i = 0; i < ninputs; i++) - ninput_items_required[i] = input_required; - } - - template <class T> - int - metrics_impl<T>::general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { - gr::thread::scoped_lock guard(this->d_setlock); - int nstreams = input_items.size(); - - for(int m = 0; m < nstreams; m++) { - const T *in = (T*)input_items[m]; - float *out = (float*)output_items[m]; - - for(int i = 0; i < noutput_items / d_O ; i++) { - calc_metric(d_O, d_D, d_TABLE,&(in[i*d_D]), &(out[i*d_O]), d_TYPE); - } - } - - this->consume_each(d_D * noutput_items / d_O); - return noutput_items; - } + this->consume_each(d_D * noutput_items / d_O); + return noutput_items; +} template class metrics<std::int16_t>; template class metrics<std::int32_t>; template class metrics<float>; template class metrics<gr_complex>; - } /* namespace trellis */ +} /* namespace trellis */ } /* namespace gr */ |