<!-- canonical: https://jmrplens.github.io/phonometry/es/signals/metrology/calibration/ -->
Source: https://jmrplens.github.io/phonometry/es/signals/metrology/calibration/

Cada nivel que devuelve esta biblioteca es tan fiable como el número que
produce esta página: el factor de sensibilidad que convierte unidades
digitales en pascales. La página cubre los dos marcos de referencia en los
que se puede analizar una grabación: el **dB SPL** físico, obtenido
calibrando la cadena contra un calibrador acústico IEC 60942, y el **dBFS**
digital, niveles relativos al fondo de escala sin pretensión física alguna.

Elegir entre ellos es una pregunta sobre tu cadena de medición, no una
preferencia. Trabaja en dB SPL siempre que el resultado se enfrente a un
criterio físico (un límite de ruido, un umbral de exposición, cualquier
norma de acústica); eso exige una grabación del calibrador hecha con la
*misma cadena, sin tocar*, que la medición. Trabaja en dBFS cuando la señal
nunca tuvo un front-end analógico calibrado (normalización de sonoridad,
pruebas de códecs e interfaces, análisis solo a partir de archivos) o cuando no
existe tono de calibración, en cuyo caso las afirmaciones absolutas de SPL
quedan sencillamente fuera de alcance.

El flujo alrededor del factor importa tanto como la fórmula: derívalo antes
y vuelve a comprobarlo después de cada sesión, verifica sonómetro y
calibrador periódicamente en laboratorio (IEC 61672-3 e IEC 60942; Bies,
Hansen y Howard 2017, §3.4) y trata la diferencia pre/post como tu cota de
deriva. La sección de
[campo, laboratorio y deriva](#comprobaciones-verificacion-y-deriva)
de más abajo convierte eso en reglas concretas, y el recorrido
[Construye un sonómetro](/phonometry/es/signals/sound-level-meter/) empieza
exactamente en este paso antes de calcular ningún nivel.

## ¿Por qué calibrar? La teoría

Una grabación digital solo conoce *números*: una sinusoide a fondo de escala es
±1,0 tanto si era un susurro como un motor a reacción. Para expresar niveles
de presión acústica físicos, la cadena micrófono → preamplificador → ADC debe
caracterizarse con un único número, el **factor de sensibilidad** $S$, que
convierte unidades digitales en pascales:

$$
p(t) = S\ x(t) \qquad S = \frac{p_\text{ref}\cdot 10^{L_\text{cal}/20}}{\tilde{x}_\text{ref}}
$$

donde $L_\text{cal}$ es el nivel del calibrador (típicamente 94 dB, es decir,
1 Pa), $p_\text{ref} = 20\ \mu\text{Pa}$ y $\tilde{x}_\text{ref}$ es el RMS
del tono de calibración grabado, en unidades digitales.
`sensitivity()` es exactamente esa ecuación. El factor vale mientras
nada cambie en la cadena: si tocas la ganancia, recalibra.

## Calibrar una grabación de principio a fin

Los tres pasos de abajo son todo el flujo de trabajo de SPL físico: una toma del
calibrador, una llamada a `sensitivity()` y el factor entregado a una función de
nivel. Las dos grabaciones tienen que venir de la misma cadena sin tocar nada
entre medias. El mismo factor funciona en toda la biblioteca: `octave_filter` y
`OctaveFilterBank` lo reciben dentro de `LevelCalibration(factor=...)`, y `leq`,
`laeq` y `ln_levels` como `calibration_factor=`.

```python

from phonometry import filters, metrology

# 1. Graba la señal de tu calibrador de 94 dB (1 kHz, 1 Pa RMS = 94 dB SPL)
fs = 48000
# calibrator_recording: tu tono de calibrador de 1 kHz grabado (1 Pa RMS = 94 dB SPL).
#   Sintetizado aquí para que la guía funcione; en una medición real graba tu calibrador.
#   Cinco segundos, como pide el procedimiento de acoplamiento de más abajo.
calibrator_recording = np.sqrt(2) * np.sin(2 * np.pi * 1000 * np.arange(5 * fs) / fs)
# recording: la captura de micrófono que quieres calibrar, misma cadena de entrada (Pa tras calibrar).
#   Sintetizada aquí; en una medición real es tu señal grabada.
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)

# 2. Calcula el factor de sensibilidad
calibration_factor = metrology.sensitivity(calibrator_recording, target_spl=94.0, fs=fs)

# 3. Aplica la calibración a tus mediciones
spl, freq = filters.octave_filter(
    recording, fs,
    calibration=filters.LevelCalibration(factor=calibration_factor))
# spl está ahora en dB SPL re 20 µPa
print(f"S = {calibration_factor:.3f} Pa por unidad digital")   # 1.002
print(f"banda de 1 kHz: {spl[freq.index(1000.0)]:.1f} dB SPL") # 77.0
```

Merece la pena leer los dos números en lugar de saltárselos. La toma sintética
del calibrador tiene un valor eficaz de exactamente 1,0 unidades digitales, así
que $S = 20\ \mu\text{Pa}\cdot 10^{94/20} / 1{,}0 = 1{,}002$ Pa por unidad
digital: una unidad digital es un pascal, que es el aspecto de una cadena cuyo
fondo de escala queda justo por encima del nivel del calibrador. El registro de
medición tiene amplitud 0,2, luego un valor eficaz de 0,141 unidades digitales,
luego 0,142 Pa, luego $20\log_{10}(0{,}142 / 2\times 10^{-5}) = 77{,}0$ dB SPL,
que es la banda de 1 kHz que imprime el fragmento.

De ahí sale la regla de cordura para toda sesión posterior. $S$ es la escala de
pascales por unidad de la cadena, así que $94 - L_\text{cal,dBFS}$, el nivel del
calibrador menos el nivel eficaz en dBFS de la toma del calibrador, es el nivel
de presión acústica que llevaría al convertidor a un valor eficaz digital de 1,0.
Si ese número no queda a unos pocos decibelios del nivel más alto para el que se
preparó la cadena, algo va mal en la toma: una grabación recortada o a media
escala, un `target_spl` dejado en 94,0 para un calibrador de 114 dB, o un cambio
de ganancia entre las dos grabaciones. Un factor equivocado en exactamente 20 dB
es el desenlace habitual del segundo error, y ningún paso posterior lo va a
delatar.

### Acoplar el calibrador

El fragmento son tres líneas; el paso que esconde es el que sale mal. El nivel
especificado de un calibrador acústico es el nivel *en el diafragma del micrófono
insertado* (IEC 60942:2017, 5.3.1.2), así que el montaje mecánico es parte de la
medición y no un preliminar. Seis pasos:

1. **Fija la ganancia para el nivel más alto que esperes, y bloquéala.** $S$ solo
   vale mientras la cadena siga exactamente como se calibró, y un mando de
   ganancia movido después de la comprobación desplaza todos los niveles en una
   cantidad que nada aguas abajo puede detectar.
2. **Desactiva todos los procesos automáticos de la interfaz** (control
   automático de ganancia, limitación, supresión de ruido, realce de «voz») y
   graba a 24 bits. Cualquiera de ellos vuelve no lineal la cadena, y la toma del
   calibrador es la única señal en la que eso resulta invisible, porque es un
   único tono estable.
3. **Quita la pantalla antiviento y monta el adaptador que viene con el
   calibrador.** Un adaptador es parte integrante del calibrador acústico
   (5.1.1), y allí donde el manual da los datos de diseño del adaptador da
   también la distancia de inserción y el diámetro mínimo de micrófono con el que
   se produce el sellado (6.3 u). Comprueba que tu modelo de micrófono *y su
   configuración*, con o sin rejilla protectora, están en la lista del manual
   (6.3 a): el nivel especificado vale para los modelos y configuraciones que allí
   se declaren (5.3.1.3), y el manual indica cuánto se mueve el nivel con el
   volumen de carga efectivo del micrófono insertado (6.3 k), el volumen de aire
   delimitado por el plano de referencia, el diafragma y la pared de la cápsula
   (3.13).
4. **Inserta la cápsula a fondo hasta el plano de referencia**, el plano de
   contacto entre micrófono y calibrador (3.12), sujeta el conjunto quieto y deja
   que se estabilice. El manual indica dos tiempos de estabilización: el propio
   del calibrador, que no puede pasar de 30 s (5.1.10), y el que necesita el
   conjunto micrófono más calibrador una vez acoplados (6.3 e).
5. **Haz la comprobación lejos de la fuente en marcha.** La cavidad no es un
   aislante acústico. IEC 60942 lo cuantifica para sus propios ensayos: con el
   micrófono acoplado y el calibrador *apagado*, el nivel que lee el micrófono
   tiene que quedar al menos 30 dB por debajo del nivel que se está midiendo para
   los ensayos periódicos (B.4.2), y 40 dB por debajo para la evaluación de
   modelo (A.5.3). Para un calibrador de 94 dB, eso es un fondo por debajo de
   64 dB en la cápsula, un número que se puede grabar y comprobar en diez
   segundos, y el que decide si `narrowband=True` es opcional (ver la figura de
   más abajo).
6. **Graba de 5 a 10 s de tono ya estabilizado**, recorta el ruido de
   manipulación de los dos extremos y pasa el resto a `sensitivity(ref, fs=fs)`.
   La norma mide el nivel generado como un promedio de 20 s a 25 s (A.5.5.1) y la
   fluctuación a corto plazo a lo largo de 60 s muestreada al menos 30 veces
   (5.3.3); unos pocos segundos ya estabilizados bastan para que el valor eficaz
   converja, y la comprobación de estabilidad de más abajo es la que dice si el
   tono estaba de verdad estabilizado.

**Campo de presión en la cavidad, campo libre en la medición.** El acoplador
excita el diafragma con una excitación de presión: la cavidad es mucho menor que
una longitud de onda, así que la presión acústica es uniforme en ella y no hay
difracción alrededor de la cápsula. El micrófono que estás calibrando está
normalmente caracterizado para *campo libre*, donde su propio cuerpo y la rejilla
elevan la respuesta en alta frecuencia. Las dos caracterizaciones difieren en
décimas de decibelio por debajo de unos 2 kHz y en varios decibelios cerca de
10 kHz, que es por lo que IEC 60942 confina la frecuencia principal de un
calibrador acústico al margen de 160 Hz a 1250 Hz (5.4.1.1): ahí las
sensibilidades de presión y de campo libre de una cápsula de medición coinciden
lo bastante como para no aplicar ninguna corrección. También significa que $S$ es
un anclaje a una sola frecuencia. La *forma* de la respuesta de la cadena lejos
de la frecuencia del calibrador sale de los datos de campo libre del propio
micrófono, no de esta comprobación: las tres sensibilidades y dónde se aplica
cada una están en
[Micrófonos](/phonometry/es/devices/electroacoustics/microphones/). Vuelve a poner
la pantalla antiviento antes de medir, y recuerda que tiene su propia pérdida por
inserción de unas décimas de decibelio en alta frecuencia, que la calibración no
ha visto.

## Supuestos del calibrador (IEC 60942)

`sensitivity` supone que la grabación de referencia procede de un
calibrador acústico según **IEC 60942** (clases LS, 1 y 2):

- El `target_spl=94.0` por defecto corresponde a la salida habitual de 94 dB
  @ 1 kHz. El apartado 5.3.1.3 exige que el nivel principal sea al menos 90 dB re
  20 µPa *cuando el calibrador se aplica a los modelos y configuraciones de
  micrófono que especifica su manual de instrucciones*; 94 dB y 114 dB son los
  valores usuales, y la frecuencia principal tiene que caer entre 160 Hz y
  1,25 kHz (5.4.1.1).
- La sensibilidad resultante hereda la tolerancia de nivel propia del calibrador,
  y ese número cuesta un paso conseguirlo. IEC 60942:2017 no imprime a propósito
  límites de tolerancia: la Tabla 2 da el **límite de aceptación** del nivel
  generado (0,25 dB para un calibrador de clase 1 de 160 Hz a 1,25 kHz, 0,40 dB
  para clase 2, 0,10 dB para clase LS) y la Tabla A.1, la **incertidumbre máxima
  permitida** de la medida de laboratorio que lo demuestra (0,15 dB para clase 1
  en ese mismo margen); el Anexo D, Figura D.1, sitúa el límite de tolerancia en
  su suma. **±0,4 dB** es, por tanto, la cifra de clase 1 que hay que llevarse a
  un balance de incertidumbre a 1 kHz, y es una tolerancia, no un error medido.
  Súmale encima el error de estimación del valor eficaz de tu propia grabación.
- IEC 60942 mide el nivel generado como un promedio de 20 s a 25 s (A.5.5.1):
  graba unos segundos de tono *estable* (excluyendo el ruido de manipulación del
  principio y el final) para que la estimación RMS converja.
- **Correcciones ambientales, y qué calibradores las necesitan.** El nivel
  generado se especifica en las condiciones de referencia del apartado 4: 23 °C,
  101,325 kPa y 50 % de humedad relativa. La Tabla 2 sigue valiendo sin ninguna
  corrección en una franja alrededor de ellas (de 97 kPa a 105 kPa, de 20 °C a
  26 °C, del 40 % al 65 % de HR, apartado 5.3.2), y fuera de esa franja un
  calibrador tiene que quedarse dentro de los límites más anchos de las Tablas 5
  y 6 en todo su margen de funcionamiento, que para clase 1 es de 65 kPa a
  108 kPa, de −10 °C a +50 °C y del 25 % al 90 % de HR (5.5). Solo los
  *pistófonos* que necesitan una corrección de presión estática para cumplir su
  clase llevan la letra **M** en su designación (clase LS/M, clase 1/M, 5.1.5 y
  Tabla 1); se suministran con un barómetro, o su manual especifica uno (5.1.8),
  y el manual indica la corrección y su incertidumbre (6.3 i, 6.3 m). Un pistófono
  genera un desplazamiento de volumen fijo, así que su salida sigue a la presión
  estática ambiente: del orden de una décima de decibelio con la meteorología
  corriente, y en torno a −1 dB a 1000 m sobre el nivel del mar. Cualquier otro
  calibrador, por 5.1.7, tiene que cumplir su clase sin ninguna corrección
  ambiental. Cuando la corrección *sí* haga falta, aplícala al nivel objetivo y
  no a los resultados:

```python
p_correction_db = 0.0  # del manual del calibrador y la lectura del barómetro
cal_corrected = metrology.sensitivity(
    calibrator_recording, target_spl=94.0 + p_correction_db, fs=fs)
```

  La corrección entra directamente en $S$, así que mueve todos los niveles de la
  sesión en la misma cantidad.

### Validación automática de estabilidad

Si pasas la frecuencia de muestreo (y `validate=True`, el valor por defecto),
`sensitivity(ref, fs=fs)` comprueba la grabación igual que la
IEC 60942:2017 comprueba el calibrador (5.3.3): la *fluctuación de nivel a
corto plazo*, el valor absoluto de la diferencia entre cada uno de los niveles
máximo y mínimo con ponderación temporal F y el nivel medio, no debe superar
el límite de clase 1 de la Tabla 2 para la frecuencia nominal del calibrador.
La Tabla 2 da tres filas disjuntas, y no deben leerse como rangos solapados:

| Frecuencia nominal | Límite de clase 1 | |
| :--- | :---: | :--- |
| 160 Hz a 16 kHz | 0,07 dB | la fila estricta, y con la que se juzga un calibrador de 1 kHz |
| por encima de 63 Hz y por debajo de 160 Hz | 0,10 dB | |
| 31,5 Hz a 63 Hz | 0,20 dB | donde la propia ponderación temporal F ondula sobre el tono |

La Tabla 2 abarca de 31,5 Hz a 16 kHz y no especifica nada fuera de ese rango,
así que una `frequency` por debajo de 31,5 Hz o por encima de 16 kHz recae en
los 0,07 dB estrictos y no en las filas relajadas de baja frecuencia. Pasa
`frequency=` para seleccionar la fila correcta en calibradores que no sean de
1 kHz. Un `CalibrationWarning` delata micrófonos mal acoplados o ruido de manipulación
antes de que corrompan silenciosamente todos los niveles calibrados. La
grabación debe durar al menos 2 s (1 s para que el integrador F se asiente más
1 s de envolvente estable); con grabaciones más cortas se avisa en lugar de dar
un veredicto poco fiable. Sin `fs` la comprobación se omite. Sobrescribe el
límite con `max_fluctuation_db` o desactiva con `validate=False`.

La comprobación caza justo lo que arruina las calibraciones de campo (un acoplador flojo,
viento, ruido de manipulación):

*La comprobación es una decisión, y la figura enseña lo lejos que queda de ser
apurada. El tono estable oscila entre +0,003 y −0,004 dB alrededor de su media,
la vigésima parte del límite de clase 1 de 0,07 dB de la Tabla 2. Un 3 % de
modulación de amplitud (un acoplador que no acaba de asentar, una mano sobre el
micrófono) lo lleva a +0,142 y −0,143 dB, el doble del límite, mientras suena
igual y da el mismo nivel medio. La media es lo que usa la sensibilidad; solo la
fluctuación dice si se puede confiar en ella.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python

from phonometry import filters

fs = 48000
t = np.arange(int(fs * 6.0)) / fs
stable = 0.5 * np.sin(2 * np.pi * 1000 * t)
# Modulación de amplitud del 3 % a 2 Hz: ~0,14 dB de oscilación, fuera de límite
unstable = stable * (1 + 0.03 * np.sin(2 * np.pi * 2.0 * t))

plt.figure(figsize=(9, 5))
skip = fs                # descartamos el ataque del integrador F (~8 tau)
for x, label in ((stable, "Tono estable (buen acoplamiento)"),
                 (unstable, "Tono con AM del 3% (acoplamiento flojo)")):
    env = filters.time_weighting(x, fs, mode="fast")[skip:]
    level = 10 * np.log10(np.maximum(env, np.finfo(float).eps))
    plt.plot(t[skip:], level - level.mean(), label=label)
for lim in (0.07, -0.07):
    plt.axhline(lim, linestyle="--", color="gray")
plt.xlabel("Tiempo [s]")
plt.ylabel("Nivel F respecto a la media [dB]")
plt.legend()
plt.show()
```

</details>

### Ruido de banda ancha en la toma, y lo que cuesta

El valor eficaz de la grabación del calibrador es el denominador de $S$, así que
todo lo que haya en la toma que no sea el tono lo infla y encoge el factor, y
todos los niveles derivados de ese factor se leen entonces *de menos*, en
$-10\log_{10}(1 + 1/\mathrm{SNR})$, con SNR la relación de potencias entre el
tono y el ruido de la grabación. Pasar `narrowband=True` sustituye el valor
eficaz de banda completa por un detector coherente de Goertzel enganchado al
tono, que rechaza la parte incoherente:

*Error de sensibilidad frente a la relación señal-ruido de la toma del
calibrador, medido llamando a `sensitivity()` sobre un tono de 1 kHz más ruido de
banda ancha. El estimador del valor eficaz de banda completa cae exactamente
sobre la forma cerrada; cuesta 0,41 dB con 10 dB de SNR, 0,05 dB con 20 dB y se
gasta entero el límite de aceptación de clase 1 de 0,25 dB por debajo de 12,3 dB
de SNR. El estimador de Goertzel se queda dentro de 0,02 dB en todo el margen. El
margen de fondo de 30 dB que pide el procedimiento de acoplamiento (B.4.2) deja
por tanto al estimador del valor eficaz simple en 0,004 dB, que es por lo que
`narrowband=False` es un valor por defecto sensato y `narrowband=True` es el
remedio para una toma que no se pudo hacer lo bastante silenciosa.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python

# metrology viene del primer fragmento de esta página.
fs = 48000
t = np.arange(int(fs * 6.0)) / fs
tone = np.sqrt(2) * np.sin(2 * np.pi * 1000 * t)     # 1 Pa RMS sobre 1,0 digital
s_true = 2e-5 * 10 ** (94 / 20)
noise = np.random.default_rng(7).standard_normal(t.size)
noise /= np.sqrt(np.mean(noise ** 2))

snr_db = np.arange(0.0, 40.5, 1.0)
rms, goertzel = [], []
for snr in snr_db:
    x = tone + noise * 10 ** (-snr / 20)
    # validate=False: las tomas ruidosas suspenden a propósito la comprobación
    # de estabilidad, que es una segunda razón independiente para no aceptarlas.
    rms.append(
        20 * np.log10(metrology.sensitivity(x, fs=fs, validate=False) / s_true))
    goertzel.append(20 * np.log10(
        metrology.sensitivity(x, fs=fs, narrowband=True, validate=False) / s_true))

plt.figure(figsize=(9, 5))
plt.axhspan(-0.25, 0.25, alpha=0.15)
plt.plot(snr_db, rms, label="narrowband=False")
plt.plot(snr_db, -10 * np.log10(1 + 10 ** (-snr_db / 10)), "k:",
         label="forma cerrada")
plt.plot(snr_db, goertzel, label="narrowband=True")
plt.xlabel("Relación señal-ruido en el acoplador [dB]")
plt.ylabel("Error de sensibilidad [dB]")
plt.legend()
plt.show()
```

</details>

### Parámetros de `sensitivity()`

| Parámetro | Tipo / forma | Unidades | Rango / defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `ref_signal` | array 1D/2D | unidades digitales | no vacío, no silencio | Grabación solo del tono de calibración (recorta el ruido de manipulación) |
| `target_spl` | float | dB re 20 µPa | defecto `94.0` | Nivel nominal del calibrador (calibradores de 114 dB: pasa `114.0`) |
| `ref_pressure` | float | Pa | defecto `2e-5` | Presión de referencia $p_0$; rara vez se cambia |
| `fs` | int, opcional | Hz | > 0; defecto `None` | Necesario para la validación de estabilidad; omítelo para saltarla |
| `validate` | bool | — | defecto `True` | Emite `CalibrationWarning` con grabaciones inestables/cortas |
| `max_fluctuation_db` | float, opcional | dB | defecto `None` → Tabla 2 clase 1 | Sobrescritura explícita del límite de estabilidad |
| `frequency` | float | Hz | defecto `1000.0` | Frecuencia nominal del calibrador; elige la fila de la Tabla 2 de IEC 60942 |
| `narrowband` | bool | — | defecto `False` | Estima el tono con un detector coherente (Goertzel) cerca de `frequency` (requiere `fs`) en lugar del RMS de banda completa; rechaza el zumbido/ruido de banda ancha que si no infla el RMS y reduce todos los niveles posteriores (−0,41 dB a 10 dB de SNR, −0,04 dB a 20 dB; ver la figura de arriba). Actívalo para grabaciones de acoplador ruidosas |

Devuelve el factor de sensibilidad (float) para pasarlo como
`calibration_factor=` a `leq`, `laeq`, `ln_levels`, `lc_peak`, `sel` y las
funciones de dosis, y como `calibration=LevelCalibration(factor=...)` a
`octave_filter`.

### Lo que el factor dice además: el margen medible

$S$ no es solo una conversión, es la escala de la cadena, y de ella salen
directamente los dos extremos del margen medible.

**El techo.** Una señal cuyo valor eficaz digital llega a 1,0 corresponde a
$20\log_{10}(S/p_0)$ dB, que es también el nivel del calibrador menos el nivel en
dBFS de la toma del calibrador. Una *sinusoide* a fondo de escala tiene un valor
eficaz de $1/\sqrt{2}$, así que se lee 3,01 dB por debajo:
$L_\text{FS} = 20\log_{10}\!\big(S/(\sqrt{2}\,p_0)\big)$. Ese es el nivel
sinusoidal más alto que el convertidor puede llevar sin recortar; contrástalo con
el nivel de presión acústica de sobrecarga del propio micrófono, que es una
propiedad de la cápsula y del preamplificador y no del convertidor (ver
[Micrófonos](/phonometry/es/devices/electroacoustics/microphones/)), y mantén el
menor de los dos al menos 10 dB por encima del suceso más fuerte que esperes. Un
suceso recortado no se anuncia: se lee *de menos*, y de forma verosímil.

**El suelo.** Graba 30 s con la cápsula en un recinto silencioso (la cavidad
cerrada del calibrador con la excitación apagada sirve muy bien, y es la misma
toma que ya pide el paso de acoplamiento) y pásala por el mismo factor. Ese nivel
es el ruido propio de la cadena: micrófono más preamplificador más convertidor.
Un nivel medido que quede a menos de 3 dB de él no es una medida de la fuente; uno
a menos de 10 dB necesita la corrección por ruido de fondo que aplican las guías
de emisión y de ruido ambiental.

```python
# Sigue del primer fragmento: calibration_factor y fs ya están definidos.
ceiling = 20 * np.log10(calibration_factor / (np.sqrt(2) * 2e-5))
quiet = 1e-4 * np.random.default_rng(0).standard_normal(30 * fs)  # tu toma de 30 s
floor = 20 * np.log10(np.sqrt(np.mean((quiet * calibration_factor) ** 2)) / 2e-5)
print(f"sinusoide a fondo de escala {ceiling:.1f} dB SPL, suelo de ruido {floor:.1f} dB SPL")
```

### Sin calibrador: a partir de la sensibilidad nominal

Un calibrador es la única vía hacia un nivel *normativo*, pero no es la única vía
hacia un número. Si la hoja de características del micrófono declara una
sensibilidad y la de la interfaz una tensión de entrada de fondo de escala, la
ganancia de la cadena es el producto de tres números que se pueden leer, y $S$ se
puede montar aritméticamente:

$$
S = \frac{V_\text{FS}}{M\,G}
$$

donde $M$ es la **sensibilidad de campo libre en voltios por pascal** nominal de
la cápsula a la frecuencia de referencia, $G$ la ganancia lineal de tensión del
preamplificador más la interfaz, y $V_\text{FS}$ la *amplitud* de tensión de
entrada que lleva al convertidor a $\pm 1{,}0$. Ojo con la trampa de esta última:
la hoja de características de una interfaz suele declarar su nivel máximo de
entrada como el valor eficaz de la sinusoide que justo alcanza el fondo de
escala, así que $V_\text{FS} = \sqrt{2}$ veces esa cifra.

Desarrollado para una cápsula de media pulgada de 12,5 mV/Pa, +20 dB de ganancia
y una entrada cuyo nivel máximo es 1,0 V eficaces: $M = 0{,}0125$ V/Pa, $G = 10$,
$V_\text{FS} = 1{,}414$ V, así que $S = 11{,}31$ Pa por unidad digital. Un pascal
(94 dB) cae entonces en $MG/V_\text{FS} = 0{,}0884$ unidades digitales eficaces,
es decir, −21,1 dBFS, y el techo deducido arriba es
$20\log_{10}(11{,}31/(\sqrt{2}\cdot 2\times 10^{-5})) = 112{,}0$ dB SPL. Los dos
números se pueden contrastar con la cadena en unos segundos, que es de lo que va
esta vía.

Cuidado con la palabra *sensibilidad*: significa cosas recíprocas en las dos
páginas. Aquí $S$ son pascales por unidad digital; en la página de
[Micrófonos](/phonometry/es/devices/electroacoustics/microphones/), $M$ son
voltios por pascal, expuesta como `sensitivity_mv_per_pa`, y las
caracterizaciones de campo libre, de presión y de incidencia aleatoria son tres
números distintos para la misma cápsula: usa la de campo libre a la frecuencia de
referencia.

Lo que cuesta esta vía: hereda la desviación individual de la cápsula respecto de
su valor nominal (unas décimas de decibelio en un micrófono de laboratorio con
carta de calibración individual, pero una cifra *nominal* en una cápsula barata
puede equivocarse en un par de decibelios), la repetibilidad del ajuste de
ganancia y la tolerancia de fondo de escala de la propia interfaz. Cuenta en el
balance con en torno a un decibelio, frente a las pocas décimas de una
comprobación con calibrador, y ten en cuenta lo que no puede hacer en absoluto:
no puede detectar
una cápsula dañada, un preamplificador con fugas ni un cambio de ganancia, porque
nada en ella está medido. Úsala para trabajo cercano al dBFS, para dar un
repaso de cordura al resultado de un calibrador, y nunca para un nivel que se
enfrente a un límite. Y una vez leídos los números, la ganancia tiene que quedarse
exactamente donde estaba.

<span id="comprobaciones-verificacion-y-deriva"></span>

## Comprobaciones de campo, verificación de laboratorio y deriva

La calibración vive en tres escalas de tiempo:

- **En cada sesión: la comprobación de campo.** Acopla el calibrador y obtén
  la sensibilidad antes de cada serie de mediciones, y compruébala de nuevo
  al terminar. Los métodos normativos hacen obligatoria la segunda
  comprobación y usan la diferencia antes/después como criterio de validez
  (uno habitual invalida la serie cuando ambas difieren en más de 0,5 dB).
  Sea cual sea el umbral, esa diferencia es tu cota de deriva para todo lo
  capturado entre medias; llévala al balance de incertidumbre en lugar
  de suponerla cero.
- **Periódicamente: verificación de laboratorio.** Una comprobación de campo
  solo compara la cadena con el calibrador; no puede ver un error que
  calibrador y medidor compartan, y no dice nada de la respuesta lejos de
  1 kHz. IEC 61672-3 define los ensayos periódicos del sonómetro
  (ponderaciones, linealidad de nivel y balística contrastadas con los
  límites de clase) e IEC 60942 los ensayos correspondientes del propio
  calibrador; los intervalos de laboratorio típicos son de uno a dos años.
- **Entre comprobaciones: la deriva.** La sensibilidad del micrófono se
  mueve con la temperatura, la humedad y el envejecimiento de la cápsula; la
  electrónica, con la tensión de la batería. Una cadena de clase 1 sana
  deriva unas centésimas de dB en una sesión, y por eso una diferencia
  antes/después de medio decibelio señala un daño y no el clima. La mayor
  «deriva» de todas es un mando de ganancia tocado: el factor $S$ solo vale
  mientras la cadena permanece exactamente como se calibró.

### Qué tiene que registrar una calibración para poder declararse

La pareja antes/después y la tolerancia de clase del calibrador son las dos
entradas de Tipo B que consume el
[balance de incertidumbre](/phonometry/es/signals/metrology/gum-uncertainty/) de un
nivel. Una comprobación que no se escribió no se puede propagar, así que anota,
en el momento de la comprobación:

- marca, modelo, número de serie, designación de clase (incluida la letra M si la
  lleva) y fecha de la última verificación de laboratorio del calibrador;
- modelo y número de serie del micrófono y del preamplificador, y la
  configuración de micrófono usada (con o sin rejilla protectora);
- el adaptador montado, si lo hubo;
- la sensibilidad obtenida antes de la serie, la obtenida al terminarla y su
  diferencia, que es la cota de deriva;
- frecuencia de muestreo, profundidad de bits y el ajuste de ganancia, tal cual
  quedó bloqueado;
- temperatura del aire, presión estática y humedad relativa, más cualquier
  corrección de presión estática aplicada a `target_spl` y de dónde salió;
- el nivel de fondo que leyó la cápsula acoplada con el calibrador apagado;
- el factor $S$ resultante y la tolerancia que se le supone.

Una sutileza más sobre clases: las tolerancias se encadenan. Una medición de
clase 1 exige un calibrador de clase 1 (o LS) *y* un sonómetro de clase 1;
calibrar una cadena de clase 1 con un calibrador de clase 2 degrada en
silencio todos los niveles derivados a exactitud de clase 2, porque la
tolerancia de nivel más ancha del calibrador entra directamente en $S$.

## Análisis digital (dBFS)

Si trabajas con archivos de audio digital (WAV, FLAC…) y quieres analizar
niveles relativos al fondo de escala en lugar de presión física, usa el
parámetro `dbfs=True`.

En este modo:

* **0 dBFS** corresponde a un nivel numérico de señal de 1,0 (RMS o pico).
* El factor de calibración no se aplica (dBFS es relativo al fondo de escala digital).
* Útil para analizar el margen hasta fondo de escala, el mastering digital o
  las señales normalizadas.

```python

from phonometry import filters

fs = 48000
# recording: la captura de micrófono que quieres calibrar, misma cadena de entrada (Pa tras calibrar).
#   Sintetizada aquí; en una medición real es tu señal grabada.
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)

# Suponiendo que 'recording' está normalizada entre -1.0 y 1.0
spl_dbfs, freq = filters.octave_filter(
    recording, fs, calibration=filters.LevelCalibration(dbfs=True))
# Los resultados serán negativos (p. ej. -20 dBFS)
```

### El convenio difiere del de AES17 en 3,01 dB

Este es el convenio **referido al valor eficaz**: una señal cuyo valor eficaz es
1,0 se lee como 0 dBFS, así que una sinusoide a fondo de escala, cuyo valor
eficaz es 0,707, se lee como −3,01 dBFS en `mode='rms'`. AES17, y los medidores,
DAW y herramientas de sonoridad que lo siguen, normalizan en cambio a 0 dBFS la
*sinusoide* de fondo de escala, así que el mismo archivo medido por dos
herramientas difiere en exactamente 3,01 dB sin que ninguna de las dos se
equivoque. Fíjate en que `mode='peak'` con `dbfs=True` lee 0 dBFS para esa misma
sinusoide, porque su pico *es* 1,0: la elección entre valor eficaz y pico de más
abajo y la cuestión del convenio son la misma pregunta hecha dos veces. Cualquier
número en dBFS que se cite fuera de la biblioteca debería llevar su convenio
consigo.

### Qué sobrevive a la pérdida de una referencia física

La mitad de lo que calcula esta biblioteca es indiferente al marco en que esté, y
la otra mitad carece de sentido en silencio sin $S$. La línea divisoria es si la
magnitud está construida a partir de una *razón* o de una *forma* (invariante) o
a partir de un valor absoluto (no).

**Invariantes al marco** (el mismo número en dBFS que en dB SPL): tiempos de
reverberación y pendientes de caída, funciones de transferencia y coherencia,
correlación y retardo, pendientes y formas espectrales, diferencias entre bandas,
y cualquier diferencia A menos C o C menos Z. Estas son las magnitudes que
legítimamente se pueden sacar de una grabación sin calibrar, y aquí vive casi
todo `signals/spectra`.

**Dependientes del marco** (verosímiles, equivocadas y silenciosas sin
calibración): el $L_\mathrm{Aeq}$ frente a un límite, el SEL, la dosis y la exposición al
ruido, los niveles percentiles $L_N$, toda magnitud psicoacústica anclada a
20 µPa (la sonoridad en sonios, la agudeza, la cadena de ECMA-418-2), los
criterios de pico de la normativa de conservación de la audición, y todos los
veredictos de conformidad de la biblioteca. Ninguna de esas funciones rechaza
muestras sin calibrar (no pueden saberlo), así que el marco es una decisión que el
analista tiene que anotar junto al resultado.

*Izquierda: un registro, dos marcos. El espectro en dBFS es el espectro en dB SPL
desplazado una constante, aquí 106,04 dB, que es exactamente el nivel del
calibrador menos el nivel en dBFS de la toma del calibrador; el marco dBFS cambia
el origen y nada más, que es por lo que todas las magnitudes basadas en formas de
arriba lo sobreviven. Derecha: el ataque de una ráfaga tonal de 1 kHz después del
filtro de octava, con amplitud de excitación 0,5. La señal de banda sobrepasa
hasta 0,582 antes de asentarse, así que `mode='peak'` lee 1,32 dB por encima del
tono estacionario.*

## RMS frente a niveles de pico

Los niveles se pueden leer de dos maneras, y las dos se usan en los analizadores
comerciales:

- **RMS (`mode='rms'`)** integra energía sobre la trama, que es sobre lo que
  está definido todo nivel normalizado ($L_\mathrm{eq}$, $L_\mathrm{Aeq}$, $L_N$).
- **Pico (`mode='peak'`)** retiene el mayor valor instantáneo de la trama, que es
  contra lo que se comprueban los criterios de impacto y de límite de pico como
  $L_\mathrm{Cpeak}$. Ojo: el pico de banda que se devuelve aquí está limitado en banda
  y sin ponderar, así que no es en sí mismo $L_\mathrm{Cpeak}$.

```python

from phonometry import filters

fs = 48000
# recording: la captura de micrófono que quieres calibrar, misma cadena de entrada (Pa tras calibrar).
#   Sintetizada aquí; en una medición real es tu señal grabada.
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)

# Medir niveles de pico para análisis de impactos
spl_peak, freq = filters.octave_filter(recording, fs, mode='peak')
```

:::note
`mode='peak'` mide el máximo absoluto de la señal de banda **filtrada**, que
incluye el transitorio de arranque del filtro (sobreimpulso). Las señales que
empiezan de forma abrupta pueden leer alrededor de 1 dB de más: 1,32 dB para la
ráfaga tonal dibujada en el panel derecho de arriba. Es inherente a los filtros
de banda IIR (un sonómetro analógico se comporta igual), no un artefacto del
procesado.
:::

## Entrada de audio entero

Las señales enteras (p. ej. int16 de `scipy.io.wavfile.read`) se convierten
internamente a float64 antes de cualquier elevación al cuadrado. La conversión
es un cambio de dtype, no un reescalado: una muestra int16 de +32767 entra como
32767.0, no como 1.0. Eso es inofensivo *mientras la grabación del calibrador y
la medición estén en el mismo formato*, porque entonces `sensitivity` devuelve
un factor 32768 veces menor y los dos se cancelan exactamente: un tono que marca
87,958 dB desde arrays float marca 87,958 dB desde los arrays int16 de las
mismas grabaciones. No es inofensivo en el caso contrario: el mismo tono leído
sin calibrar da 87,94 dB como float y 172,14 dB como int16, una desviación de
$20\log_{10}(32768) = 90{,}3$ dB, y aplicar una sensibilidad derivada de float a
una medición leída como entero (o al revés) arrastra esa desviación al resultado
sin ningún síntoma. O se mantienen las dos grabaciones en un solo formato, o se
dividen las dos por el valor de fondo de escala (`x / 32768.0` para int16) antes
de nada.

## Qué cubre esta guía

La IEC 60942:2017 en lo que condiciona el *factor de sensibilidad*: el nivel
principal del calibrador que supone `target_spl`, las tolerancias de clase de
la Tabla 2 y la Tabla A.1 citadas arriba en la discusión de incertidumbre y la
comprobación de fluctuación de nivel a corto plazo del apartado 5.3.3 frente a
los límites de clase 1 de la Tabla 2, que `sensitivity(ref, fs=fs)` ejecuta
sobre la grabación de referencia.

Los ensayos de conformidad del propio calibrador (nivel generado, frecuencia,
distorsión y las correcciones ambientales por presión estática y temperatura)
no están implementados, así que pasa un `target_spl` ya corregido cuando el
manual del calibrador lo pida. Los ensayos periódicos de la IEC 61672-3 se
citan como práctica de laboratorio, no se ejecutan: aquí nada verifica un
sonómetro ni le asigna una clase. La parte de dBFS de esta página queda fuera
de cualquier norma y no hace ninguna afirmación física.

## Véase también

- [Construye un sonómetro](/phonometry/es/signals/sound-level-meter/): el recorrido que empieza en este paso de calibración y termina en un instrumento verificado por clase.
- [Niveles](/phonometry/es/signals/levels/levels/): todas las métricas que consumen el `calibration_factor` derivado aquí.
- [Multicanal y rendimiento](/phonometry/es/signals/filters/multichannel/): una sensibilidad por canal cuando los canales difieren.
- [Incertidumbre de medida (GUM y Monte Carlo)](/phonometry/es/signals/metrology/gum-uncertainty/): propagar la tolerancia del calibrador y la cota de deriva a la incertidumbre de un nivel.
- Referencia de la API: [`metrology.calibration`](/phonometry/es/reference/api/metrology/calibration/) y [`phonometry`](/phonometry/es/reference/api/filters/phonometry/).

## Respuestas rápidas

### ¿Qué nivel de calibrador debo usar para calibrar mi cadena de medición?

La elección habitual es 94 dB SPL a 1 kHz (1 Pa RMS), que es lo que `sensitivity()` supone con su `target_spl=94.0` por defecto; para un calibrador de 114 dB pasa `114.0`. IEC 60942 exige que el nivel principal sea al menos 90 dB re 20 µPa. Graba unos segundos de tono estable, porque la norma especifica el nivel generado como promedio de 20 s.

### ¿Cuánta deriva entre las comprobaciones de calibración previa y posterior es aceptable?

Obtén la sensibilidad antes de cada serie de mediciones y compruébala de nuevo
al terminar: un criterio habitual invalida la serie cuando ambas difieren en
más de 0,5 dB. Una cadena de clase 1 sana deriva unas centésimas de dB en una
sesión, así que una diferencia antes/después de medio decibelio señala un daño
y no el clima. Sea cual sea el umbral, lleva la diferencia al balance de
incertidumbre en lugar de suponerla cero.

### ¿Puedo calibrar una cadena de clase 1 con un calibrador de clase 2?

Puedes, pero las tolerancias se encadenan: una medición de clase 1 exige un calibrador de clase 1 (o LS) según IEC 60942 y un sonómetro de clase 1, así que un calibrador de clase 2 degrada en silencio todos los niveles derivados a exactitud de clase 2, porque su tolerancia de nivel más ancha entra directamente en el factor de sensibilidad $S$. Como referencia, el límite de tolerancia de clase 1 es de ±0,4 dB entre 160 Hz y 1,25 kHz: los 0,25 dB de límite de aceptación de la Tabla 2 de IEC 60942:2017 más los 0,15 dB de incertidumbre máxima permitida de medida de la Tabla A.1, combinados como describe el Anexo D.
