GNU Radio 3.5.3.2 C++ API
|
00001 /* -*- c++ -*- */ 00002 /* 00003 * Copyright 2011 Free Software Foundation, Inc. 00004 * 00005 * This file is part of GNU Radio 00006 * 00007 * GNU Radio is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 3, or (at your option) 00010 * any later version. 00011 * 00012 * GNU Radio is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with GNU Radio; see the file COPYING. If not, write to 00019 * the Free Software Foundation, Inc., 51 Franklin Street, 00020 * Boston, MA 02110-1301, USA. 00021 */ 00022 #ifndef INCLUDED_DIGITAL_IMPL_MPSK_SNR_EST_H 00023 #define INCLUDED_DIGITAL_IMPL_MPSK_SNR_EST_H 00024 00025 #include <digital_api.h> 00026 #include <gr_sync_block.h> 00027 00028 //! Enum for the type of SNR estimator to select 00029 /*! \ingroup snr_blk 00030 * \anchor ref_snr_est_types 00031 * 00032 * Below are some ROUGH estimates of what values of SNR each of these 00033 * types of estimators is good for. In general, these offer a 00034 * trade-off between accuracy and performance. 00035 * 00036 * \li SNR_EST_SIMPLE: Simple estimator (>= 7 dB) 00037 * \li SNR_EST_SKEW: Skewness-base est (>= 5 dB) 00038 * \li SNR_EST_M2M4: 2nd & 4th moment est (>= 1 dB) 00039 * \li SNR_EST_SVR: SVR-based est (>= 0dB) 00040 */ 00041 enum snr_est_type_t { 00042 SNR_EST_SIMPLE = 0, // Simple estimator (>= 7 dB) 00043 SNR_EST_SKEW, // Skewness-base est (>= 5 dB) 00044 SNR_EST_M2M4, // 2nd & 4th moment est (>= 1 dB) 00045 SNR_EST_SVR // SVR-based est (>= 0dB) 00046 }; 00047 00048 /*! \brief A parent class for SNR estimators, specifically for M-PSK 00049 * signals in AWGN channels. 00050 * \ingroup snr_blk 00051 */ 00052 class DIGITAL_API digital_impl_mpsk_snr_est 00053 { 00054 protected: 00055 double d_alpha, d_beta; 00056 00057 public: 00058 /*! Constructor 00059 * 00060 * Parameters: 00061 * \param alpha: the update rate of internal running average 00062 * calculations. 00063 */ 00064 digital_impl_mpsk_snr_est(double alpha); 00065 virtual ~digital_impl_mpsk_snr_est(); 00066 00067 //! Get the running-average coefficient 00068 double alpha() const; 00069 00070 //! Set the running-average coefficient 00071 void set_alpha(double alpha); 00072 00073 //! Update the current registers 00074 virtual int update(int noutput_items, 00075 const gr_complex *in); 00076 00077 //! Use the register values to compute a new estimate 00078 virtual double snr(); 00079 }; 00080 00081 00082 //! \brief SNR Estimator using simple mean/variance estimates. 00083 /*! \ingroup snr_blk 00084 * 00085 * A very simple SNR estimator that just uses mean and variance 00086 * estimates of an M-PSK constellation. This esimator is quick and 00087 * cheap and accurate for high SNR (above 7 dB or so) but quickly 00088 * starts to overestimate the SNR at low SNR. 00089 */ 00090 class DIGITAL_API digital_impl_mpsk_snr_est_simple : 00091 public digital_impl_mpsk_snr_est 00092 { 00093 private: 00094 double d_y1, d_y2; 00095 00096 public: 00097 /*! Constructor 00098 * 00099 * Parameters: 00100 * \param alpha: the update rate of internal running average 00101 * calculations. 00102 */ 00103 digital_impl_mpsk_snr_est_simple(double alpha); 00104 ~digital_impl_mpsk_snr_est_simple() {} 00105 00106 int update(int noutput_items, 00107 const gr_complex *in); 00108 double snr(); 00109 }; 00110 00111 00112 //! \brief SNR Estimator using skewness correction. 00113 /*! \ingroup snr_blk 00114 * 00115 * This is an estimator that came from a discussion between Tom 00116 * Rondeau and fred harris with no known paper reference. The idea is 00117 * that at low SNR, the variance estimations will be affected because 00118 * of fold-over around the decision boundaries, which results in a 00119 * skewness to the samples. We estimate the skewness and use this as 00120 * a correcting term. 00121 */ 00122 class DIGITAL_API digital_impl_mpsk_snr_est_skew : 00123 public digital_impl_mpsk_snr_est 00124 { 00125 private: 00126 double d_y1, d_y2, d_y3; 00127 00128 public: 00129 /*! Constructor 00130 * 00131 * Parameters: 00132 * \param alpha: the update rate of internal running average 00133 * calculations. 00134 */ 00135 digital_impl_mpsk_snr_est_skew(double alpha); 00136 ~digital_impl_mpsk_snr_est_skew() {} 00137 00138 int update(int noutput_items, 00139 const gr_complex *in); 00140 double snr(); 00141 }; 00142 00143 00144 //! \brief SNR Estimator using 2nd and 4th-order moments. 00145 /*! \ingroup snr_blk 00146 * 00147 * An SNR estimator for M-PSK signals that uses 2nd (M2) and 4th (M4) 00148 * order moments. This estimator uses knowledge of the kurtosis of 00149 * the signal (k_a) and noise (k_w) to make its estimation. We use 00150 * Beaulieu's approximations here to M-PSK signals and AWGN channels 00151 * such that k_a=1 and k_w=2. These approximations significantly 00152 * reduce the complexity of the calculations (and computations) 00153 * required. 00154 * 00155 * Reference: 00156 * D. R. Pauluzzi and N. C. Beaulieu, "A comparison of SNR 00157 * estimation techniques for the AWGN channel," IEEE 00158 * Trans. Communications, Vol. 48, No. 10, pp. 1681-1691, 2000. 00159 */ 00160 class DIGITAL_API digital_impl_mpsk_snr_est_m2m4 : 00161 public digital_impl_mpsk_snr_est 00162 { 00163 private: 00164 double d_y1, d_y2; 00165 00166 public: 00167 /*! Constructor 00168 * 00169 * Parameters: 00170 * \param alpha: the update rate of internal running average 00171 * calculations. 00172 */ 00173 digital_impl_mpsk_snr_est_m2m4(double alpha); 00174 ~digital_impl_mpsk_snr_est_m2m4() {} 00175 00176 int update(int noutput_items, 00177 const gr_complex *in); 00178 double snr(); 00179 }; 00180 00181 00182 //! \brief SNR Estimator using 2nd and 4th-order moments. 00183 /*! \ingroup snr_blk 00184 * 00185 * An SNR estimator for M-PSK signals that uses 2nd (M2) and 4th (M4) 00186 * order moments. This estimator uses knowledge of the kurtosis of 00187 * the signal (k_a) and noise (k_w) to make its estimation. In this 00188 * case, you can set your own estimations for k_a and k_w, the 00189 * kurtosis of the signal and noise, to fit this estimation better to 00190 * your signal and channel conditions. 00191 * 00192 * A word of warning: this estimator has not been fully tested or 00193 * proved with any amount of rigor. The estimation for M4 in 00194 * particular might be ignoring effectf of when k_a and k_w are 00195 * different. Use this estimator with caution and a copy of the 00196 * reference on hand. 00197 * 00198 * The digital_mpsk_snr_est_m2m4 assumes k_a and k_w to simplify the 00199 * computations for M-PSK and AWGN channels. Use that estimator 00200 * unless you have a way to guess or estimate these values here. 00201 * 00202 * Original paper: 00203 * R. Matzner, "An SNR estimation algorithm for complex baseband 00204 * signal using higher order statistics," Facta Universitatis 00205 * (Nis), no. 6, pp. 41-52, 1993. 00206 * 00207 * Reference used in derivation: 00208 * D. R. Pauluzzi and N. C. Beaulieu, "A comparison of SNR 00209 * estimation techniques for the AWGN channel," IEEE 00210 * Trans. Communications, Vol. 48, No. 10, pp. 1681-1691, 2000. 00211 */ 00212 class DIGITAL_API digital_impl_snr_est_m2m4 : 00213 public digital_impl_mpsk_snr_est 00214 { 00215 private: 00216 double d_y1, d_y2; 00217 double d_ka, d_kw; 00218 00219 public: 00220 /*! Constructor 00221 * 00222 * Parameters: 00223 * \param alpha: the update rate of internal running average 00224 * calculations. 00225 * \param ka: estimate of the signal kurtosis (1 for PSK) 00226 * \param kw: estimate of the channel noise kurtosis (2 for AWGN) 00227 */ 00228 digital_impl_snr_est_m2m4(double alpha, double ka, double kw); 00229 ~digital_impl_snr_est_m2m4() {} 00230 00231 int update(int noutput_items, 00232 const gr_complex *in); 00233 double snr(); 00234 }; 00235 00236 00237 //! \brief Signal-to-Variation Ratio SNR Estimator. 00238 /*! \ingroup snr_blk 00239 * 00240 * This estimator actually comes from an SNR estimator for M-PSK 00241 * signals in fading channels, but this implementation is 00242 * specifically for AWGN channels. The math was simplified to assume 00243 * a signal and noise kurtosis (k_a and k_w) for M-PSK signals in 00244 * AWGN. These approximations significantly reduce the complexity of 00245 * the calculations (and computations) required. 00246 * 00247 * Original paper: 00248 * A. L. Brandao, L. B. Lopes, and D. C. McLernon, "In-service 00249 * monitoring of multipath delay and cochannel interference for 00250 * indoor mobile communication systems," Proc. IEEE 00251 * Int. Conf. Communications, vol. 3, pp. 1458-1462, May 1994. 00252 * 00253 * Reference: 00254 * D. R. Pauluzzi and N. C. Beaulieu, "A comparison of SNR 00255 * estimation techniques for the AWGN channel," IEEE 00256 * Trans. Communications, Vol. 48, No. 10, pp. 1681-1691, 2000. 00257 */ 00258 class DIGITAL_API digital_impl_mpsk_snr_est_svr : 00259 public digital_impl_mpsk_snr_est 00260 { 00261 private: 00262 double d_y1, d_y2; 00263 00264 public: 00265 /*! Constructor 00266 * 00267 * Parameters: 00268 * \param alpha: the update rate of internal running average 00269 * calculations. 00270 */ 00271 digital_impl_mpsk_snr_est_svr(double alpha); 00272 ~digital_impl_mpsk_snr_est_svr() {} 00273 00274 int update(int noutput_items, 00275 const gr_complex *in); 00276 double snr(); 00277 }; 00278 00279 #endif /* INCLUDED_DIGITAL_IMPL_MPSK_SNR_EST_H */