8#ifndef clAOLinearPredictor_hpp
9#define clAOLinearPredictor_hpp
13#include "../../math/geo.hpp"
15#include "../../sigproc/psdUtils.hpp"
17#include "../../sigproc/autocorrelation.hpp"
18#include "../../sigproc/linearPredictor.hpp"
29#define CLAOLP_BREADCRUMB
40template <
typename _realT>
65 realT m_min_var0{ 0 };
66 realT m_min_sc0{ 10 };
67 realT m_precision0{ 2 };
68 realT m_max_sc0{ 100 };
69 realT m_dPrecision{ 3 };
74 realT m_minPrecision{ 0.001 };
79 std::vector<regResult> m_regResults;
92 std::vector<realT> &PSDn,
103 for(
size_t i = 0; i < PSDt.size(); ++i )
105 m_PSDtn[i] = PSDt[i] + PSDn[i] + PSDreg;
132 template <
bool telem>
138 std::vector<realT> &PSDt,
139 std::vector<realT> &PSDn,
154 min_var = std::numeric_limits<realT>::max();
158 sc0 = min_sc - precision * m_dPrecision;
164 realT psdReg = PSDt[0];
169 for( realT sc = max_sc; sc >= sc0; sc -= precision )
185 realT ll = 0, ul = 0;
197 m_regResults.push_back({sc, gopt_lp, gmax_lp, var_lp});
201 if( var_lp < min_var )
208 if( var_lp > 10 * min_var )
226 template <
bool telem = false>
232 std::vector<realT> &PSDt,
233 std::vector<realT> &PSDn,
240 realT min_var = m_min_var0;
242 realT precision = m_precision0;
243 realT max_sc = m_max_sc0;
247 m_regResults.reserve(m_maxIts * 50);
252 while( precision > m_minPrecision && its < m_maxIts )
255 int rv = _regularizeCoefficients<telem>( min_var, min_sc, precision, max_sc, go_lp, PSDt, PSDn, Nc );
262 if( min_sc == max_sc )
278 max_sc = min_sc + precision;
279 precision /= m_dPrecision;
287 int rv =
calcCoefficients( PSDt, PSDn, PSDt[0] * pow( 10, -min_sc / 10 ), Nc );
298 realT ll = 0, ul = 0;
312 template <
bool pr
intout = false>
318 std::vector<realT> &PSDt,
319 std::vector<realT> &PSDn,
323 realT minVar = std::numeric_limits<realT>::max();
325 for(
int n = minNc; n <= maxNc; ++n )
330 regularizeCoefficients<printout>( _gmax_lp, _gopt_lp, _var_lp, go_lp, PSDt, PSDn, n );
332 if( _var_lp < minVar )
Provides a class to manage closed loop gain optimization.
void augment1SidedPSD(vectorTout &psdTwoSided, vectorTin &psdOneSided, bool addZeroFreq=false, typename vectorTin::value_type scale=0.5)
Augment a 1-sided PSD to standard 2-sided FFT form.
#define gmax(A, B)
max(A,B) - larger (most +ve) of two numbers (generic) (defined in the SOFA library sofam....
Class to manage the calculation of linear predictor coefficients for a closed-loop AO system.
realT m_gmax_lp
The maximum allowable gain for LP.
int calcCoefficients(std::vector< realT > &PSDt, std::vector< realT > &PSDn, realT PSDreg, int Nc, realT condition=0)
Calculate the LP coefficients for a turbulence PSD and a noise PSD.
int _regularizeCoefficients(realT &min_var, realT &min_sc, realT precision, realT max_sc, clGainOpt< realT > &go_lp, std::vector< realT > &PSDt, std::vector< realT > &PSDn, int Nc)
Worker function for regularizing the PSD for coefficient calculation.
std::vector< realT > m_psd2s
Working memory for the 2-sided regularized PSD.
std::vector< realT > m_PSDtn
Working memory for the regularized PSD.
std::vector< realT > m_ac
Working memory to hold the autocorrelation.
int regularizeCoefficients(realT &gmax_lp, realT &gopt_lp, realT &var_lp, realT &min_sc, clGainOpt< realT > &go_lp, std::vector< realT > &PSDt, std::vector< realT > &PSDn, int Nc)
Regularize the PSD and calculate the associated LP coefficients.
int optimizeNc(realT &gmax_lp, realT &gopt_lp, int &Nc, realT &var_lp, clGainOpt< realT > &go_lp, std::vector< realT > &PSDt, std::vector< realT > &PSDn, int minNc, int maxNc)
Regularize the PSD and calculate the associated LP coefficients.
int m_extrap
The LP extrapolation length in loop steps. Normally it is 1 step.
A class to manage optimizing closed-loop gains.
void a(const std::vector< realT > &newA)
Set the vector of IIR coefficients.
void b(const std::vector< realT > &newB)
Set the vector of FIR coefficients.
realT optGainOpenLoop(realT &var, const std::vector< realT > &PSDerr, const std::vector< realT > &PSDnoise, bool gridSearch)
Return the optimum closed loop gain given an open loop PSD.
realT maxStableGain(realT &ll, realT &ul)
Find the maximum stable gain for the loop parameters.
Functor for calculating the autocorrelation given a PSD.
A class to support linear prediction.
int calcCoefficients(const std::vector< realT > &ac, size_t Nc, size_t Npred=1, realT condition=0)
Calculate the LP coefficients given an autocorrelation.