<!-- canonical: https://docs.jmrp.io/phonometry/es/signals/levels/weighting/ -->
Source: https://docs.jmrp.io/phonometry/es/signals/levels/weighting/

Las curvas de ponderación frecuencial simulan la sensibilidad del oído humano.
Esta guía cubre **A**, **C** y **Z**, las curvas especificadas en
**IEC 61672-1:2013**: de dónde vienen, cómo aplicarlas, el diseño
`high_accuracy` y la verificación de clase frente a la Tabla 3. El resto de
la familia, la curva G de infrasonido, las históricas B y D y la curva AU, es
[Ponderaciones especiales](/phonometry/es/signals/levels/special-weightings/).

*Las tres curvas de IEC 61672-1, medidas con los filtros de la propia
biblioteca a 48 kHz: A, que descarta los graves; C, que los conserva; y Z,
que no pondera nada. El recuadro amplía la pequeña región positiva de A en
torno a 2,5 kHz. Las curvas especiales B, D y AU tienen su propia gráfica en
[Ponderaciones especiales](/phonometry/es/signals/levels/special-weightings/), junto
con la curva G de infrasonido.*

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

```python

from phonometry import filters

# Medimos la respuesta de cada curva: ponderamos un impulso unitario
# centrado y tomamos su espectro (búfer de 1 s -> resolución de 1 Hz).
fs = 48000
impulse = np.zeros(fs)
impulse[fs // 2] = 1.0
freqs = np.fft.rfftfreq(fs, 1 / fs)

fig, ax = plt.subplots(figsize=(9, 5))
for curve in ("A", "C", "Z"):
    spectrum = np.fft.rfft(filters.weighting_filter(impulse, fs, curve=curve))
    ax.semilogx(freqs[1:], 20 * np.log10(np.abs(spectrum[1:]) + np.finfo(float).eps),
                label=curve)
ax.set(xlim=(10, 22000), ylim=(-72, 15),
       xlabel="Frecuencia [Hz]", ylabel="Respuesta [dB]")
ax.grid(True, which="both", alpha=0.3)
ax.legend()
plt.show()
```

</details>

* **Ponderación A (`A`):** estándar para ruido ambiental (IEC 61672-1).
* **Ponderación C (`C`):** para presión acústica de pico y ruido de alto nivel.
* **Ponderación Z (`Z`):** plana por especificación, no por omisión.
  IEC 61672-1 define Z como una respuesta nominalmente plana de 10 Hz a
  20 kHz con las mismas tolerancias de la Tabla 3 que A y C, y por eso
  `verify_weighting_class` puede llegar a calificarla. La biblioteca la
  implementa como un paso directo, así que el ancho de banda *efectivo* de un
  nivel ponderado Z es el que entregue tu cadena de captura: elimina la
  componente continua (`detrend`) y filtra tú el ruido de viento con un paso
  alto si la grabación baja de 10 Hz.

El argumento `curve` acepta además las cuatro ponderaciones especiales, con
gráfica y documentación en
[Ponderaciones especiales](/phonometry/es/signals/levels/special-weightings/): `'G'`
para infrasonido (ISO 7196), las históricas `'B'` (ANSI S1.4-1983) y `'D'`
(IEC 537), y `'AU'` para sonido audible en presencia de ultrasonidos
(IEC 61012).

La respuesta en una línea es
`filters.weighting_filter(recording, fs, curve='A')`. El apartado 2 lo enseña
sobre una señal ejecutable, el 5 explica por qué el diseño por defecto
se ajusta a la frecuencia de muestreo en lugar de transformar el prototipo
impreso, y el 6 demuestra que el resultado cumple la clase 1.

## 1. De dónde vienen las curvas

Las curvas A y C son líneas isofónicas invertidas, congeladas en filtros:
**A** aproxima la inversa de la histórica línea isofónica de 40 fonios (niveles
bajos, donde el oído descarta los graves con más agresividad) y **C** la más
plana de ~100 fonios (niveles altos). IEC 61672-1:2013 (Anexo E) define ambas
analíticamente a partir de cuatro frecuencias de esquina:

$$
f_1 = 20{,}599\ \text{Hz}, \quad f_2 = 107{,}653\ \text{Hz}, \quad
f_3 = 737{,}862\ \text{Hz}, \quad f_4 = 12194{,}217\ \text{Hz}
$$

C es un paso banda con polos dobles en $f_1$ y $f_4$ (2 ceros en el origen);
A añade los polos $f_2$ y $f_3$ (4 ceros), y por eso sigue cayendo en los
medios-graves. Ambas se normalizan a exactamente 0 dB a 1 kHz. Z no aplica
ningún conformado dentro de la banda especificada; su objetivo de diseño es
0 dB en todo el rango de 10 Hz a 20 kHz. La derivación completa de polos y
ceros está en la
página de [Teoría](/phonometry/es/reference/theory/signal-analysis/).

### Una breve historia: A, B, C y Z

La cadena va de las mediciones de igual sonoridad de Fletcher y Munson en
1933 a la primera norma estadounidense de sonómetros (1936), que dio a los
instrumentos respuestas conmutables para que la lectura aproximara la
sonoridad a distintos niveles: **A** de la línea isofónica de 40 fonios para sonidos
débiles, **B** de la de ~70 fonios para los moderados y una respuesta plana
para los fuertes (la curva **C** propiamente dicha, reflejo de la línea isofónica
más plana de ~100 fonios, llegó con la revisión de 1944). Conmutar curvas
según el nivel murió en la práctica (las
lecturas saltaban en los puntos de cambio y las mediciones de campo dejaban
de ser comparables), pero A sobrevivió sola: décadas de datos de daño
auditivo y de molestia comunitaria se habían recogido con ella, y
correlaciona con ambos casi tan bien como métricas mucho más elaboradas.
IEC 61672-1 (primera edición, 2002) remató la limpieza: B se eliminó, A y C
se conservaron con tolerancias más estrictas y **Z** se introdujo para
sustituir el «lineal» mal especificado de los sonómetros antiguos, que
variaba según el fabricante. La curva B (y la curva D de ruido de aeronaves,
que corrió la misma suerte) sigue disponible para datos históricos; véase
[Ponderaciones especiales](/phonometry/es/signals/levels/special-weightings/).

### Cuándo importa C − A

Como A descarta los graves y C los conserva, la diferencia
$L_\mathrm{Ceq} - L_\mathrm{Aeq}$ es un indicador de un solo número del contenido en
baja frecuencia:

- **Por debajo de unos 10 dB**: espectro de banda ancha ordinario; el nivel
  ponderado A lo valora con justicia.
- **En torno a 15 a 20 dB o más**: la energía se concentra en las bajas
  frecuencias (retumbo de climatización, compresores, graves de música a
  través de una pared). El nivel ponderado A entonces subestima el problema;
  mira el espectro de octavas y, por debajo de 20 Hz, pasa a la curva G.
- **La selección de protectores auditivos**: el método HML de ISO 4869-2 se
  apoya exactamente en esta diferencia C menos A para decidir cuánta
  atenuación en baja frecuencia debe aportar el protector (el método SNR,
  más simple, la esquiva trabajando directamente con el nivel ponderado C).

```python

from phonometry import filters, signals

# Un retumbo de 50 Hz bajo un siseo ligero: débil en A, fuerte en C.
fs = 48000
t = np.arange(10 * fs) / fs
rng = np.random.default_rng(1)
x = 0.2 * np.sin(2 * np.pi * 50 * t) + 0.01 * rng.standard_normal(t.size)

la = signals.leq(filters.weighting_filter(x, fs, curve="A"))
lc = signals.leq(filters.weighting_filter(x, fs, curve="C"))
print(f"LAeq = {la:.1f} dB   LCeq = {lc:.1f} dB   C - A = {lc - la:.1f} dB")
# LAeq = 52.4 dB   LCeq = 75.7 dB   C - A = 23.2 dB
# C - A por encima de 20 dB: el número ponderado A ocultaría el retumbo.
```

*Los mismos tres niveles de banda para dos señales. Una fuente concentrada en
baja frecuencia (izquierda) pone casi toda su energía justo donde A recorta con
más fuerza, así que C − A llega a 23 dB y el nivel ponderado A por sí solo no
dice nada de ella. El ruido rosa de banda ancha (derecha) da C − A = 1,8 dB, que
es el régimen que describe la primera viñeta.*

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

