diff options
author | Tom Rondeau <trondeau@vt.edu> | 2012-06-14 16:12:00 -0400 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2012-06-14 16:13:17 -0400 |
commit | 1a5a1d4e2e0374f73cef5fbc9a01bf82d8b7d892 (patch) | |
tree | e8285bdf4c103deec225fabf0b9b1bfe4e1cdafd /gr-filter | |
parent | 4e2f38528e90ee4a05644d48d015b098a8651405 (diff) |
filter: added a ccf Volk dot product to use with ccf filters and used it in fir_filter_ccf.
Produces improved results to previous version.
Diffstat (limited to 'gr-filter')
-rw-r--r-- | gr-filter/include/filter/fir_filter.h | 2 | ||||
-rw-r--r-- | gr-filter/lib/fir_filter.cc | 30 | ||||
-rw-r--r-- | gr-filter/lib/fir_filter_XXX_impl.cc.t | 2 |
3 files changed, 26 insertions, 8 deletions
diff --git a/gr-filter/include/filter/fir_filter.h b/gr-filter/include/filter/fir_filter.h index 3ce21d3049..8bfaa4f50e 100644 --- a/gr-filter/include/filter/fir_filter.h +++ b/gr-filter/include/filter/fir_filter.h @@ -84,7 +84,7 @@ namespace gr { private: unsigned int d_ntaps; - gr_complex *d_taps; + float *d_taps; float **d_aligned_taps; gr_complex *d_output; int d_align; diff --git a/gr-filter/lib/fir_filter.cc b/gr-filter/lib/fir_filter.cc index 973be45d4b..18568da9d0 100644 --- a/gr-filter/lib/fir_filter.cc +++ b/gr-filter/lib/fir_filter.cc @@ -145,8 +145,14 @@ namespace gr { fir_filter_ccf::fir_filter_ccf(int decimation, const std::vector<float> &taps) { + d_align = volk_get_alignment(); + d_naligned = d_align / sizeof(gr_complex); + d_taps = NULL; set_taps(taps); + + // Make sure the output sample is always aligned, too. + d_output = fft::malloc_complex(1); } fir_filter_ccf::~fir_filter_ccf() @@ -167,9 +173,17 @@ namespace gr { } d_ntaps = (int)taps.size(); - d_taps = fft::malloc_complex(d_ntaps); + d_taps = fft::malloc_float(d_ntaps); for(unsigned int i = 0; i < d_ntaps; i++) { - d_taps[d_ntaps-i-1] = gr_complex(taps[i],0); + d_taps[d_ntaps-i-1] = taps[i]; + } + + // Make a set of taps at all possible arch alignments + d_aligned_taps = (float**)malloc(d_naligned*sizeof(float**)); + for(int i = 0; i < d_naligned; i++) { + d_aligned_taps[i] = fft::malloc_float(d_ntaps+d_naligned-1); + memset(d_aligned_taps[i], 0, sizeof(float)*(d_ntaps+d_naligned-1)); + memcpy(&d_aligned_taps[i][i], d_taps, sizeof(float)*(d_ntaps)); } } @@ -178,7 +192,7 @@ namespace gr { { std::vector<float> t; for(unsigned int i = 0; i < d_ntaps; i++) - t.push_back(d_taps[d_ntaps-i-1].real()); + t.push_back(d_taps[d_ntaps-i-1]); return t; } @@ -191,9 +205,13 @@ namespace gr { gr_complex fir_filter_ccf::filter(const gr_complex input[]) { - gr_complex output; - volk_32fc_x2_dot_prod_32fc_u(&output, input, d_taps, d_ntaps); - return output; + const gr_complex *ar = (gr_complex *)((unsigned long) input & ~(d_align-1)); + unsigned al = input - ar; + + volk_32fc_32f_dot_prod_32fc_a(d_output, ar, + d_aligned_taps[al], + (d_ntaps+al)); + return *d_output; } void diff --git a/gr-filter/lib/fir_filter_XXX_impl.cc.t b/gr-filter/lib/fir_filter_XXX_impl.cc.t index 18bec38be3..8ea8151f87 100644 --- a/gr-filter/lib/fir_filter_XXX_impl.cc.t +++ b/gr-filter/lib/fir_filter_XXX_impl.cc.t @@ -40,7 +40,7 @@ namespace gr { @IMPL_NAME@::@IMPL_NAME@(int decimation, const std::vector<@TAP_TYPE@> &taps) - : gr_sync_decimator("fir_filter_fff", + : gr_sync_decimator("@BASE_NAME@", gr_make_io_signature(1, 1, sizeof(@I_TYPE@)), gr_make_io_signature(1, 1, sizeof(@O_TYPE@)), decimation) |