Ir al contenido

Sonoridad avanzada (ISO 532-2/-3, ECMA-418-2)

Normas aplicables: ISO 532ECMA-418Referencias: Moore 2013

El método de Zwicker de ISO 532-1 es la vía de referencia hacia la sonoridad en sonios y está en Sonoridad, junto con las líneas isofónicas de ISO 226. Esta página cubre las familias de modelos más nuevas que phonometry incluye a su lado: 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.

La página empieza por la elección: qué modelo encaja con qué medición, y por qué los valores en sonios de los cuatro métodos coinciden en el ancla de 1 kHz / 40 dB pero no son intercambiables dígito a dígito. Después, cada modelo tiene su propia sección con un ejemplo resuelto, su figura y su tabla de parámetros.

ModeloNormaEstacionario / variable en el tiempoSalidaCuándo usarlo
ZwickerISO 532-1:2017ambossoniosMétodo de referencia; entrada en tercios de octava; rápido y muy citado
Moore-GlasbergISO 532-2:2017estacionariosoniosPatrón de excitación roex; mejor para tonos y con suma binaural explícita
Moore-Glasberg-SchlittenlacherISO 532-3:2023variable en el tiemposonios (STL/LTL)Sonoridad variable en el tiempo con trazas de corto/largo plazo y el pico
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 sonio; 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 cerca de 1 sonio 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 cerca de 1 sonio a 40 dB SPL

Los tres modelos pasan por aproximadamente 1 sonio en el ancla de 40 dB (el front-end de Sottek devuelve ahí 0,9845 sone_HMS) y divergen con el nivel: Zwicker duplica el valor en sonios 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 cerca de 1 sonio 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 [sonios]")
ax.legend()
plt.show()

Todos los modelos de esta página salvo el de Zwicker se escriben sobre el eje del número ERBN, así que conviene tener a mano la escala misma. La cóclea se comporta como un banco de filtros auditivos paso banda solapados; la anchura del filtro centrado en una frecuencia dada se resume con su ancho de banda rectangular equivalente, el del filtro rectangular que dejaría pasar la misma potencia con la misma respuesta de pico. Ajustando datos de ruido con muesca de oyentes jóvenes a niveles moderados, Glasberg y Moore (1990) lo convierten en una recta en frecuencia (Moore, An Introduction to the Psychology of Hearing 6.ª ed., p. 76):

Integrar convierte eso en una escala de frecuencia en la que un paso es una anchura de filtro auditivo. La escala es el número ERBN y su unidad es el Cam, por Cambridge:

from phonometry import psychoacoustics
cam = psychoacoustics.cam_from_frequency(1000.0)
print(round(psychoacoustics.erb_bandwidth(1000.0), 1)) # 132.4 Hz
print(round(cam, 2)) # 15.59 Cam
print(round(psychoacoustics.frequency_from_cam(cam), 1)) # 1000.0 Hz

La biblioteca expresa el mismo ajuste con una cifra significativa más, y , la precisión que emplea la implementación de ISO 532-2; ambas formas concuerdan dentro del 0,2 % en todo el margen audible, y esas cifras de más son las que hacen de frequency_from_cam una inversa exacta. No son auxiliares privados del modelo de sonoridad: loudness_moore_glasberg llama a esas mismas tres funciones, de modo que una rejilla MooreGlasbergLoudness.erb_number y un eje Cam construido por ti no pueden separarse.

Ancho de banda del filtro auditivo frente a la frecuencia central en ejes log-log: la recta ERB_N de Glasberg y Moore desde unos 30 Hz a 50 Hz hasta más de 1 kHz a 16 kHz, el ancho de banda de tercio de octava a porcentaje constante cruzándola cerca de 500 Hz, el punto de 1 kHz anotado en 15,59 Cam y un segundo eje superior con la escala CamAncho de banda del filtro auditivo frente a la frecuencia central en ejes log-log: la recta ERB_N de Glasberg y Moore desde unos 30 Hz a 50 Hz hasta más de 1 kHz a 16 kHz, el ancho de banda de tercio de octava a porcentaje constante cruzándola cerca de 500 Hz, el punto de 1 kHz anotado en 15,59 Cam y un segundo eje superior con la escala Cam