```python

fig, ax = plt.subplots(figsize=(9, 4.5))
for curve, style in (("Z", "-"), ("C", "--"), ("A", ":")):
    filtered = filters.octave_filter(
        filters.weighting_filter(x, fs, curve=curve), fs, fraction=3)
    band_levels, centres = filtered.levels, filtered.frequencies
    ax.semilogx(centres, band_levels, style, label=f"Bandas ponderadas {curve}")
ax.set(xlabel="Frecuencia central de banda [Hz]", ylabel="Nivel de banda [dB]")
ax.legend()
plt.show()
```

</details>

### Lo que la ponderación A no puede hacer

A es un filtro fijo deducido de datos de igual sonoridad con tonos puros a un
único nivel de sonoridad, y se aplica a espectros complejos a cualquier nivel.
De ahí salen tres supuestos, y cada uno se rompe de una forma que merece
nombrarse. No dice nada de cómo se *combinan* las bandas, porque las líneas
isofónicas se midieron con tonos aislados; está congelada en la línea de 40
fonios, así que el sonido grave de nivel alto queda sistemáticamente
infravalorado a medida que las líneas reales se aplanan con el nivel; y no tiene
ninguna estructura temporal, así que un impulso y un sonido estacionario de la
misma energía reciben idéntico trato.

Cada uno de esos tres tiene su instrumento propio. Para la sonoridad percibida,
usa los modelos de ISO 532 de
[Sonoridad](/phonometry/es/perception/psychoacoustics/loudness/) en vez de otra
curva de ponderación. Para el contenido por debajo de 20 Hz, usa la curva G de
ISO 7196 ([Ponderaciones
especiales](/phonometry/es/signals/levels/special-weightings/)). Para el
carácter tonal o impulsivo, usa las correcciones de ISO 1996-1 ([Niveles
ambientales](/phonometry/es/environment/assessment/environmental-levels/)). Nada
de esto hace que usar A esté mal: los niveles ponderados A son la magnitud en la
que están escritos los límites, así que un informe da el nivel ponderado A y
añade las demás métricas como prueba de apoyo, nunca como sustituto.

## 2. Uso básico

```python

from phonometry import filters

# recording: una captura de micrófono calibrada (Pa) — grabada con tu cadena de medición. Sintetizada aquí para que la guía funcione por sí sola.
fs = 48000
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)

# Aplicar ponderación A a la señal en bruto
weighted_signal = filters.weighting_filter(recording, fs, curve='A')

# Aplicar ponderación C para análisis de picos
c_weighted_signal = filters.weighting_filter(recording, fs, curve='C')
```

Las ponderaciones especiales usan el mismo argumento `curve`; cada una está
documentada, con su propia gráfica de respuesta, en
[Ponderaciones especiales](/phonometry/es/signals/levels/special-weightings/).

### Ponderar un espectro, no una forma de onda

La tarea de escritorio más común no es ponderar una grabación, sino ponderar A
una tabla de niveles de banda en tercios de octava, y hay dos vías que no dan la
misma respuesta. La **exacta** es la que hace un sonómetro: ponderar la forma de
onda y luego filtrar por bandas.

```python
band_source = signals.noise_signal(fs, 20.0, color="pink", rms=0.05, seed=3)
filtered = filters.octave_filter(
    filters.weighting_filter(band_source, fs, curve="A"), fs, fraction=3)
weighted_bands, centres = filtered.levels, filtered.frequencies
print(f"suma energética de las bandas ponderadas A "
      f"{10 * np.log10(np.sum(10 ** (weighted_bands / 10))):.2f} dB")
print(f"LAeq de la misma señal                     "
      f"{signals.laeq(band_source, fs):.2f} dB")
# suma energética de las bandas ponderadas A 62.84 dB
# LAeq de la misma señal                     62.79 dB
```

