<!-- canonical: https://jmrplens.github.io/phonometry/es/environment/sources/cnossos-road-emission/ -->
Source: https://jmrplens.github.io/phonometry/es/environment/sources/cnossos-road-emission/

Todo mapa estratégico de ruido trazado en la Unión Europea desde 2021 parte de
los mismos dos números: cuánto ruido hace un vehículo en cada banda de octava y
cuántos pasan por hora. El **Anexo II de la Directiva 2002/49/CE**, sustituido
por los métodos CNOSSOS-EU, los convierte en una **potencia acústica direccional
por metro de línea fuente**, que la etapa de propagación lleva luego hasta el
receptor.

Esta guía cubre la fuente viaria, el apartado 2.2 del Anexo II con la base de
coeficientes del Apéndice F. La fuente ferroviaria (2.3, Apéndice G) y el modelo
de propagación CNOSSOS-EU (2.5) van aparte.

## 1. Qué texto está implementado

El Anexo II es un blanco móvil y equivocarse en la superposición de instrumentos
es la forma más fácil de publicar una tabla incorrecta. Hay tres en juego:

| Instrumento | Qué le hace a la fuente viaria |
| :--- | :--- |
| Directiva (UE) **2015/996** de la Comisión | Sustituye el Anexo II completo. Aporta las fórmulas 2.2.1 a 2.2.20 y las Tablas F-1 a F-4. |
| **Corrección de errores** del DO L 5, 10.1.2018 | Corrige el 2.2.1: las potencias acústicas se calculan "para cada banda de octava de **63 Hz a 8 kHz**", no de 125 Hz a 4 kHz como imprimía el texto original. El Apéndice F siempre cubrió de 63 Hz a 8 kHz, así que el texto sin corregir contradecía sus propias tablas. |
| Directiva Delegada (UE) **2021/1226** de la Comisión | Sustituye por completo la **Tabla F-1** y la **Tabla F-4**, funde en una sola las antiguas filas 4a y 4b de la Tabla F-4 e imprime la ponderación A por bandas de octava que se usa en 2.5.5. |

La biblioteca implementa el resultado consolidado. Las Tablas F-2 (neumáticos
con clavos) y F-3 (cruces) nunca se han modificado. La modificación de 2021 no
es cosmética: la fuente viaria vigente es unos **2,5 a 3,5 dB(A) más ruidosa**
que la publicada en 2015, así que toda comparación con bibliografía anterior a
2021 arrastra ese desfase.

## 2. La fuente y la línea fuente

Cada vehículo es una **fuente puntual a 0,05 m sobre el pavimento**, que radia
uniformemente; la primera reflexión en la calzada ya está dentro de la potencia
acústica, y por eso el método la llama magnitud de semicampo libre. Un flujo de
tráfico es una **línea fuente** incoherente, idealmente una por carril en el eje
del carril.

Para cada categoría de vehículo $m$ y banda de octava $i$, la fórmula (2.2.1)
convierte la potencia acústica de un vehículo en potencia por metro de línea:

$$
L'_{W,\mathrm{eq,line},i,m} = L_{W,i,m} + 10\,\log_{10}\!\left(\frac{Q_m}{1000\,v_m}\right),
$$

con $Q_m$ en vehículos por hora y $v_m$ en km/h. La potencia del vehículo es a
su vez la suma energética de un término de **rodadura** y otro de **propulsión**
(2.2.2), salvo para los vehículos de dos ruedas de la categoría 4, que no tienen
rodadura alguna y se quedan solo con la propulsión (2.2.3):

$$
L_{W,i,m} = 10\,\log_{10}\!\left(10^{L_{W\mathrm{R},i,m}/10} + 10^{L_{W\mathrm{P},i,m}/10}\right).
$$

La Tabla [2.2.a] define cinco categorías de vehículo: **1** vehículos ligeros,
**2** vehículos pesados medios, **3** vehículos pesados, **4** vehículos de dos
ruedas a motor y **5** la categoría «abierta», reservada para tipos de vehículo
todavía sin definir. La categoría 4 se divide en las subclases **4a**
ciclomotores y **4b** motocicletas, que circulan en modos de conducción muy
distintos, de modo que la base de coeficientes lleva cinco filas: 1, 2, 3, 4a y
4b. Las cuatro primeras categorías son obligatorias y la 5 es opcional; no tiene
coeficientes en el Apéndice F y aquí no se modeliza.

