summaryrefslogtreecommitdiff
path: root/gr-filter
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2012-06-14 16:12:00 -0400
committerTom Rondeau <trondeau@vt.edu>2012-06-14 16:13:17 -0400
commit1a5a1d4e2e0374f73cef5fbc9a01bf82d8b7d892 (patch)
treee8285bdf4c103deec225fabf0b9b1bfe4e1cdafd /gr-filter
parent4e2f38528e90ee4a05644d48d015b098a8651405 (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.h2
-rw-r--r--gr-filter/lib/fir_filter.cc30
-rw-r--r--gr-filter/lib/fir_filter_XXX_impl.cc.t2
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)