La vía de la **tabla** es a la que te ves obligado cuando los datos llegan ya
como niveles de banda: sumar el $A(f_\mathrm{m})$ tabulado a cada nivel de banda. Es una
aproximación, porque A sube con mucha pendiente en las bandas graves, así que su
media ponderada por energía *dentro* de una banda no es su valor en la
frecuencia central. Medido frente a la vía exacta sobre ese mismo ruido rosa:
las dos coinciden mejor que 0,1 dB de 100 Hz a 8 kHz, la vía de la tabla queda
hasta 0,7 dB baja en las bandas más graves (donde A sube unos 12 dB por octava)
y hasta 1 dB alta en la banda más aguda a 48 kHz (donde A cae con fuerza y la
banda queda recortada por Nyquist), mientras que los *totales* coinciden en unas
centésimas. Así que el error no es unilateral: sigue el signo de la curvatura de
la ponderación a lo largo de la banda.

Deja constancia de qué vía produjo un espectro ponderado. Los totales
coincidirán; los niveles de banda, no, y una comparación banda a banda entre el
espectro ponderado A de un sonómetro y otro corregido por tabla mostrará décimas
de decibelio que son método, no medida. El mismo argumento vale sin cambios para
C y para G.

## 3. Parámetros de `weighting_filter()` / `WeightingFilter`

| Parámetro | Tipo | Unidades | Rango / por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `x` | array 1D o 2D, o `Signal` | cualquiera | no vacío | 2D es `[channels, samples]` |
| `fs` | int | Hz | > 0; tomada de `x` cuando `x` es un `Signal` | |
| `curve` | str | — | `'A'` (por defecto), `'B'`, `'C'`, `'D'`, `'G'`, `'AU'`, `'Z'`, `'468'` | `'G'` según ISO 7196 (infrasonido), `'B'`/`'D'` históricas y `'AU'` según IEC 61012 se tratan en [Ponderaciones especiales](/phonometry/es/signals/levels/special-weightings/); `'Z'` se implementa como un paso directo de una respuesta que la norma especifica plana; `'468'` es la curva de nivel de programa de ITU-R BS.468-4, y su falda es tan pronunciada que exige el diseño ajustado y rechaza `high_accuracy=False` |
| `high_accuracy` | bool | — | por defecto `True` | Ajusta el prototipo analógico a $f_\mathrm{s}$ en vez de transformarlo a ciegas; mantiene A/C en clase 1 a cualquier frecuencia de muestreo. Detalles en el §5 |
| `stateful` | bool (solo clase) | — | por defecto `False` | Conserva el estado del filtro entre bloques (streaming) |
| `steady_ic` | bool (solo clase) | — | por defecto `False` | Condiciones iniciales estacionarias (sin transitorio de arranque) |

## 4. Objeto de filtro reutilizable

Si ponderas muchas señales con los mismos parámetros, diseña el filtro una sola vez:

```python

from phonometry import filters

# recording: una captura de micrófono calibrada (Pa) — grabada con tu cadena de medición. Sintetizada aquí para que la guía funcione por sí sola.
fs = 48000
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)

wf = filters.WeightingFilter(fs, "A")
batch = [recording]                  # tu lote de grabaciones
for recording in batch:
    weighted = wf.filter(recording)
```

## 5. Precisión en alta frecuencia (`high_accuracy`)

Las curvas de la sección 1 son analógicas: polos y ceros en el plano $s$.
Convertirlas en filtro digital con la transformación bilineal es exacto en
magnitud y erróneo en frecuencia: sitúa la respuesta del prototipo en
$2 f_\mathrm{s} \tan(\pi f / f_\mathrm{s})$ en vez de en $2 \pi f$, y el error
crece de forma cuadrática hacia Nyquist. A $f_\mathrm{s} = 48$ kHz ese diseño
simple queda 15,7 dB por debajo del objetivo de diseño de la A en la fila de
19 952,6 Hz, y a $f_\mathrm{s} = 32$ kHz queda 61,4 dB por debajo en 15 848,9 Hz.

Por defecto (`high_accuracy=True`) phonometry no transforma el prototipo a
ciegas: **ajusta** un prototipo analógico de la misma estructura cuya
respuesta *en las frecuencias deformadas* es la del prototipo impreso en las
verdaderas, y transforma ese. Lo que se ejecuta es una única cascada de
secciones de segundo orden a la frecuencia de entrada, sin nada alrededor.
Medido frente al prototipo impreso sobre la banda propia de cada norma:

| Curva | 32 kHz | 44,1 kHz | 48 kHz | 96 kHz |
| :--- | ---: | ---: | ---: | ---: |
| A | 0,008 dB | 0,003 dB | 0,0003 dB | 0,00001 dB |
| C | 0,002 dB | 0,002 dB | 0,0004 dB | 0,00001 dB |
| AU | 0,003 dB | 0,005 dB | 0,004 dB | 0,001 dB |
| 468 | 0,041 dB | 0,052 dB | 0,060 dB | 0,00002 dB |

Por eso A y C verifican **clase 1 a cualquier frecuencia de muestreo desde
8 kHz**, y en todas las filas de la Tabla 3 su desviación se mantiene dentro
de los 0,05 dB a los que está redondeada la propia tabla. Antes la cadena
llegaba a sus secciones a través de una etapa de interpolación y otra de
diezmado, y el filtro antialias de esas etapas tenía su banda de transición
sobre la frecuencia de Nyquist de entrada: a $f_\mathrm{s} = 32$ kHz eso dejaba
la fila de 15 848,9 Hz 16,2 dB por debajo del objetivo de diseño de la A, por
encima del límite de clase 1 de −16,0 dB, de modo que ahí la A solo verificaba
clase 2.

La banda que controla el ajuste es el rango normalizado propio de cada curva,
recortado por arriba al 99,5 % de la frecuencia de Nyquist: suficiente para
contener toda frecuencia en la que estas normas fijan un requisito, siendo la
aproximación más estrecha la fila de 15 848,9 Hz de la Tabla 3, al 0,9906 de
Nyquist cuando $f_\mathrm{s} = 32$ kHz. Por encima de ese último medio por
ciento la respuesta no se afirma: ningún filtro digital puede seguir una curva
analógica más allá de Nyquist, y la magnitud de un filtro de coeficientes
reales tiene pendiente nula allí. De ahí sale la fila 468 de la tabla anterior;
su falda sigue cayendo a unos $-30$ dB/octava donde termina la banda, y es el
3 % de la tolerancia de $\pm 2$ dB de esa curva, no una carencia de exactitud.

*El diseño bilineal simple (rojo) cruza la tolerancia de clase 1 cerca de
12,5 kHz; el diseño ajustado (azul) se apoya sobre la curva analítica.*

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

```python

from phonometry import filters

# Respuesta medida de ambos diseños a fs = 48 kHz: ponderamos un impulso
# unitario centrado y tomamos su espectro...
fs = 48000
impulse = np.zeros(fs)
impulse[fs // 2] = 1.0
freqs = np.fft.rfftfreq(fs, 1 / fs)[1:]

# ...frente a la curva A analítica de IEC 61672-1 construida con las
# cuatro frecuencias de esquina de la sección 1, normalizada a 0 dB a 1 kHz.
f1, f2, f3, f4 = 20.599, 107.653, 737.862, 12194.217
gain = (f4**2 * freqs**4) / ((freqs**2 + f1**2)
        * np.sqrt((freqs**2 + f2**2) * (freqs**2 + f3**2))
        * (freqs**2 + f4**2))
analytic = 20 * np.log10(gain / gain[np.argmin(np.abs(freqs - 1000))])

fig, ax = plt.subplots(figsize=(9, 5))
ax.semilogx(freqs, analytic, "k--", label="Analítica (IEC 61672-1)")
for high_accuracy, label in ((False, "Bilineal simple"),
                             (True, "Sobremuestreado (por defecto)")):
    weighted = filters.weighting_filter(impulse, fs, curve="A",
                                high_accuracy=high_accuracy)
    response = 20 * np.log10(np.abs(np.fft.rfft(weighted))
                             + np.finfo(float).eps)[1:]
    ax.semilogx(freqs, response, label=label)
ax.set(xlim=(1000, 20000), ylim=(-12, 3),
       xlabel="Frecuencia [Hz]", ylabel="Respuesta de la ponderación A [dB]")
ax.grid(True, which="both", alpha=0.3)
ax.legend()
plt.show()
```

</details>

