70 if(connectivitySettings.
isEmpty()) {
71 qDebug() <<
"UnbiasedSquaredPhaseLagIndex::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() <<
"UnbiasedSquaredPhaseLagIndex::calculate - Resetting to full spectrum";
145 QFuture<void> result = QtConcurrent::map(connectivitySettings.
getTrialData(),
147 result.waitForFinished();
167 QVector<QPair<int,MatrixXcd> >& vecPairCsdSum,
168 QVector<QPair<int,MatrixXd> >& vecPairCsdImagSignSum,
173 const QPair<MatrixXd, VectorXd>& tapers)
187 RowVectorXd vecInputFFT, rowData;
188 RowVectorXcd vecTmpFreq;
190 MatrixXcd matTapSpectrum(tapers.first.rows(), iNFreqs);
193 fft.SetFlag(fft.HalfSpectrum);
195 for (i = 0; i < iNRows; ++i) {
197 rowData.array() = inputData.
matData.row(i).array() - inputData.
matData.row(i).mean();
200 for(j = 0; j < tapers.first.rows(); j++) {
202 if (rowData.cols() < iNfft) {
203 vecInputFFT.setZero(iNfft);
204 vecInputFFT.block(0,0,1,rowData.cols()) = rowData.cwiseProduct(tapers.first.row(j));;
206 vecInputFFT = rowData.cwiseProduct(tapers.first.row(j));
210 fft.fwd(vecTmpFreq, vecInputFFT, iNfft);
211 matTapSpectrum.row(j) = vecTmpFreq * tapers.second(j);
220 double denomCSD = sqrt(tapers.second.cwiseAbs2().sum()) * sqrt(tapers.second.cwiseAbs2().sum()) / 2.0;
222 bool bNfftEven =
false;
229 for (i = 0; i < iNRows; ++i) {
230 for (j = i; j < iNRows; ++j) {
236 matCsd.row(j)(0) /= 2.0;
240 matCsd.row(j).tail(1) /= 2.0;
244 inputData.
vecPairCsd.append(QPair<int,MatrixXcd>(i,matCsd));
245 inputData.
vecPairCsdImagSign.append(QPair<int,MatrixXd>(i,matCsd.imag().cwiseSign()));
250 if(vecPairCsdSum.isEmpty()) {
254 for (
int j = 0; j < vecPairCsdSum.size(); ++j) {
255 vecPairCsdSum[j].second += inputData.
vecPairCsd.at(j).second;
263 for (i = 0; i < inputData.
vecPairCsd.size(); ++i) {
269 if(vecPairCsdImagSignSum.isEmpty()) {
272 for (
int j = 0; j < vecPairCsdImagSignSum.size(); ++j) {
296 QSharedPointer<NetworkEdge> pEdge;
298 double dNTrials = double(connectivitySettings.
size() - 1.0);
302 matNom = (connectivitySettings.
size() * matNom.array().square() - 1.0) / dNTrials;
304 for(j = i; j < matNom.rows(); ++j) {
305 matWeight = matNom.row(j).transpose();
307 pEdge = QSharedPointer<NetworkEdge>(
new NetworkEdge(i, j, matWeight));
309 finalNetwork.
getNodeAt(i)->append(pEdge);
310 finalNetwork.
getNodeAt(j)->append(pEdge);
311 finalNetwork.
append(pEdge);
static void compute(ConnectivitySettings::IntermediateTrialData &inputData, QVector< QPair< int, Eigen::MatrixXcd > > &vecPairCsdSum, QVector< QPair< int, Eigen::MatrixXd > > &vecPairCsdImagSignSum, QMutex &mutex, int iNRows, int iNFreqs, int iNfft, const QPair< Eigen::MatrixXd, Eigen::VectorXd > &tapers)