*Los vehículos ligeros llevan el grueso del flujo, pero 45 pesados por hora se
imponen igualmente en las frecuencias medias: el espectro por metro enseña
exactamente dónde manda cada categoría.*

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

```python

from phonometry import (
    JunctionType, RoadSurface, RoadTraffic, RoadVehicleCategory, road_source_power,
)

traffic = [
    RoadTraffic(RoadVehicleCategory.LIGHT, 1200.0, 50.0),
    RoadTraffic(RoadVehicleCategory.MEDIUM_HEAVY, 90.0, 50.0),
    RoadTraffic(RoadVehicleCategory.HEAVY, 45.0, 50.0),
    RoadTraffic(RoadVehicleCategory.MOTORCYCLES, 60.0, 50.0),
]
result = road_source_power(
    traffic, surface=RoadSurface.THIN_LAYER_A, temperature=12.0, gradient=3.0,
    junction_distance=60.0, junction_type=JunctionType.CROSSING,
)
print(result.total_line_power.round(1))
# [89.1 82.7 81.3 80.2 80.4 76.2 71.7 66. ]  dB re 1 pW por metro de línea
print(round(float(result.a_weighted_line_power), 1))     # 84.2 dB(A) por metro
result.plot()
plt.show()
```

</details>

**Cuánto vale una fuente viaria.** Esta arteria urbana, 1 200 vehículos ligeros,
90 pesados medios, 45 pesados y 60 motocicletas por hora a 50 km/h, sale a
**84,2 dB(A) por metro de línea**; el enlace de autopista en circulación libre de
la sección 6 (1 000 ligeros y 120 pesados por hora a 90 y 80 km/h) llega a
**88,6 dB(A) por metro**. Esas son las dos magnitudes contra las que contrastar
un resultado propio. La aritmética que hay detrás merece retenerse: duplicar el
flujo suma exactamente 3 dB, mientras que reducir a la mitad la velocidad suma
3 dB al término de flujo $10\log_{10}(Q/1000v)$ y resta del término de rodadura,
de modo que ambos se cancelan en parte y un enlace urbano queda solo unos pocos
decibelios por debajo de uno de autopista. El espectro dice qué mecanismo manda:
la autopista tiene su máximo en 1 kHz porque lleva la rodadura, y la arteria tiene
su máximo en 63 Hz y se mantiene más plana, porque a 50 km/h con vehículos pesados
y un cruce a 60 m ha tomado el mando el término de propulsión. La comprobación
que puede hacer cualquier lector sobre las dos: `a_weighted_line_power` tiene que
coincidir con la suma energética ponderada A de los valores por banda impresos,
usando la `CNOSSOS_A_WEIGHTING` por bandas de octava de la sección 6.

### De dónde sale cada dato de entrada

Todos los argumentos de `road_source_power` son magnitudes *definidas* en el
Anexo II, y equivocarse en uno es un error silencioso: la llamada funciona y el
mapa queda desviado varios decibelios. De aquí se lee cada uno.

