<!-- canonical: https://jmrplens.github.io/phonometry/es/guides/electroacoustics/ -->
Source: https://jmrplens.github.io/phonometry/es/guides/electroacoustics/

Dos pilares de la caracterización de equipos de audio, a partir de una señal
capturada: cuánto **distorsiona** un amplificador o un transductor un tono de
prueba, y qué **respuesta en frecuencia** revela una medición de entrada/salida.
Esta página cubre el conjunto de distorsión de la IEC 60268-3: distorsión
armónica total y de orden n, THD+N y SINAD a través del ancho de banda de
medición AES17, la intermodulación por órdenes de modulación y por frecuencia
diferencia, la intermodulación dinámica (DIM) y la THD ponderada ITU-R 468, y
los estimadores de respuesta en frecuencia `H1`/`H2` de Bendat y
Piersol con la coherencia ordinaria `γ²`. Toda magnitud tiene un oráculo
analítico exacto (señales sintéticas con amplitudes armónicas y de
intermodulación conocidas, un oráculo de Fourier de seno recortado, una
síntesis completa de la señal de ensayo DIM y un camino LTI conocido), así que
los valores son verificables y no ajustados. Las secciones finales cubren las
convenciones de sensibilidad de IEC 60268-4 (micrófonos) e IEC 60268-5
(altavoces), donde fallan la mayoría de las comparaciones entre hojas de
datos, el modelo de radiación del pistón con pantalla que hay detrás de la
directividad de los altavoces, y los informes de características nominales de
altavoz (IEC 60268-5) y micrófono (IEC 60268-4) que componen las hojas de
datos de las normas a partir de una respuesta medida.

## 1. Distorsión armónica (IEC 60268-3 14.12.2–5)

Un dispositivo no lineal alimentado con un seno puro en `f₁` devuelve el
fundamental más armónicos en `2f₁, 3f₁, …`. La **distorsión armónica total**
combina las amplitudes armónicas `aₙ`, ya sea respecto al fundamental
(`kind='F'`) o respecto al RMS total (`kind='R'`):

$$
\mathrm{THD}_F = \frac{\sqrt{\sum_{n\ge 2} a_n^2}}{a_1}, \qquad
\mathrm{THD}_R = \frac{\sqrt{\sum_{n\ge 2} a_n^2}}{\sqrt{\sum_{n\ge 1} a_n^2}},
\qquad
d_n = \frac{a_n}{\sqrt{\sum_{k\ge 1} a_k^2}}.
$$

`dₙ` es la distorsión armónica de orden n (el armónico n respecto al total). Los
tonos deben caer en las líneas de la FFT: usa muestreo coherente (un número
entero de periodos) o una ventana de baja fuga para leer las amplitudes sin
fuga espectral.

```python
from phonometry import electroacoustics

thd_f = electroacoustics.thd(signal, fs, 1000.0, kind="F")          # respecto al fundamental
thd_r = electroacoustics.thd(signal, fs, 1000.0, kind="R")          # respecto al RMS total
d2 = electroacoustics.harmonic_distortion(signal, fs, 1000.0, 2)    # armónico de 2º orden
```

`harmonic_analysis` agrupa el fundamental, las amplitudes armónicas y la THD
(ambas convenciones), THD+N y SINAD en un único resultado representable:

```python
from phonometry import electroacoustics

res = electroacoustics.harmonic_analysis(signal, fs, 1000.0)
print(res.thd_f, res.thd_r, res.thd_plus_noise, res.sinad_db)
res.plot()   # espectro armónico anotado (necesita matplotlib)
```

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

```python

from phonometry import electroacoustics

fs = 48000
n = fs                     # 1 s -> líneas de 1 Hz; los armónicos caen en líneas
t = np.arange(n) / fs
f0 = 1000.0
amps = {1: 1.0, 2: 0.02, 3: 0.012, 4: 0.006, 5: 0.003}
sig = sum(a * np.sin(2 * np.pi * k * f0 * t) for k, a in amps.items())
sig = sig + np.random.default_rng(2026).standard_normal(n) * 1.2e-2

res = electroacoustics.harmonic_analysis(sig, fs, f0, n_harmonics=len(amps))
res.plot(language="es")
plt.show()
```

</details>

## 2. THD+N y SINAD (AES17-2015 6.3)

Mientras que la THD cuenta solo los armónicos, la **THD+N** compara *todo salvo
el fundamental* (armónicos **y** ruido) con la señal total. AES17 elimina el
fundamental con un filtro de muesca normalizado (`1,2 ≤ Q ≤ 3`, validado sobre
la respuesta *aplicada* de fase cero según la cláusula 5.2.8) y toma la razón
entre el residuo y el RMS total; el **SINAD** es su recíproco en dB:

$$
\mathrm{THD{+}N} = \frac{V_\text{residuo}}{V_\text{total}}, \qquad
\mathrm{SINAD} = -20\lg(\mathrm{THD{+}N})\ \mathrm{dB}.
$$