El filtro del oído no es una fracción constante de la frecuencia. Por debajo de unos 500 Hz es bastante más estrecho que un tercio de octava, y por eso la función de banda crítica «antigua», plana en baja frecuencia, ajusta tan mal ahí las medidas directas; por encima es más ancho. El eje superior cuenta la misma curva en Cam, de modo que pasos iguales sobre él son números iguales de filtros auditivos.

Ver el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics
f = np.geomspace(50.0, 16000.0, 400)
erb = psychoacoustics.erb_bandwidth(f)
third_octave = f * (2 ** (1 / 6) - 2 ** (-1 / 6)) # 23 % de f, como referencia
fig, ax = plt.subplots()
ax.loglog(f, erb, label="ERB$_N$ (Glasberg y Moore, 1990)")
ax.loglog(f, third_octave, "--", label="Tercio de octava (23 % de f)")
ax.set(xlabel="Frecuencia central [Hz]",
ylabel="Ancho de banda rectangular equivalente ERB$_N$ [Hz]")
ax.legend()
# El eje Cam arriba: marcas donde caen números ERB_N enteros.
cam_ticks = np.arange(5.0, 40.0, 5.0)
ax2 = ax.twiny()
ax2.set_xscale("log")
ax2.set_xlim(ax.get_xlim())
ax2.set_xticks(psychoacoustics.frequency_from_cam(cam_ticks))
ax2.set_xticklabels([f"{c:.0f}" for c in cam_ticks])
ax2.set_xlabel("Número ERB$_N$ [Cam]")
plt.show()

Parámetros de erb_bandwidth(), cam_from_frequency() y frequency_from_cam()

Sección titulada «Parámetros de erb_bandwidth(), cam_from_frequency() y frequency_from_cam()»
ParámetroTipoUnidadesRango / defectoNotas
frequencyfloat o arrayHz≥ 0erb_bandwidth, cam_from_frequency
camfloat o arrayCam≥ 0frequency_from_cam

Cada una devuelve un float con entrada escalar y un array en caso contrario. Las tres constantes se exportan como ERB_C1, ERB_C2 y CAM_C.

Qué grabación corresponde a qué argumentos

Sección titulada «Qué grabación corresponde a qué argumentos»

field y presentation no son preferencias: son descripciones de cómo llegó el sonido a quien escucha, y equivocarlos cuesta más que cualquier diferencia entre los modelos de esta página. El apartado 7.2 de ISO 532-2 lista las situaciones de escucha y la función de transferencia que necesita cada una, y el apartado 8.1 fija qué hacen con el resultado los dos oídos.

Cómo se captó el sonidofield=Por qué
Un micrófono en el centro de la posición que ocuparía la cabeza de quien escucha, ausente, con una única fuente frontal'free'Columna 2 de la Tabla 1, la transferencia de campo libre hasta la membrana timpánica
El mismo micrófono en una sala reverberante o in situ'diffuse'Columna 3 de la Tabla 1, la transferencia de campo difuso; también es la opción correcta para auriculares de campo difuso
Un micrófono de sonda a menos de 10 mm del tímpano (5 mm cuando hay componentes fuertes por encima de 3 kHz)'eardrum'Apartado 7.2.4: el espectro ya está en la membrana, así que no se aplica ninguna función de transferencia
Un simulador de cabeza y torso'eardrum', pero solo si el simulador es un modelo acústico fiel de un adulto medioApartado 7.2.5; si no, necesita su propio fichero de corrección, que esta API no sabe expresar — ecualiza antes la grabación a campo libre o a campo difuso y usa la opción que corresponda
Cuatro vías de captación y los argumentos que implica cada una: un único micrófono donde estaría la cabeza de quien escucha con una sola fuente frontal, que da field free; el mismo micrófono en un campo reverberante, que da field diffuse; un micrófono de sonda a menos de 10 mm de la membrana timpánica, que da field eardrum sin ninguna función de transferencia; y un simulador de cabeza y torso, que da field eardrum solo si es un modelo fiel de un adulto medio; un pie indica que un sonido diótico suena alrededor de 1,5 veces más sonoro que el mismo sonido en un solo oídoCuatro vías de captación y los argumentos que implica cada una: un único micrófono donde estaría la cabeza de quien escucha con una sola fuente frontal, que da field free; el mismo micrófono en un campo reverberante, que da field diffuse; un micrófono de sonda a menos de 10 mm de la membrana timpánica, que da field eardrum sin ninguna función de transferencia; y un simulador de cabeza y torso, que da field eardrum solo si es un modelo fiel de un adulto medio; un pie indica que un sonido diótico suena alrededor de 1,5 veces más sonoro que el mismo sonido en un solo oído

