60 std::vector<realT> m_c;
62 realT _setCondition{ 0 };
63 realT _actCondition{ 0 };
93 Eigen::Array<realT, -1, -1> Rmat, Rvec, PInv, LPcoeff;
95 Rmat.resize( Nc, Nc );
98 for(
int i = 0; i < Nc && i < acSz; ++i )
100 for(
int j = 0; j < Nc && i < acSz; ++j )
102 Rmat( i, j ) = ac[abs( i - j )];
105 Rvec( 0, i ) = ac[i + Npred];
108 realT tmpCond = condition;
110 _setCondition = condition;
113 _actCondition = tmpCond;
116 Eigen::Map<Eigen::Array<realT,-1,-1>> cmap(m_c.data(), 1, m_c.size());
117 cmap = Rvec.matrix() * PInv.matrix();
141 if( acSz < Nc + Npred )
143 std::string msg =
"too many coefficients for size and prediction length\n";
144 msg +=
" acSz = " + std::to_string( acSz ) +
"\n";
145 msg +=
" Nc = " + std::to_string( Nc ) +
"\n";
146 msg +=
" Npred = " + std::to_string( Npred ) +
"\n";
152 std::string msg =
"Nc can't be 0";
156 std::vector<realT> r, x, y;
159 r.resize( 2. * Nc - 1 );
164 for(
size_t i = 0; i < Nc; ++i )
166 r[i] = ac[Nc - i - 1];
170 for(
size_t i = Nc; i < 2 * Nc - 1; ++i )
172 r[i] = ac[i - Nc + 1];
176 for(
size_t i = 0; i < Nc; ++i )
178 y[i] = ac[i + Npred];
182 return levinsonRecursion( r.data(), m_c.data(), y.data(), Nc );
195 realT predict( std::vector<realT> &hist,
int idx )
199 if( idx < m_c.size() )
204 for(
int i = 0; i < m_c.size(); ++i )
206 x += m_c[i] * hist[idx - i];
212 realT spectralResponse( realT f, realT fs )
216 std::complex<realT> He = 0;
217 for(
int j = 0; j < n; ++j )
220 He += m_c[j] * exp( s * std::complex<realT>( 0, -1.0 ) * f / fs );
224 return std::norm( one / ( one - He ) );
int eigenPseudoInverse(Eigen::Array< dataT, -1, -1 > &PInv, dataT &condition, int &nRejected, Eigen::Array< dataT, -1, -1 > &U, Eigen::Array< dataT, -1, -1 > &S, Eigen::Array< dataT, -1, -1 > &VT, int minMN, dataT &maxCondition, dataT alpha=0, int interact=MX_PINV_NO_INTERACT)
Calculate the pseudo-inverse of a patrix given its SVD.