42void dftHilbert(
const VectorXd& input, VectorXd& envelope)
44 const int n =
static_cast<int>(input.size());
51 std::vector<std::complex<double>>
X(
static_cast<size_t>(n));
52 for (
int k = 0; k < n; ++k) {
53 std::complex<double> sum(0.0, 0.0);
54 for (
int t = 0; t < n; ++t) {
55 double angle = -2.0 *
M_PI * k * t / n;
56 sum += input[t] * std::complex<double>(std::cos(angle), std::sin(angle));
58 X[
static_cast<size_t>(k)] = sum;
65 std::vector<std::complex<double>> H(
static_cast<size_t>(n));
67 for (
int k = 1; k < (n + 1) / 2; ++k)
68 H[
static_cast<size_t>(k)] = 2.0 *
X[
static_cast<size_t>(k)];
70 H[
static_cast<size_t>(n / 2)] =
X[
static_cast<size_t>(n / 2)];
71 for (
int k = (n + 1) / 2; k < n; ++k)
72 H[
static_cast<size_t>(k)] = std::complex<double>(0.0, 0.0);
75 for (
int t = 0; t < n; ++t) {
76 std::complex<double> sum(0.0, 0.0);
77 for (
int k = 0; k < n; ++k) {
78 double angle = 2.0 *
M_PI * k * t / n;
79 sum += H[
static_cast<size_t>(k)] * std::complex<double>(std::cos(angle), std::sin(angle));
81 sum /=
static_cast<double>(n);
82 envelope[t] = std::abs(sum);
94 const int nSig =
static_cast<int>(matData.rows());
95 const int nSamples =
static_cast<int>(matData.cols());
97 MatrixXd aec = MatrixXd::Identity(nSig, nSig);
99 if (nSig < 2 || nSamples < 2)
103 MatrixXd envs(nSig, nSamples);
104 for (
int i = 0; i < nSig; ++i) {
109 for (
int i = 0; i < nSig; ++i) {
110 for (
int j = i + 1; j < nSig; ++j) {
124 const int nSig =
static_cast<int>(matData.rows());
125 const int nSamples =
static_cast<int>(matData.cols());
127 MatrixXd aec = MatrixXd::Identity(nSig, nSig);
129 if (nSig < 2 || nSamples < 2)
133 for (
int i = 0; i < nSig; ++i) {
134 VectorXd si = matData.row(i).transpose();
137 for (
int j = i + 1; j < nSig; ++j) {
138 VectorXd sj = matData.row(j).transpose();
141 double siNorm2 = si.squaredNorm();
144 sjOrth_ij = sj - (sj.dot(si) / siNorm2) * si;
152 double sjNorm2 = sj.squaredNorm();
155 siOrth_ji = si - (si.dot(sj) / sjNorm2) * sj;
164 double r = (r_ij + r_ji) / 2.0;
178 dftHilbert(signal, env);
186 const int n =
static_cast<int>(a.size());
187 if (n < 2 || b.size() != n)
190 double meanA = a.mean();
191 double meanB = b.mean();
193 VectorXd ac = a.array() - meanA;
194 VectorXd bc = b.array() - meanB;
196 double stdA = std::sqrt(ac.squaredNorm() /
static_cast<double>(n - 1));
197 double stdB = std::sqrt(bc.squaredNorm() /
static_cast<double>(n - 1));
199 if (stdA < 1e-15 || stdB < 1e-15)
202 return ac.dot(bc) / (
static_cast<double>(n - 1) * stdA * stdB);
ConnectivityAec — Amplitude Envelope Correlation connectivity metric.
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
static Eigen::VectorXd hilbertEnvelope(const Eigen::VectorXd &signal)
static Eigen::MatrixXd compute(const Eigen::MatrixXd &matData)
static Eigen::MatrixXd computeOrthogonalized(const Eigen::MatrixXd &matData)
static double pearsonCorrelation(const Eigen::VectorXd &a, const Eigen::VectorXd &b)