61 std::vector<realT> m_c;
63 realT _setCondition{ 0 };
64 realT _actCondition{ 0 };
94 Eigen::Array<realT, -1, -1> Rmat, Rvec, PInv, LPcoeff;
96 Rmat.resize( Nc, Nc );
99 for(
int i = 0; i < Nc && i < acSz; ++i )
101 for(
int j = 0; j < Nc && i < acSz; ++j )
103 Rmat( i, j ) = ac[abs( i - j )];
106 Rvec( 0, i ) = ac[i + Npred];
109 realT tmpCond = condition;
111 _setCondition = condition;
114 _actCondition = tmpCond;
117 Eigen::Map<Eigen::Array<realT,-1,-1>> cmap(m_c.data(), 1, m_c.size());
118 cmap = Rvec.matrix() * PInv.matrix();
142 if( acSz < Nc + Npred )
144 std::string msg =
"too many coefficients for size and prediction length\n";
145 msg +=
" acSz = " + std::to_string( acSz ) +
"\n";
146 msg +=
" Nc = " + std::to_string( Nc ) +
"\n";
147 msg +=
" Npred = " + std::to_string( Npred ) +
"\n";
153 std::string msg =
"Nc can't be 0";
157 std::vector<realT> r, x, y;
160 r.resize( 2. * Nc - 1 );
165 for(
size_t i = 0; i < Nc; ++i )
167 r[i] = ac[Nc - i - 1];
171 for(
size_t i = Nc; i < 2 * Nc - 1; ++i )
173 r[i] = ac[i - Nc + 1];
177 for(
size_t i = 0; i < Nc; ++i )
179 y[i] = ac[i + Npred];
183 return levinsonRecursion( r.data(), m_c.data(), y.data(), Nc );
196 realT predict( std::vector<realT> &hist,
int idx )
200 if( idx < m_c.size() )
205 for(
int i = 0; i < m_c.size(); ++i )
207 x += m_c[i] * hist[idx - i];
213 realT spectralResponse( realT f, realT fs )
217 std::complex<realT> He = 0;
218 for(
int j = 0; j < n; ++j )
221 He += m_c[j] * exp( s * std::complex<realT>( 0, -1.0 ) * f / fs );
225 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.