<!-- canonical: https://jmrplens.github.io/phonometry/es/buildings/rooms/open-plan-acoustics/ -->
Source: https://jmrplens.github.io/phonometry/es/buildings/rooms/open-plan-acoustics/

Una oficina diáfana no es un problema de reverberación; es un problema de
privacidad, y una sala que queda bien en los parámetros de sala cerrada puede
suspenderlo igualmente. ISO 3382-3 caracteriza por ello la oficina con
cuatro números únicos — $r_\mathrm{D}$, $D_\mathrm{2,S}$, $L_{p,\mathrm{A,S},4\,\mathrm{m}}$ y el ruido de fondo
medio $L_{p,\mathrm{A,B}}$ — medidos a lo largo de una línea de puestos de trabajo,
alejándose de un hablante. Esta guía cubre esa cadena de medición — las
magnitudes, la línea de medición a escala y la ficha acreditada — y después le
da la vuelta a la pregunta: en fase de proyecto, antes de que exista ninguna
oficina ni ningún restaurante, el modelo de Long de ruido autogenerado por los
ocupantes predice el fondo que genera una sala ocupada a partir de sus propios
ocupantes, y convierte una relación habla-ruido objetivo en un área de absorción
por mesa. Primero la medición, después el diseño; las dos mitades no comparten
más que la sala. Las
respuestas al impulso y los niveles que la sustentan se adquieren como en
[Medición de la respuesta al impulso](/phonometry/es/buildings/rooms/room-impulse-response/);
el STI por posición sale de la
[guía del Índice de transmisión del habla](/phonometry/es/perception/speech/speech-transmission/);
los parámetros de decaimiento de sala cerrada viven en
[Acústica de salas](/phonometry/es/buildings/rooms/room-acoustics/).

## Privacidad del habla a lo largo de una línea de puestos

La acústica de oficinas diáfanas trata de la **privacidad del habla**: con
qué rapidez el habla de un hablante se desvanece hasta la ininteligibilidad a
medida que uno se aleja. Los niveles y el STI se miden a lo largo de una fila
de puestos de trabajo (al menos 4 posiciones, preferiblemente 6–10), y cuatro
magnitudes de un solo número resumen la sala: la distancia de distracción
$r_\mathrm{D}$, la tasa de decaimiento espacial $D_\mathrm{2,S}$, el nivel de habla a 4 m
$L_{p,\mathrm{A,S},4\,\mathrm{m}}$ y el ruido de fondo medio ponderado A $L_{p,\mathrm{A,B}}$
(apartado 6.4). La distancia de privacidad $r_\mathrm{P}$ y el STI en el puesto más
cercano son añadidos opcionales; `open_plan_metrics` devuelve $D_\mathrm{2,S}$,
$L_{p,\mathrm{A,S},4\,\mathrm{m}}$, $r_\mathrm{D}$ y $r_\mathrm{P}$. La **tasa de decaimiento
espacial** del habla ponderada A es la pendiente del nivel frente a
$\log_{10}(r/r_0)$, escalada a una cifra por duplicación usando solo las posiciones
de 2–16 m,

$$
D_\mathrm{2,S} = -\log_{10}(2)\ b, \qquad L = a + b\ \log_{10}(r/r_0),\ r_0 = 1\ \text{m},
$$

con **$L_{p,\mathrm{A,S},4\,\mathrm{m}}$** leído en la misma recta a 4 m. La **distancia de
distracción** $r_\mathrm{D}$ (STI = 0,50) y la **distancia de privacidad** $r_\mathrm{P}$
(STI = 0,20) provienen de una regresión lineal del STI frente a la distancia.

Las dos distancias se leen **sobre la recta ajustada**, y el apartado 6.3
permite que la lectura caiga fuera del tramo medido: la Figura 3 b) dibuja la
recta prolongada hasta el cruce. Así que un $r_\mathrm{D}$ que cae dentro de la línea es
una medición, mientras que un $r_\mathrm{P}$ bastante más allá de la última posición es
una extrapolación cuya confianza decae con la distancia: decláralo con el tramo
medido al lado («$r_\mathrm{P}$ = 17 m, extrapolado desde posiciones hasta 16 m»). La
norma también prevé oficinas en las que el STI nunca baja a 0,20 — «puede
resultar imposible determinar la distancia de privacidad si el STI > 0,20 en
todas las posiciones» — y eso es lo que significa aquí un `nan`, no un fallo. Un
STI *no decreciente* a lo largo de la línea suele indicar que la última posición
quedó cerca de una superficie reflectante, donde suben tanto el nivel como el
STI; el apartado 6.2 dice que se descarte esa posición de los ajustes de
$D_\mathrm{2,S}$ y $r_\mathrm{D}$ en lugar de darle vueltas.

El Anexo A de la ISO 3382-3 es informativo, pero fija los dos extremos de la
escala:

| Magnitud | Oficina mala típica | Objetivo bueno |
| :--- | :---: | :---: |
| $D_\mathrm{2,S}$ | < 5 dB | ≥ 7 dB |
| $L_{p,\mathrm{A,S},4\,\mathrm{m}}$ | > 50 dB | ≤ 48 dB |
| $r_\mathrm{D}$ | > 10 m | ≤ 5 m |

