Ir al contenido

Sonoridad

Normas aplicables: ISO 226ISO 532ECMA-418Referencias: Fastl y Zwicker 2007Fletcher y Munson 1933

Las métricas de nivel dicen cuánta presión acústica hay; la sonoridad dice cuán fuerte la percibe realmente quien escucha. Esta página cubre las tres familias de modelos de sonoridad que incluye phonometry: el método de Zwicker (ISO 532-1), los métodos de Moore-Glasberg (ISO 532-2/3) y la sonoridad del modelo de Sottek (ECMA-418-2), además de las curvas isofónicas de tonos puros (ISO 226). El sharpness, la tonalidad y la aspereza están en Métricas de calidad sonora; las métricas de habla en el índice de transmisión del habla y el índice de inteligibilidad del habla.

¿Cómo calculo la sonoridad de Zwicker de ISO 532-1 con Python?

Sección titulada «¿Cómo calculo la sonoridad de Zwicker de ISO 532-1 con Python?»

Llama a psychoacoustics.loudness_zwicker(x, fs, calibration_factor=sens) sobre una grabación calibrada. Si solo tienes el espectro, usa loudness_zwicker_from_spectrum(levels_28) con los 28 niveles de banda de tercio de octava de 25 Hz a 12,5 kHz. Cualquiera de los dos resultados lleva loudness en sonos, loudness_level en fonios y, para señales variables en el tiempo, los percentiles n5 y n10.

Los decibelios comprimen la percepción: 10 dB más se leen como el doble de sonoro, y dos sonidos con el mismo dB(A) pueden diferir audiblemente según cómo se reparta su energía entre las bandas críticas del oído. El método de Zwicker modela explícitamente la cadena auditiva (transmisión del oído externo/medio, análisis en bandas críticas sobre la escala de 24 Bark, pendientes de enmascaramiento dependientes del nivel) y produce la sonoridad N en sonos, una escala de razón: 4 sonos es el doble de sonoro que 2 sonos. Por definición, un tono de 1 kHz a 40 dB SPL es 1 sono, y cada +10 fonios duplica el valor en sonos.

Cadena de sonoridad de Zwicker ISO 532-1: 28 niveles de banda de tercio de octava, transmisión y agrupación de bandas críticas inferiores, sonoridad de núcleo de las 20 bandas críticas, sonoridad específica sobre Bark, integrada en la sonoridad total N en sonos y el nivel de sonoridad en foniosCadena de sonoridad de Zwicker ISO 532-1: 28 niveles de banda de tercio de octava, transmisión y agrupación de bandas críticas inferiores, sonoridad de núcleo de las 20 bandas críticas, sonoridad específica sobre Bark, integrada en la sonoridad total N en sonos y el nivel de sonoridad en fonios

La animación de abajo muestra esa integración en acción: al subir el nivel de banda de un sonido de banda estrecha de 1 kHz, el patrón de sonoridad específica N’(z) crece a lo largo del eje de Bark y el área bajo él es la sonoridad total en sonos.

El patrón de sonoridad específica de una banda estrecha de 1 kHz se construye sobre el eje de Bark mientras el nivel de banda sube de 45 a 85 dB, y el área bajo el patrón se integra en la sonoridad total en sonios.

Descargar la animación (WebM)

El patrón de sonoridad específica de una banda estrecha de 1 kHz se construye sobre el eje de Bark mientras el nivel de banda sube de 45 a 85 dB, y el área bajo el patrón se integra en la sonoridad total en sonios.

Descargar la animación (WebM)

import numpy as np
from phonometry import psychoacoustics
# Una grabación cruda y su calibración para que la guía funcione por sí sola
fs = 48000
x = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs) # cualquier grabación (unidades digitales)
sens = 1.0 # calibration_factor a pascales
levels_28 = np.full(28, 60.0) # 28 niveles de tercio de octava (dB)
# Desde una grabación sin calibrar: calibration_factor convierte unidades digitales en Pa
res = psychoacoustics.loudness_zwicker(x, fs, field="free", calibration_factor=sens)
print(f"N = {res.loudness:.1f} sone ({res.loudness_level:.0f} phon)") # 13.1 sone (77 phon)
# Señales variables en el tiempo: la sonoridad percentil N5 es el
# estándar para informes
res = psychoacoustics.loudness_zwicker(x, fs) # stationary=False (por defecto)
print(f"{res.n5:.1f} {res.n10:.1f} {res.loudness:.1f}") # 13.1 13.1 13.1 — N5, N10, Nmax
# Desde 28 niveles de tercio de octava (25 Hz .. 12.5 kHz)
res = psychoacoustics.loudness_zwicker_from_spectrum(levels_28, field="diffuse")
res.plot() # N'(z) sobre la escala Bark — el patrón de sonoridad específica (requiere matplotlib)
Patrones de sonoridad específica sobre la escala Bark para un sonido de banda estrecha de 1 kHz y un sonido de banda ancha con el mismo nivel de bandaPatrones de sonoridad específica sobre la escala Bark para un sonido de banda estrecha de 1 kHz y un sonido de banda ancha con el mismo nivel de banda

