72 nTapers =
static_cast<int>(std::floor(2.0 * halfBandwidth - 1.0));
74 const double W = halfBandwidth /
static_cast<double>(N);
80 VectorXd offdiag(N > 1 ? N - 1 : 0);
82 const double cosW = std::cos(2.0 * DPSS_PI * W);
84 for (
int i = 0; i < N; ++i) {
85 const double val = (
static_cast<double>(N - 1) - 2.0 *
static_cast<double>(i)) / 2.0;
86 diag[i] = val * val * cosW;
89 for (
int i = 0; i < N - 1; ++i) {
90 offdiag[i] =
static_cast<double>(i + 1) *
static_cast<double>(N - i - 1) / 2.0;
94 MatrixXd T = MatrixXd::Zero(N, N);
95 for (
int i = 0; i < N; ++i)
97 for (
int i = 0; i < N - 1; ++i) {
98 T(i, i + 1) = offdiag[i];
99 T(i + 1, i) = offdiag[i];
102 SelfAdjointEigenSolver<MatrixXd> solver(T);
105 const VectorXd& allEigenvalues = solver.eigenvalues();
106 const MatrixXd& allEigenvectors = solver.eigenvectors();
112 for (
int k = 0; k < nTapers; ++k) {
113 const int idx = N - 1 - k;
117 VectorXd taper = allEigenvectors.col(idx);
118 const double norm = taper.norm();
126 result.
matTapers.row(k) = taper.transpose();