70 if (connectivitySettings.
isEmpty()) {
71 qDebug() <<
"DebiasedSquaredWeightedPhaseLagIndex::calculate - Input data is empty";
81#ifdef EIGEN_FFTW_DEFAULT
82 fftw_make_planner_thread_safe();
86 int rows = connectivitySettings.
at(0).
matData.rows();
87 RowVectorXf rowVert = RowVectorXf::Zero(3);
89 for (
int i = 0; i < rows; ++i) {
90 rowVert = RowVectorXf::Zero(3);
102 int iSignalLength = connectivitySettings.
at(0).
matData.cols();
103 int iNfft = connectivitySettings.
getFFTSize();
109 int iNRows = connectivitySettings.
at(0).
matData.rows();
110 int iNFreqs = int(floor(iNfft / 2.0)) + 1;
118 qDebug() <<
"DebiasedSquaredWeightedPhaseLagIndex::calculate - Resetting to full spectrum";
146 QFuture<void> result = QtConcurrent::map(connectivitySettings.
getTrialData(),
148 result.waitForFinished();
168 QVector<QPair<int, MatrixXcd>>& vecPairCsdSum,
169 QVector<QPair<int, MatrixXd>>& vecPairCsdImagAbsSum,
170 QVector<QPair<int, MatrixXd>>& vecPairCsdImagSqrdSum,
175 const QPair<MatrixXd, VectorXd>& tapers)
189 RowVectorXd vecInputFFT, rowData;
190 RowVectorXcd vecTmpFreq;
192 MatrixXcd matTapSpectrum(tapers.first.rows(), iNFreqs);
195 fft.SetFlag(fft.HalfSpectrum);
197 for (i = 0; i < iNRows; ++i) {
199 rowData.array() = inputData.
matData.row(i).array() - inputData.
matData.row(i).mean();
202 for (
int j = 0; j < tapers.first.rows(); j++) {
204 if (rowData.cols() < iNfft) {
205 vecInputFFT.setZero(iNfft);
206 vecInputFFT.block(0, 0, 1, rowData.cols()) = rowData.cwiseProduct(tapers.first.row(j));
209 vecInputFFT = rowData.cwiseProduct(tapers.first.row(j));
213 fft.fwd(vecTmpFreq, vecInputFFT, iNfft);
214 matTapSpectrum.row(j) = vecTmpFreq * tapers.second(j);
225 bool bNfftEven =
false;
226 if (iNfft % 2 == 0) {
230 double denomCSD = sqrt(tapers.second.cwiseAbs2().sum()) * sqrt(tapers.second.cwiseAbs2().sum()) / 2.0;
232 for (i = 0; i < iNRows; ++i) {
233 for (
int j = i; j < iNRows; ++j) {
239 matCsd.row(j)(0) /= 2.0;
243 matCsd.row(j).tail(1) /= 2.0;
247 inputData.
vecPairCsd.append(QPair<int, MatrixXcd>(i, matCsd));
248 inputData.
vecPairCsdImagSqrd.append(QPair<int, MatrixXd>(i, matCsd.imag().array().square()));
249 inputData.
vecPairCsdImagAbs.append(QPair<int, MatrixXd>(i, matCsd.imag().cwiseAbs()));
254 if (vecPairCsdSum.isEmpty()) {
259 for (
int j = 0; j < vecPairCsdSum.size(); ++j) {
260 vecPairCsdSum[j].second += inputData.
vecPairCsd.at(j).second;
269 for (i = 0; i < inputData.
vecPairCsd.size(); ++i) {
275 if (vecPairCsdImagSqrdSum.isEmpty()) {
278 for (
int j = 0; j < vecPairCsdSum.size(); ++j) {
287 for (i = 0; i < inputData.
vecPairCsd.size(); ++i) {
293 if (vecPairCsdImagAbsSum.isEmpty()) {
296 for (
int j = 0; j < vecPairCsdSum.size(); ++j) {
319 MatrixXd matNom, matDenom;
321 QSharedPointer<NetworkEdge> pEdge;
324 for (
int i = 0; i < connectivitySettings.
at(0).matData.rows(); ++i) {
331 matDenom = (matDenom.array() == 0.).select(INFINITY, matDenom);
332 matDenom = matNom.cwiseQuotient(matDenom);
334 for (j = i; j < connectivitySettings.
at(0).matData.rows(); ++j) {
335 matWeight = matDenom.row(j).transpose();
337 pEdge = QSharedPointer<NetworkEdge>(
new NetworkEdge(i, j, matWeight));
339 finalNetwork.
getNodeAt(i)->append(pEdge);
340 finalNetwork.
getNodeAt(j)->append(pEdge);
341 finalNetwork.
append(pEdge);
static void compute(ConnectivitySettings::IntermediateTrialData &inputData, QVector< QPair< int, Eigen::MatrixXcd > > &vecPairCsdSum, QVector< QPair< int, Eigen::MatrixXd > > &vecPairCsdImagAbsSum, QVector< QPair< int, Eigen::MatrixXd > > &vecPairCsdImagSqrdSum, QMutex &mutex, int iNRows, int iNFreqs, int iNfft, const QPair< Eigen::MatrixXd, Eigen::VectorXd > &tapers)