| Argumento | Qué significa | De dónde se lee | La trampa |
| :--- | :--- | :--- | :--- |
| `RoadTraffic.flow_rate` ($Q_m$) | Vehículos de la categoría $m$ por hora | Promedio anual por hora, por periodo temporal (día / tarde / noche), por clase de vehículo y **por línea fuente**, a partir de aforos o de un modelo de tráfico (2.2.1) | Un aforo de hora punta. $Q$ es un promedio anual del periodo, que es lo que convierte el resultado en un ingrediente del $L_\mathrm{den}$ |
| `RoadTraffic.speed` ($v_m$) | Velocidad representativa de la categoría $m$ | En la mayoría de los casos, la **menor** entre el máximo legal del tramo de vía y el máximo legal de la categoría de vehículo; donde no haya datos de medida locales, el máximo legal de la categoría (2.2.1) | Suponer que hace falta una media medida. No hace falta: el valor por defecto de la norma *es* el límite legal, y los vehículos pesados suelen tener uno más bajo que el del tramo |
| `temperature` ($\tau$) | Temperatura del aire | La temperatura del aire **promedio anual** del periodo, a partir de datos meteorológicos de largo plazo (2.2.10) | El valor del día de la campaña. Con $K_1 = 0{,}08$ dB/°C, una media anual de 12 °C frente a una tarde de 20 °C son 0,6 dB en el término de rodadura de los ligeros |
| `RoadTraffic.studded_fraction`, `studded_months` ($Q_{\mathrm{stud,ratio}}$, $T_\mathrm{s}$) | Cuota de flota y temporada | La proporción media de vehículos ligeros por hora con neumáticos con clavos **durante** los meses en que los llevan, y el número de esos meses; el propio método forma $p_\mathrm{s} = Q_{\mathrm{stud,ratio}}\,T_\mathrm{s}/12$ (2.2.7) | Pasar la cuota promediada al año, que aplica $T_\mathrm{s}/12$ dos veces |
| `junction_distance` ($x$) | Distancia al cruce | Medida a lo largo de la vía desde la fuente puntual hasta la **intersección más próxima de esta línea fuente con otra línea fuente** (2.2.5) | Medir hasta la línea de detención o hasta el bordillo. Es el cruce de líneas, y solo afectan los últimos 100 m |
| `junction_type` ($k$) | 1 cruce con semáforo, 2 glorieta | La regulación del cruce, no su forma | Un cruce con prioridad no es ninguno de los dos: la corrección está definida para semáforos y glorietas |
| `gradient` ($s$) | Pendiente longitudinal con signo, % | El modelo del terreno a lo largo de la línea fuente, saturando en ±12 % | Aplicar un solo signo a un flujo bidireccional. La norma exige partir el flujo por la mitad y corregir una mitad en subida y la otra en bajada |
| `surface` | Tipo de pavimento | El inventario de firmes, emparejado con una fila de la Tabla F-4 **y su rango de velocidad declarado** | Usar una fila fuera de su rango de validez |
| geometría | Línea fuente y receptor | Una línea por carril en el centro del carril (también se admite una línea por calzada, o una para una vía de doble sentido), con la fuente puntual a 0,05 m sobre el pavimento; los puntos receptores de la Directiva están a 4 m del suelo | Situar la fuente en el bordillo, o a la altura de la carrocería |

Dos consecuencias que conviene enunciar sin rodeos. La primera, que la
temperatura tiene que pertenecer al *mismo* periodo que $Q$ y $v$: un flujo de
noche emparejado con una media anual de temperatura y una velocidad de noche es
lo que convierte la potencia de línea resultante en un ingrediente del $L_\mathrm{den}$
y no en una instantánea de una tarde. La segunda, que la línea fuente es un
objeto de modelado y no una marca vial: moverla del centro del carril al bordillo
cambia todas las distancias de propagación aguas abajo.

## 3. Ruido de rodadura (2.2.4 a 2.2.10)

El ruido de rodadura es el ruido neumático-calzada. Crece logarítmicamente con
la velocidad a partir de la velocidad de referencia
$v_\mathrm{ref} = 70\ \text{km/h}$:

$$
L_{W\mathrm{R},i,m} = A_{\mathrm{R},i,m} + B_{\mathrm{R},i,m}\,\log_{10}\!\left(\frac{v_m}{v_\mathrm{ref}}\right)
             + \Delta L_{W\mathrm{R},i,m},
$$

donde la corrección reúne cuatro efectos independientes (2.2.5): el pavimento,
los neumáticos con clavos, el cruce y la temperatura del aire.

La **temperatura del aire** (2.2.10) es una recta, aplicada por igual a las ocho
bandas: $\Delta L_{W,\mathrm{temp}} = K_m\,(20\ \text{°C} - \tau)$, con
$K_1 = 0{,}08\ \text{dB/°C}$ para los ligeros y
$K_2 = K_3 = 0{,}04\ \text{dB/°C}$ para las dos categorías pesadas. El aire frío endurece
los neumáticos y hace más ruidosa la calzada, así que la corrección es
*positiva* por debajo de 20 °C.

Los **neumáticos con clavos** (2.2.6 a 2.2.9) solo se aplican a la categoría 1.
El exceso por neumático $D_{\mathrm{stud},i}(v)$ se satura por debajo de
50 km/h y por encima de 90 km/h, y la corrección de parque lo pondera por la
fracción del año en que los clavos están en circulación,
$p_\mathrm{s} = Q_{\mathrm{stud,ratio}} \cdot T_\mathrm{s}/12$:

$$
\Delta L_{\mathrm{studded},i} = 10\,\log_{10}\!\left[(1 - p_\mathrm{s}) + p_\mathrm{s}\,10^{D_{\mathrm{stud},i}/10}\right].
$$

