diff options
Diffstat (limited to 'gr-blocks/lib/moving_average_XX_impl.cc.t')
-rw-r--r-- | gr-blocks/lib/moving_average_XX_impl.cc.t | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/gr-blocks/lib/moving_average_XX_impl.cc.t b/gr-blocks/lib/moving_average_XX_impl.cc.t index 089166971f..fe0a2bdebd 100644 --- a/gr-blocks/lib/moving_average_XX_impl.cc.t +++ b/gr-blocks/lib/moving_average_XX_impl.cc.t @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2008,2010,2013 Free Software Foundation, Inc. + * Copyright 2008,2010,2013,2017 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -33,24 +33,30 @@ namespace gr { namespace blocks { @NAME@::sptr - @NAME@::make(int length, @O_TYPE@ scale, int max_iter) + @NAME@::make(int length, @O_TYPE@ scale, int max_iter, unsigned int vlen) { return gnuradio::get_initial_sptr - (new @NAME_IMPL@(length, scale, max_iter)); + (new @NAME_IMPL@(length, scale, max_iter, vlen)); } - @NAME_IMPL@::@NAME_IMPL@(int length, @O_TYPE@ scale, int max_iter) + @NAME_IMPL@::@NAME_IMPL@(int length, @O_TYPE@ scale, int max_iter, unsigned int vlen) : sync_block("@NAME@", - io_signature::make(1, 1, sizeof(@I_TYPE@)), - io_signature::make(1, 1, sizeof(@O_TYPE@))), + io_signature::make(1, 1, sizeof(@I_TYPE@)*vlen), + io_signature::make(1, 1, sizeof(@O_TYPE@)*vlen)), d_length(length), d_scale(scale), d_max_iter(max_iter), + d_vlen(vlen), d_new_length(length), d_new_scale(scale), d_updated(false) { set_history(length); + //we don't have C++11's <array>, so initialize the stored vector instead + //we store this vector so that work() doesn't spend its time allocating and freeing vector storage + if(d_vlen > 1) { + d_sum = std::vector<@I_TYPE@>(d_vlen); + } } @NAME_IMPL@::~@NAME_IMPL@() @@ -95,18 +101,39 @@ namespace gr { const @I_TYPE@ *in = (const @I_TYPE@ *)input_items[0]; @O_TYPE@ *out = (@O_TYPE@ *)output_items[0]; - @I_TYPE@ sum = 0; - int num_iter = (noutput_items>d_max_iter) ? d_max_iter : noutput_items; - for(int i = 0; i < d_length-1; i++) { - sum += in[i]; - } - - for(int i = 0; i < num_iter; i++) { - sum += in[i+d_length-1]; - out[i] = sum * d_scale; - sum -= in[i]; + unsigned int num_iter = (unsigned int)((noutput_items>d_max_iter) ? d_max_iter : noutput_items); + if(d_vlen == 1) { + @I_TYPE@ sum = in[0]; + for(int i = 1; i < d_length-1; i++) { + sum += in[i]; + } + + for(unsigned int i = 0; i < num_iter; i++) { + sum += in[i+d_length-1]; + out[i] = sum * d_scale; + sum -= in[i]; + } + + } else { // d_vlen > 1 + //gets automatically optimized well + for(unsigned int elem = 0; elem < d_vlen; elem++) { + d_sum[elem] = in[elem]; + } + + for(int i = 1; i < d_length - 1; i++) { + for(unsigned int elem = 0; elem < d_vlen; elem++) { + d_sum[elem] += in[i*d_vlen + elem]; + } + } + + for(unsigned int i = 0; i < num_iter; i++) { + for(unsigned int elem = 0; elem < d_vlen; elem++) { + d_sum[elem] += in[(i+d_length-1)*d_vlen + elem]; + out[i*d_vlen + elem] = d_sum[elem] * d_scale; + d_sum[elem] -= in[i*d_vlen + elem]; + } + } } - return num_iter; } |