Ir al contenido

Fuentes imagen y campo estacionario de sala

Referencias: Kuttruff 2016Vorländer 2020Allen y Berkley 1979Bies et al. 2017

Dos modelos clásicos predicen el campo sonoro de una sala rectangular antes de construirla. El modelo de fuentes imagen da el patrón determinista de reflexiones tempranas — toda la respuesta al impulso como suma de imágenes especulares de la fuente — mientras que el modelo estacionario da el nivel estadístico al que se asienta una fuente de potencia conocida, separado en un campo directo y otro reverberante. Esta página cubre ambos en phonometry.room: el primero complementa la respuesta al impulso medida de la guía de Acústica de salas con una sintética, y el segundo complementa la tasa de decaimiento única de la guía de Predicción del tiempo de reverberación con una predicción de nivel frente a distancia, uniendo la potencia acústica de una fuente con el nivel que produce en el interior.

Una sala rectangular rígida o absorbente — una caja de zapatos — refleja una fuente puntual en sus seis paredes, y cada reflexión es exactamente el sonido en campo libre de una imagen especular de la fuente. Reflejar una coordenada en una pared () convierte la fuente en una red regular de imágenes, y la respuesta al impulso es el sonido directo más un impulso retardado y atenuado por imagen,

Cada imagen a distancia del receptor llega en con una amplitud formada por la divergencia esférica , el producto de los factores de reflexión de presión de pared cada uno elevado al número de reflexiones que esa imagen hizo en la pared , y la pérdida de presión del aire a lo largo del camino ( el coeficiente de atenuación de intensidad, de modo que la intensidad cae como ). Una caja de zapatos tiene exactamente imágenes audibles hasta el orden de reflexión (1560 en el orden 10), y la densidad de reflexiones crece como .

import numpy as np
from phonometry import room
# Sala de 7 x 5 x 3 m, fuente y receptor descentrados.
res = room.image_source_rir(
dimensions=(7.0, 5.0, 3.0),
source=(2.0, 1.6, 1.5),
receiver=(5.2, 3.4, 1.7),
absorption=0.12, # absorción de pared uniforme (escalar)
fs=48000,
max_order=12,
)
print(res.ir.shape) # (n_muestras,) RIR de banda ancha
print(round(res.direct_time * 1000, 2)) # llegada del sonido directo, ms
print(res.times.size == room.audible_image_count(12) + 1) # imágenes + fuente
res.plot() # el reflectograma de la figura de abajo
# La RIR sintética entra directa en el análisis de decaimiento de ISO 3382.
params = room.room_parameters(res.ir, res.fs, limits=None)
print(bool(params.t30_valid[0])) # True: la ventana de decaimiento es usable
# T30 crece hacia la estimación de Eyring al aumentar max_order (ver abajo); a
# orden bajo la cola especular se trunca, trátalo como un valor limitado por orden.
print(round(float(params.t30[0]), 2)) # tiempo de reverberación, s

image_source_rir devuelve un ImageSourceResult. Su ir es la RIR muestreada (un array 1D en banda ancha, o una fila por banda de octava con absorción por banda), mientras que la tabla exacta de reflexiones a resolución subenteros se guarda en times, distances, orders, amplitudes e image_positions, de modo que la geometría es exacta con independencia de la frecuencia de muestreo. El sonido directo y las reflexiones tempranas individuales son magnitudes geométricas buenas a precisión de máquina.

El reflectograma inferior muestra todo el patrón: el sonido directo a 0 dB y luego la nube de reflexiones coloreada por orden de reflexión decayendo bajo la envolvente de divergencia . Las reflexiones de orden 1 (las seis paredes) quedan justo por debajo del sonido directo; los órdenes superiores llegan más tarde, más densos y más débiles.