Los **cruces** (2.2.17, 2.2.18) suman el mismo decaimiento lineal a los dos
términos: $\Delta L_{W\mathrm{R,acc}} = C_{\mathrm{R},m,k}\cdot\max(1 - |x|/100,\ 0)$ para
el ruido de rodadura y
$\Delta L_{W\mathrm{P,acc}} = C_{\mathrm{P},m,k}\cdot\max(1 - |x|/100,\ 0)$ para el de
propulsión, con $x$ la distancia en metros de la fuente puntual a la intersección
más próxima de su línea fuente con otra línea fuente, y $k$ el tipo de cruce: 1
para un cruce regulado por semáforo y 2 para una glorieta. Los dos se atribuyen
por igual a todas las bandas de octava. Los coeficientes de rodadura $C_\mathrm{R}$ son
*negativos* (el tráfico junto a un cruce va más despacio) y los de propulsión
$C_\mathrm{P}$ positivos (va acelerando), y la norma declara explícitamente que los dos
son nulos a partir de $|x| \ge 100$ m.

*Las tres correcciones de esta sección, cada una dibujada como lo que de verdad
le hace a la potencia de línea. El término de temperatura es el único exactamente
lineal y el único que cambia de signo; el de clavos es una banda saturante entre
50 y 90 km/h; y el de cruce no es monótono, porque el coeficiente negativo de
rodadura y el positivo de propulsión decaen a la vez: en un cruce con semáforo la
reducción más profunda está en torno a 50 m, no en el propio cruce.*

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

```python

# `road_source_power`, `RoadTraffic`, `RoadVehicleCategory` y `JunctionType`
# los importa el fragmento de la figura de arriba.
def a_line(**kwargs):
    return float(road_source_power(**kwargs).a_weighted_line_power)

ligeros = [RoadTraffic(RoadVehicleCategory.LIGHT, 1000.0, 50.0)]
pesados = [RoadTraffic(RoadVehicleCategory.HEAVY, 1000.0, 50.0)]
temps = np.linspace(-10.0, 40.0, 60)
fig, (t_ax, s_ax, j_ax) = plt.subplots(1, 3, figsize=(13, 4.2))
for flujo, name in [(ligeros, "Ligeros (1)"), (pesados, "Pesados (3)")]:
    ref = a_line(traffic=flujo)
    t_ax.plot(temps, [a_line(traffic=flujo, temperature=t) - ref for t in temps],
              label=name)
t_ax.set(xlabel="Temperatura del aire tau [°C]",
         ylabel="Cambio en la potencia de línea [dB(A)]")
t_ax.legend()

velocidades = np.linspace(20.0, 130.0, 60)
for share in (0.2, 0.5):
    s_ax.plot(velocidades, [
        a_line(traffic=[RoadTraffic(RoadVehicleCategory.LIGHT, 1000.0, v,
                                    studded_fraction=share)],
               studded_months=4.0)
        - a_line(traffic=[RoadTraffic(RoadVehicleCategory.LIGHT, 1000.0, v)])
        for v in velocidades], label=f"Qstud,ratio = {share:g}, Ts = 4 meses")
s_ax.set(xlabel="Velocidad v [km/h]",
         ylabel="Cambio en la potencia de línea [dB(A)]")
s_ax.legend(fontsize="small")

xs = np.linspace(0.0, 120.0, 60)
ref = a_line(traffic=ligeros)
for junction, name in [(JunctionType.CROSSING, "Cruce con semáforo"),
                       (JunctionType.ROUNDABOUT, "Glorieta")]:
    j_ax.plot(xs, [a_line(traffic=ligeros, junction_distance=float(x),
                          junction_type=junction) - ref for x in xs], label=name)
j_ax.set(xlabel="Distancia al cruce |x| [m]",
         ylabel="Cambio en la potencia de línea [dB(A)]")
j_ax.legend(fontsize="small")
plt.show()
```

</details>

## 4. Ruido de propulsión (2.2.11 a 2.2.16)

El ruido de propulsión es el del grupo motopropulsor: motor, escape, transmisión
y admisión. Es **lineal** con la velocidad, no logarítmico, porque a baja
velocidad el motor trabaja más por unidad de distancia recorrida:

$$
L_{W\mathrm{P},i,m} = A_{\mathrm{P},i,m} + B_{\mathrm{P},i,m}\,\frac{v_m - v_\mathrm{ref}}{v_\mathrm{ref}}
             + \Delta L_{W\mathrm{P},i,m}.
$$

