58 if(checkEmpty(hpiModelParameters)) {
62 const bool bParametersChanged = m_modelParameters != hpiModelParameters;
63 const bool bDimensionsChanged = m_iCurrentModelCols != matData.cols();
65 if(bDimensionsChanged || bParametersChanged) {
66 m_iCurrentModelCols = matData.cols();
67 m_modelParameters = hpiModelParameters;
68 selectModelAndCompute();
71 return m_matInverseSignalModel * matData.transpose();
76bool InvSignalModel::checkDataDimensions(
const int iCols)
78 bool bHasChanged =
false;
79 if(iCols != m_iCurrentModelCols) {
80 m_iCurrentModelCols = iCols;
90 bool bHasChanged =
false;
91 if((m_modelParameters.iSampleFreq() != hpiModelParameters.
iSampleFreq()) ||
92 (m_modelParameters.iLineFreq() != hpiModelParameters.
iLineFreq()) ||
93 (m_modelParameters.iNHpiCoils() != hpiModelParameters.
iNHpiCoils()) ||
94 (m_modelParameters.vecHpiFreqs() != hpiModelParameters.
vecHpiFreqs()) ||
95 (m_modelParameters.bBasic() != hpiModelParameters.
bBasic())) {
97 m_modelParameters = hpiModelParameters;
107 std::cout <<
"InvSignalModel::checkEmpty - no Hpi frequencies set" << std::endl;
110 std::cout <<
"InvSignalModel::checkEmpty - no sampling frequencies set" << std::endl;
118void InvSignalModel::selectModelAndCompute()
120 if(m_modelParameters.bBasic()) {
121 computeInverseBasicModel();
123 computeInverseAdvancedModel();
129void InvSignalModel::computeInverseBasicModel()
131 const int iNumCoils = m_modelParameters.
iNHpiCoils();
133 const VectorXd vecTime = VectorXd::LinSpaced(m_iCurrentModelCols, 0, m_iCurrentModelCols-1) *1.0/m_modelParameters.iSampleFreq();
136 matSimsig.conservativeResize(m_iCurrentModelCols,iNumCoils*2);
138 for(
int i = 0; i < iNumCoils; ++i) {
139 matSimsig.col(i) = sin(2*
M_PI*m_modelParameters.vecHpiFreqs()[i]*vecTime.array());
140 matSimsig.col(i+iNumCoils) = cos(2*
M_PI*m_modelParameters.vecHpiFreqs()[i]*vecTime.array());
147void InvSignalModel::computeInverseAdvancedModel()
149 const int iNumCoils = m_modelParameters.iNHpiCoils();
150 const int iSampleFreq = m_modelParameters.iSampleFreq();
152 MatrixXd matSimsigInvTemp;
154 const VectorXd vecTime = VectorXd::LinSpaced(m_iCurrentModelCols, 0, m_iCurrentModelCols-1) *1.0/iSampleFreq;
157 matSimsig.conservativeResize(m_iCurrentModelCols,iNumCoils*4+2);
158 for(
int i = 0; i < iNumCoils; ++i) {
159 matSimsig.col(i) = sin(2*
M_PI*m_modelParameters.vecHpiFreqs()[i]*vecTime.array());
160 matSimsig.col(i+iNumCoils) = cos(2*
M_PI*m_modelParameters.vecHpiFreqs()[i]*vecTime.array());
161 matSimsig.col(i+2*iNumCoils) = sin(2*
M_PI*m_modelParameters.iLineFreq()*(i+1)*vecTime.array());
162 matSimsig.col(i+3*iNumCoils) = cos(2*
M_PI*m_modelParameters.iLineFreq()*(i+1)*vecTime.array());
164 matSimsig.col(iNumCoils*4) = RowVectorXd::LinSpaced(m_iCurrentModelCols, -0.5, 0.5);
165 matSimsig.col(iNumCoils*4+1).fill(1);
167 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)