diff options
Diffstat (limited to 'gr-qtgui/lib/qtgui_freq_sink_c.cc')
-rw-r--r-- | gr-qtgui/lib/qtgui_freq_sink_c.cc | 345 |
1 files changed, 0 insertions, 345 deletions
diff --git a/gr-qtgui/lib/qtgui_freq_sink_c.cc b/gr-qtgui/lib/qtgui_freq_sink_c.cc deleted file mode 100644 index 7d6c3d7c00..0000000000 --- a/gr-qtgui/lib/qtgui_freq_sink_c.cc +++ /dev/null @@ -1,345 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2012 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <qtgui_freq_sink_c.h> -#include <gr_io_signature.h> -#include <string.h> - -#include <QTimer> -#include <volk/volk.h> - -qtgui_freq_sink_c_sptr -qtgui_make_freq_sink_c(int fftsize, int wintype, - double fc, double bw, - const std::string &name, - int nconnections, - QWidget *parent) -{ - return gnuradio::get_initial_sptr - (new qtgui_freq_sink_c(fftsize, wintype, - fc, bw, name, - nconnections, - parent)); -} - -qtgui_freq_sink_c::qtgui_freq_sink_c(int fftsize, int wintype, - double fc, double bw, - const std::string &name, - int nconnections, - QWidget *parent) - : gr_sync_block("freq_sink_c", - gr_make_io_signature(1, -1, sizeof(gr_complex)), - gr_make_io_signature(0, 0, 0)), - d_fftsize(fftsize), d_fftavg(1.0), - d_wintype((gr_firdes::win_type)(wintype)), - d_center_freq(fc), d_bandwidth(bw), d_name(name), - d_nconnections(nconnections), d_parent(parent) -{ - d_main_gui = NULL; - - // Perform fftshift operation; - // this is usually desired when plotting - d_shift = true; - - d_fft = new gr::fft::fft_complex(d_fftsize, true); - d_fbuf = gr::fft::malloc_float(d_fftsize); - - d_index = 0; - for(int i = 0; i < d_nconnections; i++) { - d_residbufs.push_back(gr::fft::malloc_complex(d_fftsize)); - d_magbufs.push_back(gr::fft::malloc_double(d_fftsize)); - } - - buildwindow(); - - initialize(); -} - -qtgui_freq_sink_c::~qtgui_freq_sink_c() -{ - for(int i = 0; i < d_nconnections; i++) { - gr::fft::free(d_residbufs[i]); - gr::fft::free(d_magbufs[i]); - } - delete d_fft; - delete d_fbuf; -} - -void -qtgui_freq_sink_c::forecast(int noutput_items, gr_vector_int &ninput_items_required) -{ - unsigned int ninputs = ninput_items_required.size(); - for (unsigned int i = 0; i < ninputs; i++) { - ninput_items_required[i] = std::min(d_fftsize, 8191); - } -} - -void -qtgui_freq_sink_c::initialize() -{ - if(qApp != NULL) { - d_qApplication = qApp; - } - else { - int argc=0; - char **argv = NULL; - d_qApplication = new QApplication(argc, argv); - } - - d_main_gui = new FreqDisplayForm(d_nconnections, d_parent); - d_main_gui->SetFFTSize(d_fftsize); - d_main_gui->SetFrequencyRange(d_center_freq, - d_center_freq - d_bandwidth/2.0, - d_center_freq + d_bandwidth/2.0); - - // initialize update time to 10 times a second - set_update_time(0.1); - d_last_time = 0; -} - -void -qtgui_freq_sink_c::exec_() -{ - d_qApplication->exec(); -} - -QWidget* -qtgui_freq_sink_c::qwidget() -{ - return d_main_gui; -} - -PyObject* -qtgui_freq_sink_c::pyqwidget() -{ - PyObject *w = PyLong_FromVoidPtr((void*)d_main_gui); - PyObject *retarg = Py_BuildValue("N", w); - return retarg; -} - -void -qtgui_freq_sink_c::set_fft_size(const int fftsize) -{ - d_fftsize = fftsize; - d_main_gui->SetFFTSize(fftsize); -} - -int -qtgui_freq_sink_c::fft_size() const -{ - return d_fftsize; -} - -void -qtgui_freq_sink_c::set_fft_average(const float fftavg) -{ - d_fftavg = fftavg; - d_main_gui->SetFFTAverage(fftavg); -} - -float -qtgui_freq_sink_c::fft_average() const -{ - return d_fftavg; -} - -void -qtgui_freq_sink_c::set_frequency_range(const double centerfreq, - const double bandwidth) -{ - d_center_freq = centerfreq; - d_bandwidth = bandwidth; - d_main_gui->SetFrequencyRange(d_center_freq, - -d_bandwidth/2.0, - d_bandwidth/2.0); -} - -void -qtgui_freq_sink_c::set_fft_power_db(double min, double max) -{ - d_main_gui->SetFrequencyAxis(min, max); -} - -void -qtgui_freq_sink_c::set_update_time(double t) -{ - //convert update time to ticks - gruel::high_res_timer_type tps = gruel::high_res_timer_tps(); - d_update_time = t * tps; - d_main_gui->setUpdateTime(t); -} - -void -qtgui_freq_sink_c::set_title(int which, const std::string &title) -{ - d_main_gui->setTitle(which, title.c_str()); -} - -void -qtgui_freq_sink_c::set_color(int which, const std::string &color) -{ - d_main_gui->setColor(which, color.c_str()); -} - -void -qtgui_freq_sink_c::set_resize(int width, int height) -{ - d_main_gui->resize(QSize(width, height)); -} - -void -qtgui_freq_sink_c::fft(float *data_out, const gr_complex *data_in, int size) -{ - if(d_window.size()) { - volk_32fc_32f_multiply_32fc_a(d_fft->get_inbuf(), data_in, &d_window.front(), size); - } - else { - memcpy(d_fft->get_inbuf(), data_in, sizeof(gr_complex)*size); - } - - d_fft->execute(); // compute the fft - - volk_32fc_s32f_x2_power_spectral_density_32f_a(data_out, d_fft->get_outbuf(), size, 1.0, size); - - // Perform shift operation - unsigned int len = (unsigned int)(floor(size/2.0)); - float *tmp = (float*)malloc(sizeof(float)*len); - memcpy(tmp, &data_out[0], sizeof(float)*len); - memcpy(&data_out[0], &data_out[len], sizeof(float)*(size - len)); - memcpy(&data_out[size - len], tmp, sizeof(float)*len); - free(tmp); -} - -void -qtgui_freq_sink_c::windowreset() -{ - //gr_firdes::win_type newwintype = (gr_firdes::win_type)d_main_gui->GetWindowType(); - //if(d_wintype != newwintype) { - // d_wintype = newwintype; - // buildwindow(); - //} -} - -void -qtgui_freq_sink_c::buildwindow() -{ - d_window.clear(); - if(d_wintype != 0) { - d_window = gr_firdes::window(d_wintype, d_fftsize, 6.76); - } -} - -void -qtgui_freq_sink_c::fftresize() -{ - gruel::scoped_lock lock(d_mutex); - - int newfftsize = d_main_gui->GetFFTSize(); - d_fftavg = d_main_gui->GetFFTAverage(); - - if(newfftsize != d_fftsize) { - // Resize residbuf and replace data - for(int i = 0; i < d_nconnections; i++) { - gr::fft::free(d_residbufs[i]); - gr::fft::free(d_magbufs[i]); - - d_residbufs[i] = gr::fft::malloc_complex(newfftsize); - d_magbufs[i] = gr::fft::malloc_double(newfftsize); - - memset(d_magbufs[i], 0, newfftsize*sizeof(double)); - } - - // Set new fft size and reset buffer index - // (throws away any currently held data, but who cares?) - d_fftsize = newfftsize; - d_index = 0; - - // Reset window to reflect new size - buildwindow(); - - // Reset FFTW plan for new size - delete d_fft; - d_fft = new gr::fft::fft_complex(d_fftsize, true); - - gr::fft::free(d_fbuf); - d_fbuf = gr::fft::malloc_float(d_fftsize); - } -} - -int -qtgui_freq_sink_c::work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) -{ - int j=0; - const gr_complex *in = (const gr_complex*)input_items[0]; - - // Update the FFT size from the application - fftresize(); - windowreset(); - - for(int i=0; i < noutput_items; i+=d_fftsize) { - unsigned int datasize = noutput_items - i; - unsigned int resid = d_fftsize-d_index; - - // If we have enough input for one full FFT, do it - if(datasize >= resid) { - - for(int n = 0; n < d_nconnections; n++) { - // Fill up residbuf with d_fftsize number of items - in = (const gr_complex*)input_items[n]; - memcpy(d_residbufs[n]+d_index, &in[j], sizeof(gr_complex)*resid); - - fft(d_fbuf, d_residbufs[n], d_fftsize); - for(int x = 0; x < d_fftsize; x++) { - d_magbufs[n][x] = (double)((1.0-d_fftavg)*d_magbufs[n][x] + (d_fftavg)*d_fbuf[x]); - } - - //volk_32f_convert_64f_a(d_magbufs[n], d_fbuf, d_fftsize); - } - - if(gruel::high_res_timer_now() - d_last_time > d_update_time) { - d_last_time = gruel::high_res_timer_now(); - d_qApplication->postEvent(d_main_gui, - new FreqUpdateEvent(d_magbufs, d_fftsize)); - } - - d_index = 0; - j += resid; - } - // Otherwise, copy what we received into the residbuf for next time - else { - for(int n = 0; n < d_nconnections; n++) { - in = (const gr_complex*)input_items[n]; - memcpy(d_residbufs[n]+d_index, &in[j], sizeof(gr_complex)*datasize); - } - d_index += datasize; - j += datasize; - } - } - - return noutput_items; -} |