Esos intervalos son informativos, y las guías nacionales o el pliego del cliente
prevalecen sobre ellos. Lee $D_\mathrm{2,S}$ y $L_{p,\mathrm{A,S},4\,\mathrm{m}}$ **como una pareja**: la
tasa de decaimiento es una pendiente y el nivel a 4 m es su ordenada, así que
citar cualquiera de los dos por separado favorece o condena la sala.

$L_{p,\mathrm{A,B}}$ es la cuarta magnitud exigida y no es un adorno: el ruido de fondo
se mide en bandas de octava en todas las posiciones con la misma integración de
$\ge 10$ s, se pondera A y se promedia sobre la línea, y esa media es el
enmascarador frente al que se calcula el STI de cada posición. Promediarlo
espacialmente es lo que deja $r_\mathrm{D}$ y $r_\mathrm{P}$ sin ambigüedad. Es también la razón
de que el diseño de una oficina diáfana tenga dos palancas y no una
— **atenuación** (mamparas, techo absorbente, distribución: suben $D_\mathrm{2,S}$ y
bajan $L_{p,\mathrm{A,S},4\,\mathrm{m}}$) y **enmascaramiento** (subir el fondo para que el habla
pierda antes la inteligibilidad) — y de que la oficina se mida amueblada,
desocupada y con las instalaciones en marcha. Una oficina medida con la
ventilación o el sistema de enmascaramiento bajados devuelve un STI mayor en
todas las posiciones y desplaza las dos distancias metros hacia fuera sin que
nada haya cambiado en la sala.

```python

from phonometry import room

# Una línea de laboratorio: los niveles están construidos con 7 dB limpios por
# duplicación y el STI con una recta de -0,03 por metro, para que cada número
# impreso pueda comprobarse a mano. Una línea medida no es tan pulcra (ver abajo).
r = np.array([2.0, 4.0, 6.0, 8.0, 12.0, 16.0])       # distancias al hablante (m)
lp = 65.0 - 7.0 * np.log2(r)                          # nivel de habla ponderado A (dB)
sti = 0.70 - 0.03 * r                                 # STI por posición

m = room.open_plan_metrics(r, lp, sti)
print(round(m.d2s, 1), round(m.lp_as_4m, 1))         # 7.0 dB, 51.0 dB
print(round(m.rd, 1), round(m.rp, 1))                # 6.7 m, 16.7 m
m.plot()   # la regresión de decaimiento espacial de la figura de abajo
```

**Leer esta oficina.** $D_\mathrm{2,S}$ = 7,0 dB es exactamente el umbral de oficina
buena del Anexo A, pero $L_{p,\mathrm{A,S},4\,\mathrm{m}}$ = 51,0 dB queda por encima de la línea de
50 dB de oficina *mala*, y $r_\mathrm{D}$ se queda aun así en 6,7 m. Es una buena tasa de
decaimiento gastada desde un nivel de partida demasiado alto, así que la
corrección es atenuar **cerca del hablante** — una mampara, una isla acústica
sobre el puesto — y no ganar más decaimiento más lejos. Y una línea medida no se
parece a esta: las posiciones se dispersan en torno a la recta ajustada,
típicamente uno o dos decibelios, con las cercanas tiradas hacia arriba por el
campo directo y las lejanas aplanadas por el suelo de ruido de fondo. Lo que se
declara es la **regresión**, no ninguna posición suelta: $L_{p,\mathrm{A,S},4\,\mathrm{m}}$ se lee
sobre la recta aunque no hubiera ningún micrófono a 4 m, que es también la razón
de que se prefieran seis posiciones — cuatro apenas sujetan una pendiente en
cuanto hay que descartar una de ellas.

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

```python

from phonometry import room

r = np.array([2.0, 4.0, 6.0, 8.0, 12.0, 16.0])       # distancias al hablante (m)
lp = 65.0 - 7.0 * np.log2(r)                          # nivel de habla ponderado A (dB)
sti = 0.70 - 0.03 * r                                 # STI por posición
m = room.open_plan_metrics(r, lp, sti)

# En una línea: la regresión D2,S reconstruida con los campos del resultado,
# con los cruces rD / rP marcados (la figura superior añade además los puntos
# medidos y el eje de STI):
m.plot(language="es")
plt.show()
```