Dónde se cruzan las dos leyes de velocidad es lo que da a la fuente viaria su
comportamiento: por debajo del cruce la fuente es un motor, por encima es un
neumático.

*Un vehículo ligero está dominado por el neumático desde unos 25 km/h; uno
pesado solo a partir de unos 60 km/h, y por eso un camión sigue siendo un motor
a velocidades urbanas.*

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

```python

from phonometry import (
    CNOSSOS_A_WEIGHTING, road_propulsion_noise, road_rolling_noise,
    road_vehicle_sound_power,
)

weights = np.asarray(CNOSSOS_A_WEIGHTING)
a_weighted = lambda bands: 10.0 * np.log10(np.sum(10.0 ** ((bands + weights) / 10.0)))

speeds = np.linspace(20.0, 130.0, 221)
fig, ax = plt.subplots()
for category, name in [("1", "Vehículos ligeros (1)"), ("3", "Vehículos pesados (3)")]:
    rolling = [a_weighted(road_rolling_noise(category, v)) for v in speeds]
    propulsion = [a_weighted(road_propulsion_noise(category, v)) for v in speeds]
    total = [a_weighted(road_vehicle_sound_power(category, v)) for v in speeds]
    ax.plot(speeds, total, lw=2.4, label=f"{name} - total")
    ax.plot(speeds, rolling, ls="--", lw=1.2, label=f"{name} - rodadura")
    ax.plot(speeds, propulsion, ls=":", lw=1.2, label=f"{name} - propulsión")
ax.set_xlabel("Velocidad v [km/h]")
ax.set_ylabel("Potencia acústica ponderada A [dB(A) re 1 pW]")
ax.legend(fontsize="small")
plt.show()
```

</details>

La **pendiente de la vía** (2.2.13 a 2.2.16) es la única corrección cuya forma
publicada es genuinamente asimétrica, y la asimetría no es un desliz de
transcripción. Para los ligeros la rama de bajada **no lleva factor de
velocidad**, mientras que las dos categorías pesadas sí lo llevan y con
desplazamientos de velocidad distintos:

| Categoría | Bajada ($s$ por debajo del codo) | Banda plana | Subida |
| :--- | :--- | :--- | :--- |
| 1 | $(\min(12\ \%, -s) - 6\ \%)/1\ \%$ | −6 % a 2 % | $(\min(12\ \%, s) - 2\ \%)/1{,}5\ \% \cdot v/100$ |
| 2 | $(\min(12\ \%, -s) - 4\ \%)/0{,}7\ \% \cdot (v - 20)/100$ | −4 % a 0 % | $\min(12\ \%, s)/1\ \% \cdot v/100$ |
| 3 | $(\min(12\ \%, -s) - 4\ \%)/0{,}5\ \% \cdot (v - 10)/100$ | −4 % a 0 % | $\min(12\ \%, s)/0{,}8\ \% \cdot v/100$ |

La categoría 4 no lleva corrección por pendiente. La pendiente se satura en el
12 % en ambos sentidos. El ruido de bajada viene del freno motor y el de subida
de la carga, así que las dos ramas son positivas. Para un flujo bidireccional,
divide el flujo en dos y corrige una mitad en subida y la otra en bajada.

*La asimetría es una forma, no una errata. Cada categoría tiene su propia banda
plana (de −6 % a +2 % para los ligeros, de −4 % a 0 % para las dos clases de
pesados), cada una satura en ±12 %, y las dos ramas suben: en bajada el motor
frena y en subida trabaja. A 80 km/h un descenso del 14 % vale 6,0 dB(A) a un
vehículo ligero y 11,2 dB(A) a uno pesado, mientras que la misma subida vale 5,3
y 12,0 dB(A), y la rama de bajada de los ligeros es la única de las seis que no
escala con la velocidad.*

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

```python

# `road_propulsion_noise` y `CNOSSOS_A_WEIGHTING` los importa el fragmento de la
# figura de las leyes de velocidad de más arriba.
weights = np.asarray(CNOSSOS_A_WEIGHTING)
a_weighted = lambda bands: 10.0 * np.log10(np.sum(10.0 ** ((bands + weights) / 10.0)))

pendientes = np.linspace(-14.0, 14.0, 141)
fig, ax = plt.subplots()
for category in ("1", "2", "3"):
    for speed, style in [(50.0, "--"), (80.0, "-")]:
        plano = a_weighted(road_propulsion_noise(category, speed))
        ax.plot(pendientes,
                [a_weighted(road_propulsion_noise(category, speed, gradient=s)) - plano
                 for s in pendientes], style, label=f"Categoría {category}, {speed:g} km/h")
ax.set_xlabel("Pendiente de la vía s [%]")
ax.set_ylabel("Corrección del ruido de propulsión [dB(A)]")
ax.legend(fontsize="small")
plt.show()
```

