83 if(connectivitySettings.
isEmpty()) {
84 qDebug() <<
"PartialDirectedCoherence::calculate - Input data is empty";
91 const int nTrials = connectivitySettings.
size();
92 MatrixXd matDataAvg = connectivitySettings.
at(0).
matData;
93 for(
int t = 1; t < nTrials; ++t) {
94 matDataAvg += connectivitySettings.
at(t).
matData;
96 matDataAvg /=
static_cast<double>(nTrials);
98 const int nCh =
static_cast<int>(matDataAvg.rows());
99 const int iNfft = connectivitySettings.
getFFTSize();
100 const int iNFreqs =
static_cast<int>(std::floor(iNfft / 2.0)) + 1;
106 RowVectorXf rowVert = RowVectorXf::Zero(3);
107 for(
int i = 0; i < nCh; ++i) {
108 rowVert = RowVectorXf::Zero(3);
119 model.
fit(matDataAvg);
122 VectorXd vecFreqs = VectorXd::LinSpaced(iNFreqs, 0.0, 0.5);
124 int p = model.
order();
126 const MatrixXcd matI = MatrixXcd::Identity(nCh, nCh);
127 const std::complex<double> jImag(0.0, 1.0);
131 for(
int i = 0; i < nCh; ++i) {
132 for(
int j = 0; j < nCh; ++j) {
133 MatrixXd matWeight(iNFreqs, 1);
135 for(
int fi = 0; fi < iNFreqs; ++fi) {
137 MatrixXcd matAf = matI;
138 for(
int k = 0; k < p; ++k) {
139 const double phase = -2.0 *
M_PI * vecFreqs(fi) * (k + 1);
140 matAf -= coeffs[k].cast<std::complex<double>>() * std::exp(jImag * phase);
144 double colNorm = 0.0;
145 for(
int k = 0; k < nCh; ++k) {
146 colNorm += std::norm(matAf(k, j));
148 colNorm = std::sqrt(colNorm);
151 matWeight(fi, 0) = std::abs(matAf(i, j)) / colNorm;
153 matWeight(fi, 0) = 0.0;
157 QSharedPointer<NetworkEdge> pEdge =
158 QSharedPointer<NetworkEdge>(
new NetworkEdge(j, i, matWeight));
160 finalNetwork.
getNodeAt(j)->append(pEdge);
161 finalNetwork.
getNodeAt(i)->append(pEdge);
162 finalNetwork.
append(pEdge);