1 /* -*- c++ -*- */ 2 /* 3 * Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt 4 * https://gqrx.dk/ 5 * 6 * Copyright 2012 Alexandru Csete OZ9AEC. 7 * FM stereo implementation by Alex Grinkov a.grinkov(at)gmail.com. 8 * 9 * Gqrx is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 3, or (at your option) 12 * any later version. 13 * 14 * Gqrx is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with Gqrx; see the file COPYING. If not, write to 21 * the Free Software Foundation, Inc., 51 Franklin Street, 22 * Boston, MA 02110-1301, USA. 23 */ 24 #ifndef WFMRX_H 25 #define WFMRX_H 26 27 #include <gnuradio/analog/simple_squelch_cc.h> 28 #include "receivers/receiver_base.h" 29 #include "dsp/rx_noise_blanker_cc.h" 30 #include "dsp/rx_filter.h" 31 #include "dsp/rx_meter.h" 32 #include "dsp/rx_demod_fm.h" 33 #include "dsp/stereo_demod.h" 34 #include "dsp/resampler_xx.h" 35 #include "dsp/rx_rds.h" 36 #include "dsp/rds/decoder.h" 37 #include "dsp/rds/parser.h" 38 39 class wfmrx; 40 41 #if GNURADIO_VERSION < 0x030900 42 typedef boost::shared_ptr<wfmrx> wfmrx_sptr; 43 #else 44 typedef std::shared_ptr<wfmrx> wfmrx_sptr; 45 #endif 46 47 /*! \brief Public constructor of wfm_rx. */ 48 wfmrx_sptr make_wfmrx(float quad_rate, float audio_rate); 49 50 /*! \brief Wide band FM receiver. 51 * \ingroup RX 52 * 53 * This block provides receiver for broadcast FM transmissions. 54 */ 55 class wfmrx : public receiver_base_cf 56 { 57 58 public: 59 /*! \brief Available demodulators. */ 60 enum wfmrx_demod { 61 WFMRX_DEMOD_MONO = 0, /*!< Mono. */ 62 WFMRX_DEMOD_STEREO = 1, /*!< FM stereo. */ 63 WFMRX_DEMOD_STEREO_UKW = 2, /*!< UKW stereo. */ 64 WFMRX_DEMOD_NUM = 3 /*!< Included for convenience. */ 65 }; 66 wfmrx(float quad_rate, float audio_rate); 67 ~wfmrx(); 68 69 bool start(); 70 bool stop(); 71 72 void set_quad_rate(float quad_rate); 73 void set_audio_rate(float audio_rate); 74 75 void set_filter(double low, double high, double tw); set_cw_offset(double offset)76 void set_cw_offset(double offset) { (void)offset; } 77 78 float get_signal_level(); 79 80 /* Noise blanker */ has_nb()81 bool has_nb() { return false; } 82 //void set_nb_on(int nbid, bool on); 83 //void set_nb_threshold(int nbid, float threshold); 84 85 /* Squelch parameter */ has_sql()86 bool has_sql() { return true; } 87 void set_sql_level(double level_db); 88 void set_sql_alpha(double alpha); 89 90 /* AGC */ has_agc()91 bool has_agc() { return false; } 92 /*void set_agc_on(bool agc_on); 93 void set_agc_hang(bool use_hang); 94 void set_agc_threshold(int threshold); 95 void set_agc_slope(int slope); 96 void set_agc_decay(int decay_ms); 97 void set_agc_manual_gain(int gain);*/ 98 99 void set_demod(int demod); 100 101 /* FM parameters */ has_fm()102 bool has_fm() {return true; } 103 void set_fm_maxdev(float maxdev_hz); 104 void set_fm_deemph(double tau); 105 106 void get_rds_data(std::string &outbuff, int &num); 107 void start_rds_decoder(); 108 void stop_rds_decoder(); 109 void reset_rds_parser(); 110 bool is_rds_decoder_active(); 111 112 private: 113 bool d_running; /*!< Whether receiver is running or not. */ 114 float d_quad_rate; /*!< Input sample rate. */ 115 int d_audio_rate; /*!< Audio output rate. */ 116 117 wfmrx_demod d_demod; /*!< Current demodulator. */ 118 119 resampler_cc_sptr iq_resamp; /*!< Baseband resampler. */ 120 rx_filter_sptr filter; /*!< Non-translating bandpass filter.*/ 121 122 rx_meter_c_sptr meter; /*!< Signal strength. */ 123 gr::analog::simple_squelch_cc::sptr sql; /*!< Squelch. */ 124 rx_demod_fm_sptr demod_fm; /*!< FM demodulator. */ 125 stereo_demod_sptr stereo; /*!< FM stereo demodulator. */ 126 stereo_demod_sptr stereo_oirt; /*!< FM stereo oirt demodulator. */ 127 stereo_demod_sptr mono; /*!< FM stereo demodulator OFF. */ 128 129 rx_rds_sptr rds; /*!< RDS decoder */ 130 rx_rds_store_sptr rds_store; /*!< RDS decoded messages */ 131 gr::rds::decoder::sptr rds_decoder; 132 gr::rds::parser::sptr rds_parser; 133 bool rds_enabled; 134 }; 135 136 #endif // WFMRX_H 137