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