Mismo nivel de banda, sonoridad muy distinta: la energía repartida entre muchas bandas críticas (rojo) suma muchos más sonos que el mismo nivel concentrado en una sola banda (azul). El área bajo N’(z) es la sonoridad total.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics
levels_28 = np.full(28, 60.0) # 28 niveles de tercio de octava (dB)
# Desde 28 niveles de tercio de octava (25 Hz .. 12.5 kHz)
res = psychoacoustics.loudness_zwicker_from_spectrum(levels_28, field="diffuse")
# En una línea — el patrón de sonoridad específica N'(z) desde el resultado:
res.plot(language="es")
plt.show()
# O reproduce la figura a mano — dos patrones con el mismo nivel de banda (60 dB),
# la energía repartida entre muchas bandas críticas frente a la banda de 1 kHz:
narrow = psychoacoustics.loudness_zwicker_from_spectrum(np.r_[np.full(16, -60.0), 60.0, np.full(11, -60.0)])
broad = psychoacoustics.loudness_zwicker_from_spectrum(np.full(28, 60.0))
z = np.arange(1, narrow.specific.size + 1) * 0.1 # eje Bark
fig, ax = plt.subplots()
for r, color, label in [
(broad, "#ff7f0e", f"Banda ancha N = {broad.loudness:.1f} sone"),
(narrow, "#1f77b4", f"Banda estrecha 1 kHz N = {narrow.loudness:.1f} sone"),
]:
ax.fill_between(z, r.specific, color=color, alpha=0.3)
ax.plot(z, r.specific, color=color, label=label)
ax.set_xlabel("Tasa de banda crítica z [Bark]")
ax.set_ylabel("Sonoridad específica N' [sone/Bark]")
ax.legend()
plt.show()

La implementación es un port de sala limpia del programa de referencia normativo de la norma (Anexo A.4): las doce tablas de datos son exactas dígito a dígito y el conjunto completo de validación del Anexo B se ejecuta en CI: el caso de prueba estacionario reproduce el valor publicado hasta el último dígito impreso, y las trazas N(t) de los pulsos de tono se mantienen dentro de la banda de tolerancia del 5 % por muestra que fija la norma.

ParámetroTipoUnidadesRango / valor por defectoNotas
xarray 1DPa (tras calibración)≥ 8 ms a 48 kHzSe remuestrea internamente a 48 kHz si es necesario
fsintHz> 0
fieldstr'free' (por defecto) / 'diffuse'Corrección de campo sonoro (Tabla A.5)
stationaryboolpor defecto FalseTrue: un único N a partir del espectro promediado
calibration_factorfloatPa por unidad digitalpor defecto 1.0De sensitivity()

Devuelve un dataclass ZwickerLoudness: loudness (N, sonos), loudness_level (fonios), specific (N′(z), 240 bins de 0,1 Bark) y, para los análisis variables en el tiempo, n5, n10, time, loudness_vs_time (traza a 500 Hz).

ZwickerLoudness.report(path) renderiza una ficha PDF de una página con el formato de un informe de sonoridad acreditado: la línea de base normativa, un bloque opcional de metadatos de cabecera, una tabla compacta de métricas (sonoridad total N, nivel de sonoridad LN y los percentiles N5/N10 para un resultado variable en el tiempo) junto al patrón de sonoridad específica N′(z) (el propio .plot() del resultado), el número único N = X sono (LN = Y fonio) en caja, una fila opcional de veredicto y un pie con el descargo fijo. Usa el mismo contenedor ReportMetadata y el mismo motor de renderizado que la ficha de aislamiento de ISO 717; un requirement aportado se lee como la sonoridad máxima admisible en sonos (una sonoridad menor cumple). El renderizado necesita reportlab (pip install phonometry[report]); solo se admite engine="reportlab". La ficha se genera en inglés por defecto; pasa language="es" para una ficha en español (cadenas fijas traducidas y coma como separador decimal), p. ej. res.report("loudness_fiche_es.pdf", language="es").