Ambas tensiones se miden a través del ancho de banda de medición AES17 (un paso
alto de 20 Hz más el paso bajo normalizado en 20 kHz, cláusulas 5.2.5 y 6.3.1)
de modo que un offset de continua o el ruido ultrasónico a frecuencias de
muestreo altas no cuentan como "ruido". El borde de banda es configurable, y
`bandwidth=None` desactiva la cadena y mide toda la banda de Nyquist.

```python
from phonometry import electroacoustics

ratio = electroacoustics.thd_plus_noise(signal, fs, 1000.0)          # razón (0..)
db = electroacoustics.thd_plus_noise(signal, fs, 1000.0, as_db=True)  # 20·lg(razón) dB
sinad_db = electroacoustics.sinad(signal, fs, 1000.0)                 # = -db
wide = electroacoustics.thd_plus_noise(signal, fs, 1000.0, bandwidth=None)  # Nyquist completa
```

Como la THD+N incluye el suelo de ruido en banda, es igual o mayor que la THD de
solo armónicos; el `SINAD` es el correspondiente margen señal-a-ruido-y-distorsión
en dB (una magnitud derivada de la THD+N de AES17; la propia AES17 no define el
SINAD). La muesca descarta internamente un transitorio de arranque/parada, así
que la medición requiere una captura estacionaria y suficientemente larga.

### 2.1 THD ponderada (IEC 60268-3 14.12.11)

`weighted_thd` pondera en frecuencia el residuo tras la muesca antes de tomar la
razón, de modo que se tiene en cuenta el énfasis perceptual de los productos de
distorsión. La ponderación por defecto es la red que exige la cláusula: la
curva del Apéndice A de la IEC 60268-1, es decir la ITU-R BS.468-4, con su pico
de +12,2 dB cerca de 6,3 kHz (expuesta como `itu_r_468_weighting`); `'A'` y
`'C'` se mantienen como opciones etiquetadas. Según la cláusula, la medición
ponderada solo es válida para frecuencias fundamentales entre 31,5 Hz y 400 Hz:

```python
from phonometry import electroacoustics

print(electroacoustics.weighted_thd(signal, fs, 100.0))                  # red ITU-R 468
print(electroacoustics.weighted_thd(signal, fs, 100.0, weighting="A"))   # variante ponderada A
print(electroacoustics.itu_r_468_weighting([6300.0]))                    # [+12.2] dB
```

### 2.2 Rango dinámico y ruido de canal en reposo (AES17-2015 6.4)

Las dos cifras de catálogo de cualquier conversor comparten la ponderación
AES17 **CCIR-RMS** (5.2.7): la curva ITU-R BS.468-4 desplazada un valor plano de
`-5,63` dB para que sea unidad a 2 kHz. El **rango dinámico** (6.4.1) excita el
dispositivo con un seno de 997 Hz 60 dB por debajo de plena escala, elimina la
fundamental con la muesca normalizada (5.2.8) y pondera el residuo de
ruido-más-distorsión, y luego informa de la razón del seno de plena escala a ese
residuo ponderado (también conocida como relación señal-ruido). El **ruido de
canal en reposo** (6.4.2) es el mismo nivel ponderado medido con el dispositivo
excitado por cero digital, referido a plena escala:

```python
from phonometry import electroacoustics

# Rango dinámico: captura la salida del ensayo de 997 Hz a -60 dBFS, escalada
# de modo que 1.0 sea plena escala digital.
dr = electroacoustics.dynamic_range(output, fs, 997.0)     # dB CCIR-RMS
# Ruido de canal en reposo: captura la salida con entrada de cero digital.
idle = electroacoustics.idle_channel_noise(idle_output, fs)  # dBFS CCIR-RMS
```

Ambas reutilizan la muesca y la curva ITU-R 468 de la cadena de THD+N, y ambas
se miden a través de la banda AES17 (un paso alto de 20 Hz más el paso bajo
normalizado en `bandwidth`). Como el filtro CCIR-RMS marca `-5,63` dB a 1 kHz, un
tono de 1 kHz mide su propio dBFS menos 5,63 dB, lo que fija la ponderación con
exactitud.

## 3. Distorsión por intermodulación (IEC 60268-3 14.12.7–10)

Cuando dos tonos atraviesan una no linealidad, laten entre sí y producen
productos de suma y diferencia. La IEC 60268-3 normaliza tres ensayos, cada uno
con su definición por órdenes:

- **Distorsión de modulación** (14.12.7): un tono grave grande `f_low` y un
  tono agudo pequeño `f_high` (preferiblemente 4:1). Los valores por orden son
  sumas *aritméticas* de las amplitudes de las bandas laterales respecto a la
  salida en `f_high`: `d_m,2 = (a_{f₂+f₁} + a_{f₂−f₁})/a_{f₂}` y
  `d_m,3 = (a_{f₂+2f₁} + a_{f₂−2f₁})/a_{f₂}`. El resultado también lleva el
  valor `smpte` de RMS combinado que reportan los analizadores tipo SMPTE (no
  es una magnitud IEC).