- `high_accuracy=False` da el diseño bilineal simple: la forma cerrada que un
  lector puede comprobar término a término frente a la norma, al coste
  anterior. Verifica clase 1 para $f_\mathrm{s} \ge 44\,100$ Hz, degrada a
  clase 2 a 32 000 y 22 050 Hz y no cumple ninguna clase a 16 000 Hz.
- La curva `'468'` rechaza `high_accuracy=False`: su falda deja el diseño
  simple 23 dB fuera a 16 kHz, e ITU-R BS.468-4 imprime una única máscara de
  tolerancia y ningún grado inferior al que recurrir.
- El **procesado por bloques (stateful)** no cuesta nada. Ambos diseños son
  secciones de segundo orden a la frecuencia de entrada, así que `stateful` y
  `high_accuracy` son independientes, stateful usa por defecto el diseño
  ajustado como todo lo demás, y los bloques concatenados reproducen
  exactamente una llamada única.
- El ajuste cuesta unos 200 ms y se cachea por curva y frecuencia de
  muestreo, así que se paga una sola vez. Incluso contándolo, ponderar un
  minuto de audio a 44,1 kHz es más rápido que antes: unos 215 ms frente a
  377 ms para la A y 220 ms frente a 775 ms para la 468. Con el diseño ya
  cacheado, el filtrado solo son unos 18 ms, y retiene 21 MB de intermedios
  en vez de 169 MB.

```python

from phonometry import filters

# recording: una captura de micrófono calibrada (Pa) — grabada con tu cadena de medición. Sintetizada aquí para que la guía funcione por sí sola.
fs = 48000
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)

# El diseño bilineal en forma cerrada, explícito
y = filters.weighting_filter(recording, fs, curve="A", high_accuracy=False)

# Procesado por bloques con estado (mismo diseño ajustado, estado entre bloques)
wf = filters.WeightingFilter(fs, "A", stateful=True)
blocks = [recording]                 # tu secuencia de bloques de señal
for block in blocks:
    weighted = wf.filter(block)
```

Consulta [Procesado por bloques](/phonometry/es/signals/filters/block-processing/) para
el flujo en streaming y [Teoría](/phonometry/es/reference/theory/signal-analysis/) para las
definiciones analíticas de las curvas.

:::note[Por encima de unos pocos kilohercios el filtro es el término más pequeño]
El diseño ajustado elimina la contribución *del filtro* al error en alta
frecuencia y, una vez que desaparece, el filtro deja de ser lo que decide la
lectura. Toman el relevo tres términos mayores, y los tres viven en el
instrumento, no en el código.

Un micrófono de campo libre está calibrado para el sonido que llega desde su
dirección de referencia, así que hay que apuntarlo a la fuente; en interiores,
en campo difuso, esa cápsula lee alto en altas frecuencias y lo correcto es una
cápsula de incidencia aleatoria. Un paravientos lleva su propia pérdida por
inserción dependiente de la frecuencia, que IEC 61672-1 trata como parte del
instrumento (apartado 5.3.3, «Windscreens») y cuya corrección declarada hay que
aplicar antes de que signifique nada un nivel de banda en alta frecuencia, o
cualquier nivel ponderado A cerca del extremo superior del rango. Y el operador
es un reflector: usa trípode y apártate.

La cadena de clases de la
[guía de calibración](/phonometry/es/signals/metrology/calibration/) dice el
resto: un veredicto de clase 1 para el filtro es un eslabón, y es el eslabón más
débil el que fija la exactitud de la lectura.
:::

## 6. Verificación frente a las tablas de tolerancias (IEC 61672-1)

`verify_weighting_class` comprueba un filtro de ponderación frente a los
límites de aceptación de **IEC 61672-1:2013** (Tabla 3). Evalúa la respuesta
relativa del filtro en la frecuencia *exacta* en base 10 que hay detrás de
cada etiqueta nominal por debajo de Nyquist (los objetivos de diseño de la
Tabla 3 se calculan en $f = 1000 \cdot 10^{n/10}$, p. ej. 15 848,9 Hz para
«16 kHz»; la IEC 61672-3 ensaya en esas mismas frecuencias), resta la
ponderación objetivo de diseño e informa de la clase de prestaciones por
frecuencia con su margen en dB. Un barrido logarítmico denso impone además el
apartado 5.5.7 *entre* las frecuencias nominales (la desviación respecto al
objetivo analítico del anexo E debe mantenerse dentro del mayor de los dos
límites adyacentes, de modo que una resonancia o un notch entre nominales no
puede pasar) y, cuando filas de la Tabla 3 con límite inferior finito quedan
por encima de Nyquist, el veredicto se marca `range_limited` (atestigua solo
las frecuencias comprobadas, no la conformidad completa de 10 Hz a 20 kHz):