from phonometry import psychoacoustics, ReportMetadata
res = psychoacoustics.loudness_zwicker_from_spectrum(levels_28, field="free")
res.report(
"ficha_sonoridad.pdf",
metadata=ReportMetadata(
specimen="Electrodoméstico, ruido de funcionamiento estable",
measurement_standard="ISO 532-1 método 1",
laboratory="Laboratorio de referencia Phonometry",
requirement=12.0, # sonoridad máxima admisible (sonos)
),
) # N (sonos) y LN (fonios)

La ficha de ejemplo se regenera con make reports y se conserva renderizada en el repositorio; pulsa la vista previa para abrir el PDF.

Informe de ejemplo de sonoridad ISO 532-1 (PDF)

Ficha de sonoridad de una página: una cabecera de metadatos, una tabla de métricas con la sonoridad total N y el nivel de sonoridad LN, el patrón de sonoridad específica sobre la tasa de banda crítica, el resultado de un solo número N = 8,2 sonos (LN = 70,4 fonios) en caja y una fila de veredicto CUMPLE frente a un límite de 12 sonos.

Descargar el informe (PDF)

Ficha de sonoridad de Zwicker (ZwickerLoudness.report), N en sonos con LN en fonios.

Nivel de sonoridad de tonos puros (ISO 226:2023)

Sección titulada «Nivel de sonoridad de tonos puros (ISO 226:2023)»

Las curvas isofónicas normales relacionan el SPL de un tono puro con su nivel de sonoridad percibido en fonios (el SPL de un tono de 1 kHz igual de fuerte). equal_loudness_contour(phon) evalúa la Fórmula (1) de ISO 226:2023 en las 29 frecuencias preferentes de tercio de octava de la Tabla 1, loudness_level(spl, frequency) es la inversa exacta (Fórmula 2) y hearing_threshold() devuelve la columna del umbral de audición. equal_loudness_contours(phons) agrupa toda una familia de curvas con el umbral en un resultado EqualLoudnessContours representable:

from phonometry import psychoacoustics
freqs, spl = psychoacoustics.equal_loudness_contour(40.0) # la clásica isofónica de 40 fonios
phon = psychoacoustics.loudness_level(73.0, 63.0) # 73 dB @ 63 Hz -> 40 fonios
# Toda la familia (20-90 fonios por defecto) más el umbral de audición:
res = psychoacoustics.equal_loudness_contours()
res.plot() # el clásico gráfico de ISO 226 (necesita matplotlib)
Curvas isofónicas normales de ISO 226:2023 de 20 a 90 fonios con la curva del umbral de audiciónCurvas isofónicas normales de ISO 226:2023 de 20 a 90 fonios con la curva del umbral de audición

ISO 226:2023 define las curvas de 20 a 90 fonios; por encima de 80 fonios la fórmula solo es válida hasta 4 kHz, por lo que la curva de 90 fonios se detiene ahí y no se define ninguna curva superior.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
from phonometry import psychoacoustics
# Una línea — la familia de curvas directamente desde el resultado:
res = psychoacoustics.equal_loudness_contours()
res.plot(language="es")
plt.show()
# O reproduce la figura a mano — Fórmula (1) de ISO 226:2023 en las 29
# frecuencias preferentes de la Tabla 1, una curva por nivel de sonoridad:
fig, ax = plt.subplots()
for phon in [20, 40, 60, 80, 90]:
freqs, spl = psychoacoustics.equal_loudness_contour(float(phon))
ax.semilogx(freqs, spl, color="C0")
ax.annotate(f"{phon} fonios", xy=(1000, phon + 1), fontsize=9)
ft, tf = psychoacoustics.hearing_threshold()
ax.semilogx(ft, tf, "--", color="C1", label="Umbral de audición $T_f$")
ax.set(xlabel="Frecuencia [Hz]", ylabel="Nivel de presión acústica [dB re 20 µPa]")
ax.grid(True, which="both", alpha=0.3)
ax.legend()
plt.show()

