57 if (checkEmpty(hpiModelParameters)) {
61 const bool bParametersChanged = m_modelParameters != hpiModelParameters;
62 const bool bDimensionsChanged = m_iCurrentModelCols != matData.cols();
64 if (bDimensionsChanged || bParametersChanged) {
65 m_iCurrentModelCols = matData.cols();
66 m_modelParameters = hpiModelParameters;
67 selectModelAndCompute();
70 return m_matInverseSignalModel * matData.transpose();
78 std::cout <<
"InvSignalModel::checkEmpty - no Hpi frequencies set" << std::endl;
81 std::cout <<
"InvSignalModel::checkEmpty - no sampling frequencies set" << std::endl;
89void InvSignalModel::selectModelAndCompute()
91 if (m_modelParameters.bBasic()) {
92 computeInverseBasicModel();
94 computeInverseAdvancedModel();
100void InvSignalModel::computeInverseBasicModel()
102 const int iNumCoils = m_modelParameters.
iNHpiCoils();
104 const VectorXd vecTime = VectorXd::LinSpaced(m_iCurrentModelCols, 0, m_iCurrentModelCols - 1) * 1.0 / m_modelParameters.iSampleFreq();
107 matSimsig.conservativeResize(m_iCurrentModelCols, iNumCoils * 2);
109 for (
int i = 0; i < iNumCoils; ++i) {
110 matSimsig.col(i) = sin(2 *
M_PI * m_modelParameters.vecHpiFreqs()[i] * vecTime.array());
111 matSimsig.col(i + iNumCoils) = cos(2 *
M_PI * m_modelParameters.vecHpiFreqs()[i] * vecTime.array());
118void InvSignalModel::computeInverseAdvancedModel()
120 const int iNumCoils = m_modelParameters.iNHpiCoils();
121 const int iSampleFreq = m_modelParameters.iSampleFreq();
123 MatrixXd matSimsigInvTemp;
125 const VectorXd vecTime = VectorXd::LinSpaced(m_iCurrentModelCols, 0, m_iCurrentModelCols - 1) * 1.0 / iSampleFreq;
128 matSimsig.conservativeResize(m_iCurrentModelCols, iNumCoils * 4 + 2);
129 for (
int i = 0; i < iNumCoils; ++i) {
130 matSimsig.col(i) = sin(2 *
M_PI * m_modelParameters.vecHpiFreqs()[i] * vecTime.array());
131 matSimsig.col(i + iNumCoils) = cos(2 *
M_PI * m_modelParameters.vecHpiFreqs()[i] * vecTime.array());
132 matSimsig.col(i + 2 * iNumCoils) = sin(2 *
M_PI * m_modelParameters.iLineFreq() * (i + 1) * vecTime.array());
133 matSimsig.col(i + 3 * iNumCoils) = cos(2 *
M_PI * m_modelParameters.iLineFreq() * (i + 1) * vecTime.array());
135 matSimsig.col(iNumCoils * 4) = RowVectorXd::LinSpaced(m_iCurrentModelCols, -0.5, 0.5);
136 matSimsig.col(iNumCoils * 4 + 1).fill(1);
138 m_matInverseSignalModel = matSimsigInvTemp.block(0, 0, iNumCoils * 2, m_iCurrentModelCols);
Sinusoidal HPI signal model — builds and inverts the regressor matrix that extracts coil amplitudes f...
Immutable configuration for the HPI signal model — coil drive frequencies, sample rate,...
Static linear-algebra helpers: SVD-based conditioning, block-diagonal assembly, sorted index pairs.
Inverse source estimation (MNE, dSPM, sLORETA, dipole fitting).
Configuration parameters for the HPI signal model (line frequency, coil frequencies,...
QVector< int > vecHpiFreqs() const
Eigen::MatrixXd fitData(const InvHpiModelParameters &hpiModelParameters, const Eigen::MatrixXd &matData)
static Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > pinv(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &a)