Reflectograma por fuentes imagen de una sala de 7 por 5 por 3 metros: el sonido directo a 0 dB seguido de una nube de reflexiones coloreadas por orden de reflexión que decae bajo la envolvente de divergencia 1/r, más densa y débil con el tiempoReflectograma por fuentes imagen de una sala de 7 por 5 por 3 metros: el sonido directo a 0 dB seguido de una nube de reflexiones coloreadas por orden de reflexión que decae bajo la envolvente de divergencia 1/r, más densa y débil con el tiempo
Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import room
res = room.image_source_rir((7.0, 5.0, 3.0), (2.0, 1.6, 1.5),
(5.2, 3.4, 1.7), 0.12, fs=48000, max_order=10)
# Una línea: el reflectograma (nivel en dB rel. directo vs tiempo, por orden).
res.plot(language="es")
plt.show()
# A mano: dispersión de las amplitudes de reflexión coloreadas por orden.
t_ms = np.asarray(res.times) * 1e3
amp = np.asarray(res.amplitudes)
level = 20 * np.log10(np.abs(amp) / np.max(np.abs(amp)))
order = np.asarray(res.orders)
fig, ax = plt.subplots()
sc = ax.scatter(t_ms[order > 0], level[order > 0], c=order[order > 0],
cmap="viridis", s=18)
ax.stem([t_ms[order == 0][0]], [0.0]) # sonido directo
fig.colorbar(sc, label="Orden de reflexión")
ax.set_xlabel("Tiempo de llegada [ms]"); ax.set_ylabel("Nivel rel. directo [dB]")
ax.set_xlim(0, 120); ax.set_ylim(-60, 5)
plt.show()

Por banda, por pared y con aire. Pasa coeficientes por banda (un array por pared (6, n_bandas), un vector por banda o una lista frequencies) para sintetizar un decaimiento por banda de octava; un vector de longitud 6 fija cada pared por separado (orden x0, xL, y0, yL, z0, zL); y air_attenuation (el coeficiente de intensidad m de air_attenuation_m) añade la pérdida de aire exp(-m r / 2) que se come la cola de altas frecuencias.

import numpy as np
from phonometry import room
freqs = [250.0, 500.0, 1000.0, 2000.0]
alpha = np.array([[0.10, 0.15, 0.25, 0.40]] * 6) # (6 paredes, 4 bandas)
res = room.image_source_rir((7.0, 5.0, 3.0), (2.0, 1.6, 1.5), (5.2, 3.4, 1.7),
alpha, fs=48000, max_order=12, frequencies=freqs)
print(res.ir.shape) # (4 bandas, n_muestras)
print(np.round(np.sum(res.ir ** 2, axis=1), 4)) # más absorción -> menos energía

Reproducir el decaimiento estadístico. La tasa de decaimiento inicial de la RIR sintética reproduce el tiempo de reverberación de Eyring , porque la tasa media de reflexiones es igual a . El acuerdo solo es estrecho en el límite casi cúbico: una sala alargada sostiene la energía a lo largo de su eje largo, así que su decaimiento especular puro es más lento que la estimación difusa de Eyring — exactamente la anisotropía que los modelos de Fitzroy y Arau-Puchades se construyeron para corregir. El modelo capta solo reflexiones especulares (sin difracción ni difusión) y es exacto para factores de reflexión de pared reales e independientes del ángulo.

ParámetroTipoUnidadesRango / defectoNotas
dimensions(float, float, float)mtodas > 0Longitudes de sala (Lx, Ly, Lz)
source / receiver(float, float, float)mestrictamente dentro de la salaPosiciones (x, y, z)
absorptionescalar / (6,) / (n,) / (6, n)[0, 1]Uniforme, por pared, por banda o por pared y banda
fsintHz> 0Frecuencia de muestreo
max_orderint≥ 0, defecto 20Corte de orden de reflexión
speed_of_soundfloatm/s> 0, defecto 343Velocidad del sonido c
air_attenuationfloat o (n,)1/m≥ 0, defecto 0Coeficiente de intensidad del aire m
durationfloat, opcionals> 0Longitud de la RIR (defecto: última llegada)
frequencies(n,), opcionalHzCentros de banda que etiquetan un resultado por banda

Devuelve un ImageSourceResult (ir, fs, frequencies y la tabla exacta de reflexiones times/distances/orders/amplitudes/image_positions) con .plot() y una propiedad direct_time. audible_image_count(order) da el recuento de imágenes de la caja de zapatos y reflection_density(t, volume) la densidad .

Cuando una fuente de potencia acústica constante funciona en una sala, el nivel se asienta en la suma de un campo directo que cae con la distancia y un campo reverberante difuso que es (aproximadamente) el mismo en todas partes. La constante de sala mide cuánto campo reverberante levanta una potencia dada, y el nivel estacionario es