Las cuatro situaciones del apartado 7.2, con la geometría que las decide. Las distancias de la escena 3 son las de la propia norma: 10 mm desde la membrana timpánica, 5 mm cuando el sonido tiene componentes fuertes por encima de 3 kHz.

El modo de fallo es silencioso y grande. Aplicar una transferencia de campo libre a una señal que ya contiene la resonancia del canal auditivo cuenta dos veces una ganancia de unos 15 dB cerca de 3 kHz: un tono de 3 kHz a 70 dB da 13,8 sonios (78,0 fonios) con field="free" y 5,0 sonios (62,7 fonios) con field="eardrum", y nada en el resultado dice cuál de las dos era la apropiada. En el otro sentido, una grabación de campo libre analizada como 'eardrum' se queda corta en la misma medida.

presentation es el otro factor dos. monaural calcula un oído con el otro en silencio, diotic presenta la señal idéntica a los dos oídos — que es lo que representa la grabación de un único micrófono en campo libre, ya que ambos oídos escuchan el mismo campo — y binaural combina dos señales de oído independientes a través de la etapa de inhibición de la norma. El tono definitorio de 1 kHz a 40 dB es 1,000 sonios diótico y 0,667 sonios monoaural, la razón 1,5 que enuncia el apartado 8.1, y la inhibición es la razón de que dos oídos den alrededor de vez y media lo de un solo oído en vez de exactamente el doble. Con una entrada de un solo espectro, binaural y diotic coinciden, así que la distinción solo tiene efecto con la entrada de dos canales de loudness_moore_glasberg_time. Ojo además con que loudness_ecma() solo ofrece 'free' y 'diffuse', así que el material referido al tímpano hay que corregirlo antes de que llegue al modelo de ECMA-418-2.

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 (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 sonio / 40 fonios por construcción del sonio.
res = psychoacoustics.loudness_moore_glasberg_from_spectrum([(1000.0, 40.0)], field="free")
print(f"N = {res.loudness:.3f} sonios ({res.loudness_level:.1f} fonios)") # 1.000 sonios (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' [sonios/Cam]")
plt.show()

Desde un espectro de tercio de octava (apartado 5.5)

Sección titulada «Desde un espectro de tercio de octava (apartado 5.5)»

El método exacto quiere componentes sinusoidales, pero el apartado 5.5 define la entrada que un sonómetro entrega de verdad: los niveles de las 29 bandas de tercio de octava contiguas de 25 Hz a 16 kHz sobre los centros nominales de IEC 61260-1:2014. Cada banda se supone plana y se expande internamente en un conjunto equivalente de componentes antes de que corra el método exacto. Hay dos restricciones que conviene decir sin rodeos: exactamente 29 valores y una rejilla fija — un sonómetro que registre de 20 Hz a 20 kHz hay que recortarlo a ella, y uno que se detenga en 8 kHz no sirve en absoluto.

# `psychoacoustics` lo importan los fragmentos de arriba.
# Un espectro de ventilación tal como lo registra un sonómetro: 29 bandas de
# tercio de octava, de 25 Hz a 16 kHz, en dB SPL.
band_levels = [42.0, 45.0, 48.0, 51.0, 54.0, 56.0, 57.0, 57.0, 56.0, 55.0,
54.0, 53.0, 52.0, 51.0, 50.0, 49.0, 48.0, 47.0, 46.0, 45.0,
43.0, 41.0, 39.0, 37.0, 34.0, 31.0, 28.0, 25.0, 22.0]
n_mg = psychoacoustics.loudness_moore_glasberg_from_third_octave(
band_levels, field="diffuse")
print(f"{n_mg.loudness:.1f} sonios ({n_mg.loudness_level:.1f} fonios)") # 17.4 sonios (81.3 fonios)
# La misma medición pasada por ISO 532-1, que se detiene una banda antes:
n_zw = psychoacoustics.loudness_zwicker_from_spectrum(
band_levels[:28], field="diffuse")
print(f"{n_zw.loudness:.1f} sonios ({n_zw.loudness_level:.1f} fonios)") # 13.8 sonios (77.9 fonios)

Las dos normas ni siquiera coinciden en dónde termina el espectro: ISO 532-2 toma 29 bandas hasta 16 kHz e ISO 532-1 toma 28 hasta 12,5 kHz, que es la razón del recorte. El resto de la diferencia son los modelos: excitación roex y suma binaural explícita frente a la sonoridad de núcleo de ISO 532-1. Usa field="diffuse" para una medición en sala hecha con un sonómetro corregido a campo libre — el argumento de campo es donde más se equivoca quien entra por niveles de banda.

loudness_moore_glasberg() y sus variantes _from_spectrum / _from_third_octave

Sección titulada «loudness_moore_glasberg() y sus variantes _from_spectrum / _from_third_octave»

Los tres puntos de entrada solo se diferencian en cómo se aporta el espectro, y comparten field y presentation.

ParámetroSe aplica aTipoUnidadesRango / valor por defectoNotas
xloudness_moore_glasbergarray 1DPano vacíoSeñal de presión calibrada
fsloudness_moore_glasbergintHz> 0
components_from_spectrumlista de (f, L)Hz, dB SPLComponentes sinusoidales discretas
band_levels_from_third_octavevector de 29dB SPL25 Hz .. 16 kHzCentros nominales de IEC 61260-1; exactamente 29
fieldlas tresstr'free' (por defecto) / 'diffuse' / 'eardrum'Transferencia del oído externo (apartado 7.2)
presentationlas tresstr'binaural' (por defecto) / 'diotic' / 'monaural'Suma binaural (apartado 8.1)

Devuelve un MooreGlasbergLoudness: loudness (, sonios), loudness_level (fonios), specific (, 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 , rápida, y la sonoridad de largo plazo , más lenta. La sonoridad de largo plazo de pico 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} sonios ({res.loudness_level_max:.0f} fonios)") # 1.000 sonios (40 fonios)
print(f"sonoridad de largo plazo superada el 5% del tiempo: {res.percentiles[5.0]:.3f} sonios") # 0.999 sonios
res.plot() # sonoridad de corto plazo S'(t) y de largo plazo S''(t) frente al tiempo

La sonoridad de corto plazo sube en unas pocas decenas de milisegundos y cae despacio, imitando la sensibilidad rápida del oído al ataque y su recuperación más lenta; la de largo plazo vuelve a integrar esa traza con una constante de tiempo mucho mayor, así que apenas reacciona a una sílaba suelta y sigue en cambio el nivel global de un suceso. El máximo de esa traza lenta, , es el predictor que la norma da para la sonoridad de un sonido breve, y su validez se acaba hacia los 5 s porque más allá el oyente deja de juzgar el sonido como un único suceso. Por eso mismo los percentiles van a su lado: para un sonido que fluctúa sin una estructura clara de sucesos, un percentil de la sonoridad de largo plazo (típicamente el valor al 5 %) es el estadístico estable, mientras que lo fijaría el único peor instante.

Trazas de sonoridad de corto plazo y de largo plazo de Moore-Glasberg para un pulso de 200 ms a 1 kHz y 60 dB SPL dentro de un registro de 0,8 s: la traza de corto plazo sube hasta un máximo de 4,8 sonios dentro de la ventana sombreada del pulso y se relaja deprisa, mientras la de largo plazo integra hasta 3,6 sonios y decae lentamente tras el final del pulsoTrazas de sonoridad de corto plazo y de largo plazo de Moore-Glasberg para un pulso de 200 ms a 1 kHz y 60 dB SPL dentro de un registro de 0,8 s: la traza de corto plazo sube hasta un máximo de 4,8 sonios dentro de la ventana sombreada del pulso y se relaja deprisa, mientras la de largo plazo integra hasta 3,6 sonios y decae lentamente tras el final del pulso

Un pulso de 200 ms a 1 kHz y 60 dB SPL: la sonoridad de corto plazo alcanza 4,8 sonios en unas pocas decenas de milisegundos y se relaja deprisa, mientras la de largo plazo integra hasta 3,6 sonios y decae lentamente tras el final del pulso; el par de constantes de tiempo que definen los apartados 7.8/7.9 de ISO 532-3.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics
# La figura es un pulso, no un tono estacionario: 1 kHz a 60 dB SPL, abierto
# entre los 200 y los 400 ms de un registro de 0,8 s.
fs = 48000
t = np.arange(int(0.8 * fs)) / fs
sig = np.zeros_like(t)
on = (t >= 0.2) & (t < 0.4)
sig[on] = np.sqrt(2) * 2e-5 * 10 ** (60 / 20) * np.sin(2 * np.pi * 1000 * t[on])
burst = psychoacoustics.loudness_moore_glasberg_time(sig, fs)
print(round(float(burst.short_term_loudness.max()), 1),
round(float(burst.long_term_loudness.max()), 1)) # 4.8 3.6
# El resultado lleva ambas trazas sobre un eje temporal de 1 ms:
burst.plot(language="es")
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 (sonios), 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 , 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 se expresa en sone_HMS, y la misma ancla de 1 kHz/40 dB calibra el front-end. La implementación de sala limpia devuelve 0,9845 sone_HMS para esa ancla en lugar de exactamente 1: el residuo del 1,55 % viene del promediado de bandas que impone el apartado 6.2.3 sobre las bandas que caen en la frontera entre tamaños de bloque y que excita el flanco inferior del tono, cerca de 800 a 900 Hz — sin ningún promediado de bandas la cadena da 0,955; con el promediado restringido a las vecinas del mismo tamaño de bloque, 0,996; y con el recálculo completo entre grupos que exige la norma, 0,9845. La constante de calibración se conserva en su valor tabulado literal en vez de reajustarse, que es la razón de que la desviación se vea siquiera; la referencia de la API de psychoacoustics.loudness.ecma lleva la explicación completa.

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:.4f} sone_HMS") # 0.9845 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 a 60 dB SPL que totaliza 2,8 sone_HMS, con máximo en la banda crítica del tono cerca de 9 Bark_HMS y caída a ambos ladosSonoridad específica media N'(z) del modelo de Sottek sobre las 53 bandas Bark_HMS para un tono de 1 kHz a 60 dB SPL que totaliza 2,8 sone_HMS, con máximo en la banda crítica del tono cerca de 9 Bark_HMS y caída a ambos lados