Validez según el apartado 4.1: 20–90 fonios (80 fonios por encima de 4 kHz); la implementación se verifica en CI contra las tablas del Anexo B. Ojo: esto es la sonoridad de tonos puros; la sonoridad de señales arbitrarias en sonos es lo que calculan los modelos ISO 532 de esta página.

La ISO 532-1 de arriba es una de las tres familias de modelos de sonoridad que incluye phonometry (cuatro métodos en la tabla de abajo). Esta sección añade la sonoridad de Moore-Glasberg de ISO 532-2/532-3 y la sonoridad del modelo de Sottek de ECMA-418-2:2025, cuyo front-end auditivo compartido también impulsa la tonalidad y la aspereza de Métricas de calidad sonora.

ModeloNormaEstacionario / variable en el tiempoSalidaCuándo usarlo
ZwickerISO 532-1:2017ambossonosMétodo de referencia; entrada en tercios de octava; rápido y muy citado
Moore-GlasbergISO 532-2:2017estacionariosonosPatrón de excitación roex; mejor para tonos y con suma binaural explícita
Moore-Glasberg-SchlittenlacherISO 532-3:2023variable en el tiemposonos (STL/LTL)Sonoridad variable en el tiempo con trazas de corto/largo plazo y el pico N_max
Sottek (modelo auditivo)ECMA-418-2:2025variable en el tiemposone_HMSComparte un único front-end auditivo con las métricas de tonalidad y aspereza de ECMA

Los cuatro métodos están anclados de modo que un tono de 1 kHz a 40 dB SPL es ≈ 1 sono; los valores no son intercambiables dígito a dígito porque los modelos difieren en sus filtros auditivos y en su suma de sonoridad.

Sonoridad de un tono de 1 kHz en función del nivel para los modelos de Zwicker, Moore-Glasberg y Sottek, todos pasando por 1 sono a 40 dB SPLSonoridad de un tono de 1 kHz en función del nivel para los modelos de Zwicker, Moore-Glasberg y Sottek, todos pasando por 1 sono a 40 dB SPL

Los tres modelos coinciden en el ancla de 1 sono / 40 dB y divergen con el nivel: Zwicker duplica el valor en sonos cada +10 fonios, mientras que el modelo de Sottek crece más lentamente (alrededor de 1,65× por cada 10 dB), una diferencia intrínseca entre las sumas auditivas, no un error de calibración.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics
# Tono de 1 kHz, 20..80 dB SPL: los tres modelos pasan por 1 sono a 40 dB
fs = 48000
t = np.arange(fs) / fs
levels = np.arange(20.0, 81.0, 10.0)
zw, mg, ec = [], [], []
for spl in levels:
x = np.sqrt(2) * 2e-5 * 10 ** (spl / 20) * np.sin(2 * np.pi * 1000 * t)
zw.append(psychoacoustics.loudness_zwicker(x, fs, stationary=True).loudness)
mg.append(
psychoacoustics.loudness_moore_glasberg_from_spectrum([(1000.0, float(spl))]).loudness
)
ec.append(psychoacoustics.loudness_ecma(x, fs).loudness)
fig, ax = plt.subplots()
ax.plot(levels, zw, "o-", label="Zwicker (ISO 532-1)")
ax.plot(levels, mg, "s--", label="Moore-Glasberg (ISO 532-2)")
ax.plot(levels, ec, "^-.", label="Sottek (ECMA-418-2)")
ax.plot(40.0, 1.0, "o", color="k", markerfacecolor="none", markersize=10) # el ancla compartida
ax.set(xlabel="Nivel de presión acústica [dB SPL]", ylabel="Sonoridad total N [sonos]")
ax.legend()
plt.show()

Donde Zwicker usa bandas críticas fijas sobre la escala Bark, Moore-Glasberg construye un patrón de excitación con filtros auditivos exponenciales redondeados (roex) dependientes del nivel sobre la escala del número ERB (“Cam”), y luego aplica una transformación compresiva de excitación → sonoridad específica con C = 0,0617 sonos/Cam (ISO 532-2:2017, Fórmula 7) y una etapa de inhibición binaural. Reproduce los casos de tono y de banda ancha del Anexo B con un uno o dos por ciento de error y, a diferencia de ISO 532-1, modela la suma binaural explícitamente.

