summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gr-filter/lib/freq_xlating_fir_filter_impl.cc13
-rw-r--r--gr-filter/lib/freq_xlating_fir_filter_impl.h1
2 files changed, 11 insertions, 3 deletions
diff --git a/gr-filter/lib/freq_xlating_fir_filter_impl.cc b/gr-filter/lib/freq_xlating_fir_filter_impl.cc
index 8ddc967ba1..e94560d447 100644
--- a/gr-filter/lib/freq_xlating_fir_filter_impl.cc
+++ b/gr-filter/lib/freq_xlating_fir_filter_impl.cc
@@ -57,7 +57,8 @@ freq_xlating_fir_filter_impl<IN_T, OUT_T, TAP_T>::freq_xlating_fir_filter_impl(
d_proto_taps(taps),
d_center_freq(center_freq),
d_sampling_freq(sampling_freq),
- d_updated(false)
+ d_updated(false),
+ d_decim(decimation)
{
std::vector<gr_complex> dummy_taps;
d_composite_fir =
@@ -175,10 +176,16 @@ int freq_xlating_fir_filter_impl<IN_T, OUT_T, TAP_T>::work(
unsigned j = 0;
for (int i = 0; i < noutput_items; i++) {
- out[i] = d_r.rotate(d_composite_fir->filter(&in[j]));
- j += this->decimation();
+ out[i] = d_composite_fir->filter(&in[j]);
+ j += d_decim;
}
+ // re-use of the same buffer as the input and output is safe for many volk functions
+ // and faster than creating local temporary memory in the work function and doing an
+ // extra copy. So out is used below as both the in and out params to the rotate
+ // function.
+ d_r.rotateN(out, out, noutput_items);
+
return noutput_items;
}
diff --git a/gr-filter/lib/freq_xlating_fir_filter_impl.h b/gr-filter/lib/freq_xlating_fir_filter_impl.h
index 73b83a2567..3475107a8a 100644
--- a/gr-filter/lib/freq_xlating_fir_filter_impl.h
+++ b/gr-filter/lib/freq_xlating_fir_filter_impl.h
@@ -42,6 +42,7 @@ protected:
double d_center_freq;
double d_sampling_freq;
bool d_updated;
+ const int d_decim;
virtual void build_composite_fir();