51 nTapers =
static_cast<int>(std::floor(2.0 * halfBandwidth - 1.0));
53 const double W = halfBandwidth /
static_cast<double>(N);
59 VectorXd offdiag(N > 1 ? N - 1 : 0);
61 const double cosW = std::cos(2.0 * DPSS_PI * W);
63 for (
int i = 0; i < N; ++i) {
64 const double val = (
static_cast<double>(N - 1) - 2.0 *
static_cast<double>(i)) / 2.0;
65 diag[i] = val * val * cosW;
68 for (
int i = 0; i < N - 1; ++i) {
69 offdiag[i] =
static_cast<double>(i + 1) *
static_cast<double>(N - i - 1) / 2.0;
73 MatrixXd T = MatrixXd::Zero(N, N);
74 for (
int i = 0; i < N; ++i)
76 for (
int i = 0; i < N - 1; ++i) {
77 T(i, i + 1) = offdiag[i];
78 T(i + 1, i) = offdiag[i];
81 SelfAdjointEigenSolver<MatrixXd> solver(T);
84 const VectorXd& allEigenvalues = solver.eigenvalues();
85 const MatrixXd& allEigenvectors = solver.eigenvectors();
91 for (
int k = 0; k < nTapers; ++k) {
92 const int idx = N - 1 - k;
96 VectorXd taper = allEigenvectors.col(idx);
97 const double norm = taper.norm();
105 result.
matTapers.row(k) = taper.transpose();