con el factor de directividad de la fuente (1 omnidireccional, 2 sobre un suelo duro, 4 en una arista, 8 en una esquina). Los dos términos se cruzan en la distancia crítica : más cerca que domina el campo directo y duplicar la distancia baja el nivel 6 dB; más lejos manda el campo reverberante y alejarse apenas ayuda.

from phonometry import room
field = room.steady_state_field(
sound_power_level=90.0, # Lw, dB re 1 pW
surface_area=100.0, # área total de contorno S, m^2
mean_absorption=0.2, # absorción media de Sabine alpha_bar
)
print(round(field.room_constant, 1)) # 25.0 m^2
print(round(field.critical_distance, 2)) # 0.71 m
field.plot() # directo / reverberante / total vs distancia

El SteadyFieldResult.plot() dibuja los niveles directo, reverberante y total frente a la distancia con la distancia crítica marcada: la curva total sigue el campo directo cerca de la fuente y se aplana en la meseta reverberante más allá de .

Campo estacionario de sala de una fuente de 90 dB en un taller con constante de sala de 62 metros cuadrados: el nivel de presión acústica total sigue el campo directo de 6 dB por duplicación cerca de la fuente, cruza la meseta reverberante constante en la distancia crítica de 1,11 m y se aplana sobre ella más alláCampo estacionario de sala de una fuente de 90 dB en un taller con constante de sala de 62 metros cuadrados: el nivel de presión acústica total sigue el campo directo de 6 dB por duplicación cerca de la fuente, cruza la meseta reverberante constante en la distancia crítica de 1,11 m y se aplana sobre ella más allá

Una fuente de 90 dB re 1 pW en un taller de 12 x 8 x 4 m con absorción media de 0,15: dentro de m alejarse baja el nivel 6 dB por duplicación; más allá manda la meseta reverberante y solo la absorción, no la distancia, baja el nivel (Bies 5.ª ed., §6.4).

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import room
field = room.steady_state_field(
sound_power_level=90.0, # Lw, dB re 1 pW
surface_area=352.0, # un taller de 12 x 8 x 4 m
mean_absorption=0.15,
)
# Una línea: niveles directo, reverberante y total con rc marcada.
field.plot(language="es")
plt.show()
# A mano, desde los campos del resultado:
fig, ax = plt.subplots()
ax.semilogx(field.distances, field.direct, "--", label="Campo directo")
ax.semilogx(field.distances, field.reverberant, ":", label="Campo reverberante")
ax.semilogx(field.distances, field.total, label="Total")
ax.axvline(field.critical_distance, ls="-.",
label=f"rc = {field.critical_distance:.2f} m")
ax.set_xlabel("Distancia a la fuente [m]")
ax.set_ylabel("Nivel de presión acústica [dB]")
ax.legend()
plt.show()

Los bloques se exponen por separado, de modo que una medición de emisión fluye directa a una predicción de nivel:

from phonometry import room
R = room.room_constant(100.0, 0.2) # constante de sala de Bies, 25 m^2
print(round(float(room.critical_distance(R)), 3)) # 0.705 m (Q = 1)
print(round(float(room.steady_state_spl(90.0, 5.0, R)), 2)) # nivel a 5 m, dB

La distancia de reverberación de Kuttruff ( para ) usa el área de absorción de Sabine en lugar de la constante de sala ; ambas coinciden para pequeño, y este módulo usa de modo que es exactamente el cruce de su propio steady_state_spl. Pasa characteristic_impedance=rho_c para añadir el término de Bies (unos +0,14 dB a 20 °C).

Dónde se difumina la estadística. La frecuencia de Schroeder (V en m³, T en s) marca aproximadamente la transición modal-a-difuso, un cruce heurístico y no un corte abrupto: bastante por debajo dominan los modos discretos y los supuestos difusos de y pierden fiabilidad, bastante por encima los modos se solapan y esta imagen estadística se cumple. En salas límite conviene comprobar banda a banda.

