Why is the number of tapers in mne.time_frequency.tfr_array_multitaper equal to floor(time_bandwidth - 1)?

When writing down the math behind multitaper, I read that the number of tapers L of is recommended to be [1,2]:

L<<2 alpha -1,
where alpha = 1/2 * R * T, with R: full frequency bandwidth, and alpha >=1 [1, eq. 22].

From the MNE description for tfr_array_multitaper:
"The number of good tapers (low-bias) is chosen automatically based on this to equal floor(time_bandwidth - 1)”,
where time_bandwidth is the product between the temporal window length (in seconds) and the full frequency bandwidth (in Hz), and time_bandwith>=2.

In the code I found this as well ( mne-python/mne/time_frequency/tfr.py at main · mne-tools/mne-python · GitHub ):

 n_taps = int(np.floor(time_bandwidth - 1))

 ...

        # Get dpss tapers

        tapers, conc = dpss_windows(

            t.shape\[0\], time_bandwidth / 2.0, n_taps, sym=False

        )

So if I understand these correct, time_bandwidth in MNE is equal to 2alpha in [1], and thus in MNE: L = 2alpha-1, against the recommendation in [1,2], which would be L<<2alpha-1, meaning that, e.g., L=alpha.

I wanted to ask if I understood something wrong, or if there is a reason why in MNE the number of tapers is chosen differently that recommended.

I also found this post: mne.time_frequency.psd_multitaper details which mentions that some related code may come from here: Neuroimaging in Python — nitime 0.9.dev documentation , where they indeed used the same value for L as MNE does.

  • MNE version: e.g. 1.12.1
  • operating system: e.g. macOS Tahoe 26.5.2

[1] https://ieeexplore.ieee.org/abstract/document/6767046/

[2] https://www.cambridge.org/core/books/spectral-analysis-for-physical-applications/A9195239A8965A2C53D43EB2D1B80A33 chapter 7

Your mapping is correct: in MNE, time_bandwidth = T·R = 2NW = 2α, because the code passes time_bandwidth / 2 as the DPSS half bandwidth parameter. Therefore MNE chooses

K = floor(time_bandwidth - 1) = floor(2NW - 1).

The key point is that roughly 2NW DPSS sequences are concentrated inside the target band. The usual practical choice is therefore K = 2NW − 1: it uses the well concentrated tapers while avoiding the sequence near the concentration transition. This is the standard thomson multitaper convention, not something specific to MNE or nitime

I checked the current MNE source and reproduced the DPSS calculation with SciPy. For example, time_bandwidth=4 gives NW=2 and K=3; the three spectral-concentration ratios were approximately 0.99994, 0.99756, and 0.95939. So all three are strongly concentrated in the specified band

I would not read L ≪ 2α−1 in the review as rule used to define the complete lowbias DPSS set. It is a more conservative/asymptotic condition used in that particular derivation. Choosing, say, L=α is possible, but it trades fewer leakage-prone tapers for higher estimator variance. MNE instead follows the common maximal lowbias choice. The only slightly misleading part is the documentation wording: MNE does not inspect the eigenvalues and apply a configurable bias threshold here. it directly requests floor(time_bandwidth−1) tapers

Sourcs: MNE implementation, MNE API documentation and SciPy DPSS documentation