```python
from phonometry import filters

result = filters.verify_weighting_class(filters.WeightingFilter(48000, "A"))
print(result.overall_class)          # 1
print(result.range_limited)          # False
print(result.between_nominals)       # {'worst_freq': ..., 'margin_class1_db': ...}
print(result.bands[20])
# {'freq': 1000.0, 'class': 1, 'deviation_db': 0.0, 'margin_class1_db': 0.7, 'margin_class2_db': 1.0}
```

La máscara de aceptación de la Tabla 3 también es pública:
`weighting_class_limits(1)` devuelve las 34 frecuencias nominales con los
límites de desviación inferior/superior (un límite inferior de `-inf` significa
que solo se aplica el superior). Los límites cualifican la *desviación* respecto
al objetivo de diseño, por lo que son idénticos para A, C y Z.

**El grado de laboratorio vive en la edición retirada.** IEC 61672-1:2013
publica solo las clases 1 y 2; el **Tipo 0**, el más estricto de los cuatro
tipos de instrumento de **IEC 651:1979**, sobrevive en la Tabla V de esa
norma. Se selecciona con `edition="1979"`, igual que `verify_filter_class`
alcanza la clase 0 de IEC 61260:1995. La clase *N* es entonces el Tipo *N* de
la norma, y cada banda y el barrido llevan un margen por tipo, de
`margin_class0_db` a `margin_class3_db`:

```python
from phonometry import filters

result = filters.verify_weighting_class(
    filters.WeightingFilter(48000, "A"), edition="1979"
)
print(result.overall_class)                             # 0
print(min(b["margin_class0_db"] for b in result.bands)) # 0.650...
```

Es una máscara distinta, no un cambio de nombre, y ve errores que la clase 1
no puede ver: el Tipo 0 mantiene +2/-3 dB tanto a 16 kHz como a 20 kHz, donde
la clase 1 se abre a +2,5/-16 dB y a +3/-inf. El diseño `high_accuracy=False`
a 48 kHz cae 15,7 dB en la fila de 20 kHz y aun así obtiene clase 1 por ella;
bajo la Tabla V esa fila se rechaza y el filtro queda calificado como Tipo 1.
La edición de 1979 cubre A, B y C, las ponderaciones que IEC 651 define: la
nota al pie de su Tabla V hace que una sola máscara gobierne todas las
características de ponderación, así que B se somete allí a esos mismos
límites en lugar de tomar prestados los de ANSI.

*Los diseños ajustados A y C (azul, morado) se mantienen cerca de
desviación cero, holgadamente dentro del corredor de clase 1 (sombreado); los
límites más amplios de clase 2 se muestran punteados. El corredor se ensancha
en los extremos de banda donde solo se aplica un límite unilateral.*

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

```python

from phonometry import filters

freqs, lower1, upper1 = filters.weighting_class_limits(1)
_, lower2, upper2 = filters.weighting_class_limits(2)
lo1, lo2 = np.clip(lower1, -7, 7), np.clip(lower2, -7, 7)

fig, ax = plt.subplots(figsize=(10, 6.5))
ax.fill_between(freqs, lo1, upper1, step="mid", alpha=0.10,
                label="Región de aceptación de clase 1")
ax.plot(freqs, upper1, drawstyle="steps-mid", label="Límite superior/inferior de clase 1")
ax.plot(freqs, lo1, drawstyle="steps-mid", color="C1")
ax.plot(freqs, upper2, ":", drawstyle="steps-mid", label="Límite superior/inferior de clase 2")
ax.plot(freqs, lo2, ":", drawstyle="steps-mid", color="C2")

for curve, marker in (("A", "o"), ("C", "s")):
    bands = filters.verify_weighting_class(filters.WeightingFilter(48000, curve)).bands
    f = [b["freq"] for b in bands]
    dev = [b["deviation_db"] for b in bands]
    ax.plot(f, dev, marker=marker, label=f"Desviación de la ponderación {curve} (48 kHz)")

ax.set(xscale="log", xlim=(10, 20000), ylim=(-7, 7),
       xlabel="Frecuencia [Hz]", ylabel="Desviación del objetivo de diseño [dB]")
ax.legend(fontsize=8, ncol=2)
plt.show()
```

