diff options
Diffstat (limited to 'gr-fft/lib/fft_vfc_fftw.cc')
-rw-r--r-- | gr-fft/lib/fft_vfc_fftw.cc | 140 |
1 files changed, 62 insertions, 78 deletions
diff --git a/gr-fft/lib/fft_vfc_fftw.cc b/gr-fft/lib/fft_vfc_fftw.cc index b635c3b9bd..eac4268ba5 100644 --- a/gr-fft/lib/fft_vfc_fftw.cc +++ b/gr-fft/lib/fft_vfc_fftw.cc @@ -30,97 +30,81 @@ #include <string.h> namespace gr { - namespace fft { - - fft_vfc::sptr fft_vfc::make(int fft_size, bool forward, - const std::vector<float> &window, - int nthreads) - { - return gnuradio::get_initial_sptr(new fft_vfc_fftw - (fft_size, forward, window, - nthreads)); - } - - fft_vfc_fftw::fft_vfc_fftw(int fft_size, bool forward, - const std::vector<float> &window, - int nthreads) - : sync_block("fft_vfc_fftw", - io_signature::make(1, 1, fft_size * sizeof(float)), - io_signature::make(1, 1, fft_size * sizeof(gr_complex))), - d_fft_size(fft_size), d_forward(forward) - { - d_fft = new fft_complex(d_fft_size, d_forward, nthreads); - if(!set_window(window)) +namespace fft { + +fft_vfc::sptr +fft_vfc::make(int fft_size, bool forward, const std::vector<float>& window, int nthreads) +{ + return gnuradio::get_initial_sptr( + new fft_vfc_fftw(fft_size, forward, window, nthreads)); +} + +fft_vfc_fftw::fft_vfc_fftw(int fft_size, + bool forward, + const std::vector<float>& window, + int nthreads) + : sync_block("fft_vfc_fftw", + io_signature::make(1, 1, fft_size * sizeof(float)), + io_signature::make(1, 1, fft_size * sizeof(gr_complex))), + d_fft_size(fft_size), + d_forward(forward) +{ + d_fft = new fft_complex(d_fft_size, d_forward, nthreads); + if (!set_window(window)) throw std::runtime_error("fft_vfc: window not the same length as fft_size\n"); - } - - fft_vfc_fftw::~fft_vfc_fftw() - { - delete d_fft; - } +} - void - fft_vfc_fftw::set_nthreads(int n) - { - d_fft->set_nthreads(n); - } +fft_vfc_fftw::~fft_vfc_fftw() { delete d_fft; } - int - fft_vfc_fftw::nthreads() const - { - return d_fft->nthreads(); - } +void fft_vfc_fftw::set_nthreads(int n) { d_fft->set_nthreads(n); } - bool - fft_vfc_fftw::set_window(const std::vector<float> &window) - { - if(window.size()==0 || window.size()==d_fft_size) { - d_window=window; - return true; - } - else - return false; - } +int fft_vfc_fftw::nthreads() const { return d_fft->nthreads(); } - int - fft_vfc_fftw::work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { - const float *in = (const float *)input_items[0]; - gr_complex *out = (gr_complex *)output_items[0]; +bool fft_vfc_fftw::set_window(const std::vector<float>& window) +{ + if (window.size() == 0 || window.size() == d_fft_size) { + d_window = window; + return true; + } else + return false; +} - unsigned int output_data_size = output_signature()->sizeof_stream_item (0); +int fft_vfc_fftw::work(int noutput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ + const float* in = (const float*)input_items[0]; + gr_complex* out = (gr_complex*)output_items[0]; - int count = 0; + unsigned int output_data_size = output_signature()->sizeof_stream_item(0); - while(count++ < noutput_items) { + int count = 0; - // copy input into optimally aligned buffer - if(d_window.size()) { - gr_complex *dst = d_fft->get_inbuf(); - for(unsigned int i = 0; i < d_fft_size; i++) // apply window - dst[i] = in[i] * d_window[i]; - } - else { - gr_complex *dst = d_fft->get_inbuf(); - for(unsigned int i = 0; i < d_fft_size; i++) // float to complex conversion - dst[i] = in[i]; - } + while (count++ < noutput_items) { - // compute the fft - d_fft->execute(); + // copy input into optimally aligned buffer + if (d_window.size()) { + gr_complex* dst = d_fft->get_inbuf(); + for (unsigned int i = 0; i < d_fft_size; i++) // apply window + dst[i] = in[i] * d_window[i]; + } else { + gr_complex* dst = d_fft->get_inbuf(); + for (unsigned int i = 0; i < d_fft_size; i++) // float to complex conversion + dst[i] = in[i]; + } - // copy result to output stream - memcpy(out, d_fft->get_outbuf(), output_data_size); + // compute the fft + d_fft->execute(); - in += d_fft_size; - out += d_fft_size; - } + // copy result to output stream + memcpy(out, d_fft->get_outbuf(), output_data_size); - return noutput_items; + in += d_fft_size; + out += d_fft_size; } - } /* namespace fft */ -} /* namespace gr */ + return noutput_items; +} +} /* namespace fft */ +} /* namespace gr */ |