- **Distorsión por frecuencia diferencia** (14.12.8): dos tonos agudos iguales
  `f₁ < f₂`, referida a `U_{2,ref} = 2·U_{2,f₂}` (la suma de las amplitudes de
  ambos tonos): `d_d,2 = a_{f₂−f₁}/(a_{f₁}+a_{f₂})` y la suma aritmética
  `d_d,3 = (a_{2f₂−f₁} + a_{2f₁−f₂})/(a_{f₁}+a_{f₂})`.
- **Distorsión total por frecuencia diferencia** (14.12.10): un ensayo de dos
  tonos específico (`f₁ = 2f₀`, `f₂ = 3f₀ − δ`; los tonos normalizados de
  8 kHz y 11,95 kHz son los valores por defecto) donde solo cuentan los dos
  productos en banda en `f₀ ∓ δ`:
  `d_TDFD = √(a²_{f₂−f₁} + a²_{2f₁−f₂}) / (a_{f₁} + a_{f₂})`.
- **Intermodulación dinámica** (DIM, 14.12.9): un seno de 15 kHz más una onda
  cuadrada de 3,15 kHz filtrada en paso bajo (1:4 pico a pico). La DIM es el
  RMS de los productos de intermodulación `|k·f_square ± f_sine|` que caen por
  debajo de `f_sine` (Tabla 2 de la IEC 60268-3), respecto a la amplitud del
  seno de 15 kHz (la definición de 14.12.9.1; el denominador impreso en
  14.12.9.2 f) es un defecto editorial, véase la
  [fe de erratas](https://github.com/jmrplens/phonometry/blob/main/docs/ERRATA.md)).

```python
from phonometry import electroacoustics

md = electroacoustics.modulation_distortion(signal, fs, 60.0, 7000.0)
print(md.d2, md.d3, md.smpte)                                       # 14.12.7
md.plot()   # portadora y bandas laterales de modulación, d2/d3 anotadas (necesita matplotlib)
dfd2 = electroacoustics.difference_frequency_distortion(signal, fs, 13e3, 14e3, order=2)
tdfd = electroacoustics.total_difference_frequency_distortion(signal, fs)         # 8/11,95 kHz
dim = electroacoustics.dynamic_intermodulation_distortion(signal, fs)             # DIM (15k/3,15k)
```

El `ModulationDistortionResult` se puede dibujar: `.plot()` traza la amplitud
de salida en la portadora `f₂` (la referencia de 0 dB) y las cuatro bandas
laterales de modulación en `f₂ ± f₁` y `f₂ ± 2f₁`, la contraparte de
modulación del espectro armónico de la sección 1. La relación asimétrica entre
los pares `n = 2` y `n = 3` lee de un vistazo el equilibrio entre los términos
cuadrático y cúbico de la no linealidad:

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

```python

from phonometry import electroacoustics

fs = 48000
t = np.arange(fs) / fs                        # 1 s -> los tonos caen en bins de la FFT
x = np.sin(2 * np.pi * 60.0 * t) + 0.25 * np.sin(2 * np.pi * 7000.0 * t)
signal = x + 0.04 * x**2 + 0.012 * x**3       # salida de un dispositivo débilmente no lineal

md = electroacoustics.modulation_distortion(signal, fs, 60.0, 7000.0)
md.plot(language="es")
plt.show()
```

</details>

## 4. Respuesta en frecuencia y coherencia (Bendat y Piersol)

Dada una entrada `x` y la salida `y` de un dispositivo, la **respuesta en
frecuencia** `H(f)` se estima a partir de los autoespectros y el espectro cruzado
promediados con Welch. Bendat y Piersol (*Random Data*, 4ª ed.) dan dos
estimadores, que difieren en qué canal soporta el ruido, más la **coherencia
ordinaria** `γ²`, la fracción de la potencia de salida explicada linealmente por
la entrada:

$$
H_1 = \frac{G_{xy}}{G_{xx}}, \qquad H_2 = \frac{G_{yy}}{G_{yx}}, \qquad
\gamma^2 = \frac{|G_{xy}|^2}{G_{xx}\,G_{yy}} \in [0, 1].
$$

`H1` es insesgado cuando el ruido está en la salida, y `H2` cuando está en la
entrada; para un camino lineal sin ruido ambos recuperan la respuesta verdadera y
`γ² = 1`. El ruido aditivo a la salida sesga `H2` al alza y baja la coherencia
hasta `SNR/(1+SNR)`.

```python
from phonometry import electroacoustics

res = electroacoustics.transfer_function(x, y, fs, estimator="H1")
print(res.magnitude_db, res.phase, res.coherence)
res.plot()   # magnitud/fase de Bode + coherencia (necesita matplotlib)

freqs, gamma2 = electroacoustics.coherence(x, y, fs)
```

La coherencia necesita promediarse sobre varios segmentos de Welch para ser
significativa; un único segmento da `γ² ≡ 1` por construcción.

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

```python

from scipy import signal as sp
from phonometry import electroacoustics

fs = 48000
n = 400000
rng = np.random.default_rng(7)
x = rng.standard_normal(n)
b, a = sp.butter(2, [400.0, 4000.0], btype="band", fs=fs)   # dispositivo bajo ensayo
y = sp.lfilter(b, a, x)
y = y + rng.standard_normal(n) * np.sqrt(np.mean(y ** 2)) * 0.05   # ruido de salida

res = electroacoustics.transfer_function(x, y, fs, estimator="H1")
res.plot(language="es")
plt.show()
```

</details>

## 5. Convenciones de sensibilidad (IEC 60268-4 / IEC 60268-5)

Las cifras de distorsión y de respuesta solo son comparables entre
dispositivos cuando coinciden las convenciones de *sensibilidad* que hay
detrás, y dos convenciones hacen tropezar constantemente: el nivel de
referencia del micrófono y la normalización de potencia y distancia del
altavoz.

**Micrófonos (IEC 60268-4, cláusula 11).** La sensibilidad `M` es la tensión
de salida por unidad de presión acústica, expresada en mV/Pa; el *nivel* de
sensibilidad es `LM = 20 lg(M / 1 V/Pa)` dB, negativo para todo micrófono real
(un condensador de estudio de 50 mV/Pa queda en −26 dB re 1 V/Pa). El tropiezo
clásico es la referencia: −26 dB re 1 V/Pa y +34 dB re 1 mV/Pa son el *mismo*
micrófono, a 60 dB de distancia sobre el papel, así que un nivel de
sensibilidad sin su referencia no significa nada. La norma también distingue
sensibilidad de campo libre, de campo difuso y de presión; para la misma
cápsula divergen en alta frecuencia, de modo que el tipo declarado importa
tanto como el número.

**Altavoces (IEC 60268-5, cláusula 20.3).** La sensibilidad característica es
la presión acústica producida a 1 m sobre el eje de referencia, en campo
libre, referida a una entrada de 1 W en la impedancia nominal; expresada como
nivel re 20 µPa (cláusula 20.4) es el familiar «dB @ 1 W/1 m». En esa frase se
esconden dos normalizaciones:

- *La eléctrica.* La tensión de ensayo es `Up = √(R · 1 W)`, numéricamente
  `√R`: 2,83 V en una impedancia nominal de 8 Ω. Una hoja de datos que anuncia
  «dB @ 2,83 V/1 m» para un altavoz de 4 Ω le está entregando 2 W, lo que
  infla la cifra en 3 dB frente a una calificación verdadera de 1 W/1 m;
  comprueba la impedancia nominal antes de comparar.
- *La geométrica.* 1 m es una distancia de **referencia**, no necesariamente
  la de medición. La norma manda medir en campo lejano (a 0,5 m o a un número
  entero de metros, cláusula 7.1) y referir el resultado con la ley de la
  distancia inversa, `Lp(1 m) = Lp(r) + 20 lg(r / 1 m)`. Ese escalado solo
  vale donde el nivel cae de verdad 6 dB por duplicación de distancia, de ahí
  el campo libre del diagrama; a 1 m de una caja multivía grande puede que el
  campo cercano aún no haya terminado, y la cifra «a 1 m» es entonces una
  magnitud referida, no lo que leería un micrófono colocado a 1 m.

## 6. Pistón radiante: impedancia de radiación y directividad

El **pistón circular rígido en pantalla infinita** es el radiador canónico tras
un cono de altavoz, el extremo abierto de un conducto y la eficiencia de
radiación de cualquier superficie vibrante finita (Beranek y Mellow §4.19,
§13.7). Su impedancia mecánica de radiación es $Z_r = \rho c S\,(R_1 + jX_1)$ con
$S = \pi a^2$ y las funciones adimensionales de resistencia y reactancia
(Ecs. (13.117), (13.118))

$$
R_1(x) = 1 - \frac{2 J_1(x)}{x}, \qquad X_1(x) = \frac{2 H_1(x)}{x},
\qquad x = 2ka,
$$

donde $J_1$ es la función de Bessel y $H_1$ la de Struve de orden uno. A baja
frecuencia $R_1 \to (ka)^2/2$ y la reactancia es de tipo másico con la **masa de
radiación** $M_r = 8\rho a^3/3$ (Ec. (4.151)); a alta frecuencia $R_1 \to 1$,
$X_1 \to 0$ y el pistón radia como en un tubo infinito. El campo lejano sigue la
directividad $D(\theta) = 2 J_1(ka\sin\theta)/(ka\sin\theta)$, cuyo primer nulo
está en $ka\sin\theta = 3.8317$.

```python

from phonometry import radiating_piston

res = radiating_piston(radius=0.1, frequencies=np.geomspace(20, 20000, 200),
                       angles=np.linspace(0.0, np.pi / 2, 91))
print(round(res.radiation_mass, 4))            # 8 rho a^3 / 3, kg
print(round(float(res.directivity_index[0]), 2))  # 3.01 dB, límite de semiespacio
res.plot()                                      # R1 y X1 vs ka
```

*El `.plot()` del resultado es la figura clásica de impedancia de Beranek y
Mellow calculada para este pistón: por debajo de `ka ≈ 1` la carga es casi
puramente de tipo masa (`X₁` domina y `R₁ ∝ (ka)²`, el régimen en el que la
salida de un altavoz está limitada por rigidez y masa), y por encima la
resistencia se asienta en `ρcS` con rizados de interferencia mientras la
reactancia se desvanece.*

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

```python

from phonometry import radiating_piston

res = radiating_piston(radius=0.075, frequencies=np.geomspace(20, 20000, 400))
res.plot(language="es")   # R1 y X1 normalizadas frente a ka
plt.show()
```

</details>

`radiating_piston` devuelve un `RadiatingPistonResult` con la `resistance` y
`reactance` normalizadas, la `radiation_resistance`/`radiation_reactance`
mecánicas, la `radiation_mass`, el `directivity_index`, el patrón de campo lejano
`directivity` (cuando se dan `angles`) y `.plot()`. Los bloques
`piston_resistance`, `piston_reactance` y `piston_directivity` también son
invocables directamente. El pistón es el modelo de radiador complementario de los
[silenciadores de control de ruido industrial](/phonometry/es/guides/noise-control/).

El **patrón de directividad** es, por sí mismo, un resultado representable:
`piston_directivity_pattern(ka)` muestrea $D(\theta)$ para uno o varios valores
de $ka$ y devuelve un `PistonDirectivity` (la malla de ángulos polares, la
`directivity` lineal y su forma en dB `directivity_db`, y los valores de `ka`),
cuyo `.plot()` dibuja el diagrama de haz clásico. Varios $ka$ se muestran como
una familia sobre los mismos ejes polares, de modo que el estrechamiento del
lóbulo principal y la aparición de los lóbulos secundarios se leen de un vistazo:

```python
from phonometry import piston_directivity_pattern

pattern = piston_directivity_pattern([3.0, 8.0, 16.0])
print(pattern.directivity_db.shape)  # (3, 361): una fila por ka
pattern.plot()                       # diagrama de haz polar en dB (necesita matplotlib)
```

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

```python

from phonometry import piston_directivity_pattern

piston_directivity_pattern([3.0, 8.0, 16.0]).plot(language="es")
plt.show()
```

</details>

## 7. Informe de características del altavoz (IEC 60268-5)

Las características nominales que IEC 60268-5 define en torno a una respuesta en
el eje medida se reúnen en un único resultado de **características del altavoz**
que representa la ficha de características nominales de la norma. Dos de los
números se calculan a partir de la respuesta en lugar de solo repetirse:

- **Nivel de sensibilidad característica** (20.3/20.4). El nivel en el eje
  promediado en una banda declarada, referido a 1 W en la impedancia nominal
  $R$ a 1 m: $L_M = \overline{L} + 20\lg(d/d_0) + 20\lg(U_p/U)$ con
  $U_p = \sqrt{R\cdot 1\,\text{W}} = \sqrt R$. La excitación por defecto es ese
  $\sqrt R$ (2,83 V en 8 Ω), de modo que con una respuesta a 1 m el nivel de
  sensibilidad es la media de banda.
- **Rango de frecuencias efectivo** (21.2). La banda en la que la respuesta se
  mantiene dentro de 10 dB del nivel promediado en la banda de una octava en la
  región de máxima sensibilidad; los valles más estrechos que 1/9 de octava se
  desprecian.

```python

from phonometry import loudspeaker_characteristics, radiating_piston, ReportMetadata

freqs = np.geomspace(30, 24000, 320)
spl = 87.0 + 1.2 * np.sin(2 * np.log2(freqs / 900.0))
spl -= 10 * np.log10(1 + (50.0 / freqs) ** 6)       # caída en baja frecuencia
spl -= 10 * np.log10(1 + (freqs / 16000.0) ** 7)    # caída en alta frecuencia

result = loudspeaker_characteristics(
    freqs, spl, rated_impedance=8.0, sensitivity_band=(200.0, 4000.0),
    impedance=(np.geomspace(20, 20000, 260),
               6.6 + 24 * np.exp(-(np.log2(np.geomspace(20, 20000, 260) / 52.0) ** 2) / 0.12)),
    distortion=(np.geomspace(50, 5000, 140),
                0.3 + 2.6 * np.exp(-(np.log2(np.geomspace(50, 5000, 140) / 70.0) ** 2) / 0.45)),
    directivity=radiating_piston(0.075, np.array([1000.0, 2000.0, 4000.0]),
                                 angles=np.radians(np.linspace(0, 90, 46))),
    polar_frequency=2000.0,
)
print(round(result.sensitivity_level_db, 1))                 # dB, 1 W / 1 m
print(tuple(round(x) for x in result.effective_range))       # Hz

result.report("altavoz.pdf", metadata=ReportMetadata(measurement_standard="IEC 60268-5"),
              language="es")
```

`loudspeaker_characteristics` devuelve un `LoudspeakerCharacteristics` con el
`sensitivity_level_db`, el `effective_range`, el `reference_level_db`, la
`characteristic_sensitivity_pa` y la `minimum_impedance` calculados, y un
`.report()` que escribe la ficha. La respuesta en el eje se dibuja con su banda
de tolerancia y los marcadores del rango efectivo según la proporción de
IEC 60263 (una década de frecuencia igual a 25 dB), y la directividad polar
sobre el círculo de referencia de 25 dB de IEC 60263. El módulo de impedancia
(con la línea del 80 % de la nominal), la curva de distorsión armónica total y
la directividad alimentan los paneles secundarios, reutilizando la directividad
del [pistón radiante](#6-pistón-radiante-impedancia-de-radiación-y-directividad)
de la sección 6 y un resultado de
[distorsión con barrido sinusoidal](/phonometry/es/guides/swept-sine-distortion/)
para la curva de distorsión.

Las características nominales también están disponibles de forma interactiva
mediante `.plot()`, que dibuja **un concepto por figura** con el mismo código de
paneles que compone el informe, seleccionado con `quantity`. Al pasar unos ejes
se dibuja sobre ellos:

```python
result.plot()                        # respuesta en el eje (por defecto)
result.plot(quantity="impedance")    # módulo |Z| con las líneas nominal / 80 %
result.plot(quantity="thd")          # distorsión armónica total vs frecuencia
result.plot(quantity="directivity")  # respuesta polar sobre el círculo de 25 dB
```

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

```python

from phonometry import loudspeaker_characteristics

freqs = np.geomspace(30, 24000, 320)
spl = 87.0 + 1.2 * np.sin(2 * np.log2(freqs / 900.0))
spl -= 10 * np.log10(1 + (50.0 / freqs) ** 6)       # caída en baja frecuencia
spl -= 10 * np.log10(1 + (freqs / 16000.0) ** 7)    # caída en alta frecuencia

result = loudspeaker_characteristics(freqs, spl, rated_impedance=8.0,
                                     sensitivity_band=(200.0, 4000.0))
result.plot(language="es")   # quantity="response" (por defecto)
plt.show()
```

</details>

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

```python

from phonometry import loudspeaker_characteristics

freqs = np.geomspace(30, 24000, 320)
spl = 87.0 - 10 * np.log10(1 + (50.0 / freqs) ** 6)
fz = np.geomspace(20, 20000, 260)

result = loudspeaker_characteristics(
    freqs, spl, rated_impedance=8.0, sensitivity_band=(200.0, 4000.0),
    impedance=(fz, 6.6 + 24 * np.exp(-(np.log2(fz / 52.0) ** 2) / 0.12)),
)
result.plot(quantity="impedance", language="es")
plt.show()
```

</details>

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

```python

from phonometry import loudspeaker_characteristics

freqs = np.geomspace(30, 24000, 320)
spl = 87.0 - 10 * np.log10(1 + (50.0 / freqs) ** 6)
thd_f = np.geomspace(50, 5000, 140)

result = loudspeaker_characteristics(
    freqs, spl, rated_impedance=8.0, sensitivity_band=(200.0, 4000.0),
    distortion=(thd_f, 0.3 + 2.6 * np.exp(-(np.log2(thd_f / 70.0) ** 2) / 0.45)),
)
result.plot(quantity="thd", language="es")
plt.show()
```

</details>

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

```python

from phonometry import loudspeaker_characteristics, radiating_piston

freqs = np.geomspace(30, 24000, 320)
spl = 87.0 - 10 * np.log10(1 + (50.0 / freqs) ** 6)

result = loudspeaker_characteristics(
    freqs, spl, rated_impedance=8.0, sensitivity_band=(200.0, 4000.0),
    directivity=radiating_piston(0.075, np.array([1000.0, 2000.0, 4000.0]),
                                 angles=np.radians(np.linspace(0, 90, 46))),
    polar_frequency=2000.0,
)
result.plot(quantity="directivity", language="es")
plt.show()
```

</details>

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

## 8. Informe de características del micrófono (IEC 60268-4)

El compañero de micrófono de la sección 7: las características nominales que
IEC 60268-4 define en torno a una respuesta en frecuencia de campo libre medida
se reúnen en un único resultado de **características del micrófono** que
representa la ficha de características nominales de la norma. Cuatro de los
números se calculan a partir de las propias definiciones de la norma en lugar
de solo repetirse:

- **Nivel de sensibilidad** (11.1). La sensibilidad nominal en campo libre $M$
  (mV/Pa, a la frecuencia de referencia de 1 kHz de 11.3) como nivel,
  $L_M = 20\lg(M / 1\,\text{V/Pa})$: 12,5 mV/Pa son $-38{,}1$ dB re 1 V/Pa.
- **Rango de frecuencias efectivo** (12.2). La banda en la que la respuesta,
  normalizada a 0 dB en la frecuencia de referencia, se mantiene dentro de la
  tolerancia $\pm$ declarada; los bordes son los cruces interpolados con la
  tolerancia.
- **Índice de directividad** (13.2.2). $D = 20\lg(M_0/M_\mathrm{diff})$ con la
  sensibilidad de campo difuso de la integral de 11.2.2 a) sobre un diagrama
  con simetría de revolución; el cardioide ideal devuelve $10\lg 3 = 4{,}8$ dB.
- **Nivel de ruido equivalente** (17.2). La tensión de ruido inherente
  ponderada sobre la sensibilidad nominal como nivel de presión acústica,
  $L_N = 20\lg\bigl((U_N/M)/20\,\mu\text{Pa}\bigr)$, con la relación
  señal-ruido re 1 Pa (94 dB SPL) derivada de él. El nivel de presión acústica de
  sobrecarga (15.2) se lee de una curva de distorsión frente a nivel en el
  límite de THD declarado.

```python

from phonometry import microphone_characteristics, ReportMetadata

freqs = np.geomspace(20, 20000, 400)
response = -10 * np.log10(1 + (30.0 / freqs) ** 4)      # caída en baja frecuencia
response -= 10 * np.log10(1 + (freqs / 19000.0) ** 8)   # caída en alta frecuencia
response += 2.0 * np.exp(-(np.log2(freqs / 9000.0) ** 2) / 0.3)  # región de presencia

angles = np.linspace(0, 179, 359)
cardioid = 20 * np.log10((1 + np.cos(np.radians(angles))) / 2)

result = microphone_characteristics(
    freqs, response, 12.5, tolerance_db=3.0,          # 12,5 mV/Pa a 1 kHz
    rated_impedance=150.0, minimum_load_impedance=1000.0,
    noise_voltage=1.25e-6,                             # ponderada A, V
    max_spl_thd_percent=0.5,
    distortion=(np.linspace(100, 140, 81),
                0.5 * 10 ** ((np.linspace(100, 140, 81) - 130.0) * 0.08)),
    polar=(angles, cardioid), polar_frequency=1000.0,
    powering="Phantom P48 (IEC 61938)", supply_current_ma=3.1,
)
print(round(result.sensitivity_level_db, 1))            # -38,1 dB re 1 V/Pa
print(tuple(round(x) for x in result.effective_range))  # Hz
print(round(result.directivity_index_db, 1))            # 4,8 dB (cardioide)
print(round(result.equivalent_noise_level_db, 1))       # dB(A)

result.report("microfono.pdf", metadata=ReportMetadata(measurement_standard="IEC 60268-4"),
              language="es")
```

`microphone_characteristics` devuelve un `MicrophoneCharacteristics` con el
`sensitivity_level_db`, el `effective_range`, el `directivity_index_db`, el
`equivalent_noise_level_db`, el `max_spl_db`, la `signal_to_noise_ratio_db` y
el `diffuse_field_sensitivity_level_db` calculados, y un `.report()` que
escribe la ficha. La respuesta de campo libre se dibuja con su banda de
tolerancia, el marcador de la frecuencia de referencia y los marcadores del
rango efectivo según la proporción de IEC 60263 (una década de frecuencia igual
a 25 dB), y el diagrama direccional sobre el círculo de referencia de 25 dB de
IEC 60263; el espectro de ruido inherente y la curva de distorsión frente a
nivel (con el límite de THD y el nivel de sobrecarga marcados) alimentan los
paneles secundarios. Un `requirement` en los metadatos se comprueba como nivel
de ruido equivalente máximo permitido.

Las características nominales también están disponibles de forma interactiva
mediante `.plot()`, que dibuja **un concepto por figura** con el mismo código de
paneles que compone el informe, seleccionado con `quantity`. Al pasar unos ejes
se dibuja sobre ellos:

```python
result.plot()                        # respuesta de campo libre (por defecto)
result.plot(quantity="directivity")  # diagrama polar sobre el círculo de 25 dB
result.plot(quantity="noise")        # espectro de banda del ruido inherente
result.plot(quantity="distortion")   # THD frente al nivel de presión acústica
```

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

```python

from phonometry import microphone_characteristics

freqs = np.geomspace(20, 20000, 400)
response = -10 * np.log10(1 + (30.0 / freqs) ** 4)      # caída en baja frecuencia
response -= 10 * np.log10(1 + (freqs / 19000.0) ** 8)   # caída en alta frecuencia
response += 2.0 * np.exp(-(np.log2(freqs / 9000.0) ** 2) / 0.3)  # región de presencia

result = microphone_characteristics(freqs, response, 12.5, tolerance_db=3.0)
result.plot(language="es")   # quantity="response" (por defecto)
plt.show()
```

</details>

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

```python

from phonometry import microphone_characteristics

freqs = np.geomspace(20, 20000, 400)
response = -10 * np.log10(1 + (30.0 / freqs) ** 4)
angles = np.linspace(0, 179, 359)
cardioid = 20 * np.log10((1 + np.cos(np.radians(angles))) / 2)

result = microphone_characteristics(
    freqs, response, 12.5, tolerance_db=3.0,
    polar=(angles, cardioid), polar_frequency=1000.0,
)
result.plot(quantity="directivity", language="es")
plt.show()
```

</details>

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

```python

from phonometry import microphone_characteristics

freqs = np.geomspace(20, 20000, 400)
response = -10 * np.log10(1 + (30.0 / freqs) ** 4)
noise_f = np.geomspace(20, 20000, 31)

result = microphone_characteristics(
    freqs, response, 12.5, tolerance_db=3.0, noise_voltage=1.25e-6,
    noise_spectrum=(noise_f, 6.0 + 12.0 * np.log10(1000.0 / noise_f)),
)
result.plot(quantity="noise", language="es")
plt.show()
```

</details>

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

```python

from phonometry import microphone_characteristics

freqs = np.geomspace(20, 20000, 400)
response = -10 * np.log10(1 + (30.0 / freqs) ** 4)
spl_axis = np.linspace(100, 140, 81)

result = microphone_characteristics(
    freqs, response, 12.5, tolerance_db=3.0, max_spl_thd_percent=0.5,
    distortion=(spl_axis, 0.5 * 10 ** ((spl_axis - 130.0) * 0.08)),
)
result.plot(quantity="distortion", language="es")
plt.show()
```

</details>

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

## Qué cubre esta guía

**Cubierto.** El conjunto de distorsión de IEC 60268-3 (cláusulas
14.12.2-14.12.11): THD_F y THD_R (`thd`), la distorsión armónica de orden n
(`harmonic_distortion`), THD+N y SINAD a través del ancho de banda de
medición de AES17-2015 (`harmonic_analysis`, cláusulas 5.2.5/5.2.8/6.3.1 de
AES17), la intermodulación por modulación y por frecuencia diferencia, la
intermodulación dinámica (DIM) y la THD ponderada ITU-R BS.468-4, además del
margen dinámico y el ruido de canal en reposo de AES17-2015. Los
estimadores de respuesta en frecuencia `H1`/`H2` de Bendat y Piersol y la
coherencia ordinaria. Las características nominales de micrófono de la
IEC 60268-4:2014 (sensibilidad, respuesta y rango de frecuencias, índice de
directividad, nivel de sobrecarga, nivel de ruido equivalente, impedancias y
alimentación) mediante `microphone_characteristics` y su `.report()`. Las
características nominales de altavoz de la IEC 60268-5:2003+A1:2007
(sensibilidad, rango de frecuencias, índice de directividad, THD frente a
frecuencia) mediante `loudspeaker_characteristics` y su `.report()`, ambas
trazadas según las convenciones de escala de la IEC 60263. El modelo de
radiación de pistón con bafle (`radiating_piston`, Beranek y Mellow
§4.19/§13.7).

**No cubierto.** Otras partes de la serie IEC 60268 quedan fuera de esta
página: la Parte 16 (inteligibilidad objetiva del habla, el índice de
transmisión del habla) no está implementada. Las ediciones implementadas
están fijadas en IEC 60268-4:2014, IEC 60268-5:2003+A1:2007 y AES17-2015; las
revisiones sucesoras IEC 60268-4:2018 y AES17-2020 no son las comprobadas.

## Véase también

- [Control de ruido industrial](/phonometry/es/guides/noise-control/):
  silenciadores reactivos, métodos HVAC de conducto y cerramientos de máquina,
  que comparten el pistón radiante como radiador canónico.
- [Distorsión con barrido sinusoidal](/phonometry/es/guides/swept-sine-distortion/):
  la separación armónica de Farina/Novak cuya THD(f) alimenta el panel de
  distorsión del altavoz.
- Referencia de la API: [`electroacoustics.distortion`](/phonometry/es/reference/api/electroacoustics/distortion/), [`electroacoustics.frequency_response`](/phonometry/es/reference/api/electroacoustics/frequency-response/), [`electroacoustics.piston`](/phonometry/es/reference/api/electroacoustics/piston/), [`electroacoustics.loudspeaker`](/phonometry/es/reference/api/electroacoustics/loudspeaker/) y [`electroacoustics.microphone`](/phonometry/es/reference/api/electroacoustics/microphone/).