</details>

## Qué cubre esta guía

IEC 61672-1:2013 para las curvas A, C y Z: la definición analítica del Anexo E
a partir de cuatro frecuencias de esquina, el diseño `high_accuracy` que
mantiene las tolerancias de clase 1 hasta 16 kHz a 44,1 kHz y por encima, y
los límites de aceptación de clase 1/clase 2 de la Tabla 3 que comprueba
`verify_weighting_class`.

Las curvas especiales, la G de infrasonido de ISO 7196, las históricas B (ANSI
S1.4-1983) y D (IEC 537) y la AU de IEC 61012, junto con la verificación de B
y AU frente a sus tablas de tolerancias, tienen su propia guía: [Ponderaciones
especiales](/phonometry/es/signals/levels/special-weightings/).

## Véase también

- [Ponderaciones especiales (G, B, D, AU)](/phonometry/es/signals/levels/special-weightings/):
  la curva G de infrasonido, las históricas B y D, y la AU para sonido
  audible en presencia de ultrasonidos.
- [Los mismos bits en cualquier máquina](/phonometry/es/reference/determinism/):
  por qué el filtro diseñado es byte-idéntico en cualquier CPU, BLAS, número
  de hilos o plataforma, con la evidencia medida.
- Referencia de la API: [`filters.weighting`](/phonometry/es/reference/api/filters/weighting/) y [`filters.compliance`](/phonometry/es/reference/api/filters/compliance/).
- Teoría: [Curvas de ponderación (IEC 61672-1)](/phonometry/es/reference/theory/signal-analysis/#curvas-de-ponderación-iec-61672-1): la definición en polos y ceros de las curvas A, C y Z, y la deformación bilineal que el diseño ajustado cancela.

## Respuestas rápidas

### ¿Cómo aplico la ponderación A a una señal con Python?

Llama a `filters.weighting_filter(recording, fs, curve='A')` sobre una señal
calibrada. Devuelve la señal temporal ponderada A, filtrada con el diseño de
polos y ceros de IEC 61672-1:2013 dentro de las tolerancias de clase 1, así que
`signals.leq()` sobre la salida es el $L_\mathrm{Aeq}$. La misma función aplica las
ponderaciones C, Z, B, D, AU y la G de infrasonido mediante `curve`.

### ¿Cuándo debo usar la ponderación C en lugar de la ponderación A?

Usa la ponderación C para presión acústica de pico y ruido de alto nivel, y usa la diferencia $L_\mathrm{Ceq} - L_\mathrm{Aeq}$ como indicador del contenido en baja frecuencia: por debajo de unos 10 dB el nivel ponderado A valora el espectro con justicia, mientras que en torno a 15 a 20 dB o más la energía se concentra en las bajas frecuencias y el nivel ponderado A subestima el problema. El método HML de ISO 4869-2 se apoya exactamente en esta diferencia C menos A para la selección de protectores auditivos.

### ¿Es precisa la ponderación A cerca de 16 kHz con una frecuencia de muestreo de 48 kHz?

No con un diseño bilineal simple: a $f_\mathrm{s} = 48$ kHz el error de la curva A alcanza −2,7 dB a 12,5 kHz, fuera de la tolerancia de clase 1 de IEC 61672-1 (+2,0/−2,5 dB). El `high_accuracy=True` por defecto ajusta en su lugar el prototipo a la frecuencia de muestreo, lo que deja 0,0003 dB en cualquier punto de la tabla a 48 kHz y 0,008 dB a 32 kHz, así que la clase 1 se mantiene a cualquier frecuencia de muestreo desde 8 kHz. El §5 tiene las cifras y la banda que controla el ajuste.
