gqrx/dsp/rx_fft.h
2012-05-04 16:06:55 +02:00

164 lines
4.8 KiB
C++

/* -*- c++ -*- */
/*
* Copyright 2011-2012 Alexandru Csete OZ9AEC.
*
* Gqrx 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.
*
* Gqrx 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 Gqrx; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef RX_FFT_H
#define RX_FFT_H
#include <gr_sync_block.h>
#include <gri_fft.h>
#include <gr_firdes.h> /* contains enum win_type */
#include <gr_complex.h>
#include <boost/thread/mutex.hpp>
#include <boost/circular_buffer.hpp>
#define MAX_FFT_SIZE 20480
class rx_fft_c;
class rx_fft_f;
typedef boost::shared_ptr<rx_fft_c> rx_fft_c_sptr;
typedef boost::shared_ptr<rx_fft_f> rx_fft_f_sptr;
/*! \brief Return a shared_ptr to a new instance of rx_fft_c.
* \param fftsize The FFT size
* \param winttype The window type (see gr_firdes.h)
*
* This is effectively the public constructor. To avoid accidental use
* of raw pointers, the rx_fft_c constructor is private.
* make_rx_fft_c is the public interface for creating new instances.
*/
rx_fft_c_sptr make_rx_fft_c(int fftsize=4096, int wintype=gr_firdes::WIN_HAMMING);
/*! \brief Block for computing complex FFT.
* \ingroup DSP
*
* This block is used to compute the FFT of the received spectrum.
*
* The samples are collected in a cicular buffer with size FFT_SIZE.
* When the GUI asks for a new set of FFT data via get_fft_data() an FFT
* will be performed on the data stored in the circular buffer - assuming
* of course that the buffer contains at least fftsize samples.
*
* \note Uses code from qtgui_sink_c
*/
class rx_fft_c : public gr_sync_block
{
friend rx_fft_c_sptr make_rx_fft_c(int fftsize, int wintype);
protected:
rx_fft_c(int fftsize=4096, int wintype=gr_firdes::WIN_HAMMING);
public:
~rx_fft_c();
int work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
void get_fft_data(std::complex<float>* fftPoints, int &fftSize);
void set_window_type(int wintype);
int get_window_type();
void set_fft_size(int fftsize);
int get_fft_size();
private:
int d_fftsize; /*! Current FFT size. */
int d_wintype; /*! Current window type. */
boost::mutex d_mutex; /*! Used to lock FFT output buffer. */
gri_fft_complex *d_fft; /*! FFT object. */
std::vector<float> d_window; /*! FFT window taps. */
boost::circular_buffer<gr_complex> d_cbuf; /*! buffer to accumulate samples. */
void do_fft(const gr_complex *data_in, int size);
};
/*! \brief Return a shared_ptr to a new instance of rx_fft_f.
* \param fftsize The FFT size
* \param winttype The window type (see gr_firdes.h)
*
* This is effectively the public constructor. To avoid accidental use
* of raw pointers, the rx_fft_f constructor is private.
* make_rx_fft_f is the public interface for creating new instances.
*/
rx_fft_f_sptr make_rx_fft_f(int fftsize=1024, int wintype=gr_firdes::WIN_HAMMING);
/*! \brief Block for computing real FFT.
* \ingroup DSP
*
* This block is used to compute the FFT of the audio spectrum or anything
* else where real FFT is useful.
*
* The samples are collected in a cicular buffer with size FFT_SIZE.
* When the GUI asks for a new set of FFT data using get_fft_data() an FFT
* will be performed on the data stored in the circular buffer - assuming
* that the buffer contains at least fftsize samples.
*
* \note Uses code from qtgui_sink_f
*/
class rx_fft_f : public gr_sync_block
{
friend rx_fft_f_sptr make_rx_fft_f(int fftsize, int wintype);
protected:
rx_fft_f(int fftsize=1024, int wintype=gr_firdes::WIN_HAMMING);
public:
~rx_fft_f();
int work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
void get_fft_data(std::complex<float>* fftPoints, int &fftSize);
void set_window_type(int wintype);
int get_window_type();
void set_fft_size(int fftsize);
int get_fft_size();
private:
int d_fftsize; /*! Current FFT size. */
int d_wintype; /*! Current window type. */
boost::mutex d_mutex; /*! Used to lock FFT output buffer. */
gri_fft_complex *d_fft; /*! FFT object. */
std::vector<float> d_window; /*! FFT window taps. */
boost::circular_buffer<float> d_cbuf; /*! buffer to accumulate samples. */
void do_fft(const float *data_in, int size);
};
#endif /* RX_FFT_H */