summaryrefslogtreecommitdiff
path: root/gr-blocks/lib/moving_average_XX_impl.cc.t
diff options
context:
space:
mode:
Diffstat (limited to 'gr-blocks/lib/moving_average_XX_impl.cc.t')
-rw-r--r--gr-blocks/lib/moving_average_XX_impl.cc.t61
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;
}