```python

from phonometry import room

r = np.array([2.0, 4.0, 6.0, 8.0, 12.0, 16.0])       # distancias al hablante (m)
lp = 65.0 - 7.0 * np.log2(r)                          # nivel de habla ponderado A (dB)
sti = 0.70 - 0.03 * r                                 # STI por posición
m = room.open_plan_metrics(r, lp, sti)

# Decaimiento espacial: Lp,A,S medido frente a la distancia en eje logarítmico,
# la regresión D2,S reconstruida con los campos del resultado, y el STI con los
# cruces rD / rP en un eje gemelo:
b = -m.d2s / np.log10(2.0)                 # pendiente de la regresión frente a lg(r)
a = m.lp_as_4m - b * np.log10(4.0)         # ordenada desde el nivel a 4 m
rr = np.logspace(np.log10(2.0), np.log10(16.0), 100)

fig, ax = plt.subplots()
ax.semilogx(r, lp, "o", label="Lp,A,S medido")
ax.semilogx(rr, a + b * np.log10(rr), "--", label=f"D2,S = {m.d2s:.1f} dB")
ax.plot(4.0, m.lp_as_4m, "D", label=f"Lp,A,S,4m = {m.lp_as_4m:.0f} dB")
ax.set_xlabel("Distancia al hablante r [m]")
ax.set_ylabel("Nivel de habla ponderado A [dB]")
ax.set_xlim(1.8, 20.0)

twin = ax.twinx()
twin.semilogx(r, sti, "s-", color="#2ca02c", label="STI")
twin.axvline(m.rd, ls=":", color="#2ca02c")
twin.axvline(m.rp, ls=":", color="#9467bd")
twin.annotate(f"rD = {m.rd:.1f} m", (m.rd, 0.52))
twin.annotate(f"rP = {m.rp:.1f} m", (m.rp, 0.22))
twin.set_ylabel("STI")
twin.set_ylim(0.0, 1.0)

lines, labels = ax.get_legend_handles_labels()
tl, tlab = twin.get_legend_handles_labels()
ax.legend(lines + tl, labels + tlab, loc="best")
plt.show()
```

</details>

Frente a la escala del Anexo A, esa única oficina queda entre dos salas muy
distintas:

*Los dos extremos del Anexo A sobre un mismo eje. La oficina tratada cumple los
tres objetivos; la sin tratar incumple los tres, y su distancia de privacidad
— 24 m leídos sobre una línea de 16 m — es exactamente la extrapolación de la que
se advertía arriba.*

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

```python

# `room` es el import del primer fragmento de arriba.

positions = np.array([2.0, 3.0, 4.0, 6.0, 8.0, 11.0, 16.0])
for d2s, lp_4m, sti_0, sti_slope in ((8.0, 47.0, 0.62, 0.0267),
                                     (4.0, 52.0, 0.75, 0.0227)):
    slope = -d2s / np.log10(2.0)
    levels = (lp_4m - slope * np.log10(4.0)) + slope * np.log10(positions)
    res = room.open_plan_metrics(positions, levels, sti_0 - sti_slope * positions)
    print(round(res.d2s, 1), round(res.lp_as_4m, 1),
          round(res.rd, 1), round(res.rp, 1))
    # 8.0 47.0 4.5 15.7   /   4.0 52.0 11.0 24.2
    plt.semilogx(positions, levels, "o--")
plt.show()
```

</details>

La propia línea merece una planta a escala. `plot_open_plan_geometry` dibuja
la fuente, la línea de micrófonos entre los puestos de trabajo y las dos
distancias sobre el eje, y un resultado que retuvo sus posiciones redibuja su
propia línea con `m.plot_geometry()`.

*Todas las magnitudes de ISO 3382-3 salen de esta única línea: seis
micrófonos de 2 m a 16 m entre los puestos de trabajo, con $r_\mathrm{D}$ y $r_\mathrm{P}$
cayendo entre ellos.*

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

```python

from phonometry import room

# La línea de 2-16 m del ejemplo, con las distancias de distracción y
# de privacidad marcadas sobre el eje.
room.plot_open_plan_geometry([2.0, 4.0, 6.0, 8.0, 12.0, 16.0],
                             rd=6.5, rp=13.0, language="es")
plt.show()

# Un resultado retiene sus posiciones, así que m.plot_geometry() dibuja
# su propia línea con los rD y rP de la regresión.
```

</details>

## Medir la línea

Los apartados 5.1 y 5.2 fijan todo lo que el dibujo de arriba deja implícito.

**La fuente (5.1.1).** Un altavoz **omnidireccional** radiando **ruido rosa**,
que cumpla los requisitos de omnidireccionalidad de la ISO 3382-1 — la norma es
explícita sobre el porqué: quien trabaja en una oficina diáfana no habla de forma
continua en ninguna dirección fija. Una señal determinista de espectro rosa (una
MLS o un barrido, adquiridos como en la
[guía de la respuesta al impulso](/phonometry/es/buildings/rooms/room-impulse-response/))
es un sustituto admitido, y los resultados se obtienen de la respuesta al
impulso. Su potencia acústica se verifica como en la ISO 3382-1, con la fuente a
1,2 m, y el apartado 6.2 fija el nivel: suficiente en cada banda de octava para
que el ruido rosa supere al fondo en **6 dB en la posición más lejana**.

**La cadena de recepción (5.1.2).** Un sonómetro que cumpla la **clase 1** de la
IEC 61672-1, un micrófono **omnidireccional** (incluido todo lo que se le acople)
y filtros de octava conformes a la **IEC 61260**. Si la señal se graba para
procesarla después, toda la cadena tiene que cumplir.