</details>

**Por debajo de 20 km/h el vehículo deja de hacerse más silencioso.** El apartado
2.2.1 declara, después tanto de la (2.2.2) como de la (2.2.3), que para
velocidades inferiores a 20 km/h la potencia acústica toma su valor de 20 km/h:
las regresiones tabuladas se ajustaron sobre tráfico en circulación libre y no se
extrapolan a una cola. El término de flujo conserva la velocidad *real*, así que
las dos mitades de la (2.2.1) tiran en sentidos opuestos y la potencia de línea
tiene un mínimo. Para 1 000 vehículos ligeros por hora sobre el pavimento de
referencia, `road_source_power` devuelve 81,5 dB(A) por metro a 50 km/h, **76,2 a
20 km/h**, 79,2 a 10 km/h y 82,2 a 5 km/h: la misma vía se vuelve *más ruidosa*
por metro a medida que la corriente se frena por debajo de ese mínimo,
simplemente porque hay más vehículos en cada metro de ella. Un lector que no
conozca ese mínimo no puede distinguir eso de un efecto de congestión
modelizado.

Conviene decir, por tanto, qué no representa el modelo: los ciclos de aceleración
y frenado, el ralentí en una cola y el ruido de propulsión de la conducción de
parada y arranque, para lo que la corrección por cruce sobre los últimos 100 m es
un sustituto deliberadamente grosero. Los tramos congestionados se modelizan
normalmente a su velocidad media de recorrido con esa corrección aplicada.

## 5. El pavimento (2.2.19, 2.2.20 y Tabla F-4)

La Tabla F-4 da, para el pavimento de referencia y para cada uno de los catorce
pavimentos con nombre, un coeficiente por banda de octava $\alpha$ y un
coeficiente de velocidad $\beta$, por categoría de vehículo, con el rango de
velocidad en que la fila se declara válida. El
pavimento entra de forma distinta en cada término:

$$
\Delta L_{W\mathrm{R,road},i,m} = \alpha_{i,m} + \beta_m\,\log_{10}\!\left(\frac{v_m}{v_\mathrm{ref}}\right),
\qquad
\Delta L_{W\mathrm{P,road},i,m} = \min\{\alpha_{i,m};\,0\}.
$$

Un pavimento absorbente reduce el ruido de propulsión; uno ruidoso no lo
aumenta. Esa asimetría es deliberada: la calzada puede absorber el sonido del
motor que se radia hacia ella, pero una textura rugosa solo genera ruido de
neumático, y el ruido de neumático ya es el término de rodadura.

```python
from phonometry import RoadSurface, road_surface_coefficients

row = road_surface_coefficients(RoadSurface.TWO_LAYER_ZOAB_FINE)
row.speed_range          # (80.0, 130.0) km/h, el rango de validez impreso
row.alpha["1"]           # alpha por banda de octava para vehículos ligeros
row.beta["1"]            # -0.1, el coeficiente de velocidad
```

*El pavimento de referencia es la línea cero, así que cada curva se lee
directamente como «más ruidoso o más silencioso que la referencia de CNOSSOS»: la
mezcla bituminosa porosa de doble capa queda 6,3 dB por debajo a 1 kHz, y los
elementos rígidos no colocados en espina de pez quedan 31,4 dB por encima a
63 Hz. El rango de velocidad declarado que aparece en la leyenda forma parte de
la fila: una mezcla porosa validada de 80 a 130 km/h no es un juego de
coeficientes para una calle de 30 km/h, la fila de referencia es la única sin
rango, y el método no ofrece interpolación entre filas.*

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