El tono de 1 kHz a 60 dB SPL, N = 2,8 sone_HMS: un tono más sonoro que el ancla de 40 dB del fragmento de arriba, que da 0,98 sone_HMS. La sonoridad es el área bajo , así que un sonido de banda ancha que reparta un patrón bajo sobre muchas bandas puede pesar más que este pico único.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics
# La figura es el tono de 60 dB, no el ancla de 40 dB del fragmento de arriba.
fs = 48000
t = np.arange(int(1.2 * fs)) / fs
x = np.sqrt(2) * 2e-5 * 10 ** (60 / 20) * np.sin(2 * np.pi * 1000 * t)
res = psychoacoustics.loudness_ecma(x, fs, field="free")
print(f"N = {res.loudness:.1f} sone_HMS") # 2.8 sone_HMS
# 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 razón 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("Razón 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 (, sone_HMS), specific_loudness (, 53 bandas), bark, centre_frequencies, time, loudness_vs_time ( a 187,5 Hz), field.

  • Cubierto

    El ancho de banda ERBN y la escala Cam de Glasberg y Moore (1990) de Moore 6.ª ed. pp. 76-77, mediante erb_bandwidth(), cam_from_frequency() y frequency_from_cam(). 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 , mediante loudness_moore_glasberg_time(). ECMA-418-2:2025 (modelo de Sottek): el ensamblaje de sonoridad del apartado 8, mediante loudness_ecma().

  • 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.

¿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 . 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.