**El estado de la sala (5.2.1).** Se mide **amueblada**, sin nadie presente salvo
los operadores, y con la climatización y cualquier **sistema de enmascaramiento
funcionando a la potencia de un día de trabajo normal**. La norma enuncia el
fallo directamente: si las fuentes funcionan a potencia reducida, los valores de
STI salen demasiado altos, lo que sobrestima tanto $r_\mathrm{D}$ como $r_\mathrm{P}$. Y como no
hay personas, el enmascaramiento que aporta la conversación real tampoco está en
la medición, así que las distancias reales en uso son *más cortas* que las
medidas.

**La línea (5.2.2).** Cruza los puestos de trabajo y **no tiene por qué ser
recta**. Se prefieren **de 6 a 10** posiciones sucesivas y el mínimo es **4**, con
la primera en el **puesto más cercano**. La fuente y el micrófono se sitúan ambos
a la altura de la cabeza en un puesto, **1,2 m** sobre el suelo — los puestos de
trabajo de pie quedan fuera de alcance —, y al menos a **0,5 m de las mesas** y a
**2,0 m de las paredes y demás superficies reflectantes**. Se usan **al menos dos
posiciones de fuente**; si solo cabe una línea, se mide con dos fuentes emitiendo
en sentidos opuestos. Allí donde cambian el techo o el mobiliario, la oficina se
trata como **zonas** distintas, cada una con su propio juego de números únicos.

**Qué se registra en cada punto (5.2.3).** Cuatro cosas: el nivel de ruido rosa
por bandas de octava, el STI, el nivel de fondo por bandas de octava y la
distancia a la fuente — de **125 Hz a 8 kHz**, con un tiempo de integración de
**al menos 10 s** (más largo con un fondo no estacionario, como el tráfico).

**Por qué la ventana se detiene en 2 m y en 16 m.** El apartado 6.2 solo admite
en la regresión de $D_\mathrm{2,S}$ las posiciones entre 2 m y 16 m, y los dos extremos
tienen su razón. Más cerca de 2 m el receptor está en el campo directo del
hablante, cuyos 6 dB por duplicación son una propiedad del campo libre y no de la
oficina; más allá de 16 m el nivel de habla ha alcanzado normalmente el fondo, de
modo que la regresión estaría ajustando ruido. Una línea de seis posiciones de
2 m a 16 m mantiene así al menos cuatro puntos dentro del ajuste aunque haya que
descartar el último por estar cerca de una pared.

### Del ruido rosa medido a $L_{p,\mathrm{A,S},n}$

Un altavoz no es un hablante, así que ISO 3382-3 no usa nunca su nivel
directamente. El apartado 6.2 mide la *sala* con ruido rosa y después vuelve a
vestir el resultado con el espectro de una voz real. De cada posición no se
guarda su nivel absoluto, sino la atenuación banda a banda respecto a la fuente
a 1 m (Ec. 1-2), de modo que el nivel de salida del altavoz se cancela y solo
tiene que quedar lo bastante por encima del fondo:

$$
L_{p,\mathrm{Ls,1m},i} \approx L_{W,\mathrm{Ls},i} - 11\ \text{dB},
\qquad
D_{n,i} = L_{p,\mathrm{Ls,1m},i} - L_{p,\mathrm{Ls},n,i} .
$$

Esa atenuación se aplica después al espectro de habla de esfuerzo normal
(Ec. 3), se pondera A y se suma en energía sobre las siete bandas de octava
(Ec. 4):

$$
L_{p,\mathrm{S},n,i} = L_{p,\mathrm{S,1m},i} - D_{n,i},
\qquad
L_{p,\mathrm{A,S},n} = 10\log_{10}\sum_i 10^{(L_{p,\mathrm{S},n,i} + A_i)/10} .
$$

La Tabla 1 aporta el espectro omnidireccional de esfuerzo normal y las
ponderaciones A:

| Banda $i$ | $f$ [Hz] | $L_{p,\mathrm{S,1m},i}$ [dB] | $A_i$ [dB] |
| ---: | ---: | ---: | ---: |
| 1 | 125 | 49,9 | −16,1 |
| 2 | 250 | 54,3 | −8,6 |
| 3 | 500 | 58,0 | −3,2 |
| 4 | 1000 | 52,0 | 0,0 |
| 5 | 2000 | 44,8 | +1,2 |
| 6 | 4000 | 38,8 | +1,0 |
| 7 | 8000 | 33,5 | −1,1 |

cuyo total ponderado A es 57,4 dB: una voz que habla con normalidad a 1 m.

**La lectura ponderada A del ruido rosa en el sonómetro no es la entrada que
espera `open_plan_metrics`.** Meterla da un nivel absoluto que es el del
altavoz, no el de un hablante, así que $L_{p,\mathrm{A,S},4\,\mathrm{m}}$ sale directamente mal y
$D_\mathrm{2,S}$ queda sesgada por la diferencia espectral entre el ruido rosa y el
habla. Ejecuta antes la cadena de cuatro pasos:

```python

# `room` es el import del bloque de open_plan_metrics de arriba.

# Tabla 1 de ISO 3382-3: habla unisex de esfuerzo normal a 1 m, omnidireccional,
# y la ponderación A, bandas de octava de 125 Hz a 8 kHz.
speech_1m = np.array([49.9, 54.3, 58.0, 52.0, 44.8, 38.8, 33.5])
a_weight = np.array([-16.1, -8.6, -3.2, 0.0, 1.2, 1.0, -1.1])

# Niveles de ruido rosa medidos por banda de octava, una fila por posición de medición.
pink = np.array([
    [72.0, 71.0, 70.0, 69.0, 67.0, 64.0, 60.0],
    [67.0, 66.0, 64.5, 63.0, 60.5, 57.0, 52.5],
    [63.5, 62.0, 60.0, 58.0, 55.0, 51.0, 46.0],
    [60.0, 58.5, 56.0, 53.5, 50.0, 45.5, 40.0],
])
source_1m = np.full(7, 90.0) - 11.0        # Ec. (1): Lp,Ls,1m = Lw,Ls - 11 dB

d_n = source_1m - pink                     # Ec. (2): atenuación por banda
speech_n = speech_1m - d_n                 # Ec. (3): revestida de habla
lp_a_s = 10 * np.log10(np.sum(10 ** ((speech_n + a_weight) / 10), axis=1))
print(np.round(lp_a_s, 1))                 # [48.  42.4 37.8 33.8]  Ec. (4)

dist = np.array([2.0, 4.0, 8.0, 16.0])
chain = room.open_plan_metrics(dist, lp_a_s, 0.70 - 0.03 * dist)
print(round(chain.d2s, 1), round(chain.lp_as_4m, 1))     # 4.7 42.9
```

La aritmética de bandas en sí — ponderación A y suma en energía — es la misma
que en [Niveles](/phonometry/es/signals/levels/levels/).

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

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `positions_m` | array 1D | m | ≥ 4 posiciones, todas > 0 | Distancias fuente-receptor |
| `spl_a_speech` | array 1D | dB | misma longitud | Nivel de habla ponderado A $L_{p,\mathrm{A,S},n}$ por posición, procedente de la cadena de las Ec. (1)-(4) del apartado 6.2 — **no** los dB(A) de ruido rosa medidos |
| `sti_values` | array 1D | — | misma longitud | STI por posición (método completo de IEC 60268-16) |

Devuelve un `OpenPlanResult` con `d2s`, `lp_as_4m`, `rd` y `rp`; su
`.plot()` redibuja la regresión de decaimiento espacial del apartado 6.2 a
partir de esos cuatro campos y marca `rd` / `rp`.
`d2s`/`lp_as_4m` son `nan` si menos de dos posiciones caen en 2–16 m;
`rd`/`rp` son `nan` cuando el STI no decrece con la distancia. El STI por
posición puede medirse a su vez con las herramientas STIPA de la
[guía del índice de transmisión del habla](/phonometry/es/perception/speech/speech-transmission/).

## Informe ISO 3382-3 (`.report()`)

