Simulation acoustique du théâtre d’Argentomagus
1 - Calibrations des coefficients d’absorption et de diffusion des matériaux
Une campagne de mesure menée dans le théâtre analogue de Syracuse, permet de viser un temps de réverbération moyen pour le théâtre d’Argentomagus.
L’estimation du volume du modèle 3D du théâtre et la surface occupée par chacun de ses matériaux est possible dans Blender au moyen d’un script Python :
Calcul du volume total du modèle (appelé mesh) :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import bpy
import bmesh
from mathutils import Vector
def mesh_volume(obj):
# Get evaluated mesh (includes modifiers)
dg = bpy.context.evaluated_depsgraph_get()
eval_obj = obj.evaluated_get(dg)
mesh = eval_obj.to_mesh()
# Ensure triangulation for accurate calculation
bm = bmesh.new()
bm.from_mesh(mesh)
bmesh.ops.triangulate(bm, faces=bm.faces)
bm.to_mesh(mesh)
bm.free()
volume = 0.0
verts = mesh.vertices
for poly in mesh.polygons:
# Poly is now always a triangle thanks to triangulation
v1, v2, v3 = (verts[i].co for i in poly.vertices)
volume += v1.cross(v2).dot(v3)
eval_obj.to_mesh_clear()
return abs(volume) / 6.0
obj = bpy.context.active_object
print("Volume:", mesh_volume(obj))
On obtient alors une valeur en m³ :
1
Volume: 20589.84
Calcul des surfaces occupées par chaque matériau (appelés material) :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import bpy
import bmesh
from mathutils import Vector
obj = bpy.context.active_object
mesh = obj.data
bm = bmesh.new()
bm.from_mesh(mesh)
bm.faces.ensure_lookup_table()
material_areas = {}
for face in bm.faces:
mat_index = face.material_index
area = face.calc_area()
material_areas[mat_index] = material_areas.get(mat_index, 0) + area
bm.free()
print("Surface area by material index:")
for mat_index, area in material_areas.items():
mat_name = mesh.materials[mat_index].name if mesh.materials[mat_index] else "None"
print(f"{mat_name}: {area:.4f} m2")
On obtient alors des valeurs en m² :
1
2
3
4
5
6
7
8
Surface area by material index:
100% absorbent: 3 465,0182 m2
Pierre Poreuse (Argentomagus): 1391.9365 m2
Mur de scene (Argentomagus): 27.3457 m2
Marbre frons pulpiti (Argentomagus): 29.4726 m2
Pilier (Argentomagus): 32.2453 m2
CR4_parquet (BRAS): 275.8170 m2
Audience : 2932.8210 m2
Estimation du temps de réverbération moyen par bande de fréquences
On calcule alors un temps de réverbération théorique du modèle 3D, en fonction des dimensions obtenues et des coefficients d’absorption appliqués aux matériaux. La formule de Eyring est incluse dans le logiciel open-source pyroomacoustics, lui-même importé au début du script.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import pyroomacoustics as pra
from pyroomacoustics.parameters import air_absorption_table
import pandas as pd
import numpy
import os
scaling_factor = 1.4
# différence de diamètre entre Syracuse et Argentomagus
m = air_absorption_table["20C_30-50%"]
script_dir = os.path.dirname(os.path.abspath(__file__))
csv_path = os.path.join(script_dir, "surfaces_materiaux_calibration.csv")
df = pd.read_csv(csv_path, sep=";")
#print(df)
frequencies = ['125Hz', '250Hz', '500Hz', '1000Hz', '2000Hz', '4000Hz', '8000Hz']
surfaces = df['Surface occupee (m2)']
# a*S par bande
a_S = df[frequencies].multiply(surfaces, axis='index')
# somme des a*S
sum_a_S = a_S.sum()
S_total = surfaces.sum()
V_total = 20589.84
# a par bande
a_coefficient = sum_a_S.values / S_total
for i, f in enumerate(frequencies) :
eyring_syracuse = pra.rt60_eyring(S_total*(scaling_factor)**2,V_total*(scaling_factor)**3,a_coefficient[i],m[i],343)
print(f, eyring_syracuse)
Grâce au facteur multiplicateur de 1.4 appliqué compensant la différence de taille entre les théâtres d’Argentomagus et de Syracuse, on peut prévoir une surestimation ou non du temps de réverbération par rapport aux mesures de Syracuse. On peut alors ajuster en fonction les coefficients de d’absorption et de diffusion des matériaux.
On obtient des premiers temps de réverbération théoriques en secondes, par bande de fréquences :
1
2
3
4
5
6
7
125Hz 0.9612675076840118
250Hz 0.9587378998535472
500Hz 0.9652616418154282
1000Hz 0.9666220852043232
2000Hz 0.9852116816753088
4000Hz 1.076935900755007
8000Hz 1.7690107569556643
On trouve un temps de réverbération moyen de 0,96 s entre 500 Hz et 1000 Hz. Le temps cible issu des mesures du théâtre de Syracuse étant de 0,81 s, on augmente les coefficients d’absorption des matériaux majoritaires (ici la pierre poreuse et les gradins). De plus, les coefficients de diffusion sont relevés pour amoindrir la contribution de rayons « stationnaires » qui surestiment l’approximation du temps de réverbération.
On obtient donc une seconde banque de temps de réverbération par bande de fréquence :
1
2
3
4
5
6
7
125Hz 0.8545529356900029
250Hz 0.8478722506507228
500Hz 0.8444287953227818
1000Hz 0.8406911528811933
2000Hz 0.8900740918502903
4000Hz 0.9680336413059126
8000Hz 1.4935438193729154
Le temps de réverbération moyen de 0,84 s calculé entre 500 Hz et 1000 Hz paraît plus cohérent en comparaison des mesures réalisées au théâtre de Syracuse.
2 - Visualisation des réponses impulsionnelles obtenues
Voici une visualisation interactive des paramètres acoustiques issus d’une réponse impulsionnelle simulée dans le modèle 3D. Les différents indices sont décrits en Annexes A (Indices de mesure de l’acoustique d’une salle) du mémoire.
La simulation est effectuée avec 2 millions de rayons et une surface réceptrice d’un diamètre de 0,50 mètres.
On montre sur l’image ci-dessous les positions de la source et du listener correspondantes :
