|
1 | 1 | /* -*- c++ -*- */
|
2 | 2 | /*
|
3 |
| - * Copyright 2008,2010,2013 Free Software Foundation, Inc. |
| 3 | + * Copyright 2008,2010,2013,2017 Free Software Foundation, Inc. |
4 | 4 | *
|
5 | 5 | * This file is part of GNU Radio
|
6 | 6 | *
|
@@ -33,24 +33,30 @@ namespace gr {
|
33 | 33 | namespace blocks {
|
34 | 34 |
|
35 | 35 | @NAME@::sptr
|
36 |
| - @NAME@::make(int length, @O_TYPE@ scale, int max_iter) |
| 36 | + @NAME@::make(int length, @O_TYPE@ scale, int max_iter, unsigned int vlen) |
37 | 37 | {
|
38 | 38 | return gnuradio::get_initial_sptr
|
39 |
| - (new @NAME_IMPL@(length, scale, max_iter)); |
| 39 | + (new @NAME_IMPL@(length, scale, max_iter, vlen)); |
40 | 40 | }
|
41 | 41 |
|
42 |
| - @NAME_IMPL@::@NAME_IMPL@(int length, @O_TYPE@ scale, int max_iter) |
| 42 | + @NAME_IMPL@::@NAME_IMPL@(int length, @O_TYPE@ scale, int max_iter, unsigned int vlen) |
43 | 43 | : sync_block("@NAME@",
|
44 |
| - io_signature::make(1, 1, sizeof(@I_TYPE@)), |
45 |
| - io_signature::make(1, 1, sizeof(@O_TYPE@))), |
| 44 | + io_signature::make(1, 1, sizeof(@I_TYPE@)*vlen), |
| 45 | + io_signature::make(1, 1, sizeof(@O_TYPE@)*vlen)), |
46 | 46 | d_length(length),
|
47 | 47 | d_scale(scale),
|
48 | 48 | d_max_iter(max_iter),
|
| 49 | + d_vlen(vlen), |
49 | 50 | d_new_length(length),
|
50 | 51 | d_new_scale(scale),
|
51 | 52 | d_updated(false)
|
52 | 53 | {
|
53 | 54 | set_history(length);
|
| 55 | + //we don't have C++11's <array>, so initialize the stored vector instead |
| 56 | + //we store this vector so that work() doesn't spend its time allocating and freeing vector storage |
| 57 | + if(d_vlen > 1) { |
| 58 | + d_sum = std::vector<@I_TYPE@>(d_vlen); |
| 59 | + } |
54 | 60 | }
|
55 | 61 |
|
56 | 62 | @NAME_IMPL@::~@NAME_IMPL@()
|
@@ -95,18 +101,37 @@ namespace gr {
|
95 | 101 | const @I_TYPE@ *in = (const @I_TYPE@ *)input_items[0];
|
96 | 102 | @O_TYPE@ *out = (@O_TYPE@ *)output_items[0];
|
97 | 103 |
|
98 |
| - @I_TYPE@ sum = 0; |
99 |
| - int num_iter = (noutput_items>d_max_iter) ? d_max_iter : noutput_items; |
100 |
| - for(int i = 0; i < d_length-1; i++) { |
101 |
| - sum += in[i]; |
102 |
| - } |
103 |
| - |
104 |
| - for(int i = 0; i < num_iter; i++) { |
105 |
| - sum += in[i+d_length-1]; |
106 |
| - out[i] = sum * d_scale; |
107 |
| - sum -= in[i]; |
| 104 | + unsigned int num_iter = (unsigned int)((noutput_items>d_max_iter) ? d_max_iter : noutput_items); |
| 105 | + if(d_vlen == 1) { |
| 106 | + @I_TYPE@ sum = 0; |
| 107 | + for(unsigned int i = 0; i < d_length-1; i++) { |
| 108 | + sum += in[i]; |
| 109 | + } |
| 110 | + |
| 111 | + for(unsigned int i = 0; i < num_iter; i++) { |
| 112 | + sum += in[i+d_length-1]; |
| 113 | + out[i] = sum * d_scale; |
| 114 | + sum -= in[i]; |
| 115 | + } |
| 116 | + |
| 117 | + } else { // d_vlen > 1 |
| 118 | + //TODO: VOLKize this zeroing? |
| 119 | + std::fill(d_sum.begin(), d_sum.end(), (@I_TYPE@)0); |
| 120 | + |
| 121 | + for(unsigned int i = 0; i < d_length - 1; i++) { |
| 122 | + for(unsigned int elem = 0; elem < d_vlen; elem++) { |
| 123 | + d_sum[elem] += in[i*d_vlen + elem]; |
| 124 | + } |
| 125 | + } |
| 126 | + |
| 127 | + for(unsigned int i = 0; i < num_iter; i++) { |
| 128 | + for(unsigned int elem = 0; elem < d_vlen; elem++) { |
| 129 | + d_sum[elem] += in[(i+d_length-1)*d_vlen + elem]; |
| 130 | + out[i*d_vlen + elem] = d_sum[elem] * d_scale; |
| 131 | + d_sum[elem] -= in[i*d_vlen + elem]; |
| 132 | + } |
| 133 | + } |
108 | 134 | }
|
109 |
| - |
110 | 135 | return num_iter;
|
111 | 136 | }
|
112 | 137 |
|
|
0 commit comments