import numpy as np
from phonometry import psychoacoustics
# El ancla definitoria: una componente sinusoidal de 1 kHz a 40 dB SPL,
# campo libre, binaural -> 1 sono / 40 fonios por construcción del sono.
res = psychoacoustics.loudness_moore_glasberg_from_spectrum([(1000.0, 40.0)], field="free")
print(f"N = {res.loudness:.3f} sone ({res.loudness_level:.1f} phon)") # 1.000 sono (40.0 fonios)
# Desde una grabación calibrada: se forma el espectro de líneas de banda
# estrecha (FFT, normalización que preserva la potencia) y se alimenta al
# método exacto de componentes sinusoidales (ISO 532-2 apartados 5.2/5.4).
fs = 48000
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)
res = psychoacoustics.loudness_moore_glasberg(x, fs, field="free", presentation="binaural")
res.plot() # sonoridad específica N'(i) sobre la escala del número ERB (Cam)
Sonoridad específica de ISO 532-2 sobre la escala del número ERB para un tono de 1 kHz a 40 dB SPL: un único pico redondeado cerca de 15 Cam cuya área es la sonoridad total de 1 sonioSonoridad específica de ISO 532-2 sobre la escala del número ERB para un tono de 1 kHz a 40 dB SPL: un único pico redondeado cerca de 15 Cam cuya área es la sonoridad total de 1 sonio

El patrón de ISO 532-2 del ancla definitoria de 1 sonio. El pico no es una línea espectral sino la excitación que producen los filtros roex alrededor del tono, así que su anchura es la del filtro auditivo, no la de la resolución de análisis.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics
# Desde una grabación calibrada: se forma el espectro de líneas de banda
# estrecha (FFT, normalización que preserva la potencia) y se alimenta al
# método exacto de componentes sinusoidales (ISO 532-2 apartados 5.2/5.4).
fs = 48000
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)
res = psychoacoustics.loudness_moore_glasberg(x, fs, field="free", presentation="binaural")
# En una línea — el patrón de sonoridad específica N'(i) directo del resultado:
res.plot(language="es")
plt.show()
# O dibújalo a mano desde la rejilla del número ERB que ya lleva el resultado:
fig, ax = plt.subplots()
ax.fill_between(res.erb_number, res.specific, alpha=0.3)
ax.plot(res.erb_number, res.specific)
ax.set_xlabel("Número ERB [Cam]")
ax.set_ylabel("Sonoridad específica N' [sone/Cam]")
plt.show()
ParámetroTipoUnidadesRango / valor por defectoNotas
xarray 1DPano vacíoSeñal de presión calibrada (envoltorio de señal)
componentslista de (f, L)Hz, dB SPL_from_spectrum: componentes sinusoidales discretas
band_levelsvector de 29dB SPL25 Hz .. 16 kHzEntrada de _from_third_octave (bandas IEC 61260-1)
fsintHz> 0Solo en el envoltorio de señal
fieldstr'free' (por defecto) / 'diffuse' / 'eardrum'Transferencia del oído externo
presentationstr'binaural' (por defecto) / 'diotic' / 'monaural'Suma binaural

Devuelve un MooreGlasbergLoudness: loudness (N, sonos), loudness_level (fonios), specific (N′(i), 372 bins de 0,1 Cam), erb_number, centre_frequencies, field, presentation.

ISO 532-3 envuelve el mismo modelo de excitación / sonoridad específica en un análisis espectral multirresolución deslizante (seis FFT paralelas, actualizadas cada 1 ms) y dos integradores temporales en cascada: la sonoridad de corto plazo S′(t), rápida, y la sonoridad de largo plazo S″(t), más lenta. La sonoridad de largo plazo de pico N_max predice la sonoridad de sonidos de hasta unos 5 s.

