Incorrect scaling of complex multitaper coefficients with `normalization="full"`

Cerrado Apto para principiantes
#14,493 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Ya se ha fusionado un pull request relacionado.

  • #14497 de @iis-MarkKuang — fusionado

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
74/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
data

Línea de trabajo

Empieza en mne.time_frequency.psd_array_multitaper() y sigue cómo se aplica la normalización para output="complex"; compara ese escalado con la salida de potencia y _psd_from_mt(). Usa la reproducción del issue para comprobar que ambas rutas producen PSD coincidentes para normalization="full" y "length"; el trabajo está terminado cuando ambas razones son 1.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

BUG
Description of the problem

normalization="full" in psd_array_multitaper() scales the data by 1/sfreq. This is fine for output="power", but for output="complex", the scaling should be 1/sqrt(sfreq).

Because of this, power subsequently computed from the coefficients (including in Spectrum.plot()) is of a much smaller scale than if output="power" was used.

Steps to reproduce
import numpy as np

from mne.time_frequency import psd_array_multitaper
from mne.time_frequency.multitaper import _psd_from_mt

sfreq = 100.0
x = np.random.default_rng(0).standard_normal((1, 1000))

for normalization in ("length", "full"):
    psd, _ = psd_array_multitaper(
        x, sfreq, normalization=normalization, output="power", verbose=False
    )
    coefs, _, weights = psd_array_multitaper(
        x, sfreq, normalization=normalization, output="complex", verbose=False
    )
    psd_from_coefs = _psd_from_mt(coefs, weights)
    print(f"{normalization}: ratio = {np.unique((psd_from_coefs / psd).round(6))}")
Link to data

No response

Expected results

The PSD constructed directly and subsequently computed from the complex coefficients are identical.

Actual results

With normalization="full", the PSD subsequently computed from the complex coefficients are scaled by 1/sfreq relative to the PSD constructed directly.

length: ratio = [1.]
full: ratio = [0.01]
Additional information

AI disclosure: was initially picked up by Claude Opus 5.5, and further investigated by myself.

Lenguaje dominante
Python
Estrellas
3.6k
Forks
1.6k
Merge medio
1 d 18 h
PR fusionados (30 d)
71

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de mne-tools/mne-python

Todos los issues de mne-tools/mne-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.