Tuesday, February 5, 2019

[Discuss-gnuradio] Proper input size for fir_filter_ccf

I'm struggling to get the C++ fir_filter_ccf code to work correctly. My C++ code is pretty straightforward, and the same inputs work perfectly in Python:

// matches the taps produced in the Python code
vector<float> taps = firdes::low_pass(1.0, 10000000, 100000, 10000, (gr::filter::firdes::win_type)0, 0);
vector<gr_complex> input = vector<gr_complex>(100, gr_complex(1.0, 1.0));
vector<gr_complex> output = vector<gr_complex>(5);

kernel::fir_filter_ccf *filter = new kernel::fir_filter_ccf(20, taps);
filter->filterNdec(output.data(), input.data(), output.size(), 20);

This results in Valgrind reporting invalid reads:

Invalid read of size 4
   at 0x6A89FFC: volk_32fc_32f_dot_prod_32fc_generic (in /home/wspeirs/src/gnuradio-3.7.9.3/build/volk/lib/libvolk.so.1.2.3)
   by 0x4E7DA18: gr::filter::kernel::fir_filter_ccf::filter(std::complex<float> const*) (in /home/wspeirs/src/gnuradio-3.7.9.3/build/gr-filter/lib/libgnuradio-filter-3.7.9.3.so.0.0.0)
   by 0x4E7DACE: gr::filter::kernel::fir_filter_ccf::filterNdec(std::complex<float>*, std::complex<float> const*, unsigned long, unsigned int) (in /home/wspeirs/src/gnuradio-3.7.9.3/build/gr-filter/lib/libgnuradio-filter-3.7.9.3.so.0.0.0)
   by 0x40439B: main (low_pass.cc:92)
 Address 0x7c496c0 is 0 bytes after a block of size 800 alloc'd
   at 0x4C2E0EF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
   by 0x406C0F: __gnu_cxx::new_allocator<std::complex<float> >::allocate(unsigned long, void const*) (new_allocator.h:104)
   by 0x406B08: __gnu_cxx::__alloc_traits<std::allocator<std::complex<float> > >::allocate(std::allocator<std::complex<float> >&, unsigned long) (alloc_traits.h:182)
   by 0x40696D: std::_Vector_base<std::complex<float>, std::allocator<std::complex<float> > >::_M_allocate(unsigned long) (stl_vector.h:170)
   by 0x40672A: std::_Vector_base<std::complex<float>, std::allocator<std::complex<float> > >::_M_create_storage(unsigned long) (stl_vector.h:185)
   by 0x40634C: std::_Vector_base<std::complex<float>, std::allocator<std::complex<float> > >::_Vector_base(unsigned long, std::allocator<std::complex<float> > const&) (stl_vector.h:136)
   by 0x405B95: std::vector<std::complex<float>, std::allocator<std::complex<float> > >::vector(unsigned long, std::complex<float> const&, std::allocator<std::complex<float> > const&) (stl_vector.h:305)
   by 0x4042D7: main (low_pass.cc:82)

Any thoughts on why the dot-product computation attempts to read past the end of my input vector? I'm assuming my input vector size is wrong, but I'm not sure what it's supposed to be.

Thanks!

Bill-

No comments:

Post a Comment