from phonometry import room
print(round(float(room.schroeder_frequency(1.0, 200.0)), 0)) # 141 Hz
ParámetroTipoUnidadesRango / defectoNotas
sound_power_levelfloatdB re 1 pWNivel de potencia de la fuente Lw
surface_areafloat> 0Área total de contorno S
mean_absorptionfloat(0, 1)Absorción media de Sabine alpha_bar
distancesarray 1D, opcionalm> 0Rejilla de distancias (defecto: 0.1 rc a 10 rc)
directivityfloat> 0, defecto 1Factor de directividad de la fuente Q
characteristic_impedancefloat, opcionalPa·s/m> 0Añade el término 10 lg(rho c / 400)

Devuelve un SteadyFieldResult (distances, direct, reverberant, total, critical_distance, room_constant) con .plot(). Las piezas room_constant, critical_distance, schroeder_frequency y steady_state_spl también son invocables directamente (cada una acepta arrays por banda).

Las implementaciones se comprueban contra las formas cerradas y los anclajes numéricos de los propios textos fuente (ver el informe de conformidad):

  • la amplitud del sonido directo y su retardo (geometría exacta), el recuento de imágenes audibles (Kuttruff 6.ª ed., ec. (9.23)) y la densidad de reflexiones (ec. (4.6));
  • el tiempo de reverberación de Eyring recuperado del decaimiento de la RIR sintética en el límite casi cúbico (tolerancia documentada ≈ 10 %), y un solucionador 2D FDTD independiente que reproduce el retardo del eco de pared rígida y el con amortiguamiento uniforme;
  • la constante de sala, la distancia crítica como cruce exacto directo/reverberante, la frecuencia de Schroeder (el ejemplo de aula de Kuttruff, m³, s → 141 Hz) y el nivel estacionario (Bies 5.ª ed., ec. (6.43)).

Cubierto. El libro Room Acoustics de Kuttruff (la construcción de fuentes imagen del apartado 4.1, la fórmula de reverberación de Eyring usada en la comprobación casi cúbica y la frecuencia de Schroeder del apartado 3.6), Auralization de Vorländer (el modelo de fuentes espejo del capítulo 11, sus expresiones de factor de reflexión y retardo) y la descomposición por orden de reflexión de Allen y Berkley, todo implementado por room.image_source_rir; y el campo estacionario de sala de Bies, Hansen y Howard del apartado 6.4 (constante de sala, directividad , distancia crítica) implementado por room.steady_state_field, room.room_constant, room.critical_distance, room.steady_state_spl y room.schroeder_frequency.

No cubierto. El modelo de fuentes imagen solo capta reflexiones especulares: sin difracción y sin dispersión difusa, de modo que el decaimiento real de una sala alargada es más lento que la estimación de Eyring de campo difuso frente a la que se comprueba (la anisotropía que los modelos de Fitzroy y Arau-Puchades de la guía de predicción del tiempo de reverberación se diseñaron para corregir). La distancia de reverberación alternativa de Kuttruff (que usa el área de absorción de Sabine en lugar de la constante de sala) se cita como comparación pero no está implementada: steady_state_field y critical_distance usan siempre la formulación de Bies con la constante de sala.

  • Allen, J. B. y Berkley, D. A. (1979). Image method for efficiently simulating small-room acoustics. The Journal of the Acoustical Society of America, 65(4), 943-950. https://doi.org/10.1121/1.382599La descomposición del recuento de reflexiones de la red de imágenes de la sala rectangular usada en §1.
  • Bies, D. A., Hansen, C. H. y Howard, C. Q. (2017). Engineering noise control (5th ed.). CRC Press. https://doi.org/10.1201/9781351228152El campo estacionario de sala y la constante de sala del §2 (§6.4).
  • Kuttruff, H. (2016). Room acoustics (6th ed.). CRC Press. https://doi.org/10.1201/9781315372150La construcción por fuentes imagen (§4.1), la reverberación de Eyring y la distancia de reverberación (§5.5–5.6) y la frecuencia de Schroeder (§3.6) de esta página.
  • Vorländer, M. (2020). Auralization: Fundamentals of acoustics, modelling, simulation, algorithms and acoustic virtual reality (2nd ed.). Springer. https://doi.org/10.1007/978-3-030-51202-6El modelo de fuentes especulares del §1 (capítulo 11), con las expresiones de factor de reflexión y retardo.