import numpy as np
from phonometry import psychoacoustics
fs = 32000
t = np.arange(int(1.3 * fs)) / fs
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * t)
res = psychoacoustics.loudness_moore_glasberg_time(x, fs, field="free")
print(f"N_max = {res.n_max:.3f} sone ({res.loudness_level_max:.0f} phon)") # 1.000 sono (40 fonios)
print(f"sonoridad de largo plazo superada el 5% del tiempo: {res.percentiles[5.0]:.3f} sone") # 0.999 sone
res.plot() # sonoridad de corto plazo S'(t) y de largo plazo S''(t) frente al tiempo
Trazas de sonoridad de corto plazo y de largo plazo de Moore-Glasberg para un pulso de tono, mostrando el ataque rápido de la sonoridad de corto plazo y la relajación más lenta de la de largo plazoTrazas de sonoridad de corto plazo y de largo plazo de Moore-Glasberg para un pulso de tono, mostrando el ataque rápido de la sonoridad de corto plazo y la relajación más lenta de la de largo plazo
Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics
fs = 32000
t = np.arange(int(1.3 * fs)) / fs
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * t)
res = psychoacoustics.loudness_moore_glasberg_time(x, fs, field="free")
# El resultado lleva ambas trazas sobre un eje temporal de 1 ms:
res.plot(language="es")
plt.show()
# O dibújalas directamente para ver la STL rápida frente a la LTL lenta:
fig, ax = plt.subplots()
ax.plot(res.time, res.short_term_loudness, label="Corto plazo S'(t)")
ax.plot(res.time, res.long_term_loudness, label="Largo plazo S''(t)")
ax.set_xlabel("Tiempo [s]")
ax.set_ylabel("Sonoridad [sone]")
ax.legend()
plt.show()

Parámetros de loudness_moore_glasberg_time()

Sección titulada «Parámetros de loudness_moore_glasberg_time()»
ParámetroTipoUnidadesRango / valor por defectoNotas
signalarray 1D o (n, 2)Pano vacíoMono = diótico; dos columnas = oídos izquierdo/derecho
fsintHz> 0
fieldstr'free' (por defecto) / 'diffuse' / 'eardrum'Transferencia del oído externo
presentationstr'binaural' (por defecto) / 'diotic' / 'monaural'Suma binaural
percentilessecuenciaporcentajepor defecto (1, 5, 10, 50, 90, 95)Niveles de sonoridad de largo plazo excedidos

Devuelve un MooreGlasbergTimeVaryingLoudness: time (rejilla de 1 ms), short_term_loudness / long_term_loudness (sonos), sus _level en fonios, n_max, loudness_level_max, un dict percentiles, field, presentation.

ECMA-418-2:2025 especifica un único front-end auditivo (filtrado del oído externo/medio, un banco de 53 filtros de tipo gammatone sobre la escala Bark_HMS con z = 0,5 .. 26,5, rectificación de media onda, RMS de bloque y una no linealidad compresiva, Fórmula 23) que comparten sus métricas de sonoridad, tonalidad y aspereza. La sonoridad N se expresa en sone_HMS, y el mismo ancla de 1 kHz/40 dB calibra el front-end (nuestro valor de sala limpia 0,984, con el promediado completo de bandas de la cláusula 6.2.3; el origen del residuo está documentado en el docstring del módulo).

import numpy as np
from phonometry import psychoacoustics
fs = 48000
t = np.arange(int(1.2 * fs)) / fs
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * t)
res = psychoacoustics.loudness_ecma(x, fs, field="free")
print(f"N = {res.loudness:.3f} sone_HMS") # 0.984 sone_HMS
print(res.specific_loudness.shape) # (53,) sonoridad específica media N'(z)
res.plot() # sonoridad específica media N'(z) + N(l) dependiente del tiempo a 187.5 Hz
Sonoridad específica media N'(z) del modelo de Sottek sobre las 53 bandas Bark_HMS para un tono de 1 kHz, con máximo en la banda crítica del tonoSonoridad específica media N'(z) del modelo de Sottek sobre las 53 bandas Bark_HMS para un tono de 1 kHz, con máximo en la banda crítica del tono
Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics
fs = 48000
t = np.arange(int(1.2 * fs)) / fs
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * t)
res = psychoacoustics.loudness_ecma(x, fs, field="free")
# El resultado lleva la sonoridad específica media sobre las 53 bandas Bark_HMS:
res.plot(language="es")
plt.show()
# O dibuja N'(z) a mano frente a la escala de tasa de banda crítica:
fig, ax = plt.subplots()
ax.fill_between(res.bark, res.specific_loudness, alpha=0.3)
ax.plot(res.bark, res.specific_loudness)
ax.set_xlabel("Tasa de banda crítica z [Bark_HMS]")
ax.set_ylabel("Sonoridad específica N' [sone_HMS/Bark_HMS]")
plt.show()
ParámetroTipoUnidadesRango / valor por defectoNotas
signal_inarray 1DPano vacíoSeñal de presión calibrada
fsfloatHz> 0Se remuestrea a 48 kHz internamente si es necesario (apartado 5.1.1)
fieldstr'free' (por defecto) / 'diffuse'Filtro del oído externo/medio (apartado 5.1.3)