`OpenPlanResult.report(path)` renderiza una ficha PDF de una página con el
formato de un informe de medición de privacidad acústica en oficinas diáfanas:
la línea de base normativa, un bloque de cabecera de metadatos opcional, una tabla
compacta de las cuatro magnitudes que devuelve `open_plan_metrics` ($D_\mathrm{2,S}$,
$L_{p,\mathrm{A,S},4\,\mathrm{m}}$, la distancia de distracción $r_\mathrm{D}$ y la distancia de privacidad
$r_\mathrm{P}$) apilada sobre la gráfica de decaimiento espacial a todo el ancho del
resultado (`.plot()`, la regresión del apartado 6.2 en el eje logarítmico de
distancia con la lectura a 4 m y los cruces $r_\mathrm{D}$ / $r_\mathrm{P}$ marcados, la curva al
estilo de la Figura 3), el $D_\mathrm{2,S}$ enmarcado con las demás magnitudes al lado,
y un pie
con el descargo fijo. La ISO 3382-3 **caracteriza** un espacio en lugar de
definir un cumple/no cumple intrínseco, por lo que la fila de veredicto aparece solo
cuando se suministra una tasa de decaimiento espacial objetivo a través del
campo `requirement` de los metadatos (`ReportMetadata(requirement=...)`,
interpretada como el $D_\mathrm{2,S}$ mínimo aceptable en dB, según los intervalos de
calidad informativos del Anexo A donde un mayor decaimiento espacial es mejor;
la sala cumple igualando o superando el objetivo). Usa el mismo contenedor
`ReportMetadata` y el mismo motor de renderizado que la
[ficha de acústica de salas ISO
3382-1/-2](/phonometry/es/buildings/rooms/room-acoustics/#informe-iso-3382-report);
los
campos propios de oficinas diáfanas `area` (superficie del suelo),
`source_positions` y `receiver_positions` (el número de posiciones de medición)
rellenan la cabecera, junto con `client`, `test_room` (la oficina o zona),
`specimen` (la descripción y el estado de amueblamiento), `instrumentation`,
`temperature`, `relative_humidity`, `pressure`, `measurement_standard`,
`test_date`, `laboratory`, `operator`, `report_id` y `notes`. Al pasar
`metadata=None` se obtiene una ficha de caracterización simple. La ficha
incrusta la gráfica de decaimiento espacial, por lo que el renderizado necesita
tanto reportlab como matplotlib (`pip install "phonometry[report,plot]"`); solo
se admite `engine="reportlab"`. La ficha se renderiza en inglés por defecto; pasa
`language="es"` para una ficha en español (cadenas fijas traducidas y separador
decimal de coma).

```python

from phonometry import room, ReportMetadata

r = np.array([2.0, 3.0, 4.0, 6.0, 8.0, 11.0, 16.0])   # distancias al hablante (m)
# Otra línea de laboratorio, construida con 7 dB limpios por duplicación como
# antes; una medida se dispersa un decibelio o dos en torno al ajuste.
lp = 62.0 - 7.0 * np.log2(r)                           # nivel de habla ponderado A (dB)
sti = 0.65 - 0.03 * r                                  # STI por posición

result = room.open_plan_metrics(r, lp, sti)
result.report(
    "ficha_oficina_diafana.pdf",
    metadata=ReportMetadata(
        test_room="Oficina diáfana B",
        specimen="Amueblada, desocupada, con ruido de fondo",
        area=420.0, source_positions=2, receiver_positions=7,
        measurement_standard="ISO 3382-3",
        temperature=22.0, relative_humidity=45.0,
        laboratory="Laboratorio de referencia Phonometry",
        requirement=7.0,          # añade un veredicto frente a un D2,S objetivo
    ),
    language="es",
)                                 # D2,S + Lp,A,S,4m, rD, rP y la curva de decaimiento
```

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

## Ruido autogenerado por los ocupantes

La ISO 3382-3 de arriba **mide** una oficina. La pregunta complementaria en
fase de proyecto es una **predicción**: en una sala cuya única fuente de ruido
son sus propios ocupantes, ¿cuánto sube el fondo y sigue funcionando la
conversación? Long (*Architectural Acoustics* 2.ª ed., cap. 17, ecs. (17.50) a
(17.54)) plantea los dos niveles que compiten en el oyente. La señal es el
campo directo de la persona sentada enfrente,

$$
L_p(\text{señal}) = L_W + 10\log_{10}\!\left[\frac{Q}{4\pi r^2}\right],
$$

y el ruido es el campo reverberante que levantan $N$ hablantes simultáneos,

$$
L_p(\text{ruido}) = L_W + 10\log_{10} N + 10\log_{10}\!\left[\frac{4}{N A_\text{mesa}}\right],
$$

con $L_W$ el nivel de potencia acústica de un hablante (unos 70 dB en
conversación normal), $Q$ la directividad frontal del hablante (unos 2), $r$ la
distancia hablante-oyente y $A_\text{mesa}$ el área de absorción equivalente
**por mesa ocupada**, de modo que $N A_\text{mesa}$ es la absorción total de la
sala.

```python
from phonometry import room

# El restaurante duro de Long: unos 20 m² de absorción, un hablante con
# Lw = 70 dB y un oyente a 1,2 m al otro lado de la mesa.
print(round(room.speech_direct_level(1.2)))          # campo directo de 60 dB
print(round(room.crowd_noise_level(1, 20.0)))        # 63 dB con un hablante
print(round(room.crowd_noise_level(20, 20.0)))       # 76 dB con 20 mesas

# Un techo de alfa 0,9 sobre la sala de 13,7 x 13,7 m añade 170 m² de absorción.
print(round(room.crowd_noise_level(20, 20.0 + 170.0)))   # 66 dB
```

Restar ambos da la **relación habla-ruido**, y este es el resultado que merece
la pena recordar:

$$
L_\mathrm{SN} = 10\log_{10}\!\left[\frac{Q}{4\pi r^2}\right] + 10\log_{10}\!\left[\frac{A_\text{mesa}}{4}\right].
$$

No sobrevive ni $L_W$ ni $N$. Una sala más llena no es intrínsecamente peor,
porque cada mesa nueva aporta a la vez un hablante y su propia cuota de
absorción. Lo que decide si un restaurante funciona es la absorción **por
mesa**, no la absorción de la sala. Exigir $L_\mathrm{SN} > -6$ dB para una
comunicación adecuada a una separación $r_s$ a través de la mesa, y
$L_\mathrm{SN} < -9$ dB para que no se escuche a una mesa vecina situada a $r_t$, se
traduce en un par de cotas de diseño (ecs. (17.53) y (17.54)):

$$
A_\text{mesa} > 6,31\,r_s^2, \qquad A_\text{mesa} < 3,16\,r_t^2 \qquad (Q = 2).
$$

:::caution
**La primera constante está impresa como 6,33.** La forma cerrada de arriba,
con el mismo $Q = 2$ que da exactamente la segunda constante 3,16 del propio
Long, da 6,31, y su texto («6,3 metros cuadrados o más, 68 sq ft») equivale a
6,317 m². La biblioteca calcula ambas cotas a partir de la relación
habla-ruido en lugar de fijar ninguna constante, de modo que se mantienen
mutuamente coherentes; la errata queda recogida en el [registro de erratas](https://github.com/jmrplens/phonometry/blob/main/docs/ERRATA.md).
:::

```python
from phonometry import room

print(round(room.absorption_per_table(1.0, -6.0), 2))   # 6.31 m2 por mesa a 1 m
print(round(room.absorption_per_table(2.5, -9.0), 1))   # 19.8 m2 con paso de 2,5 m

# Una distribución real: 1,2 m a través de la mesa, 2,0 m hasta la siguiente.
print(round(room.absorption_per_table(1.2, -6.0), 2))   # 9.09 m2, cota inferior
print(round(room.absorption_per_table(2.0, -9.0), 2))   # 12.66 m2, cota superior

crowd = room.crowd_noise([20.0, 95.0, 190.0], distance=1.2)
crowd.plot()      # ruido autogenerado vs ocupación, frente al límite de -6 dB
```

Las dos cotas son una **ventana**, y puede estar vacía. Exigir
$6{,}31\,r_s^2 < A_\text{mesa} < 3{,}16\,r_t^2$ significa que la ventana solo
existe cuando $r_t/r_s > \sqrt{6{,}31/3{,}16} \approx 1{,}41$: junta las mesas más
que eso y no hay absorción alguna que permita conversar a través de tu propia
mesa sin que te oigan en la de al lado. La distribución de arriba pasa, con
$r_t/r_s = 1{,}67$ y 3,6 m² de margen entre las cotas.

*Izquierda: para una distribución, las dos desigualdades dejan una banda de
absorción por mesa factible. Derecha: cuánto mide esa banda a medida que las
mesas se separan — por debajo de $r_t/r_s = 1{,}41$ tiene anchura negativa, que es
el enunciado geométrico de que conversación y privacidad se han vuelto
incompatibles sea cual sea el material del techo.*

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

```python

# `room` es el import del bloque de arriba.

span = np.linspace(0.6, 3.2, 200)
plt.plot(span, room.absorption_per_table(span, -6.0), label="comunicación")
plt.plot(span, room.absorption_per_table(span, -9.0), label="privacidad")

r_s, r_t = 1.2, 2.0
lower = float(room.absorption_per_table(r_s, -6.0))
upper = float(room.absorption_per_table(r_t, -9.0))
plt.axhspan(lower, upper, alpha=0.2)
print(round(upper - lower, 1), round(r_t / r_s, 2))     # 3.6 1.67
print(round(float(np.sqrt(6.31 / 3.16)), 2))            # 1.41: la razón de cierre
plt.legend(); plt.show()
```

</details>

**De dónde sale el propio $A_\text{mesa}$.** Para una sala que ya existe, mide el
tiempo de reverberación según la ISO 3382-2 e invierte Sabine, $A = 0{,}161\,V/T$
— la misma convención que define la ISO 354 —, con las guías de
[respuesta al impulso](/phonometry/es/buildings/rooms/room-impulse-response/)
y [Acústica de salas](/phonometry/es/buildings/rooms/room-acoustics/)
aportando $T$. Para una sala en proyecto, mídela superficie a superficie como en
[Absorción acústica en recintos](/phonometry/es/buildings/rooms/enclosed-space-absorption/).
En cualquiera de los dos casos $A_\text{mesa} = A/N$, con $N$ el número de mesas
**ocupadas simultáneamente** — no los comensales, y no las mesas instaladas. Eso
es lo que hace que un restaurante a media entrada sea una sala distinta de uno
lleno con la misma absorción, y es la razón de que añadir mesas con la absorción
fija sea lo que empuja una sala más allá de su límite. Significa también que un
T30 medido con la sala vacía basta para predecir cómo sonará llena.

*Los mismos 20 hablantes en tres salas. La sala dura (20 m² de absorción)
cruza el límite de comunicación antes de que se ocupe la cuarta mesa; añadir
el techo absorbente del ejemplo de Long (190 m² en total) mantiene las 20
mesas por debajo. Las curvas son paralelas porque la ocupación siempre cuesta
$10\log_{10} N$: la única variable de diseño es el desplazamiento vertical, que es
la absorción.*

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

```python

from phonometry import room

# Una línea: el barrido de ocupación directamente desde el resultado.
result = room.crowd_noise([20.0, 95.0, 190.0], distance=1.2)
result.plot()
plt.show()

# O dibujarlo a mano desde la ecuación (17.51):
n = np.arange(1, 21)
fig, ax = plt.subplots()
for area in (20.0, 95.0, 190.0):
    ax.plot(n, room.crowd_noise_level(n, area), label=f"A = {area:.0f} m²")
signal = room.speech_direct_level(1.2)
ax.axhline(signal, ls="--", label="Habla a 1,2 m")
ax.axhline(signal + 6.0, ls=":", label="Límite de comunicación")
ax.set(xlabel="Hablantes simultáneos N",
       ylabel="Nivel de ruido autogenerado [dB]")
ax.legend()
plt.show()
```

</details>

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

| Parámetro | Tipo | Unidades | Rango / defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `absorption_areas` | float o array 1D | m² | > 0 | Áreas de absorción total de la sala a comparar |
| `talkers` | array 1D, opcional | — | ≥ 1, defecto 1..20 | Eje de ocupación $N$ |
| `distance` | float | m | > 0, defecto 1,2 | Distancia hablante-oyente $r$ |
| `sound_power_level` | float | dB re 1 pW | defecto 70 | $L_W$ del hablante |
| `directivity` | float | — | > 0, defecto 2 | $Q$ del hablante |

Devuelve un `CrowdNoiseResult` (`talkers`, `absorption_areas`, `levels`,
`signal_level`, `communication_level`, `speech_to_noise()`) con `.plot()`.
Las piezas `speech_direct_level`, `crowd_noise_level`, `speech_to_noise_ratio`
y `absorption_per_table` son invocables directamente.

## Qué cubre esta guía

Las magnitudes de oficina diáfana del apartado 4 y los apartados 6.2/6.3 de la
ISO 3382-3:2012 ($D_\mathrm{2,S}$, $L_{p,\mathrm{A,S},4\,\mathrm{m}}$, $r_\mathrm{D}$, $r_\mathrm{P}$) de
`room.open_plan_metrics`, con el dibujo a escala de la línea de medición
(`room.plot_open_plan_geometry` y `.plot_geometry()`) y la ficha ISO 3382-3 de
una página con `.report()`. Las condiciones de medición de los apartados 5.1 y
5.2 y los intervalos de calidad del Anexo A se citan aquí para planificar y
para leer los resultados. El modelo de ruido autogenerado por los ocupantes
del capítulo 17 de *Architectural Acoustics* 2.ª ed. de Long (ecs. (17.50) a
(17.54)) mediante `room.crowd_noise` y sus piezas, con la ventana de diseño de
las ecs. (17.53)-(17.54) y su condición de cierre.

El STI por posición de la ISO 3382-3 se toma como entrada de
`open_plan_metrics` en lugar de calcularse dentro de la función: mídelo con
las herramientas STIPA de la [guía del Índice de transmisión del
habla](/phonometry/es/perception/speech/speech-transmission/). La cuarta
magnitud de número único exigida, el ruido de fondo medio ponderado A
$L_{p,\mathrm{A,B}}$, tampoco se calcula aquí: es la media energética ponderada A de
los niveles de fondo por banda de octava de cada posición, y le corresponde ir
en el informe junto a las tres que sí produce esta página. Tampoco **se
comprueba** ninguna de las condiciones de medición de los apartados 5.1 y 5.2:
la función consume distancias, niveles y valores de STI vengan de donde
vengan, así que la directividad de la fuente, el estado amueblado y desocupado
y la captura del ruido de fondo son responsabilidad del operador y no de la
biblioteca. La edición implementada está fijada en la ISO 3382-3:2012; la
revisión sucesora ISO 3382-3:2022 retira la distancia de privacidad $r_\mathrm{P}$,
añade la distancia de confort $r_\mathrm{C}$ y traslada el STI por posición al método
indirecto de la IEC 60268-16, y no es la comprobada aquí. El modelo de ruido
autogenerado es un cálculo de *diseño* y deliberadamente no modela el reflejo
de Lombard: se cancela en $L_\mathrm{SN}$ mientras todo el mundo alce la voz por
igual, de modo que el modelo explica por qué el nivel se dispara en una sala
dura, no dónde se detiene. Supone además un campo reverberante difuso y una
única cifra de absorción por mesa, así que no dice nada de las mamparas, la
absorción local ni de dónde está cada mesa dentro de la sala.

## Véase también

- [Acústica de salas](/phonometry/es/buildings/rooms/room-acoustics/): los parámetros
  de decaimiento ISO 3382-1/2 de la misma sala.
- [Medición de la respuesta al impulso](/phonometry/es/buildings/rooms/room-impulse-response/):
  la adquisición tras los niveles por posición.
- [Índice de transmisión del habla](/phonometry/es/perception/speech/speech-transmission/):
  la medición STI/STIPA que alimenta los `sti_values` por posición.
- [Índice de inteligibilidad del habla](/phonometry/es/perception/speech/speech-intelligibility/):
  la mirada de ANSI S3.5 a la misma pregunta de inteligibilidad.
- [Niveles](/phonometry/es/signals/levels/levels/): los niveles ponderados A tras el
  decaimiento espacial.
- [Teoría](/phonometry/es/reference/theory/rooms-buildings/): las
  derivaciones de acústica de salas en las que se apoya esta página.
- Referencia de la API: [`room.open_plan`](/phonometry/es/reference/api/rooms/open-plan/).
- Teoría: [Respuesta al impulso y parámetros de acústica de salas](/phonometry/es/reference/theory/rooms-buildings/#respuesta-al-impulso-y-parámetros-de-acústica-de-salas-iso-18233-iso-3382-1-2-3): la teoría de decaimiento y absorción frente a la que se mide la distancia de distracción de ISO 3382-3.