```python

# `RoadSurface` y `road_surface_coefficients` se importan justo arriba.
bands = np.array([63.0, 125.0, 250.0, 500.0, 1000.0, 2000.0, 4000.0, 8000.0])
fig, ax = plt.subplots()
for surface in (RoadSurface.REFERENCE, RoadSurface.TWO_LAYER_ZOAB_FINE,
                RoadSurface.ONE_LAYER_ZOAB, RoadSurface.THIN_LAYER_A,
                RoadSurface.SMA_NL8, RoadSurface.HARD_ELEMENTS_NOT_HERRINGBONE):
    row = road_surface_coefficients(surface)
    # La fila de referencia no lleva rango de velocidad: es válida por definición.
    span = ("todas las velocidades" if row.speed_range is None
            else "{:g}-{:g} km/h".format(*row.speed_range))
    ax.semilogx(bands, row.alpha["1"], label=f"{surface.value} ({span})")
ax.axhline(0.0, color="k", lw=0.8)
ax.set_xlabel("Frecuencia central de banda de octava [Hz]")
ax.set_ylabel("Coeficiente de pavimento alpha, categoría 1 [dB]")
ax.legend(fontsize="small")
plt.show()
```

</details>

El pavimento de referencia de la primera fila es todo ceros: es el promedio
virtual de una mezcla bituminosa densa 0/11 y una mezcla bituminosa discontinua
tipo SMA 0/11, de entre dos y siete años, en estado de mantenimiento
representativo, seca, sin neumáticos con clavos, a 20 °C y en llano. Exactamente
en esas condiciones toda corrección del 2.2 se anula de forma idéntica, así que
a la velocidad de referencia $v_m = v_\mathrm{ref} = 70\ \text{km/h}$, donde
también se anulan los dos términos de velocidad, las potencias acústicas
**son** los coeficientes $A_{\mathrm{R},i,m}$ y $A_{\mathrm{P},i,m}$ de la Tabla F-1.

## 6. Entregar la fuente a un modelo de propagación

La etapa de emisión produce una potencia por metro. Trocear esa línea en fuentes
puntuales equivalentes queda, en palabras del apartado 2.5.3, «fuera del alcance
de la presente metodología»: una fuente puntual que representa un tramo de
longitud $dL$ lleva simplemente $L'_{W,\mathrm{eq,line},i} + 10\log_{10}(dL)$, que
es aritmética y se ofrece como tal.

```python

from phonometry import (
    PropagationGeometry, RoadTraffic, RoadVehicleCategory,
    line_source_segment_power, predicted_receiver_level, road_source_power,
)

result = road_source_power([
    RoadTraffic(RoadVehicleCategory.LIGHT, 1000.0, 90.0),
    RoadTraffic(RoadVehicleCategory.HEAVY, 120.0, 80.0),
])
segment = line_source_segment_power(result.total_line_power, 20.0)  # tramo de 20 m

# Un tramo, el que queda justo enfrente de un receptor a 100 m de la carretera.
levels = predicted_receiver_level(
    segment,
    PropagationGeometry(100.0, result.source_height, 4.0),
    frequencies=result.frequencies,
)

# La carretera es la suma energética de sus tramos: 1 km a cada lado, en pasos de 20 m.
energy = np.zeros_like(levels)
for x in np.arange(-990.0, 1000.0, 20.0):        # centros de tramo a lo largo de la vía
    energy += 10 ** (predicted_receiver_level(
        segment,
        PropagationGeometry(float(np.hypot(100.0, x)), result.source_height, 4.0),
        frequencies=result.frequencies,
    ) / 10)
road = 10 * np.log10(energy)
```

Dos reglas hacen defendible un troceado, y ninguna de las dos es método: el
2.5.3 declara el reparto fuera de alcance, así que esto es práctica de
ingeniería. Cada tramo tiene que ser bastante corto como para que la fuente
puntual de su centro represente al tramo entero: la ISO 9613-2 solo admite una
fuente puntual equivalente cuando la distancia de propagación supera el doble
de la mayor dimensión de la fuente, de modo que un tramo visto desde 100 m
puede medir decenas de metros y uno visto desde 10 m no. Y la carretera tiene
que modelarse lo bastante lejos en ambos sentidos como para que las colas dejen
de importar: más allá de unas diez veces la distancia perpendicular, añadir
tramos cambia el total en menos de una décima de decibelio, y por eso 1 km a
cada lado basta a 100 m aquí. Los dos espectros se leen en dB(A) dos párrafos
más abajo: **52,9 dB(A)** para el tramo aislado frente a **64,7 dB(A)** para la
carretera, una diferencia de 11,8 dB que es enteramente la aritmética de
arriba.

Conviene ver qué es esto y qué no. CNOSSOS-EU tiene **su propio** método de
propagación en el apartado 2.5 del Anexo II, y no es la ISO 9613-2: difieren en
el modelo de suelo, en el tratamiento de la difracción y en la forma de combinar
las condiciones favorables y las homogéneas. Encadenar una emisión CNOSSOS con
la propagación ISO 9613-2 de esta biblioteca es una estimación de ingeniería
legítima, pero no es la cadena normativa CNOSSOS y no debe declararse como tal.

