61 if(connectivitySettings.
isEmpty()) {
62 qDebug() <<
"PartialDirectedCoherence::calculate - Input data is empty";
69 const int nTrials = connectivitySettings.
size();
70 MatrixXd matDataAvg = connectivitySettings.
at(0).
matData;
71 for(
int t = 1; t < nTrials; ++t) {
72 matDataAvg += connectivitySettings.
at(t).
matData;
74 matDataAvg /=
static_cast<double>(nTrials);
76 const int nCh =
static_cast<int>(matDataAvg.rows());
77 const int iNfft = connectivitySettings.
getFFTSize();
78 const int iNFreqs =
static_cast<int>(std::floor(iNfft / 2.0)) + 1;
84 RowVectorXf rowVert = RowVectorXf::Zero(3);
85 for(
int i = 0; i < nCh; ++i) {
86 rowVert = RowVectorXf::Zero(3);
97 model.
fit(matDataAvg);
100 VectorXd vecFreqs = VectorXd::LinSpaced(iNFreqs, 0.0, 0.5);
102 int p = model.
order();
104 const MatrixXcd matI = MatrixXcd::Identity(nCh, nCh);
105 const std::complex<double> jImag(0.0, 1.0);
109 for(
int i = 0; i < nCh; ++i) {
110 for(
int j = 0; j < nCh; ++j) {
111 MatrixXd matWeight(iNFreqs, 1);
113 for(
int fi = 0; fi < iNFreqs; ++fi) {
115 MatrixXcd matAf = matI;
116 for(
int k = 0; k < p; ++k) {
117 const double phase = -2.0 *
M_PI * vecFreqs(fi) * (k + 1);
118 matAf -= coeffs[k].cast<std::complex<double>>() * std::exp(jImag * phase);
122 double colNorm = 0.0;
123 for(
int k = 0; k < nCh; ++k) {
124 colNorm += std::norm(matAf(k, j));
126 colNorm = std::sqrt(colNorm);
129 matWeight(fi, 0) = std::abs(matAf(i, j)) / colNorm;
131 matWeight(fi, 0) = 0.0;
135 QSharedPointer<NetworkEdge> pEdge =
136 QSharedPointer<NetworkEdge>(
new NetworkEdge(j, i, matWeight));
138 finalNetwork.
getNodeAt(j)->append(pEdge);
139 finalNetwork.
getNodeAt(i)->append(pEdge);
140 finalNetwork.
append(pEdge);