v2.0.0
Loading...
Searching...
No Matches
inv_signal_model.cpp
Go to the documentation of this file.
1//=============================================================================================================
18
19//=============================================================================================================
20// INCLUDES
21//=============================================================================================================
22
24#include "inv_signal_model.h"
25#include <math/linalg.h>
26#include <iostream>
27
28//=============================================================================================================
29// QT INCLUDES
30//=============================================================================================================
31
32#include <qmath.h>
33
34//=============================================================================================================
35// EIGEN INCLUDES
36//=============================================================================================================
37
38#include <Eigen/Core>
39
40//=============================================================================================================
41// USED NAMESPACES
42//=============================================================================================================
43
44using namespace INVLIB;
45using namespace Eigen;
46
47//=============================================================================================================
48// DEFINE GLOBAL METHODS
49//=============================================================================================================
50
51//=============================================================================================================
52// DEFINE MEMBER METHODS
53//=============================================================================================================
54
55MatrixXd InvSignalModel::fitData(const InvHpiModelParameters& hpiModelParameters, const MatrixXd& matData)
56{
57 if (checkEmpty(hpiModelParameters)) {
58 return MatrixXd();
59 }
60
61 const bool bParametersChanged = m_modelParameters != hpiModelParameters;
62 const bool bDimensionsChanged = m_iCurrentModelCols != matData.cols();
63
64 if (bDimensionsChanged || bParametersChanged) {
65 m_iCurrentModelCols = matData.cols();
66 m_modelParameters = hpiModelParameters;
67 selectModelAndCompute();
68 }
69
70 return m_matInverseSignalModel * matData.transpose();
71}
72
73//=============================================================================================================
74
75bool InvSignalModel::checkEmpty(const InvHpiModelParameters& hpiModelParameters)
76{
77 if (hpiModelParameters.vecHpiFreqs().empty()) {
78 std::cout << "InvSignalModel::checkEmpty - no Hpi frequencies set" << std::endl;
79 return true;
80 } else if (hpiModelParameters.iSampleFreq() == 0) {
81 std::cout << "InvSignalModel::checkEmpty - no sampling frequencies set" << std::endl;
82 return true;
83 }
84 return false;
85}
86
87//=============================================================================================================
88
89void InvSignalModel::selectModelAndCompute()
90{
91 if (m_modelParameters.bBasic()) {
92 computeInverseBasicModel();
93 } else {
94 computeInverseAdvancedModel();
95 }
96}
97
98//=============================================================================================================
99
100void InvSignalModel::computeInverseBasicModel()
101{
102 const int iNumCoils = m_modelParameters.iNHpiCoils();
103 MatrixXd matSimsig;
104 const VectorXd vecTime = VectorXd::LinSpaced(m_iCurrentModelCols, 0, m_iCurrentModelCols - 1) * 1.0 / m_modelParameters.iSampleFreq();
105
106 // Generate simulated data Matrix
107 matSimsig.conservativeResize(m_iCurrentModelCols, iNumCoils * 2);
108
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());
112 }
113 m_matInverseSignalModel = UTILSLIB::Linalg::pinv(matSimsig);
114}
115
116//=============================================================================================================
117
118void InvSignalModel::computeInverseAdvancedModel()
119{
120 const int iNumCoils = m_modelParameters.iNHpiCoils();
121 const int iSampleFreq = m_modelParameters.iSampleFreq();
122 MatrixXd matSimsig;
123 MatrixXd matSimsigInvTemp;
124
125 const VectorXd vecTime = VectorXd::LinSpaced(m_iCurrentModelCols, 0, m_iCurrentModelCols - 1) * 1.0 / iSampleFreq;
126
127 // add linefreq + harmonics + DC part to model
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());
134 }
135 matSimsig.col(iNumCoils * 4) = RowVectorXd::LinSpaced(m_iCurrentModelCols, -0.5, 0.5);
136 matSimsig.col(iNumCoils * 4 + 1).fill(1);
137 matSimsigInvTemp = UTILSLIB::Linalg::pinv(matSimsig);
138 m_matInverseSignalModel = matSimsigInvTemp.block(0, 0, iNumCoils * 2, m_iCurrentModelCols);
139}
#define M_PI
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,...
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)
Definition linalg.h:399