Para el total ponderado A, usa la ponderación por bandas de octava que la propia
Directiva imprime en el 2.5.5 modificado, en lugar de recalcularla:

```python
from phonometry import CNOSSOS_A_WEIGHTING

CNOSSOS_A_WEIGHTING   # (-26.2, -16.1, -8.6, -3.2, 0.0, 1.2, 1.0, -1.1)
result.a_weighted_line_power

# Los dos espectros en el receptor del troceado de arriba, ponderados A:
weight = np.asarray(CNOSSOS_A_WEIGHTING)
print(round(float(10 * np.log10(np.sum(10 ** ((levels + weight) / 10)))), 1))
# 52.9 dB(A) - un tramo de 20 m, no la carretera
print(round(float(10 * np.log10(np.sum(10 ** ((road + weight) / 10)))), 1))
# 64.7 dB(A) - la misma carretera, sumada sobre 2 km: 11.8 dB más
```

## 7. Sustituir por una base de datos nacional

El Apéndice F se llama *base de datos*, y no tabla de constantes, porque los
Estados miembros pueden sustituir sus valores por otros medidos a escala
nacional, y porque las mismas ecuaciones ya se han evaluado con dos juegos de
coeficientes distintos (el de 2015 y el de 2021). Los dos objetos de
coeficientes se pueden reemplazar:

```python

from phonometry import ROAD_COEFFICIENTS

# Una fila nacional medida para vehículos ligeros y el resto del Apéndice F tal cual.
national = dataclasses.replace(
    ROAD_COEFFICIENTS,
    rolling_a={
        **ROAD_COEFFICIENTS.rolling_a,
        "1": (83.4, 89.0, 88.1, 93.6, 100.4, 96.9, 87.0, 76.5),
    },
)
```

Una base sustituida tiene que cubrir todas las categorías del tráfico con el que
se use: pedir una categoría que no lleva lanza `ValueError` en lugar de fallar
más adelante.

Ese mecanismo es además lo que ancla la implementación: la Comisión Europea
publicó un juego de prueba de 4 875 casos de emisión viaria calculados con los
coeficientes de 2015, y alimentar las ecuaciones implementadas con esa base
superada (no con las tablas de 2021 que la biblioteca trae por defecto)
reproduce todos los niveles publicados por banda con 0,005 dB, dentro de los dos
decimales que imprime el juego de prueba.

## Qué cubre esta guía

El apartado 2.2 del Anexo II de la Directiva 2002/49/CE en el texto
consolidado: la potencia de línea del flujo de tráfico (2.2.1), la potencia
del vehículo (2.2.2, 2.2.3), el ruido de rodadura con sus correcciones por
neumáticos con clavos y temperatura (2.2.4 a 2.2.10), el ruido de propulsión
con la corrección por pendiente (2.2.11 a 2.2.16), la corrección por cruce
(2.2.17, 2.2.18) y el efecto del pavimento (2.2.19, 2.2.20), junto con toda la
base de datos del Apéndice F, a través de `road_source_power`,
`road_vehicle_sound_power`, `road_rolling_noise`, `road_propulsion_noise` y
`road_surface_coefficients`.

La fuente ferroviaria (2.3 y Apéndice G), la fuente industrial (2.4 y Apéndice
H), la fuente aeronáutica (2.6 y 2.7) y el método de propagación CNOSSOS-EU
del apartado 2.5, que es un modelo distinto del de la ISO 9613-2 implementado
en esta biblioteca. La categoría de vehículo abierta 5 no tiene coeficientes
en el Apéndice F y por eso no se modeliza. Cómo se trocea una línea fuente en
fuentes puntuales lo declara fuera de alcance el propio método.

## Véase también

- Referencia de la API: [`environment.sources.cnossos_road`](/phonometry/es/reference/api/environment/cnossos-road/).
- [Propagación del sonido en exteriores](/phonometry/es/environment/propagation/outdoor-propagation/):
  la cadena ISO 9613-2 que lleva una potencia de fuente hasta un receptor.
- [Niveles de ruido ambiental](/phonometry/es/environment/assessment/environmental-levels/): los
  indicadores $L_\mathrm{den}$ y $L_\mathrm{night}$ para los que se trazan los mapas
  resultantes.
