kopia lustrzana https://github.com/f4exb/sdrangel
				
				
				
			
		
			
				
	
	
		
			290 wiersze
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			290 wiersze
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
| /*  emnr.h
 | |
| 
 | |
| This file is part of a program that implements a Software-Defined Radio.
 | |
| 
 | |
| Copyright (C) 2015 Warren Pratt, NR0V
 | |
| Copyright (C) 2024 Edouard Griffiths, F4EXB Adapted to SDRangel
 | |
| 
 | |
| This program 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 2
 | |
| of the License, or (at your option) any later version.
 | |
| 
 | |
| This program 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 this program; if not, write to the Free Software
 | |
| Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 | |
| 
 | |
| The author can be reached by email at
 | |
| 
 | |
| warren@wpratt.com
 | |
| 
 | |
| */
 | |
| 
 | |
| #ifndef wdsp_emnr_h
 | |
| #define wdsp_emnr_h
 | |
| 
 | |
| #include <array>
 | |
| #include <vector>
 | |
| 
 | |
| #include "fftw3.h"
 | |
| #include "export.h"
 | |
| 
 | |
| namespace WDSP {
 | |
| 
 | |
| class WDSP_API EMNR
 | |
| {
 | |
| public:
 | |
|     int run;
 | |
|     int position;
 | |
|     int bsize;
 | |
|     float* in;
 | |
|     float* out;
 | |
|     int fsize;
 | |
|     int ovrlp;
 | |
|     int incr;
 | |
|     std::vector<float> window;
 | |
|     int iasize;
 | |
|     std::vector<float> inaccum;
 | |
|     std::vector<float> forfftin;
 | |
|     std::vector<float> forfftout;
 | |
|     int msize;
 | |
|     std::vector<double> mask;
 | |
|     std::vector<float> revfftin;
 | |
|     std::vector<float> revfftout;
 | |
|     std::vector<std::vector<float>> save;
 | |
|     int oasize;
 | |
|     std::vector<float> outaccum;
 | |
|     double rate;
 | |
|     int wintype;
 | |
|     double ogain;
 | |
|     double gain;
 | |
|     int nsamps;
 | |
|     int iainidx;
 | |
|     int iaoutidx;
 | |
|     int init_oainidx;
 | |
|     int oainidx;
 | |
|     int oaoutidx;
 | |
|     int saveidx;
 | |
|     fftwf_plan Rfor;
 | |
|     fftwf_plan Rrev;
 | |
| 
 | |
|     struct G
 | |
|     {
 | |
|         int incr;
 | |
|         double rate;
 | |
|         int msize;
 | |
|         std::vector<double>& mask;
 | |
|         const std::vector<float>& y;
 | |
|         int gain_method;
 | |
|         int npe_method;
 | |
|         int ae_run;
 | |
|         std::vector<double> lambda_y;
 | |
|         std::vector<double> lambda_d;
 | |
|         std::vector<double> prev_mask;
 | |
|         std::vector<double> prev_gamma;
 | |
|         double gf1p5;
 | |
|         double alpha;
 | |
|         double eps_floor;
 | |
|         double gamma_max;
 | |
|         double q;
 | |
|         double gmax;
 | |
|         //
 | |
|         std::array<double, 241*241> GG;
 | |
|         std::array<double, 241*241> GGS;
 | |
|         FILE* fileb;
 | |
| 
 | |
|         G(
 | |
|             int incr,
 | |
|             double rate,
 | |
|             int msize,
 | |
|             std::vector<double>& mask,
 | |
|             const std::vector<float>& y
 | |
|         );
 | |
|         G(const G&) = delete;
 | |
|         G& operator=(const G& other) = delete;
 | |
|         ~G() = default;
 | |
| 
 | |
|         void calc_gamma0();
 | |
|         void calc_gamma1();
 | |
|         void calc_gamma2();
 | |
|         void calc_lambda_y();
 | |
| 
 | |
|     private:
 | |
|         static double getKey(const std::array<double, 241*241>& type, double gamma, double xi);
 | |
|         static double e1xb (double x);
 | |
|         static double bessI0 (double x);
 | |
|         static double bessI1 (double x);
 | |
|     };
 | |
|     G *g;
 | |
| 
 | |
|     struct NP
 | |
|     {
 | |
|         int incr;
 | |
|         double rate;
 | |
|         int msize;
 | |
|         std::vector<double>& lambda_y;
 | |
|         std::vector<double>& lambda_d;
 | |
|         double alphaCsmooth;
 | |
|         double alphaMax;
 | |
|         double alphaCmin;
 | |
|         double alphaMin_max_value;
 | |
|         double snrq;
 | |
|         double betamax;
 | |
|         double invQeqMax;
 | |
|         double av;
 | |
|         double Dtime;
 | |
|         int U;
 | |
|         int V;
 | |
|         int D;
 | |
|         std::vector<double> p;
 | |
|         std::vector<double> alphaOptHat;
 | |
|         double alphaC;
 | |
|         std::vector<double> alphaHat;
 | |
|         std::vector<double> sigma2N;
 | |
|         std::vector<double> pbar;
 | |
|         std::vector<double> p2bar;
 | |
|         std::vector<double> Qeq;
 | |
|         double MofD;
 | |
|         double MofV;
 | |
|         std::array<double, 4> invQbar_points;
 | |
|         std::array<double, 4> nsmax;
 | |
|         std::vector<double> bmin;
 | |
|         std::vector<double> bmin_sub;
 | |
|         std::vector<int> k_mod;
 | |
|         std::vector<double> actmin;
 | |
|         std::vector<double> actmin_sub;
 | |
|         int subwc;
 | |
|         std::vector<int> lmin_flag;
 | |
|         std::vector<double> pmin_u;
 | |
|         std::vector<std::vector<double>> actminbuff;
 | |
|         int amb_idx;
 | |
| 
 | |
|         NP(
 | |
|             int incr,
 | |
|             double rate,
 | |
|             int msize,
 | |
|             std::vector<double>& lambda_y,
 | |
|             std::vector<double>& lambda_d
 | |
|         );
 | |
|         NP(const NP&) = delete;
 | |
|         NP& operator=(const NP& other) = delete;
 | |
|         ~NP() = default;
 | |
| 
 | |
|         void LambdaD();
 | |
| 
 | |
|     private:
 | |
|         static const std::array<double, 18> DVals;
 | |
|         static const std::array<double, 18> MVals;
 | |
|         static void interpM (
 | |
|             double* res,
 | |
|             double x,
 | |
|             int nvals,
 | |
|             const std::array<double, 18>& xvals,
 | |
|             const std::array<double, 18>& yvals
 | |
|         );
 | |
|     };
 | |
|     NP *np;
 | |
| 
 | |
|     struct NPS
 | |
|     {
 | |
|         int incr;
 | |
|         double rate;
 | |
|         int msize;
 | |
|         const std::vector<double>& lambda_y;
 | |
|         std::vector<double>& lambda_d;
 | |
| 
 | |
|         double alpha_pow;
 | |
|         double alpha_Pbar;
 | |
|         double epsH1;
 | |
|         double epsH1r;
 | |
| 
 | |
|         std::vector<double> sigma2N;
 | |
|         std::vector<double> PH1y;
 | |
|         std::vector<double> Pbar;
 | |
|         std::vector<double> EN2y;
 | |
| 
 | |
|         NPS(
 | |
|             int incr,
 | |
|             double rate,
 | |
|             int msize,
 | |
|             const std::vector<double>& lambda_y,
 | |
|             std::vector<double>& lambda_d,
 | |
|             double alpha_pow,
 | |
|             double alpha_Pbar,
 | |
|             double epsH1
 | |
|         );
 | |
|         NPS(const NPS&) = delete;
 | |
|         NPS& operator=(const NPS& other) = delete;
 | |
|         ~NPS() = default;
 | |
| 
 | |
|         void LambdaDs();
 | |
|     };
 | |
|     NPS *nps;
 | |
|     struct AE
 | |
|     {
 | |
|         int msize;
 | |
|         const std::vector<double>& lambda_y;
 | |
|         double zetaThresh;
 | |
|         double psi;
 | |
|         std::vector<double> nmask;
 | |
| 
 | |
|         AE(
 | |
|             int msize,
 | |
|             const std::vector<double>& lambda_y,
 | |
|             double zetaThresh,
 | |
|             double psi
 | |
|         );
 | |
|         AE(const AE&) = delete;
 | |
|         AE& operator=(const AE& other) = delete;
 | |
|         ~AE() = default;
 | |
|     };
 | |
|     AE *ae;
 | |
| 
 | |
|     EMNR(
 | |
|         int run,
 | |
|         int position,
 | |
|         int size,
 | |
|         float* in,
 | |
|         float* out,
 | |
|         int fsize,
 | |
|         int ovrlp,
 | |
|         int rate,
 | |
|         int wintype,
 | |
|         double gain,
 | |
|         int gain_method,
 | |
|         int npe_method,
 | |
|         int ae_run
 | |
|     );
 | |
|     EMNR(const EMNR&) = delete;
 | |
|     EMNR& operator=(const EMNR& other) = delete;
 | |
|     ~EMNR();
 | |
| 
 | |
|     void flush();
 | |
|     void execute(int pos);
 | |
|     void setBuffers(float* in, float* out);
 | |
|     void setSamplerate(int rate);
 | |
|     void setSize(int size);
 | |
|     // Public Properties
 | |
|     void setGainMethod(int method);
 | |
|     void setNpeMethod(int method);
 | |
|     void setAeRun(int run);
 | |
|     void setAeZetaThresh(double zetathresh);
 | |
|     void setAePsi(double psi);
 | |
| 
 | |
| private:
 | |
|     void calc_window();
 | |
|     void calc();
 | |
|     void decalc();
 | |
|     void aepf();
 | |
|     void calc_gain();
 | |
| };
 | |
| 
 | |
| } // namespace WDSP
 | |
| 
 | |
| #endif
 |