Devuelve un EcmaLoudness: loudness (N, sone_HMS), specific_loudness (N′(z), 53 bandas), bark, centre_frequencies, time, loudness_vs_time (N(l) a 187,5 Hz), field.

Cubierto. ISO 532-1:2017 (método de Zwicker): el método estacionario del apartado 5 y el método variable en el tiempo del apartado 6, portado del programa de referencia normativo del Anexo A.4 y validado frente al Anexo B, con los percentiles n5/n10, mediante loudness_zwicker() y loudness_zwicker_from_spectrum(). ISO 532-2:2017 (Moore-Glasberg): el patrón de excitación roex del apartado 7 y la inhibición binaural del apartado 8, mediante loudness_moore_glasberg() y sus variantes _from_spectrum/_from_third_octave. ISO 532-3:2023 (Moore-Glasberg-Schlittenlacher): la sonoridad de corto plazo del apartado 7.8, la de largo plazo del apartado 7.9 y su pico N_max, mediante loudness_moore_glasberg_time(). ECMA-418-2:2025 (modelo de Sottek): el ensamblaje de sonoridad del apartado 8, mediante loudness_ecma(). ISO 226:2023: la Fórmula (1), la Fórmula (2) y los parámetros de curva de la Tabla 1, mediante equal_loudness_contour(), loudness_level(), hearing_threshold() y equal_loudness_contours().

No cubierto. La combinación binaural de ECMA-418-2 (Fórmula 118, apartado 8.1.5) no está implementada: loudness_ecma() es monaural, así que analiza cada canal por separado. El apartado 5 de ISO 532-3 exige remuestrear la entrada a 32 kHz antes del análisis FFT deslizante. Esta implementación procesa en cambio a la frecuencia de muestreo nativa, una desviación documentada que se mantiene dentro de la incertidumbre expandida de la norma. Remuestrea a 32 kHz primero si te importa la conformidad estricta apartado a apartado.

¿Cuál es la diferencia entre la sonoridad en sonos y el nivel de sonoridad en fonios?

Sección titulada «¿Cuál es la diferencia entre la sonoridad en sonos y el nivel de sonoridad en fonios?»

La sonoridad N en sonos (ISO 532-1) es una escala de razón de la sonoridad percibida: 4 sonos es el doble de sonoro que 2 sonos y, por definición, un tono de 1 kHz a 40 dB SPL es 1 sono. El nivel de sonoridad en fonios (ISO 226) es el SPL de un tono puro de 1 kHz igual de fuerte, y cada +10 fonios duplica el valor en sonos.

¿Qué modelo de sonoridad elijo: Zwicker, Moore-Glasberg o Sottek?

Sección titulada «¿Qué modelo de sonoridad elijo: Zwicker, Moore-Glasberg o Sottek?»

El método de Zwicker (ISO 532-1:2017) es el de referencia: estacionario y variable en el tiempo, entrada en tercios de octava, rápido y muy citado. Moore-Glasberg (ISO 532-2:2017) es estacionario, construye patrones de excitación roex y modela la suma binaural explícitamente; ISO 532-3:2023 añade la sonoridad variable en el tiempo de corto y largo plazo con el pico N_max. El modelo de Sottek (ECMA-418-2:2025) se expresa en sone_HMS y comparte su front-end auditivo con las métricas de tonalidad y aspereza de ECMA.

¿En qué rango son válidas las curvas isofónicas de ISO 226:2023?

Sección titulada «¿En qué rango son válidas las curvas isofónicas de ISO 226:2023?»

El apartado 4.1 de ISO 226:2023 define las curvas isofónicas normales de 20 a 90 fonios, evaluadas en las 29 frecuencias preferentes de tercio de octava de la Tabla 1; por encima de 80 fonios la fórmula solo es válida hasta 4 kHz, por lo que la curva de 90 fonios se detiene ahí y no se define ninguna curva superior. Las curvas describen tonos puros, no señales arbitrarias.