diff --git a/.github/images/absorption_per_table.svg b/.github/images/absorption_per_table.svg new file mode 100644 index 000000000..3fce655c4 --- /dev/null +++ b/.github/images/absorption_per_table.svg @@ -0,0 +1,1103 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + Separation [m] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Absorption per occupied table A_tab [m²] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feasible A_tab: 9.1 to 12.7 m² + + + + + + + r_s = 1.2 m → A_tab > 9.1 m² + + + + + + + r_t = 2 m → A_tab < 12.7 m² + + + The design window, for one layout + + + + + + + + + + Communication: A_tab > 6.31 r_s² (L_SN > −6 dB) + + + + + + Privacy: A_tab < 3.16 r_t² (L_SN < −9 dB) + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.2 + + + + + + + + + + + + + 1.4 + + + + + + + + + + + + + 1.6 + + + + + + + + + + + + + 1.8 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.2 + + + + Table spacing over cross-table separation, r_t / r_s + + + + + + + + + + + + + + −5.0 + + + + + + + + + + + + + −2.5 + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 5.0 + + + + + + + + + + + + + 7.5 + + + + + + + + + + + + + 10.0 + + + + + + + + + + + + + 12.5 + + + + Width of the feasible A_tab window [m²] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + window closes at r_t / r_s = 1.41 + + + + + + + this layout: 1.67, 3.6 m² wide + + + Packed tables close it (r_s = 1.2 m) + + + + + + + + + + + + diff --git a/.github/images/absorption_per_table_dark.svg b/.github/images/absorption_per_table_dark.svg new file mode 100644 index 000000000..c3dc7c745 --- /dev/null +++ b/.github/images/absorption_per_table_dark.svg @@ -0,0 +1,1103 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + Separation [m] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Absorption per occupied table A_tab [m²] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feasible A_tab: 9.1 to 12.7 m² + + + + + + + r_s = 1.2 m → A_tab > 9.1 m² + + + + + + + r_t = 2 m → A_tab < 12.7 m² + + + The design window, for one layout + + + + + + + + + + Communication: A_tab > 6.31 r_s² (L_SN > −6 dB) + + + + + + Privacy: A_tab < 3.16 r_t² (L_SN < −9 dB) + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.2 + + + + + + + + + + + + + 1.4 + + + + + + + + + + + + + 1.6 + + + + + + + + + + + + + 1.8 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.2 + + + + Table spacing over cross-table separation, r_t / r_s + + + + + + + + + + + + + + −5.0 + + + + + + + + + + + + + −2.5 + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 5.0 + + + + + + + + + + + + + 7.5 + + + + + + + + + + + + + 10.0 + + + + + + + + + + + + + 12.5 + + + + Width of the feasible A_tab window [m²] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + window closes at r_t / r_s = 1.41 + + + + + + + this layout: 1.67, 3.6 m² wide + + + Packed tables close it (r_s = 1.2 m) + + + + + + + + + + + + diff --git a/.github/images/absorption_per_table_es.svg b/.github/images/absorption_per_table_es.svg new file mode 100644 index 000000000..115f8a07e --- /dev/null +++ b/.github/images/absorption_per_table_es.svg @@ -0,0 +1,1103 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + Separación [m] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Absorción por mesa ocupada A_tab [m²] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A_tab factible: de 9,1 a 12,7 m² + + + + + + + r_s = 1,2 m → A_tab > 9,1 m² + + + + + + + r_t = 2 m → A_tab < 12,7 m² + + + La ventana de diseño, para una distribución + + + + + + + + + + Comunicación: A_tab > 6,31 r_s² (L_SN > −6 dB) + + + + + + Privacidad: A_tab < 3,16 r_t² (L_SN < −9 dB) + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,2 + + + + + + + + + + + + + 1,4 + + + + + + + + + + + + + 1,6 + + + + + + + + + + + + + 1,8 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,2 + + + + Separación entre mesas frente a la de la mesa, r_t / r_s + + + + + + + + + + + + + + -5 + + + + + + + + + + + + + -2,5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 7,5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12,5 + + + + Anchura de la ventana factible de A_tab [m²] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + la ventana se cierra en r_t / r_s = 1,41 + + + + + + + esta distribución: 1,67, 3,6 m² de anchura + + + Con las mesas juntas se cierra (r_s = 1,2 m) + + + + + + + + + + + + diff --git a/.github/images/absorption_per_table_es_dark.svg b/.github/images/absorption_per_table_es_dark.svg new file mode 100644 index 000000000..61dcf5e33 --- /dev/null +++ b/.github/images/absorption_per_table_es_dark.svg @@ -0,0 +1,1103 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + Separación [m] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Absorción por mesa ocupada A_tab [m²] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A_tab factible: de 9,1 a 12,7 m² + + + + + + + r_s = 1,2 m → A_tab > 9,1 m² + + + + + + + r_t = 2 m → A_tab < 12,7 m² + + + La ventana de diseño, para una distribución + + + + + + + + + + Comunicación: A_tab > 6,31 r_s² (L_SN > −6 dB) + + + + + + Privacidad: A_tab < 3,16 r_t² (L_SN < −9 dB) + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,2 + + + + + + + + + + + + + 1,4 + + + + + + + + + + + + + 1,6 + + + + + + + + + + + + + 1,8 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,2 + + + + Separación entre mesas frente a la de la mesa, r_t / r_s + + + + + + + + + + + + + + -5 + + + + + + + + + + + + + -2,5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 7,5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12,5 + + + + Anchura de la ventana factible de A_tab [m²] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + la ventana se cierra en r_t / r_s = 1,41 + + + + + + + esta distribución: 1,67, 3,6 m² de anchura + + + Con las mesas juntas se cierra (r_s = 1,2 m) + + + + + + + + + + + + diff --git a/.github/images/adrienne_window.svg b/.github/images/adrienne_window.svg new file mode 100644 index 000000000..8a71f2b7e --- /dev/null +++ b/.github/images/adrienne_window.svg @@ -0,0 +1,1613 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + + + + + + + + + + + + + + + −1.0 + + + + + + + + + + + + + −0.5 + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + Free field + + + + + + + + + + + + + + + + + + + + + + The one free parameter of ISO 13472-1 + + + + + + + + + + hi: free field, the rig clear of every surface + + + + + + the same window, on the direct sound + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + Time [ms] + + + + + + + + + + + + + + −1.0 + + + + + + + + + + + + + −0.5 + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + Over the road + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 dm / c = 1.47 ms + + + parasitic arrival, just outside + the gate: lengthen the window + and it comes in with the road + + + + + + + + + + + + + measured over the road: the two arrivals overlap + + + + + + hr = road - free field, the surface alone + + + + + + Adrienne window: 0.5 + 5 + 5 ms = 10.5 ms + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −30 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + 0 + + + + Level [dB re max] + + + + + + + + + + + + + + + + + + + + + + + + + 1/T = 95 Hz: + the window's own + low-frequency limit + + + below the reported 250 Hz + + + + + + + + + + |Hi|, the windowed free-field reference + + + + + + |Hr|, the windowed surface reflection + + + + + + + + + + + + + + + + diff --git a/.github/images/adrienne_window_dark.svg b/.github/images/adrienne_window_dark.svg new file mode 100644 index 000000000..08b609fbe --- /dev/null +++ b/.github/images/adrienne_window_dark.svg @@ -0,0 +1,1613 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + + + + + + + + + + + + + + + −1.0 + + + + + + + + + + + + + −0.5 + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + Free field + + + + + + + + + + + + + + + + + + + + + + The one free parameter of ISO 13472-1 + + + + + + + + + + hi: free field, the rig clear of every surface + + + + + + the same window, on the direct sound + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + Time [ms] + + + + + + + + + + + + + + −1.0 + + + + + + + + + + + + + −0.5 + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + Over the road + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 dm / c = 1.47 ms + + + parasitic arrival, just outside + the gate: lengthen the window + and it comes in with the road + + + + + + + + + + + + + measured over the road: the two arrivals overlap + + + + + + hr = road - free field, the surface alone + + + + + + Adrienne window: 0.5 + 5 + 5 ms = 10.5 ms + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −30 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + 0 + + + + Level [dB re max] + + + + + + + + + + + + + + + + + + + + + + + + + 1/T = 95 Hz: + the window's own + low-frequency limit + + + below the reported 250 Hz + + + + + + + + + + |Hi|, the windowed free-field reference + + + + + + |Hr|, the windowed surface reflection + + + + + + + + + + + + + + + + diff --git a/.github/images/adrienne_window_es.svg b/.github/images/adrienne_window_es.svg new file mode 100644 index 000000000..386acc810 --- /dev/null +++ b/.github/images/adrienne_window_es.svg @@ -0,0 +1,1613 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + + + + + + + + + + + + + + + -1 + + + + + + + + + + + + + -0,5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + Campo libre + + + + + + + + + + + + + + + + + + + + + + El único parámetro libre de la ISO 13472-1 + + + + + + + + + + hi: campo libre, el equipo lejos de toda superficie + + + + + + la misma ventana, sobre el sonido directo + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + Tiempo [ms] + + + + + + + + + + + + + + -1 + + + + + + + + + + + + + -0,5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + Sobre el pavimento + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 dm / c = 1,47 ms + + + parasitic arrival, just outside + the gate: lengthen the window + and it comes in with the road + + + + + + + + + + + + + medido sobre el pavimento: las dos llegadas se solapan + + + + + + hr = pavimento - campo libre, solo la superficie + + + + + + Adrienne window: 0,5 + 5 + 5 ms = 10,5 ms + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -30 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + 0 + + + + Nivel [dB re max] + + + + + + + + + + + + + + + + + + + + + + + + + 1/T = 95 Hz: + the window's own + low-frequency limit + + + below the reported 250 Hz + + + + + + + + + + |Hi|, la referencia de campo libre enventanada + + + + + + |Hr|, la reflexión de la superficie enventanada + + + + + + + + + + + + + + + + diff --git a/.github/images/adrienne_window_es_dark.svg b/.github/images/adrienne_window_es_dark.svg new file mode 100644 index 000000000..e68a3f3d3 --- /dev/null +++ b/.github/images/adrienne_window_es_dark.svg @@ -0,0 +1,1613 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + + + + + + + + + + + + + + + -1 + + + + + + + + + + + + + -0,5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + Campo libre + + + + + + + + + + + + + + + + + + + + + + El único parámetro libre de la ISO 13472-1 + + + + + + + + + + hi: campo libre, el equipo lejos de toda superficie + + + + + + la misma ventana, sobre el sonido directo + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + Tiempo [ms] + + + + + + + + + + + + + + -1 + + + + + + + + + + + + + -0,5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + Sobre el pavimento + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 dm / c = 1,47 ms + + + parasitic arrival, just outside + the gate: lengthen the window + and it comes in with the road + + + + + + + + + + + + + medido sobre el pavimento: las dos llegadas se solapan + + + + + + hr = pavimento - campo libre, solo la superficie + + + + + + Adrienne window: 0,5 + 5 + 5 ms = 10,5 ms + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -30 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + 0 + + + + Nivel [dB re max] + + + + + + + + + + + + + + + + + + + + + + + + + 1/T = 95 Hz: + the window's own + low-frequency limit + + + below the reported 250 Hz + + + + + + + + + + |Hi|, la referencia de campo libre enventanada + + + + + + |Hr|, la reflexión de la superficie enventanada + + + + + + + + + + + + + + + + diff --git a/.github/images/anim_dynamic_stiffness_sweep.gif b/.github/images/anim_dynamic_stiffness_sweep.gif new file mode 100644 index 000000000..6bc1ebb72 Binary files /dev/null and b/.github/images/anim_dynamic_stiffness_sweep.gif differ diff --git a/.github/images/anim_dynamic_stiffness_sweep.webm b/.github/images/anim_dynamic_stiffness_sweep.webm new file mode 100644 index 000000000..93af49fab Binary files /dev/null and b/.github/images/anim_dynamic_stiffness_sweep.webm differ diff --git a/.github/images/anim_dynamic_stiffness_sweep_dark.gif b/.github/images/anim_dynamic_stiffness_sweep_dark.gif new file mode 100644 index 000000000..fc106fa53 Binary files /dev/null and b/.github/images/anim_dynamic_stiffness_sweep_dark.gif differ diff --git a/.github/images/anim_dynamic_stiffness_sweep_dark.webm b/.github/images/anim_dynamic_stiffness_sweep_dark.webm new file mode 100644 index 000000000..37537168c Binary files /dev/null and b/.github/images/anim_dynamic_stiffness_sweep_dark.webm differ diff --git a/.github/images/anim_dynamic_stiffness_sweep_dark_poster.jpg b/.github/images/anim_dynamic_stiffness_sweep_dark_poster.jpg new file mode 100644 index 000000000..11d0f3111 Binary files /dev/null and b/.github/images/anim_dynamic_stiffness_sweep_dark_poster.jpg differ diff --git a/.github/images/anim_dynamic_stiffness_sweep_es.webm b/.github/images/anim_dynamic_stiffness_sweep_es.webm new file mode 100644 index 000000000..a54f559f6 Binary files /dev/null and b/.github/images/anim_dynamic_stiffness_sweep_es.webm differ diff --git a/.github/images/anim_dynamic_stiffness_sweep_es_dark.webm b/.github/images/anim_dynamic_stiffness_sweep_es_dark.webm new file mode 100644 index 000000000..6d1944de7 Binary files /dev/null and b/.github/images/anim_dynamic_stiffness_sweep_es_dark.webm differ diff --git a/.github/images/anim_dynamic_stiffness_sweep_es_dark_poster.jpg b/.github/images/anim_dynamic_stiffness_sweep_es_dark_poster.jpg new file mode 100644 index 000000000..ab7cd5fb7 Binary files /dev/null and b/.github/images/anim_dynamic_stiffness_sweep_es_dark_poster.jpg differ diff --git a/.github/images/anim_dynamic_stiffness_sweep_es_poster.jpg b/.github/images/anim_dynamic_stiffness_sweep_es_poster.jpg new file mode 100644 index 000000000..88758d483 Binary files /dev/null and b/.github/images/anim_dynamic_stiffness_sweep_es_poster.jpg differ diff --git a/.github/images/anim_dynamic_stiffness_sweep_poster.jpg b/.github/images/anim_dynamic_stiffness_sweep_poster.jpg new file mode 100644 index 000000000..187270dff Binary files /dev/null and b/.github/images/anim_dynamic_stiffness_sweep_poster.jpg differ diff --git a/.github/images/background_correction_regimes.svg b/.github/images/background_correction_regimes.svg new file mode 100644 index 000000000..2325e2105 --- /dev/null +++ b/.github/images/background_correction_regimes.svg @@ -0,0 +1,714 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 5.0 + + + + + + + + + + + + + 7.5 + + + + + + + + + + + + + 10.0 + + + + + + + + + + + + + 12.5 + + + + + + + + + + + + + 15.0 + + + + + + + + + + + + + 17.5 + + + + + + + + + + + + + 20.0 + + + + Signal-to-background margin Lsb - Lb [dB] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + Correction applied, Lsb - L [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + limit of measurement + (fixed 1,3 dB, flag the band) + + + + + + + 6 - 10 lg(10^0,6 - 1) = 1.26 dB + + + + + + + the field rule stops here + + + + + + + the laboratory rule stops here + + + Background-noise correction: two standards, two thresholds + + + + + + + + + + + + + + + + ISO 10140-4 laboratory (6 / 15 dB) + + + + + + ISO 16283-1 field (6 / 10 dB) + + + + + + + + + + diff --git a/.github/images/background_correction_regimes_dark.svg b/.github/images/background_correction_regimes_dark.svg new file mode 100644 index 000000000..ce9d7169d --- /dev/null +++ b/.github/images/background_correction_regimes_dark.svg @@ -0,0 +1,714 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 5.0 + + + + + + + + + + + + + 7.5 + + + + + + + + + + + + + 10.0 + + + + + + + + + + + + + 12.5 + + + + + + + + + + + + + 15.0 + + + + + + + + + + + + + 17.5 + + + + + + + + + + + + + 20.0 + + + + Signal-to-background margin Lsb - Lb [dB] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + Correction applied, Lsb - L [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + limit of measurement + (fixed 1,3 dB, flag the band) + + + + + + + 6 - 10 lg(10^0,6 - 1) = 1.26 dB + + + + + + + the field rule stops here + + + + + + + the laboratory rule stops here + + + Background-noise correction: two standards, two thresholds + + + + + + + + + + + + + + + + ISO 10140-4 laboratory (6 / 15 dB) + + + + + + ISO 16283-1 field (6 / 10 dB) + + + + + + + + + + diff --git a/.github/images/background_correction_regimes_es.svg b/.github/images/background_correction_regimes_es.svg new file mode 100644 index 000000000..d59dd2f7b --- /dev/null +++ b/.github/images/background_correction_regimes_es.svg @@ -0,0 +1,714 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 7,5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12,5 + + + + + + + + + + + + + 15 + + + + + + + + + + + + + 17,5 + + + + + + + + + + + + + 20 + + + + Margen senal-fondo Lsb - Lb [dB] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + Correccion aplicada, Lsb - L [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + limite de medicion + (1,3 dB fijos, senalar la banda) + + + + + + + 6 - 10 lg(10^0,6 - 1) = 1,26 dB + + + + + + + la regla in situ termina aqui + + + + + + + la regla de laboratorio termina aqui + + + Correccion por ruido de fondo: dos normas, dos umbrales + + + + + + + + + + + + + + + + ISO 10140-4 laboratorio (6 / 15 dB) + + + + + + ISO 16283-1 in situ (6 / 10 dB) + + + + + + + + + + diff --git a/.github/images/background_correction_regimes_es_dark.svg b/.github/images/background_correction_regimes_es_dark.svg new file mode 100644 index 000000000..7de3092af --- /dev/null +++ b/.github/images/background_correction_regimes_es_dark.svg @@ -0,0 +1,714 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 7,5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12,5 + + + + + + + + + + + + + 15 + + + + + + + + + + + + + 17,5 + + + + + + + + + + + + + 20 + + + + Margen senal-fondo Lsb - Lb [dB] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + Correccion aplicada, Lsb - L [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + limite de medicion + (1,3 dB fijos, senalar la banda) + + + + + + + 6 - 10 lg(10^0,6 - 1) = 1,26 dB + + + + + + + la regla in situ termina aqui + + + + + + + la regla de laboratorio termina aqui + + + Correccion por ruido de fondo: dos normas, dos umbrales + + + + + + + + + + + + + + + + ISO 10140-4 laboratorio (6 / 15 dB) + + + + + + ISO 16283-1 in situ (6 / 10 dB) + + + + + + + + + + diff --git a/.github/images/biot_waves.svg b/.github/images/biot_waves.svg new file mode 100644 index 000000000..a792b5fc4 --- /dev/null +++ b/.github/images/biot_waves.svg @@ -0,0 +1,1424 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Wavenumber [rad/m] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + root swap, 495 Hz + + + Biot waves in a poroelastic layer + + + + + + + + + + + + + A + i + r + b + o + r + n + e + , +   + R + e + ( + ) + δ + + + + + + + + + + + A + i + r + b + o + r + n + e + , +   + + I + m + ( + ) + δ + + + + + + + + + + + F + r + a + m + e + - + b + o + r + n + e + , +   + R + e + ( + ) + δ + + + + + + + + + + + F + r + a + m + e + - + b + o + r + n + e + , +   + + I + m + ( + ) + δ + + + + + + + + + + + S + h + e + a + r + , +   + R + e + ( + ) + δ + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | + | +   + = +   + f + l + u + i + d +   + / +   + f + r + a + m + e +   + d + i + s + p + l + a + c + e + m + e + n + t + μ + + + + + + + + + + + + + + + + + + + + + + + + + + + fluid and frame move together + + + + + + + + + + | + | + +   + 4 + 2 +   + e + v + e + r + y + w + h + e + r + e + : +   + t + h + e +   + f + l + u + i + d +   + m + o + v + e + s +   + a + n + d +   + t + h + e +   + f + r + a + m + e +   + b + a + r + e + l + y +   + d + o + e + s + μ + a + + + + + + + + + + + + + + + a + i + r + b + o + r + n + e +   +   + | + | + μ + a + + + + + + + + + + + f + r + a + m + e + - + b + o + r + n + e +   +   + | + | + μ + b + + + + + + + + + + + + + + + diff --git a/.github/images/biot_waves_dark.svg b/.github/images/biot_waves_dark.svg new file mode 100644 index 000000000..7c5fb598e --- /dev/null +++ b/.github/images/biot_waves_dark.svg @@ -0,0 +1,1424 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Wavenumber [rad/m] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + root swap, 495 Hz + + + Biot waves in a poroelastic layer + + + + + + + + + + + + + A + i + r + b + o + r + n + e + , +   + R + e + ( + ) + δ + + + + + + + + + + + A + i + r + b + o + r + n + e + , +   + + I + m + ( + ) + δ + + + + + + + + + + + F + r + a + m + e + - + b + o + r + n + e + , +   + R + e + ( + ) + δ + + + + + + + + + + + F + r + a + m + e + - + b + o + r + n + e + , +   + + I + m + ( + ) + δ + + + + + + + + + + + S + h + e + a + r + , +   + R + e + ( + ) + δ + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | + | +   + = +   + f + l + u + i + d +   + / +   + f + r + a + m + e +   + d + i + s + p + l + a + c + e + m + e + n + t + μ + + + + + + + + + + + + + + + + + + + + + + + + + + + fluid and frame move together + + + + + + + + + + | + | + +   + 4 + 2 +   + e + v + e + r + y + w + h + e + r + e + : +   + t + h + e +   + f + l + u + i + d +   + m + o + v + e + s +   + a + n + d +   + t + h + e +   + f + r + a + m + e +   + b + a + r + e + l + y +   + d + o + e + s + μ + a + + + + + + + + + + + + + + + a + i + r + b + o + r + n + e +   +   + | + | + μ + a + + + + + + + + + + + f + r + a + m + e + - + b + o + r + n + e +   +   + | + | + μ + b + + + + + + + + + + + + + + + diff --git a/.github/images/biot_waves_es.svg b/.github/images/biot_waves_es.svg new file mode 100644 index 000000000..7c5e7a42c --- /dev/null +++ b/.github/images/biot_waves_es.svg @@ -0,0 +1,1458 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Número de onda [rad/m] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + root swap, 495 Hz + + + Ondas de Biot en una capa poroelástica + + + + + + + + + + + + + O + n + d + a +   + d + e + l +   + a + i + r + e + , +   + R + e + ( + ) + δ + + + + + + + + + + + O + n + d + a +   + d + e + l +   + a + i + r + e + , +   + + I + m + ( + ) + δ + + + + + + + + + + + O + n + d + a +   + d + e + l +   + e + s + q + u + e + l + e + t + o + , +   + R + e + ( + ) + δ + + + + + + + + + + + O + n + d + a +   + d + e + l +   + e + s + q + u + e + l + e + t + o + , +   + + I + m + ( + ) + δ + + + + + + + + + + + O + n + d + a +   + d + e +   + c + i + z + a + l + l + a + , +   + R + e + ( + ) + δ + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | + | +   + = +   + f + l + u + i + d +   + / +   + f + r + a + m + e +   + d + i + s + p + l + a + c + e + m + e + n + t + μ + + + + + + + + + + + + + + + + + + + + + + + + + + + fluid and frame move together + + + + + + + + + + | + | + +   + 4 + 2 +   + e + v + e + r + y + w + h + e + r + e + : +   + t + h + e +   + f + l + u + i + d +   + m + o + v + e + s +   + a + n + d +   + t + h + e +   + f + r + a + m + e +   + b + a + r + e + l + y +   + d + o + e + s + μ + a + + + + + + + + + + + + + + + a + i + r + b + o + r + n + e +   +   + | + | + μ + a + + + + + + + + + + + f + r + a + m + e + - + b + o + r + n + e +   +   + | + | + μ + b + + + + + + + + + + + + + + + diff --git a/.github/images/biot_waves_es_dark.svg b/.github/images/biot_waves_es_dark.svg new file mode 100644 index 000000000..7d1e3cd81 --- /dev/null +++ b/.github/images/biot_waves_es_dark.svg @@ -0,0 +1,1458 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Número de onda [rad/m] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + root swap, 495 Hz + + + Ondas de Biot en una capa poroelástica + + + + + + + + + + + + + O + n + d + a +   + d + e + l +   + a + i + r + e + , +   + R + e + ( + ) + δ + + + + + + + + + + + O + n + d + a +   + d + e + l +   + a + i + r + e + , +   + + I + m + ( + ) + δ + + + + + + + + + + + O + n + d + a +   + d + e + l +   + e + s + q + u + e + l + e + t + o + , +   + R + e + ( + ) + δ + + + + + + + + + + + O + n + d + a +   + d + e + l +   + e + s + q + u + e + l + e + t + o + , +   + + I + m + ( + ) + δ + + + + + + + + + + + O + n + d + a +   + d + e +   + c + i + z + a + l + l + a + , +   + R + e + ( + ) + δ + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | + | +   + = +   + f + l + u + i + d +   + / +   + f + r + a + m + e +   + d + i + s + p + l + a + c + e + m + e + n + t + μ + + + + + + + + + + + + + + + + + + + + + + + + + + + fluid and frame move together + + + + + + + + + + | + | + +   + 4 + 2 +   + e + v + e + r + y + w + h + e + r + e + : +   + t + h + e +   + f + l + u + i + d +   + m + o + v + e + s +   + a + n + d +   + t + h + e +   + f + r + a + m + e +   + b + a + r + e + l + y +   + d + o + e + s + μ + a + + + + + + + + + + + + + + + a + i + r + b + o + r + n + e +   +   + | + | + μ + a + + + + + + + + + + + f + r + a + m + e + - + b + o + r + n + e +   +   + | + | + μ + b + + + + + + + + + + + + + + + diff --git a/.github/images/composite_facade_weak_element.svg b/.github/images/composite_facade_weak_element.svg new file mode 100644 index 000000000..ed965c670 --- /dev/null +++ b/.github/images/composite_facade_weak_element.svg @@ -0,0 +1,550 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + Window RA [dBA] (2 m2 of an 8 m2 facade) + + + + + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + Overall facade RA [dBA] + + + + + + + + + + + + + + + + + + + + + + + + + 31.53 + + + 31.97 + + + 35.63 + + + + + + + +10 dBA on the blind part: +0.4 dBA + + + + + + + +5 dBA on the window: +4.1 dBA + + + The weak element sets the composite + (Ejemplo 7.5 geometry: 6 m2 blind part + 2 m2 window) + + + + + + + + + + + + + + + + + + + blind part RA = 40 dBA + + + + + + blind part RA = 50 dBA + + + + + + blind part RA = 60 dBA + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/composite_facade_weak_element_dark.svg b/.github/images/composite_facade_weak_element_dark.svg new file mode 100644 index 000000000..c23eff210 --- /dev/null +++ b/.github/images/composite_facade_weak_element_dark.svg @@ -0,0 +1,550 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + Window RA [dBA] (2 m2 of an 8 m2 facade) + + + + + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + Overall facade RA [dBA] + + + + + + + + + + + + + + + + + + + + + + + + + 31.53 + + + 31.97 + + + 35.63 + + + + + + + +10 dBA on the blind part: +0.4 dBA + + + + + + + +5 dBA on the window: +4.1 dBA + + + The weak element sets the composite + (Ejemplo 7.5 geometry: 6 m2 blind part + 2 m2 window) + + + + + + + + + + + + + + + + + + + blind part RA = 40 dBA + + + + + + blind part RA = 50 dBA + + + + + + blind part RA = 60 dBA + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/composite_facade_weak_element_es.svg b/.github/images/composite_facade_weak_element_es.svg new file mode 100644 index 000000000..f622dd8cc --- /dev/null +++ b/.github/images/composite_facade_weak_element_es.svg @@ -0,0 +1,550 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + RA de la ventana [dBA] (2 m2 de una fachada de 8 m2) + + + + + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + RA global de la fachada [dBA] + + + + + + + + + + + + + + + + + + + + + + + + + 31,53 + + + 31,97 + + + 35,63 + + + + + + + +10 dBA en la parte ciega: +0,4 dBA + + + + + + + +5 dBA en la ventana: +4,1 dBA + + + El elemento debil fija el conjunto + (geometria del Ejemplo 7,5: 6 m2 de parte ciega + 2 m2 de ventana) + + + + + + + + + + + + + + + + + + + blind part RA = 40 dBA + + + + + + blind part RA = 50 dBA + + + + + + blind part RA = 60 dBA + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/composite_facade_weak_element_es_dark.svg b/.github/images/composite_facade_weak_element_es_dark.svg new file mode 100644 index 000000000..b4a230359 --- /dev/null +++ b/.github/images/composite_facade_weak_element_es_dark.svg @@ -0,0 +1,550 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + RA de la ventana [dBA] (2 m2 de una fachada de 8 m2) + + + + + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + RA global de la fachada [dBA] + + + + + + + + + + + + + + + + + + + + + + + + + 31,53 + + + 31,97 + + + 35,63 + + + + + + + +10 dBA en la parte ciega: +0,4 dBA + + + + + + + +5 dBA en la ventana: +4,1 dBA + + + El elemento debil fija el conjunto + (geometria del Ejemplo 7,5: 6 m2 de parte ciega + 2 m2 de ventana) + + + + + + + + + + + + + + + + + + + blind part RA = 40 dBA + + + + + + blind part RA = 50 dBA + + + + + + blind part RA = 60 dBA + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/coupling_term_regimes.svg b/.github/images/coupling_term_regimes.svg new file mode 100644 index 000000000..988402dfa --- /dev/null +++ b/.github/images/coupling_term_regimes.svg @@ -0,0 +1,1212 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mobility ratio |Ys| / |Yi| + + + + + + + + + + + + + + + + + −20 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + Coupling term D_C [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + matched mobilities: 6.2 dB + + + + + + + pump on a concrete slab: 9.9 dB + + + + + + D_C = 10 log10(|Ys + Yi + Yk|² / (|Ys| Re{Yi})) + left: velocity source (stiff receiver takes more) + right: force source (stiff receiver takes less) + + + EN 12354-5 Coupling Term and Its Two Limits + + + + + + + + + + + + + + + + + + + Formula 19b (exact, complex mobilities) + + + + + + force-source limit (19c) + + + + + + velocity-source limit (19d) + + + + + + elastic support Yk = 0.0001 m/(N s) (19e) + + + + + + elastic support Yk = 0.001 m/(N s) (19e) + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/coupling_term_regimes_dark.svg b/.github/images/coupling_term_regimes_dark.svg new file mode 100644 index 000000000..add8bc961 --- /dev/null +++ b/.github/images/coupling_term_regimes_dark.svg @@ -0,0 +1,1212 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mobility ratio |Ys| / |Yi| + + + + + + + + + + + + + + + + + −20 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + Coupling term D_C [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + matched mobilities: 6.2 dB + + + + + + + pump on a concrete slab: 9.9 dB + + + + + + D_C = 10 log10(|Ys + Yi + Yk|² / (|Ys| Re{Yi})) + left: velocity source (stiff receiver takes more) + right: force source (stiff receiver takes less) + + + EN 12354-5 Coupling Term and Its Two Limits + + + + + + + + + + + + + + + + + + + Formula 19b (exact, complex mobilities) + + + + + + force-source limit (19c) + + + + + + velocity-source limit (19d) + + + + + + elastic support Yk = 0.0001 m/(N s) (19e) + + + + + + elastic support Yk = 0.001 m/(N s) (19e) + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/coupling_term_regimes_es.svg b/.github/images/coupling_term_regimes_es.svg new file mode 100644 index 000000000..aefd97323 --- /dev/null +++ b/.github/images/coupling_term_regimes_es.svg @@ -0,0 +1,1212 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cociente de movilidades |Ys| / |Yi| + + + + + + + + + + + + + + + + + -20 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + Término de acoplamiento D_C [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + movilidades igualadas: 6,2 dB + + + + + + + bomba sobre un forjado de hormigón: 9,9 dB + + + + + + D_C = 10 log10(|Ys + Yi + Yk|² / (|Ys| Re{Yi})) + izquierda: fuente de velocidad (un receptor rígido acepta más) + derecha: fuente de fuerza (un receptor rígido acepta menos) + + + Término de acoplamiento de la EN 12354-5 y sus dos límites + + + + + + + + + + + + + + + + + + + Fórmula 19b (exacta, movilidades complejas) + + + + + + límite de fuente de fuerza (19c) + + + + + + límite de fuente de velocidad (19d) + + + + + + apoyo elástico Yk = 0,0001 m/(N s) (19e) + + + + + + apoyo elástico Yk = 0,001 m/(N s) (19e) + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/coupling_term_regimes_es_dark.svg b/.github/images/coupling_term_regimes_es_dark.svg new file mode 100644 index 000000000..37db2334c --- /dev/null +++ b/.github/images/coupling_term_regimes_es_dark.svg @@ -0,0 +1,1212 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cociente de movilidades |Ys| / |Yi| + + + + + + + + + + + + + + + + + -20 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + Término de acoplamiento D_C [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + movilidades igualadas: 6,2 dB + + + + + + + bomba sobre un forjado de hormigón: 9,9 dB + + + + + + D_C = 10 log10(|Ys + Yi + Yk|² / (|Ys| Re{Yi})) + izquierda: fuente de velocidad (un receptor rígido acepta más) + derecha: fuente de fuerza (un receptor rígido acepta menos) + + + Término de acoplamiento de la EN 12354-5 y sus dos límites + + + + + + + + + + + + + + + + + + + Fórmula 19b (exacta, movilidades complejas) + + + + + + límite de fuente de fuerza (19c) + + + + + + límite de fuente de velocidad (19d) + + + + + + apoyo elástico Yk = 0,0001 m/(N s) (19e) + + + + + + apoyo elástico Yk = 0,001 m/(N s) (19e) + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/critical_coupling_impedance.svg b/.github/images/critical_coupling_impedance.svg new file mode 100644 index 000000000..96ba01f83 --- /dev/null +++ b/.github/images/critical_coupling_impedance.svg @@ -0,0 +1,1282 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.50 + + + + + + + + + + + + + 0.75 + + + + + + + + + + + + + 1.00 + + + + + + + + + + + + + 1.25 + + + + + + + + + + + + + 1.50 + + + + + + + + + + + + + 1.75 + + + + + + + + + + + + + 2.00 + + + + + + + + + + + + + 2.25 + + + + + + + + + + + + + 2.50 + + + + Slit height h [mm] + + + + + + + + + + + + + + + + + −4 + + + + + + + + + + + + + −2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + N + o + r + m + a + l + i + s + e + d +   + s + u + r + f + a + c + e +   + i + m + p + e + d + a + n + c + e +   +   + a + t +   + 3 + 0 + 0 +   + H + z + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + solved h = 0.978 mm: + Re(z) = 1 and Im(z) = 0 together + + + What the design solver solves + + + + + + + + + + + + + R + e + ( + ) + z + + + + + + + + + + + I + m + ( + ) + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + + + + + + + + + + 3.5 + + + + + + + + + + + + + 4.0 + + + + + + + R + e + ( + ) + z + + + + + + + + + + + + + + + + −3 + + + + + + + + + + + + + −2 + + + + + + + + + + + + + −1 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + I + m + ( + ) + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 300 Hz + + + 300 Hz + + + 300 Hz + + + matched 1 + 0j + + + The locus over 150-500 Hz + + + + + + + + + + 0.6 h over-damped + + + + + + h critically coupled + + + + + + 1.7 h under-damped + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + α +   + a + t +   + 3 + 0 + 0 +   + H + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/critical_coupling_impedance_dark.svg b/.github/images/critical_coupling_impedance_dark.svg new file mode 100644 index 000000000..1d5d05d46 --- /dev/null +++ b/.github/images/critical_coupling_impedance_dark.svg @@ -0,0 +1,1282 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.50 + + + + + + + + + + + + + 0.75 + + + + + + + + + + + + + 1.00 + + + + + + + + + + + + + 1.25 + + + + + + + + + + + + + 1.50 + + + + + + + + + + + + + 1.75 + + + + + + + + + + + + + 2.00 + + + + + + + + + + + + + 2.25 + + + + + + + + + + + + + 2.50 + + + + Slit height h [mm] + + + + + + + + + + + + + + + + + −4 + + + + + + + + + + + + + −2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + N + o + r + m + a + l + i + s + e + d +   + s + u + r + f + a + c + e +   + i + m + p + e + d + a + n + c + e +   +   + a + t +   + 3 + 0 + 0 +   + H + z + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + solved h = 0.978 mm: + Re(z) = 1 and Im(z) = 0 together + + + What the design solver solves + + + + + + + + + + + + + R + e + ( + ) + z + + + + + + + + + + + I + m + ( + ) + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + + + + + + + + + + 3.5 + + + + + + + + + + + + + 4.0 + + + + + + + R + e + ( + ) + z + + + + + + + + + + + + + + + + −3 + + + + + + + + + + + + + −2 + + + + + + + + + + + + + −1 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + I + m + ( + ) + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 300 Hz + + + 300 Hz + + + 300 Hz + + + matched 1 + 0j + + + The locus over 150-500 Hz + + + + + + + + + + 0.6 h over-damped + + + + + + h critically coupled + + + + + + 1.7 h under-damped + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + α +   + a + t +   + 3 + 0 + 0 +   + H + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/critical_coupling_impedance_es.svg b/.github/images/critical_coupling_impedance_es.svg new file mode 100644 index 000000000..4ba0f55c5 --- /dev/null +++ b/.github/images/critical_coupling_impedance_es.svg @@ -0,0 +1,1282 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,75 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,25 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 1,75 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,25 + + + + + + + + + + + + + 2,5 + + + + Slit height h [mm] + + + + + + + + + + + + + + + + + -4 + + + + + + + + + + + + + -2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + N + o + r + m + a + l + i + s + e + d +   + s + u + r + f + a + c + e +   + i + m + p + e + d + a + n + c + e +   +   + a + t +   + 3 + 0 + 0 +   + H + z + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + solved h = 0,978 mm: + Re(z) = 1 and Im(z) = 0 together + + + What the design solver solves + + + + + + + + + + + + + R + e + ( + ) + z + + + + + + + + + + + I + m + ( + ) + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 3,5 + + + + + + + + + + + + + 4 + + + + + + + R + e + ( + ) + z + + + + + + + + + + + + + + + + -3 + + + + + + + + + + + + + -2 + + + + + + + + + + + + + -1 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + I + m + ( + ) + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 300 Hz + + + 300 Hz + + + 300 Hz + + + matched 1 + 0j + + + The locus over 150-500 Hz + + + + + + + + + + 0,6 h over-damped + + + + + + h critically coupled + + + + + + 1,7 h under-damped + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + α +   + a + t +   + 3 + 0 + 0 +   + H + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/critical_coupling_impedance_es_dark.svg b/.github/images/critical_coupling_impedance_es_dark.svg new file mode 100644 index 000000000..bc9930038 --- /dev/null +++ b/.github/images/critical_coupling_impedance_es_dark.svg @@ -0,0 +1,1282 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,75 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,25 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 1,75 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,25 + + + + + + + + + + + + + 2,5 + + + + Slit height h [mm] + + + + + + + + + + + + + + + + + -4 + + + + + + + + + + + + + -2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + N + o + r + m + a + l + i + s + e + d +   + s + u + r + f + a + c + e +   + i + m + p + e + d + a + n + c + e +   +   + a + t +   + 3 + 0 + 0 +   + H + z + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + solved h = 0,978 mm: + Re(z) = 1 and Im(z) = 0 together + + + What the design solver solves + + + + + + + + + + + + + R + e + ( + ) + z + + + + + + + + + + + I + m + ( + ) + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 3,5 + + + + + + + + + + + + + 4 + + + + + + + R + e + ( + ) + z + + + + + + + + + + + + + + + + -3 + + + + + + + + + + + + + -2 + + + + + + + + + + + + + -1 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + I + m + ( + ) + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 300 Hz + + + 300 Hz + + + 300 Hz + + + matched 1 + 0j + + + The locus over 150-500 Hz + + + + + + + + + + 0,6 h over-damped + + + + + + h critically coupled + + + + + + 1,7 h under-damped + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + α +   + a + t +   + 3 + 0 + 0 +   + H + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/decay_range_bias.svg b/.github/images/decay_range_bias.svg new file mode 100644 index 000000000..7aab0d230 --- /dev/null +++ b/.github/images/decay_range_bias.svg @@ -0,0 +1,461 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + Usable decay range dynamic_range (INR) [dB] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + Error of the fitted decay time [%] + + + + + + + + + + + + + + + + ISO min. T20 + + + ISO min. T30 + + + flag T20 + + + flag T30 + + + + + + synthetic single-slope decay, T = 1.0 s + white noise floor swept, fs = 48 kHz + green band: the 5 % JND + red band: flagged invalid for T20 + below ~34 dB the fit returns NaN + + + The bias an undersized decay range leaves behind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T20 + + + + + + + + + T30 + + + + + + + + + + diff --git a/.github/images/decay_range_bias_dark.svg b/.github/images/decay_range_bias_dark.svg new file mode 100644 index 000000000..6f9ea9862 --- /dev/null +++ b/.github/images/decay_range_bias_dark.svg @@ -0,0 +1,461 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + Usable decay range dynamic_range (INR) [dB] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + Error of the fitted decay time [%] + + + + + + + + + + + + + + + + ISO min. T20 + + + ISO min. T30 + + + flag T20 + + + flag T30 + + + + + + synthetic single-slope decay, T = 1.0 s + white noise floor swept, fs = 48 kHz + green band: the 5 % JND + red band: flagged invalid for T20 + below ~34 dB the fit returns NaN + + + The bias an undersized decay range leaves behind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T20 + + + + + + + + + T30 + + + + + + + + + + diff --git a/.github/images/decay_range_bias_es.svg b/.github/images/decay_range_bias_es.svg new file mode 100644 index 000000000..dc3bd6096 --- /dev/null +++ b/.github/images/decay_range_bias_es.svg @@ -0,0 +1,461 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + Usable decay range dynamic_range (INR) [dB] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + Error of the fitted decay time [%] + + + + + + + + + + + + + + + + ISO min. T20 + + + ISO min. T30 + + + flag T20 + + + flag T30 + + + + + + synthetic single-slope decay, T = 1,0 s + white noise floor swept, fs = 48 kHz + green band: the 5 % JND + red band: flagged invalid for T20 + below ~34 dB the fit returns NaN + + + The bias an undersized decay range leaves behind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T20 + + + + + + + + + T30 + + + + + + + + + + diff --git a/.github/images/decay_range_bias_es_dark.svg b/.github/images/decay_range_bias_es_dark.svg new file mode 100644 index 000000000..a58c649bc --- /dev/null +++ b/.github/images/decay_range_bias_es_dark.svg @@ -0,0 +1,461 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + Usable decay range dynamic_range (INR) [dB] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + Error of the fitted decay time [%] + + + + + + + + + + + + + + + + ISO min. T20 + + + ISO min. T30 + + + flag T20 + + + flag T30 + + + + + + synthetic single-slope decay, T = 1,0 s + white noise floor swept, fs = 48 kHz + green band: the 5 % JND + red band: flagged invalid for T20 + below ~34 dB the fit returns NaN + + + The bias an undersized decay range leaves behind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T20 + + + + + + + + + T30 + + + + + + + + + + diff --git a/.github/images/decay_signatures.svg b/.github/images/decay_signatures.svg new file mode 100644 index 000000000..dfe627e7e --- /dev/null +++ b/.github/images/decay_signatures.svg @@ -0,0 +1,2221 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + Time [s] + + + + + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −50 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −30 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + 0 + + + + Level re steady state [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 1.00 s + T20 1.00 s + T30 1.00 s + C = -0 % + T20 = T30, curvature ~ 0 + + + single slope + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + Time [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 0.72 s + T20 1.78 s + T30 2.18 s + C = 23 % + T30 > T20: report both + + + coupled volume + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + Time [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 0.58 s + T20 0.99 s + T30 1.00 s + C = 1 % + EDT << T30: a dry seat + + + strong early energy + + + + + + + + + + + + + + + + + + diff --git a/.github/images/decay_signatures_dark.svg b/.github/images/decay_signatures_dark.svg new file mode 100644 index 000000000..a0ffd2a39 --- /dev/null +++ b/.github/images/decay_signatures_dark.svg @@ -0,0 +1,2221 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + Time [s] + + + + + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −50 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −30 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + 0 + + + + Level re steady state [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 1.00 s + T20 1.00 s + T30 1.00 s + C = -0 % + T20 = T30, curvature ~ 0 + + + single slope + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + Time [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 0.72 s + T20 1.78 s + T30 2.18 s + C = 23 % + T30 > T20: report both + + + coupled volume + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + Time [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 0.58 s + T20 0.99 s + T30 1.00 s + C = 1 % + EDT << T30: a dry seat + + + strong early energy + + + + + + + + + + + + + + + + + + diff --git a/.github/images/decay_signatures_es.svg b/.github/images/decay_signatures_es.svg new file mode 100644 index 000000000..4453f71a3 --- /dev/null +++ b/.github/images/decay_signatures_es.svg @@ -0,0 +1,2221 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -50 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -30 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + 0 + + + + Nivel re estado estacionario [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 1,00 s + T20 1,00 s + T30 1,00 s + C = -0 % + T20 = T30, curvature ~ 0 + + + single slope + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 0,72 s + T20 1,78 s + T30 2,18 s + C = 23 % + T30 > T20: report both + + + coupled volume + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 0,58 s + T20 0,99 s + T30 1,00 s + C = 1 % + EDT << T30: a dry seat + + + strong early energy + + + + + + + + + + + + + + + + + + diff --git a/.github/images/decay_signatures_es_dark.svg b/.github/images/decay_signatures_es_dark.svg new file mode 100644 index 000000000..459bd94fd --- /dev/null +++ b/.github/images/decay_signatures_es_dark.svg @@ -0,0 +1,2221 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -50 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -30 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + 0 + + + + Nivel re estado estacionario [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 1,00 s + T20 1,00 s + T30 1,00 s + C = -0 % + T20 = T30, curvature ~ 0 + + + single slope + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 0,72 s + T20 1,78 s + T30 2,18 s + C = 23 % + T30 > T20: report both + + + coupled volume + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDT 0,58 s + T20 0,99 s + T30 1,00 s + C = 1 % + EDT << T30: a dry seat + + + strong early energy + + + + + + + + + + + + + + + + + + diff --git a/.github/images/deconvolution_snr_gain.svg b/.github/images/deconvolution_snr_gain.svg new file mode 100644 index 000000000..1f783c280 --- /dev/null +++ b/.github/images/deconvolution_snr_gain.svg @@ -0,0 +1,36942 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.50 + + + + + + + + + + + + + 0.75 + + + + + + + + + + + + + 1.00 + + + + + + + + + + + + + 1.25 + + + + + + + + + + + + + 1.50 + + + + + + + + + + + + + 1.75 + + + + + + + + + + + + + 2.00 + + + + Time [s] + + + + + + + + + + + + + + + + + −100 + + + + + + + + + + + + + −80 + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + 0 + + + + Level re peak [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + noise floor read here + + + + + + sweep over pistol: +29 dB + two doublings of sweep length: +8 dB + + + Effective signal-to-noise ratio of the recovered impulse response + + + + + + + + + + Pistol shot (no deconvolution) — 46 dB + + + + + + 1 s sweep, deconvolved — 75 dB + + + + + + 4 s sweep, deconvolved — 83 dB + + + + + + + + + + diff --git a/.github/images/deconvolution_snr_gain_dark.svg b/.github/images/deconvolution_snr_gain_dark.svg new file mode 100644 index 000000000..7bae74197 --- /dev/null +++ b/.github/images/deconvolution_snr_gain_dark.svg @@ -0,0 +1,36942 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.50 + + + + + + + + + + + + + 0.75 + + + + + + + + + + + + + 1.00 + + + + + + + + + + + + + 1.25 + + + + + + + + + + + + + 1.50 + + + + + + + + + + + + + 1.75 + + + + + + + + + + + + + 2.00 + + + + Time [s] + + + + + + + + + + + + + + + + + −100 + + + + + + + + + + + + + −80 + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + 0 + + + + Level re peak [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + noise floor read here + + + + + + sweep over pistol: +29 dB + two doublings of sweep length: +8 dB + + + Effective signal-to-noise ratio of the recovered impulse response + + + + + + + + + + Pistol shot (no deconvolution) — 46 dB + + + + + + 1 s sweep, deconvolved — 75 dB + + + + + + 4 s sweep, deconvolved — 83 dB + + + + + + + + + + diff --git a/.github/images/deconvolution_snr_gain_es.svg b/.github/images/deconvolution_snr_gain_es.svg new file mode 100644 index 000000000..3ab8a8dbd --- /dev/null +++ b/.github/images/deconvolution_snr_gain_es.svg @@ -0,0 +1,36942 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,75 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,25 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 1,75 + + + + + + + + + + + + + 2 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + -100 + + + + + + + + + + + + + -80 + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + 0 + + + + Nivel re pico [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + el ruido de fondo se lee aquí + + + + + + barrido frente a pistola: +29 dB + dos duplicaciones de la duración: +8 dB + + + Relación señal-ruido efectiva de la respuesta al impulso recuperada + + + + + + + + + + Disparo de pistola (sin deconvolución) — 46 dB + + + + + + barrido de 1 s, deconvolucionado — 75 dB + + + + + + barrido de 4 s, deconvolucionado — 83 dB + + + + + + + + + + diff --git a/.github/images/deconvolution_snr_gain_es_dark.svg b/.github/images/deconvolution_snr_gain_es_dark.svg new file mode 100644 index 000000000..4564c33e7 --- /dev/null +++ b/.github/images/deconvolution_snr_gain_es_dark.svg @@ -0,0 +1,36942 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,75 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,25 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 1,75 + + + + + + + + + + + + + 2 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + -100 + + + + + + + + + + + + + -80 + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + 0 + + + + Nivel re pico [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + el ruido de fondo se lee aquí + + + + + + barrido frente a pistola: +29 dB + dos duplicaciones de la duración: +8 dB + + + Relación señal-ruido efectiva de la respuesta al impulso recuperada + + + + + + + + + + Disparo de pistola (sin deconvolución) — 46 dB + + + + + + barrido de 1 s, deconvolucionado — 75 dB + + + + + + barrido de 4 s, deconvolucionado — 83 dB + + + + + + + + + + diff --git a/.github/images/detailed_impact_paths.svg b/.github/images/detailed_impact_paths.svg new file mode 100644 index 000000000..cd90dc5f0 --- /dev/null +++ b/.github/images/detailed_impact_paths.svg @@ -0,0 +1,1500 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + Share of transmitted energy [%] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + five paths, not thirteen: only the floor is excited + L'n,w (CI) = 41 (2) dB + + + ISO 12354-2 Detailed Model: the Direct Path Governs (Annex G) + + + + + + + + + + Dd + + + + + + Df2 + + + + + + Df1 + + + + + + Df4 + + + + + + Df3 + + + + + + + + + + + + L'n (apparent) + + + + + + floating floor fo = 52.8 Hz + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Apparent normalized impact level L'n [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/detailed_impact_paths_dark.svg b/.github/images/detailed_impact_paths_dark.svg new file mode 100644 index 000000000..fc745ab7a --- /dev/null +++ b/.github/images/detailed_impact_paths_dark.svg @@ -0,0 +1,1500 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + Share of transmitted energy [%] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + five paths, not thirteen: only the floor is excited + L'n,w (CI) = 41 (2) dB + + + ISO 12354-2 Detailed Model: the Direct Path Governs (Annex G) + + + + + + + + + + Dd + + + + + + Df2 + + + + + + Df1 + + + + + + Df4 + + + + + + Df3 + + + + + + + + + + + + L'n (apparent) + + + + + + floating floor fo = 52.8 Hz + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Apparent normalized impact level L'n [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/detailed_impact_paths_es.svg b/.github/images/detailed_impact_paths_es.svg new file mode 100644 index 000000000..1efb66da9 --- /dev/null +++ b/.github/images/detailed_impact_paths_es.svg @@ -0,0 +1,1500 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + Cuota de energía transmitida [%] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cinco vías, no trece: solo se excita el forjado + L'n,w (CI) = 41 (2) dB + + + Modelo detallado de la ISO 12354-2: manda la vía directa (anexo G) + + + + + + + + + + Dd + + + + + + Df2 + + + + + + Df1 + + + + + + Df4 + + + + + + Df3 + + + + + + + + + + + + L'n (aparente) + + + + + + suelo flotante fo = 52,8 Hz + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Nivel de impactos normalizado aparente L'n [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/detailed_impact_paths_es_dark.svg b/.github/images/detailed_impact_paths_es_dark.svg new file mode 100644 index 000000000..847e74413 --- /dev/null +++ b/.github/images/detailed_impact_paths_es_dark.svg @@ -0,0 +1,1500 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + Cuota de energía transmitida [%] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cinco vías, no trece: solo se excita el forjado + L'n,w (CI) = 41 (2) dB + + + Modelo detallado de la ISO 12354-2: manda la vía directa (anexo G) + + + + + + + + + + Dd + + + + + + Df2 + + + + + + Df1 + + + + + + Df4 + + + + + + Df3 + + + + + + + + + + + + L'n (aparente) + + + + + + suelo flotante fo = 52,8 Hz + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Nivel de impactos normalizado aparente L'n [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/diagram_airflow_resistance.svg b/.github/images/diagram_airflow_resistance.svg index ff56257c5..530e0585a 100644 --- a/.github/images/diagram_airflow_resistance.svg +++ b/.github/images/diagram_airflow_resistance.svg @@ -1 +1 @@ -Airflow resistance: static and alternating methods (ISO 9053-1/-2)Static method (ISO 9053-1)specimen (A, d)laminar flow q_vΔpmanom.R = Δp / q_v (through-origin fit at 0.5 mm/s)Alternating method (ISO 9053-2)cavityVspecimen / airtightpiston f = 1–4 HzL_pR from L_p,s − L_p,t (κ′ per Annex A) \ No newline at end of file +Airflow resistance: static and alternating methods (ISO 9053-1/-2)Static method (ISO 9053-1)sealspecimen A, dgridq_vflow sourceΔpd≥ 1 borecell ≥ 29 mm bore, ≥ 1 bore of free space aboveq_v and Δp each to ±5 %, Δp readable to 0.1 Pagrid ≥ 50 % open, R < 1 %; d measured in positionR = Δp / q_v (through-origin fit at 0.5 mm/s)Alternating method (ISO 9053-2)cavityVmeasurement cell → L_p,s (h_s)airtight termination → L_p,t (h_t)piston f = 1–4 Hzq_v = 2π f h A_PL_pR from L_p,s − L_p,t (κ′ per Annex A) \ No newline at end of file diff --git a/.github/images/diagram_airflow_resistance_dark.svg b/.github/images/diagram_airflow_resistance_dark.svg index 1ddfcd9ab..3ae0a3f8f 100644 --- a/.github/images/diagram_airflow_resistance_dark.svg +++ b/.github/images/diagram_airflow_resistance_dark.svg @@ -1 +1 @@ -Airflow resistance: static and alternating methods (ISO 9053-1/-2)Static method (ISO 9053-1)specimen (A, d)laminar flow q_vΔpmanom.R = Δp / q_v (through-origin fit at 0.5 mm/s)Alternating method (ISO 9053-2)cavityVspecimen / airtightpiston f = 1–4 HzL_pR from L_p,s − L_p,t (κ′ per Annex A) \ No newline at end of file +Airflow resistance: static and alternating methods (ISO 9053-1/-2)Static method (ISO 9053-1)sealspecimen A, dgridq_vflow sourceΔpd≥ 1 borecell ≥ 29 mm bore, ≥ 1 bore of free space aboveq_v and Δp each to ±5 %, Δp readable to 0.1 Pagrid ≥ 50 % open, R < 1 %; d measured in positionR = Δp / q_v (through-origin fit at 0.5 mm/s)Alternating method (ISO 9053-2)cavityVmeasurement cell → L_p,s (h_s)airtight termination → L_p,t (h_t)piston f = 1–4 Hzq_v = 2π f h A_PL_pR from L_p,s − L_p,t (κ′ per Annex A) \ No newline at end of file diff --git a/.github/images/diagram_airflow_resistance_es.svg b/.github/images/diagram_airflow_resistance_es.svg index bcd859ca9..7ee4c4337 100644 --- a/.github/images/diagram_airflow_resistance_es.svg +++ b/.github/images/diagram_airflow_resistance_es.svg @@ -1 +1 @@ -Resistencia al flujo: métodos estático y alternante (ISO 9053-1/-2)Método estático (ISO 9053-1)probeta (A, d)flujo laminar q_vΔpmanóm.R = Δp / q_v (ajuste por el origen a 0,5 mm/s)Método alternante (ISO 9053-2)cavidadVprobeta / cierre estancopistón f = 1–4 HzL_pR por L_p,s − L_p,t (κ′ según Anexo A) \ No newline at end of file +Resistencia al flujo: métodos estático y alternante (ISO 9053-1/-2)Método estático (ISO 9053-1)selladoprobeta A, drejillaq_vfuente de caudalΔpd≥ 1 diámetrocelda ≥ 29 mm de diámetro, ≥ 1 diámetro libre por encimaq_v y Δp con ±5 % cada uno, Δp legible hasta 0,1 Parejilla ≥ 50 % abierta, R < 1 %; d medido en posiciónR = Δp / q_v (ajuste por el origen a 0,5 mm/s)Método alternante (ISO 9053-2)cavidadVcelda de medida → L_p,s (h_s)terminación estanca → L_p,t (h_t)pistón f = 1–4 Hzq_v = 2π f h A_PL_pR por L_p,s − L_p,t (κ′ según Anexo A) \ No newline at end of file diff --git a/.github/images/diagram_airflow_resistance_es_dark.svg b/.github/images/diagram_airflow_resistance_es_dark.svg index d2aff5dff..2031aa433 100644 --- a/.github/images/diagram_airflow_resistance_es_dark.svg +++ b/.github/images/diagram_airflow_resistance_es_dark.svg @@ -1 +1 @@ -Resistencia al flujo: métodos estático y alternante (ISO 9053-1/-2)Método estático (ISO 9053-1)probeta (A, d)flujo laminar q_vΔpmanóm.R = Δp / q_v (ajuste por el origen a 0,5 mm/s)Método alternante (ISO 9053-2)cavidadVprobeta / cierre estancopistón f = 1–4 HzL_pR por L_p,s − L_p,t (κ′ según Anexo A) \ No newline at end of file +Resistencia al flujo: métodos estático y alternante (ISO 9053-1/-2)Método estático (ISO 9053-1)selladoprobeta A, drejillaq_vfuente de caudalΔpd≥ 1 diámetrocelda ≥ 29 mm de diámetro, ≥ 1 diámetro libre por encimaq_v y Δp con ±5 % cada uno, Δp legible hasta 0,1 Parejilla ≥ 50 % abierta, R < 1 %; d medido en posiciónR = Δp / q_v (ajuste por el origen a 0,5 mm/s)Método alternante (ISO 9053-2)cavidadVcelda de medida → L_p,s (h_s)terminación estanca → L_p,t (h_t)pistón f = 1–4 Hzq_v = 2π f h A_PL_pR por L_p,s − L_p,t (κ′ según Anexo A) \ No newline at end of file diff --git a/.github/images/diagram_decay_range.svg b/.github/images/diagram_decay_range.svg new file mode 100644 index 000000000..c873dcc9f --- /dev/null +++ b/.github/images/diagram_decay_range.svg @@ -0,0 +1 @@ +The decay-range budget of one band (ISO 3382)time0-10-20-30-40-50-60-70Level [dB]peakbackground noiseintegration truncated here (t₁)tail compensated asan exponential decay (C)INR = 55 dBEvaluation windows46 dB54 dBEDTT20T30hatched: the 15 dB margin ISO 3382-1 asks for beyond each window — EDT needs 25 dB, T20 35 dB, T30 45 dBthe library flags at 46 dB and 54 dB instead, where the fit's positive bias crosses 5 %short of range? T20 instead of T30 -> a longer sweep or more averages -> EDT; never a fit into the noise \ No newline at end of file diff --git a/.github/images/diagram_decay_range_dark.svg b/.github/images/diagram_decay_range_dark.svg new file mode 100644 index 000000000..b5d58848e --- /dev/null +++ b/.github/images/diagram_decay_range_dark.svg @@ -0,0 +1 @@ +The decay-range budget of one band (ISO 3382)time0-10-20-30-40-50-60-70Level [dB]peakbackground noiseintegration truncated here (t₁)tail compensated asan exponential decay (C)INR = 55 dBEvaluation windows46 dB54 dBEDTT20T30hatched: the 15 dB margin ISO 3382-1 asks for beyond each window — EDT needs 25 dB, T20 35 dB, T30 45 dBthe library flags at 46 dB and 54 dB instead, where the fit's positive bias crosses 5 %short of range? T20 instead of T30 -> a longer sweep or more averages -> EDT; never a fit into the noise \ No newline at end of file diff --git a/.github/images/diagram_decay_range_es.svg b/.github/images/diagram_decay_range_es.svg new file mode 100644 index 000000000..bbd02beb6 --- /dev/null +++ b/.github/images/diagram_decay_range_es.svg @@ -0,0 +1 @@ +The decay-range budget of one band (ISO 3382)tiempo0-10-20-30-40-50-60-70Nivel [dB]picoruido de fondointegración truncada aquí (t₁)cola compensada comouna caída exponencial (C)INR = 55 dBVentanas de evaluación46 dB54 dBEDTT20T30rayado: el margen de 15 dB que exige la ISO 3382-1 más allá de cada ventana — EDT necesita 25 dB, T20 35 dB y T30 45 dBla biblioteca avisa en 46 dB y 54 dB, donde el sesgo positivo del ajuste cruza el 5 %¿falta rango? T20 en vez de T30 -> un barrido más largo o más promedios -> EDT; nunca un ajuste metido en el ruido \ No newline at end of file diff --git a/.github/images/diagram_decay_range_es_dark.svg b/.github/images/diagram_decay_range_es_dark.svg new file mode 100644 index 000000000..9c23d8ce8 --- /dev/null +++ b/.github/images/diagram_decay_range_es_dark.svg @@ -0,0 +1 @@ +The decay-range budget of one band (ISO 3382)tiempo0-10-20-30-40-50-60-70Nivel [dB]picoruido de fondointegración truncada aquí (t₁)cola compensada comouna caída exponencial (C)INR = 55 dBVentanas de evaluación46 dB54 dBEDTT20T30rayado: el margen de 15 dB que exige la ISO 3382-1 más allá de cada ventana — EDT necesita 25 dB, T20 35 dB y T30 45 dBla biblioteca avisa en 46 dB y 54 dB, donde el sesgo positivo del ajuste cruza el 5 %¿falta rango? T20 en vez de T30 -> un barrido más largo o más promedios -> EDT; nunca un ajuste metido en el ruido \ No newline at end of file diff --git a/.github/images/diagram_directivity_factor.svg b/.github/images/diagram_directivity_factor.svg new file mode 100644 index 000000000..8367c9722 --- /dev/null +++ b/.github/images/diagram_directivity_factor.svg @@ -0,0 +1 @@ +Directivity factor Q: four mountings, four critical distancesSQ = 1radiates into 4π srfree spaceon a standrc = 1.11 mSQ = 2radiates into 2π srhard flooron the slabrc = 1.57 mSQ = 4radiates into π srfloor-wall edgeagainst a wall on the slabrc = 2.22 mSQ = 8radiates into π/2 srtrihedral cornerin the corner of the workshoprc = 3.14 mThe same compact source, four mountings (workshop with R = 62 m²)Q multiplies the direct term only: the reverberant plateau does not move.rc = √(Q·R/16π), so two steps of mounting move the crossover by a factor of 2. \ No newline at end of file diff --git a/.github/images/diagram_directivity_factor_dark.svg b/.github/images/diagram_directivity_factor_dark.svg new file mode 100644 index 000000000..e114e36d0 --- /dev/null +++ b/.github/images/diagram_directivity_factor_dark.svg @@ -0,0 +1 @@ +Directivity factor Q: four mountings, four critical distancesSQ = 1radiates into 4π srfree spaceon a standrc = 1.11 mSQ = 2radiates into 2π srhard flooron the slabrc = 1.57 mSQ = 4radiates into π srfloor-wall edgeagainst a wall on the slabrc = 2.22 mSQ = 8radiates into π/2 srtrihedral cornerin the corner of the workshoprc = 3.14 mThe same compact source, four mountings (workshop with R = 62 m²)Q multiplies the direct term only: the reverberant plateau does not move.rc = √(Q·R/16π), so two steps of mounting move the crossover by a factor of 2. \ No newline at end of file diff --git a/.github/images/diagram_directivity_factor_es.svg b/.github/images/diagram_directivity_factor_es.svg new file mode 100644 index 000000000..95fe34fcd --- /dev/null +++ b/.github/images/diagram_directivity_factor_es.svg @@ -0,0 +1 @@ +Factor de directividad Q: cuatro montajes, cuatro distancias críticasSQ = 1radia en 4π srcampo libresobre un trípoderc = 1.11 mSQ = 2radia en 2π srsuelo rígidosobre la solerarc = 1.57 mSQ = 4radia en π srarista suelo-paredcontra una pared, sobre la solerarc = 2.22 mSQ = 8radia en π/2 srrincón triedroen el rincón del tallerrc = 3.14 mLa misma fuente compacta, cuatro montajes (taller con R = 62 m²)Q solo multiplica el término directo: la meseta reverberante no se mueve.rc = √(Q·R/16π), así que dos escalones de montaje desplazan el cruce un factor 2. \ No newline at end of file diff --git a/.github/images/diagram_directivity_factor_es_dark.svg b/.github/images/diagram_directivity_factor_es_dark.svg new file mode 100644 index 000000000..d903260dd --- /dev/null +++ b/.github/images/diagram_directivity_factor_es_dark.svg @@ -0,0 +1 @@ +Factor de directividad Q: cuatro montajes, cuatro distancias críticasSQ = 1radia en 4π srcampo libresobre un trípoderc = 1.11 mSQ = 2radia en 2π srsuelo rígidosobre la solerarc = 1.57 mSQ = 4radia en π srarista suelo-paredcontra una pared, sobre la solerarc = 2.22 mSQ = 8radia en π/2 srrincón triedroen el rincón del tallerrc = 3.14 mLa misma fuente compacta, cuatro montajes (taller con R = 62 m²)Q solo multiplica el término directo: la meseta reverberante no se mueve.rc = √(Q·R/16π), así que dos escalones de montaje desplazan el cruce un factor 2. \ No newline at end of file diff --git a/.github/images/diagram_dynamic_stiffness_rig.svg b/.github/images/diagram_dynamic_stiffness_rig.svg index 672f6184b..be840c11c 100644 --- a/.github/images/diagram_dynamic_stiffness_rig.svg +++ b/.github/images/diagram_dynamic_stiffness_rig.svg @@ -1 +1 @@ -Dynamic-stiffness resonance rig (ISO 9052-1)Resonance rigRigid foundationLoad platem′t = 200 kg/m²Resilient specimen200 mm × 200 mmdExciterF(t)AccelerometerMass-spring modelm′ts′tfrresonance read from the response peaks′t = 4π² m′t fr² (Formula 4)then f₀ = (1/2π)·√(s′/m′) for the installed floating floor (Formula 2) \ No newline at end of file +Dynamic-stiffness resonance rig (EN 29052-1)The three excitation arrangements (Figures 1 to 3)Rigid baseload plate measuredRigid foundationFIsolated baseplateload plate driven, both measuredBaseplate ≥ 100 kgFIsolated baseplatebaseplate driven, both measuredBaseplate ≥ 100 kgFall three are equivalent; sinusoidal excitation is the reference method in case of dispute (7.1)Specimen and load (Clauses 5 and 6)plaster of Paris ≥ 5 mm on 0.02 mm foilLoad plate, steel(200 ± 3) mm square, flat to 0.5 mm8 kg ± 0.5 kg with every device on itResilient specimen, 200 mm × 200 mmthree of them; irregularities < 3 mmdpetroleum-jelly fillet (closed-cell materials)s′t = 4π² m′t fr² (Formula 4)f₀ = (1/2π)·√(s′/m′) (Formula 2)Mass-spring modelm′ts′tfrread at the peak, extrapolated to zero force \ No newline at end of file diff --git a/.github/images/diagram_dynamic_stiffness_rig_dark.svg b/.github/images/diagram_dynamic_stiffness_rig_dark.svg index 9c9b32954..15c46a644 100644 --- a/.github/images/diagram_dynamic_stiffness_rig_dark.svg +++ b/.github/images/diagram_dynamic_stiffness_rig_dark.svg @@ -1 +1 @@ -Dynamic-stiffness resonance rig (ISO 9052-1)Resonance rigRigid foundationLoad platem′t = 200 kg/m²Resilient specimen200 mm × 200 mmdExciterF(t)AccelerometerMass-spring modelm′ts′tfrresonance read from the response peaks′t = 4π² m′t fr² (Formula 4)then f₀ = (1/2π)·√(s′/m′) for the installed floating floor (Formula 2) \ No newline at end of file +Dynamic-stiffness resonance rig (EN 29052-1)The three excitation arrangements (Figures 1 to 3)Rigid baseload plate measuredRigid foundationFIsolated baseplateload plate driven, both measuredBaseplate ≥ 100 kgFIsolated baseplatebaseplate driven, both measuredBaseplate ≥ 100 kgFall three are equivalent; sinusoidal excitation is the reference method in case of dispute (7.1)Specimen and load (Clauses 5 and 6)plaster of Paris ≥ 5 mm on 0.02 mm foilLoad plate, steel(200 ± 3) mm square, flat to 0.5 mm8 kg ± 0.5 kg with every device on itResilient specimen, 200 mm × 200 mmthree of them; irregularities < 3 mmdpetroleum-jelly fillet (closed-cell materials)s′t = 4π² m′t fr² (Formula 4)f₀ = (1/2π)·√(s′/m′) (Formula 2)Mass-spring modelm′ts′tfrread at the peak, extrapolated to zero force \ No newline at end of file diff --git a/.github/images/diagram_dynamic_stiffness_rig_es.svg b/.github/images/diagram_dynamic_stiffness_rig_es.svg index f6504f0ce..8b2e59f6d 100644 --- a/.github/images/diagram_dynamic_stiffness_rig_es.svg +++ b/.github/images/diagram_dynamic_stiffness_rig_es.svg @@ -1 +1 @@ -Banco de resonancia de rigidez dinámica (ISO 9052-1)Banco de resonanciaBase rígidaPlaca de cargam′t = 200 kg/m²Probeta resiliente200 mm × 200 mmdExcitadorF(t)AcelerómetroModelo masa-resortem′ts′tfrla resonancia se lee del pico de la respuestas′t = 4π² m′t fr² (Fórmula 4)luego f₀ = (1/2π)·√(s′/m′) para el suelo flotante instalado (Fórmula 2) \ No newline at end of file +Banco de resonancia de rigidez dinámica (EN 29052-1)Las tres disposiciones de excitación (Figuras 1 a 3)Base rígidase mide la placa de cargaCimentación rígidaFPlaca base aisladase excita la placa de carga; se miden ambasPlaca base ≥ 100 kgFPlaca base aisladase excita la placa base; se miden ambasPlaca base ≥ 100 kgFlas tres son equivalentes; la excitación sinusoidal es el método de referencia en caso de litigio (7.1)Probeta y carga (capítulos 5 y 6)escayola ≥ 5 mm sobre lámina de 0,02 mmPlaca de carga, acero(200 ± 3) mm de lado, planitud 0,5 mm8 kg ± 0,5 kg con todos los equipos encimaProbeta resiliente, 200 mm × 200 mmtres probetas; irregularidades < 3 mmdcordón de vaselina (materiales de celda cerrada)s′t = 4π² m′t fr² (Fórmula 4)f₀ = (1/2π)·√(s′/m′) (Fórmula 2)Modelo masa-resortem′ts′tfrse lee en el pico, extrapolado a fuerza nula \ No newline at end of file diff --git a/.github/images/diagram_dynamic_stiffness_rig_es_dark.svg b/.github/images/diagram_dynamic_stiffness_rig_es_dark.svg index bf7d30317..3f8a44873 100644 --- a/.github/images/diagram_dynamic_stiffness_rig_es_dark.svg +++ b/.github/images/diagram_dynamic_stiffness_rig_es_dark.svg @@ -1 +1 @@ -Banco de resonancia de rigidez dinámica (ISO 9052-1)Banco de resonanciaBase rígidaPlaca de cargam′t = 200 kg/m²Probeta resiliente200 mm × 200 mmdExcitadorF(t)AcelerómetroModelo masa-resortem′ts′tfrla resonancia se lee del pico de la respuestas′t = 4π² m′t fr² (Fórmula 4)luego f₀ = (1/2π)·√(s′/m′) para el suelo flotante instalado (Fórmula 2) \ No newline at end of file +Banco de resonancia de rigidez dinámica (EN 29052-1)Las tres disposiciones de excitación (Figuras 1 a 3)Base rígidase mide la placa de cargaCimentación rígidaFPlaca base aisladase excita la placa de carga; se miden ambasPlaca base ≥ 100 kgFPlaca base aisladase excita la placa base; se miden ambasPlaca base ≥ 100 kgFlas tres son equivalentes; la excitación sinusoidal es el método de referencia en caso de litigio (7.1)Probeta y carga (capítulos 5 y 6)escayola ≥ 5 mm sobre lámina de 0,02 mmPlaca de carga, acero(200 ± 3) mm de lado, planitud 0,5 mm8 kg ± 0,5 kg con todos los equipos encimaProbeta resiliente, 200 mm × 200 mmtres probetas; irregularidades < 3 mmdcordón de vaselina (materiales de celda cerrada)s′t = 4π² m′t fr² (Fórmula 4)f₀ = (1/2π)·√(s′/m′) (Fórmula 2)Modelo masa-resortem′ts′tfrse lee en el pico, extrapolado a fuerza nula \ No newline at end of file diff --git a/.github/images/diagram_en12354_6_takeoff.svg b/.github/images/diagram_en12354_6_takeoff.svg new file mode 100644 index 000000000..8a0b5cdfd --- /dev/null +++ b/.github/images/diagram_en12354_6_takeoff.svg @@ -0,0 +1 @@ +Room take-off: one room, three input lists (EN 12354-6)4.54 m2.40 m2.73 mV = 29.75 m³1000 Hz octave bandceiling 12.39 m² αs 0.02glass facade 10.90 m² αs 0.04floor 12.39 m² αs 0.05short wall 6.55 m² αs 0.04 (x2)long wall (brick) 10.90 m² αs 0.04objects: 0.15, 0.60, 2 × 0.05, 2 × 0.65 m³surfaces = [ (12.39, 0.05), # floor (12.39, 0.02), # ceiling (10.90, 0.04), # long wall (10.90, 0.04), # facade (6.55, 0.04), # short wall (6.55, 0.04), # short wall]A = 2.26 m² (Formula 1)objects = hard_object_absorption(volumes)psi = object_fraction(volumes, 29.75)Aobj = 2.77 m² ψ = 0.072(Formula 4, then Formula 3)One wall, two rowswindowone wall on the drawing(Swall − Swin, αwall)(Swin, αwin)areas sum to the wallNever average a lining into its wall by hand: the areas are weighted inside the formula. \ No newline at end of file diff --git a/.github/images/diagram_en12354_6_takeoff_dark.svg b/.github/images/diagram_en12354_6_takeoff_dark.svg new file mode 100644 index 000000000..0ddafd114 --- /dev/null +++ b/.github/images/diagram_en12354_6_takeoff_dark.svg @@ -0,0 +1 @@ +Room take-off: one room, three input lists (EN 12354-6)4.54 m2.40 m2.73 mV = 29.75 m³1000 Hz octave bandceiling 12.39 m² αs 0.02glass facade 10.90 m² αs 0.04floor 12.39 m² αs 0.05short wall 6.55 m² αs 0.04 (x2)long wall (brick) 10.90 m² αs 0.04objects: 0.15, 0.60, 2 × 0.05, 2 × 0.65 m³surfaces = [ (12.39, 0.05), # floor (12.39, 0.02), # ceiling (10.90, 0.04), # long wall (10.90, 0.04), # facade (6.55, 0.04), # short wall (6.55, 0.04), # short wall]A = 2.26 m² (Formula 1)objects = hard_object_absorption(volumes)psi = object_fraction(volumes, 29.75)Aobj = 2.77 m² ψ = 0.072(Formula 4, then Formula 3)One wall, two rowswindowone wall on the drawing(Swall − Swin, αwall)(Swin, αwin)areas sum to the wallNever average a lining into its wall by hand: the areas are weighted inside the formula. \ No newline at end of file diff --git a/.github/images/diagram_en12354_6_takeoff_es.svg b/.github/images/diagram_en12354_6_takeoff_es.svg new file mode 100644 index 000000000..0baf35055 --- /dev/null +++ b/.github/images/diagram_en12354_6_takeoff_es.svg @@ -0,0 +1 @@ +Levantamiento del recinto: una sala, tres listas de entrada (EN 12354-6)4.54 m2.40 m2.73 mV = 29,75 m³banda de octava de 1000 Hztecho 12,39 m² αs 0,02fachada de vidrio 10,90 m² αs 0,04suelo 12,39 m² αs 0,05pared corta 6,55 m² αs 0,04 (x2)pared larga (ladrillo) 10,90 m² αs 0,04objetos: 0,15, 0,60, 2 × 0,05, 2 × 0,65 m³surfaces = [ (12.39, 0.05), # floor (12.39, 0.02), # ceiling (10.90, 0.04), # long wall (10.90, 0.04), # facade (6.55, 0.04), # short wall (6.55, 0.04), # short wall]A = 2,26 m² (fórmula 1)objects = hard_object_absorption(volumes)psi = object_fraction(volumes, 29.75)Aobj = 2,77 m² ψ = 0,072(fórmula 4, después fórmula 3)Una pared, dos filasventanauna pared en el plano(Swall − Swin, αwall)(Swin, αwin)las áreas suman la paredNunca promedie a mano un revestimiento con su pared: la fórmula ya pondera por área. \ No newline at end of file diff --git a/.github/images/diagram_en12354_6_takeoff_es_dark.svg b/.github/images/diagram_en12354_6_takeoff_es_dark.svg new file mode 100644 index 000000000..e6c008bd0 --- /dev/null +++ b/.github/images/diagram_en12354_6_takeoff_es_dark.svg @@ -0,0 +1 @@ +Levantamiento del recinto: una sala, tres listas de entrada (EN 12354-6)4.54 m2.40 m2.73 mV = 29,75 m³banda de octava de 1000 Hztecho 12,39 m² αs 0,02fachada de vidrio 10,90 m² αs 0,04suelo 12,39 m² αs 0,05pared corta 6,55 m² αs 0,04 (x2)pared larga (ladrillo) 10,90 m² αs 0,04objetos: 0,15, 0,60, 2 × 0,05, 2 × 0,65 m³surfaces = [ (12.39, 0.05), # floor (12.39, 0.02), # ceiling (10.90, 0.04), # long wall (10.90, 0.04), # facade (6.55, 0.04), # short wall (6.55, 0.04), # short wall]A = 2,26 m² (fórmula 1)objects = hard_object_absorption(volumes)psi = object_fraction(volumes, 29.75)Aobj = 2,77 m² ψ = 0,072(fórmula 4, después fórmula 3)Una pared, dos filasventanauna pared en el plano(Swall − Swin, αwall)(Swin, αwin)las áreas suman la paredNunca promedie a mano un revestimiento con su pared: la fórmula ya pondera por área. \ No newline at end of file diff --git a/.github/images/diagram_facade_setup.svg b/.github/images/diagram_facade_setup.svg new file mode 100644 index 000000000..a51defe9f --- /dev/null +++ b/.github/images/diagram_facade_setup.svg @@ -0,0 +1 @@ +Facade sound insulation setup (ISO 16283-3)Receiving roomL₂ , T , VS = 11.5 m²Loudspeaker(on the ground)45° ± 5°r ≥ 5 m element / ≥ 7 m globalD > 3.5 m (element) / > 5 m (global)L₁,s element method≤ 10 mm parallel / ≤ 3 mm normal3 to 10 positions, never griddedL₁,2m global method(2.0 ± 0.2) m1.5 mabove thereceiving-room floorElement method → R'45° (loudspeaker) or R'tr,s (traffic): one component, comparable with a laboratory R.Global method → D2m,nT: the whole facade as built, not comparable with a laboratory R.Road traffic replaces the loudspeaker at all angles: simultaneous inside and outside, ≥ 50 pass-bys.Clauses 9.4, 9.5.1, 9.6.1 and 10.2. None of it is checked by the functions. \ No newline at end of file diff --git a/.github/images/diagram_facade_setup_dark.svg b/.github/images/diagram_facade_setup_dark.svg new file mode 100644 index 000000000..39dea0cc3 --- /dev/null +++ b/.github/images/diagram_facade_setup_dark.svg @@ -0,0 +1 @@ +Facade sound insulation setup (ISO 16283-3)Receiving roomL₂ , T , VS = 11.5 m²Loudspeaker(on the ground)45° ± 5°r ≥ 5 m element / ≥ 7 m globalD > 3.5 m (element) / > 5 m (global)L₁,s element method≤ 10 mm parallel / ≤ 3 mm normal3 to 10 positions, never griddedL₁,2m global method(2.0 ± 0.2) m1.5 mabove thereceiving-room floorElement method → R'45° (loudspeaker) or R'tr,s (traffic): one component, comparable with a laboratory R.Global method → D2m,nT: the whole facade as built, not comparable with a laboratory R.Road traffic replaces the loudspeaker at all angles: simultaneous inside and outside, ≥ 50 pass-bys.Clauses 9.4, 9.5.1, 9.6.1 and 10.2. None of it is checked by the functions. \ No newline at end of file diff --git a/.github/images/diagram_facade_setup_es.svg b/.github/images/diagram_facade_setup_es.svg new file mode 100644 index 000000000..43ed05492 --- /dev/null +++ b/.github/images/diagram_facade_setup_es.svg @@ -0,0 +1 @@ +Montaje de aislamiento acustico de fachada (ISO 16283-3)Recinto receptorL₂ , T , VS = 11,5 m²Altavoz(sobre el suelo)45° ± 5°r ≥ 5 m elemento / ≥ 7 m globalD > 3,5 m (elemento) / > 5 m (global)L₁,s metodo de elemento≤ 10 mm paralelo / ≤ 3 mm normalde 3 a 10 posiciones, nunca en rejillaL₁,2m metodo global(2,0 ± 0,2) m1,5 mpor encima delsuelo del recinto receptorMetodo de elemento → R'45° o R'tr,s: un componente, comparable con una R de laboratorio.Metodo global → D2m,nT: la fachada tal como esta construida; no comparable con laboratorio.El trafico rodado incide desde todos los angulos: medicion simultanea dentro y fuera, ≥ 50 pasos.Apartados 9.4, 9.5.1, 9.6.1 y 10.2. Nada de esto lo comprueban las funciones. \ No newline at end of file diff --git a/.github/images/diagram_facade_setup_es_dark.svg b/.github/images/diagram_facade_setup_es_dark.svg new file mode 100644 index 000000000..c5447e4be --- /dev/null +++ b/.github/images/diagram_facade_setup_es_dark.svg @@ -0,0 +1 @@ +Montaje de aislamiento acustico de fachada (ISO 16283-3)Recinto receptorL₂ , T , VS = 11,5 m²Altavoz(sobre el suelo)45° ± 5°r ≥ 5 m elemento / ≥ 7 m globalD > 3,5 m (elemento) / > 5 m (global)L₁,s metodo de elemento≤ 10 mm paralelo / ≤ 3 mm normalde 3 a 10 posiciones, nunca en rejillaL₁,2m metodo global(2,0 ± 0,2) m1,5 mpor encima delsuelo del recinto receptorMetodo de elemento → R'45° o R'tr,s: un componente, comparable con una R de laboratorio.Metodo global → D2m,nT: la fachada tal como esta construida; no comparable con laboratorio.El trafico rodado incide desde todos los angulos: medicion simultanea dentro y fuera, ≥ 50 pasos.Apartados 9.4, 9.5.1, 9.6.1 y 10.2. Nada de esto lo comprueban las funciones. \ No newline at end of file diff --git a/.github/images/diagram_heavy_impact_sources.svg b/.github/images/diagram_heavy_impact_sources.svg new file mode 100644 index 000000000..4a79e1238 --- /dev/null +++ b/.github/images/diagram_heavy_impact_sources.svg @@ -0,0 +1 @@ +Standard heavy and soft impact sources (ISO 16283-2, JIS A 1418-2)Floor under test (source room)(a) tapping machineISO 10140-5 Annex E40 mm5 hammers, 500 g each(100 ± 20) ms apart(b) rubber ballISO 16283-2 Annex A / ISO 10140-5 Annex F180 mm30 mm wallm_eff = (2.5 ± 0.1) kge = 0.8 ± 0.1(100 ± 1) cmfrom the ball's BOTTOM(c) bang machineJIS A 1418-2 only(2.4 ± 0.2)·10⁵ Pam_eff = (7.3 ± 0.2) kg85 cmsourcerigid floor +force plateoctave filteranalyser → L_FEJIS A 1418-2 Annex C: the filter goes BEFORE the analyser,so L_FE is evaluated once per bandThe dimensions above are the standards' informative construction examples;the specification is the force spectrum, not the shape. \ No newline at end of file diff --git a/.github/images/diagram_heavy_impact_sources_dark.svg b/.github/images/diagram_heavy_impact_sources_dark.svg new file mode 100644 index 000000000..6e1f73eef --- /dev/null +++ b/.github/images/diagram_heavy_impact_sources_dark.svg @@ -0,0 +1 @@ +Standard heavy and soft impact sources (ISO 16283-2, JIS A 1418-2)Floor under test (source room)(a) tapping machineISO 10140-5 Annex E40 mm5 hammers, 500 g each(100 ± 20) ms apart(b) rubber ballISO 16283-2 Annex A / ISO 10140-5 Annex F180 mm30 mm wallm_eff = (2.5 ± 0.1) kge = 0.8 ± 0.1(100 ± 1) cmfrom the ball's BOTTOM(c) bang machineJIS A 1418-2 only(2.4 ± 0.2)·10⁵ Pam_eff = (7.3 ± 0.2) kg85 cmsourcerigid floor +force plateoctave filteranalyser → L_FEJIS A 1418-2 Annex C: the filter goes BEFORE the analyser,so L_FE is evaluated once per bandThe dimensions above are the standards' informative construction examples;the specification is the force spectrum, not the shape. \ No newline at end of file diff --git a/.github/images/diagram_heavy_impact_sources_es.svg b/.github/images/diagram_heavy_impact_sources_es.svg new file mode 100644 index 000000000..fe80064cb --- /dev/null +++ b/.github/images/diagram_heavy_impact_sources_es.svg @@ -0,0 +1 @@ +Fuentes de impacto normalizadas (ISO 16283-2, JIS A 1418-2)Forjado ensayado (recinto emisor)(a) maquina de impactosISO 10140-5 Anexo E40 mm5 martillos de 500 g cada unoseparados (100 ± 20) ms(b) pelota de cauchoISO 16283-2 Anexo A / ISO 10140-5 Anexo F180 mmpared de 30 mmm_ef = (2,5 ± 0,1) kge = 0,8 ± 0,1(100 ± 1) cmdesde la BASE de la pelota(c) maquina de golpessolo en JIS A 1418-2(2,4 ± 0,2)·10⁵ Pam_ef = (7,3 ± 0,2) kg85 cmfuentesuelo rigido +plataforma de fuerzafiltro de octavaanalizador → L_FEJIS A 1418-2 Anexo C: el filtro va ANTES del analizador,de modo que L_FE se evalua una vez por bandaLas dimensiones anteriores son ejemplos constructivos informativos de las normas;la especificacion es el espectro de fuerza, no la forma. \ No newline at end of file diff --git a/.github/images/diagram_heavy_impact_sources_es_dark.svg b/.github/images/diagram_heavy_impact_sources_es_dark.svg new file mode 100644 index 000000000..8f68261af --- /dev/null +++ b/.github/images/diagram_heavy_impact_sources_es_dark.svg @@ -0,0 +1 @@ +Fuentes de impacto normalizadas (ISO 16283-2, JIS A 1418-2)Forjado ensayado (recinto emisor)(a) maquina de impactosISO 10140-5 Anexo E40 mm5 martillos de 500 g cada unoseparados (100 ± 20) ms(b) pelota de cauchoISO 16283-2 Anexo A / ISO 10140-5 Anexo F180 mmpared de 30 mmm_ef = (2,5 ± 0,1) kge = 0,8 ± 0,1(100 ± 1) cmdesde la BASE de la pelota(c) maquina de golpessolo en JIS A 1418-2(2,4 ± 0,2)·10⁵ Pam_ef = (7,3 ± 0,2) kg85 cmfuentesuelo rigido +plataforma de fuerzafiltro de octavaanalizador → L_FEJIS A 1418-2 Anexo C: el filtro va ANTES del analizador,de modo que L_FE se evalua una vez por bandaLas dimensiones anteriores son ejemplos constructivos informativos de las normas;la especificacion es el espectro de fuerza, no la forma. \ No newline at end of file diff --git a/.github/images/diagram_iso12354_annexl.svg b/.github/images/diagram_iso12354_annexl.svg new file mode 100644 index 000000000..d3ffd695d --- /dev/null +++ b/.github/images/diagram_iso12354_annexl.svg @@ -0,0 +1 @@ +ISO 12354-1 Annex L worked building: elements, junctions, pathsSection: two stacked dwellingssource dwellingreceiving dwellingTTXT rigid T (floor to external wall): Kij = 6,4 / 11,2 dBX rigid cross (floor to internal wall): Kij = 8,8 / 11,0 dBseparating floor 220 mm concrete, 484 kg/m², fc = 76,8 Hzon it 35 mm screed, 73,5 kg/m², on s' = 8 MN/m³external walls 365 mm AAC, 219 kg/m², fc = 92,6 Hzinternal walls 200 mm calcium silicate, 360 kg/m², fc = 128,4 HzPlan: the separating floorS = 20 m²5,00 m × 4,00 m5,00 m4,00 mexternal wall (T)internal wall (X)two external and two internal walls meet the floor, with5,00 m of junction along each long edge and 4,00 m alongeach short one: perimeter sum 9 m external + 9 m internal13 airborne paths = 1 direct (Dd) + 4 flanking elements × 3 branches (Ff, Df, Fd)5 impact paths = 1 direct + 4 Df: only the floor is excited, so there is no Ff or Fd \ No newline at end of file diff --git a/.github/images/diagram_iso12354_annexl_dark.svg b/.github/images/diagram_iso12354_annexl_dark.svg new file mode 100644 index 000000000..4d7d351ae --- /dev/null +++ b/.github/images/diagram_iso12354_annexl_dark.svg @@ -0,0 +1 @@ +ISO 12354-1 Annex L worked building: elements, junctions, pathsSection: two stacked dwellingssource dwellingreceiving dwellingTTXT rigid T (floor to external wall): Kij = 6,4 / 11,2 dBX rigid cross (floor to internal wall): Kij = 8,8 / 11,0 dBseparating floor 220 mm concrete, 484 kg/m², fc = 76,8 Hzon it 35 mm screed, 73,5 kg/m², on s' = 8 MN/m³external walls 365 mm AAC, 219 kg/m², fc = 92,6 Hzinternal walls 200 mm calcium silicate, 360 kg/m², fc = 128,4 HzPlan: the separating floorS = 20 m²5,00 m × 4,00 m5,00 m4,00 mexternal wall (T)internal wall (X)two external and two internal walls meet the floor, with5,00 m of junction along each long edge and 4,00 m alongeach short one: perimeter sum 9 m external + 9 m internal13 airborne paths = 1 direct (Dd) + 4 flanking elements × 3 branches (Ff, Df, Fd)5 impact paths = 1 direct + 4 Df: only the floor is excited, so there is no Ff or Fd \ No newline at end of file diff --git a/.github/images/diagram_iso12354_annexl_es.svg b/.github/images/diagram_iso12354_annexl_es.svg new file mode 100644 index 000000000..cdc560e8f --- /dev/null +++ b/.github/images/diagram_iso12354_annexl_es.svg @@ -0,0 +1 @@ +Edificio resuelto del anexo L de la ISO 12354-1: elementos, uniones y víasSección: dos viviendas superpuestasvivienda emisoravivienda receptoraTTXT T rígida (forjado a muro exterior): Kij = 6,4 / 11,2 dBX cruz rígida (forjado a tabique interior): Kij = 8,8 / 11,0 dBforjado separador hormigón de 220 mm, 484 kg/m², fc = 76,8 Hzsobre él solera de 35 mm, 73,5 kg/m², sobre s' = 8 MN/m³muros exteriores hormigón celular de 365 mm, 219 kg/m², fc = 92,6 Hztabiques interiores silicocalcáreo de 200 mm, 360 kg/m², fc = 128,4 HzPlanta: el forjado separadorS = 20 m²5,00 m × 4,00 m5,00 m4,00 mmuro exterior (T)tabique interior (X)dos muros exteriores y dos interiores llegan al forjado, con5,00 m de unión en cada borde largo y 4,00 m encada borde corto: suma del perímetro 9 m exterior + 9 m interior13 vías aéreas = 1 directa (Dd) + 4 elementos de flanco × 3 ramas (Ff, Df, Fd)5 vías de impacto = 1 directa + 4 Df: solo se excita el forjado, así que no hay Ff ni Fd \ No newline at end of file diff --git a/.github/images/diagram_iso12354_annexl_es_dark.svg b/.github/images/diagram_iso12354_annexl_es_dark.svg new file mode 100644 index 000000000..755e7cf7a --- /dev/null +++ b/.github/images/diagram_iso12354_annexl_es_dark.svg @@ -0,0 +1 @@ +Edificio resuelto del anexo L de la ISO 12354-1: elementos, uniones y víasSección: dos viviendas superpuestasvivienda emisoravivienda receptoraTTXT T rígida (forjado a muro exterior): Kij = 6,4 / 11,2 dBX cruz rígida (forjado a tabique interior): Kij = 8,8 / 11,0 dBforjado separador hormigón de 220 mm, 484 kg/m², fc = 76,8 Hzsobre él solera de 35 mm, 73,5 kg/m², sobre s' = 8 MN/m³muros exteriores hormigón celular de 365 mm, 219 kg/m², fc = 92,6 Hztabiques interiores silicocalcáreo de 200 mm, 360 kg/m², fc = 128,4 HzPlanta: el forjado separadorS = 20 m²5,00 m × 4,00 m5,00 m4,00 mmuro exterior (T)tabique interior (X)dos muros exteriores y dos interiores llegan al forjado, con5,00 m de unión en cada borde largo y 4,00 m encada borde corto: suma del perímetro 9 m exterior + 9 m interior13 vías aéreas = 1 directa (Dd) + 4 elementos de flanco × 3 ramas (Ff, Df, Fd)5 vías de impacto = 1 directa + 4 Df: solo se excita el forjado, así que no hay Ff ni Fd \ No newline at end of file diff --git a/.github/images/diagram_iso16251_mockup.svg b/.github/images/diagram_iso16251_mockup.svg new file mode 100644 index 000000000..f40047b9f --- /dev/null +++ b/.github/images/diagram_iso16251_mockup.svg @@ -0,0 +1 @@ +ISO 16251-1 small floor mock-up for floor-covering improvementSectionconcrete slab, 200 ± 10 mmcovering specimentapping machine (ISO 10140-5)5 hammers, 0,5 kg from 40 mm, 10 s⁻¹accelerometer screwed or glued underneathelastic padsfour elastic pads at the corners, each ≤ 100 × 100 mmvertical resonance of the slab on its pads < 20 Hztop flat to ± 1 mm in a line edge to edgePlanmachine positions above, accelerometers below≥ 300 mm1 200 × 800 mm (± 50 mm)≥ 2 machine positions, skew to the edges,no hammer within 100 mm of an edge, all feet on the specimen≥ 4 accelerometer positions, uniform but random,off the symmetry lines and ≥ 100 mm from every edgethree cycles: with specimen | without specimen (hammers repeated within ± 20 mm) | background≥ 20 s per level; background rule: unchanged ≥ 15 dB, energy subtraction 6-15 dB, −1,3 dB below 6 dBL_a = 10 lg(<a²>/a₀²), a₀ = 10⁻⁶ m/s² (Formula 1) \ No newline at end of file diff --git a/.github/images/diagram_iso16251_mockup_dark.svg b/.github/images/diagram_iso16251_mockup_dark.svg new file mode 100644 index 000000000..8b69cb210 --- /dev/null +++ b/.github/images/diagram_iso16251_mockup_dark.svg @@ -0,0 +1 @@ +ISO 16251-1 small floor mock-up for floor-covering improvementSectionconcrete slab, 200 ± 10 mmcovering specimentapping machine (ISO 10140-5)5 hammers, 0,5 kg from 40 mm, 10 s⁻¹accelerometer screwed or glued underneathelastic padsfour elastic pads at the corners, each ≤ 100 × 100 mmvertical resonance of the slab on its pads < 20 Hztop flat to ± 1 mm in a line edge to edgePlanmachine positions above, accelerometers below≥ 300 mm1 200 × 800 mm (± 50 mm)≥ 2 machine positions, skew to the edges,no hammer within 100 mm of an edge, all feet on the specimen≥ 4 accelerometer positions, uniform but random,off the symmetry lines and ≥ 100 mm from every edgethree cycles: with specimen | without specimen (hammers repeated within ± 20 mm) | background≥ 20 s per level; background rule: unchanged ≥ 15 dB, energy subtraction 6-15 dB, −1,3 dB below 6 dBL_a = 10 lg(<a²>/a₀²), a₀ = 10⁻⁶ m/s² (Formula 1) \ No newline at end of file diff --git a/.github/images/diagram_iso16251_mockup_es.svg b/.github/images/diagram_iso16251_mockup_es.svg new file mode 100644 index 000000000..0fb54236c --- /dev/null +++ b/.github/images/diagram_iso16251_mockup_es.svg @@ -0,0 +1 @@ +Maqueta de suelo de la ISO 16251-1 para la mejora de un revestimientoSecciónlosa de hormigón, 200 ± 10 mmprobeta de revestimientomáquina de impactos (ISO 10140-5)5 martillos, 0,5 kg desde 40 mm, 10 s⁻¹acelerómetro atornillado o pegado por debajoapoyos elásticoscuatro apoyos elásticos en las esquinas, cada uno ≤ 100 × 100 mmresonancia vertical de la losa sobre sus apoyos < 20 Hzcara superior plana a ± 1 mm en línea de borde a bordePlantaposiciones de la máquina arriba, acelerómetros abajo≥ 300 mm1 200 × 800 mm (± 50 mm)≥ 2 posiciones de la máquina, oblicuas a los bordes,ningún martillo a menos de 100 mm de un borde, todas las patas sobre la probeta≥ 4 posiciones de acelerómetro, uniformes pero aleatorias,fuera de las líneas de simetría y a ≥ 100 mm de cada bordetres ciclos: con probeta | sin probeta (martillos repetidos dentro de ± 20 mm) | ruido de fondo≥ 20 s por nivel; regla de fondo: sin cambio ≥ 15 dB, resta energética 6-15 dB, −1,3 dB por debajo de 6 dBL_a = 10 lg(<a²>/a₀²), a₀ = 10⁻⁶ m/s² (fórmula 1) \ No newline at end of file diff --git a/.github/images/diagram_iso16251_mockup_es_dark.svg b/.github/images/diagram_iso16251_mockup_es_dark.svg new file mode 100644 index 000000000..78c85cb46 --- /dev/null +++ b/.github/images/diagram_iso16251_mockup_es_dark.svg @@ -0,0 +1 @@ +Maqueta de suelo de la ISO 16251-1 para la mejora de un revestimientoSecciónlosa de hormigón, 200 ± 10 mmprobeta de revestimientomáquina de impactos (ISO 10140-5)5 martillos, 0,5 kg desde 40 mm, 10 s⁻¹acelerómetro atornillado o pegado por debajoapoyos elásticoscuatro apoyos elásticos en las esquinas, cada uno ≤ 100 × 100 mmresonancia vertical de la losa sobre sus apoyos < 20 Hzcara superior plana a ± 1 mm en línea de borde a bordePlantaposiciones de la máquina arriba, acelerómetros abajo≥ 300 mm1 200 × 800 mm (± 50 mm)≥ 2 posiciones de la máquina, oblicuas a los bordes,ningún martillo a menos de 100 mm de un borde, todas las patas sobre la probeta≥ 4 posiciones de acelerómetro, uniformes pero aleatorias,fuera de las líneas de simetría y a ≥ 100 mm de cada bordetres ciclos: con probeta | sin probeta (martillos repetidos dentro de ± 20 mm) | ruido de fondo≥ 20 s por nivel; regla de fondo: sin cambio ≥ 15 dB, resta energética 6-15 dB, −1,3 dB por debajo de 6 dBL_a = 10 lg(<a²>/a₀²), a₀ = 10⁻⁶ m/s² (fórmula 1) \ No newline at end of file diff --git a/.github/images/diagram_iso354_room.svg b/.github/images/diagram_iso354_room.svg new file mode 100644 index 000000000..25b7ad804 --- /dev/null +++ b/.github/images/diagram_iso354_room.svg @@ -0,0 +1 @@ +Reverberation-room sound absorption (ISO 354)Reverberation room · planV = 200 m³ (≥ 150 m³)diffusers 0.8–3 m² each, ≈ 5 kg/m² (Annex A)Test specimen S = 10.8 m²10–12 m², width/length 0.7–1, edges not parallel to the room≥ 0.75 mS1S2≥ 3 mM1M2M3≥ 1.5 mmicrophones ≥ 1.5 m apart, ≥ 2 m from a source, ≥ 1 m from any surface and from the specimenThe measurement is a difference1 · empty roomT₁ → A₁2 · specimen installedT₂ → A₂α_s = (A₂ − A₁) / SAnnex B mounting (part of the result)perimeter frame, flushType A: directly on the rigid floor400 mmType E-400: 400 mm face to floorA = 55.3 V/(c T) − 4 V m · c = 331 + 0.6 t (15–30 °C)≥ 12 spatially independent decays = ≥ 3 microphones × ≥ 2 sources · T₂₀ read from −5 dB over 20 dBthe empty-room A₁ must clear the Table 1 ceiling, and T₁ is measured without the specimen frame \ No newline at end of file diff --git a/.github/images/diagram_iso354_room_dark.svg b/.github/images/diagram_iso354_room_dark.svg new file mode 100644 index 000000000..8d69bd9ba --- /dev/null +++ b/.github/images/diagram_iso354_room_dark.svg @@ -0,0 +1 @@ +Reverberation-room sound absorption (ISO 354)Reverberation room · planV = 200 m³ (≥ 150 m³)diffusers 0.8–3 m² each, ≈ 5 kg/m² (Annex A)Test specimen S = 10.8 m²10–12 m², width/length 0.7–1, edges not parallel to the room≥ 0.75 mS1S2≥ 3 mM1M2M3≥ 1.5 mmicrophones ≥ 1.5 m apart, ≥ 2 m from a source, ≥ 1 m from any surface and from the specimenThe measurement is a difference1 · empty roomT₁ → A₁2 · specimen installedT₂ → A₂α_s = (A₂ − A₁) / SAnnex B mounting (part of the result)perimeter frame, flushType A: directly on the rigid floor400 mmType E-400: 400 mm face to floorA = 55.3 V/(c T) − 4 V m · c = 331 + 0.6 t (15–30 °C)≥ 12 spatially independent decays = ≥ 3 microphones × ≥ 2 sources · T₂₀ read from −5 dB over 20 dBthe empty-room A₁ must clear the Table 1 ceiling, and T₁ is measured without the specimen frame \ No newline at end of file diff --git a/.github/images/diagram_iso354_room_es.svg b/.github/images/diagram_iso354_room_es.svg new file mode 100644 index 000000000..39b7b0618 --- /dev/null +++ b/.github/images/diagram_iso354_room_es.svg @@ -0,0 +1 @@ +Absorción acústica en cámara reverberante (ISO 354)Cámara reverberante · plantaV = 200 m³ (≥ 150 m³)difusores 0,8–3 m² cada uno, ≈ 5 kg/m² (Anexo A)Probeta de ensayo S = 10,8 m²10–12 m², anchura/longitud 0,7–1, bordes no paralelos a la cámara≥ 0,75 mS1S2≥ 3 mM1M2M3≥ 1,5 mmicrófonos separados ≥ 1,5 m, a ≥ 2 m de una fuente y a ≥ 1 m de cualquier superficie y de la probetaLa medida es una diferencia1 · cámara vacíaT₁ → A₁2 · probeta instaladaT₂ → A₂α_s = (A₂ − A₁) / SMontaje del Anexo B (parte del resultado)marco perimetral, enrasadoTipo A: directamente sobre el suelo rígido400 mmTipo E-400: 400 mm de la cara al sueloA = 55,3 V/(c T) − 4 V m · c = 331 + 0,6 t (15–30 °C)≥ 12 curvas de caída espacialmente independientes = ≥ 3 micrófonos × ≥ 2 fuentes · T₂₀ leído desde −5 dB sobre 20 dBA₁ de la cámara vacía debe quedar bajo el techo de la Tabla 1, y T₁ se mide sin el marco de la probeta \ No newline at end of file diff --git a/.github/images/diagram_iso354_room_es_dark.svg b/.github/images/diagram_iso354_room_es_dark.svg new file mode 100644 index 000000000..062be2697 --- /dev/null +++ b/.github/images/diagram_iso354_room_es_dark.svg @@ -0,0 +1 @@ +Absorción acústica en cámara reverberante (ISO 354)Cámara reverberante · plantaV = 200 m³ (≥ 150 m³)difusores 0,8–3 m² cada uno, ≈ 5 kg/m² (Anexo A)Probeta de ensayo S = 10,8 m²10–12 m², anchura/longitud 0,7–1, bordes no paralelos a la cámara≥ 0,75 mS1S2≥ 3 mM1M2M3≥ 1,5 mmicrófonos separados ≥ 1,5 m, a ≥ 2 m de una fuente y a ≥ 1 m de cualquier superficie y de la probetaLa medida es una diferencia1 · cámara vacíaT₁ → A₁2 · probeta instaladaT₂ → A₂α_s = (A₂ − A₁) / SMontaje del Anexo B (parte del resultado)marco perimetral, enrasadoTipo A: directamente sobre el suelo rígido400 mmTipo E-400: 400 mm de la cara al sueloA = 55,3 V/(c T) − 4 V m · c = 331 + 0,6 t (15–30 °C)≥ 12 curvas de caída espacialmente independientes = ≥ 3 micrófonos × ≥ 2 fuentes · T₂₀ leído desde −5 dB sobre 20 dBA₁ de la cámara vacía debe quedar bajo el techo de la Tabla 1, y T₁ se mide sin el marco de la probeta \ No newline at end of file diff --git a/.github/images/diagram_junction_catalogue.svg b/.github/images/diagram_junction_catalogue.svg new file mode 100644 index 000000000..9eb67be79 --- /dev/null +++ b/.github/images/diagram_junction_catalogue.svg @@ -0,0 +1 @@ +EN 12354-1 Annex E junction types, path branches and the mass ratiorigid cross1324K13K12ℓfrigid T132K13K12T with a flexible interlayer132K13elastic layercorner12K12thickness change12K12lightweight double leaf1324K13K24rigid cross:'rigid_cross', 'through' / 'corner'rigid T:'rigid_t', 'through' / 'corner'flexible T:'flexible_t', 'through' / 'corner'corner:'corner', 'corner'thickness change:'thickness_change', 'through'lightweight double leaf:'lightweight_double_homogeneous', 'double_leaf'M = lg(m'perp,i / m'i): m'i is the element carrying the path, so the ratio is per path, not per junction.The functions take the RATIO, not M. Annex H.3 floor, ratio 1,61: 'through' -> K13 = 12,5 dB, 'corner' -> K12 = 8,9 dBℓf is the coupling length along the junction line, measured surface to surface. Annex E values are read at 500 Hz, +/- 3 dB. \ No newline at end of file diff --git a/.github/images/diagram_junction_catalogue_dark.svg b/.github/images/diagram_junction_catalogue_dark.svg new file mode 100644 index 000000000..e374458f4 --- /dev/null +++ b/.github/images/diagram_junction_catalogue_dark.svg @@ -0,0 +1 @@ +EN 12354-1 Annex E junction types, path branches and the mass ratiorigid cross1324K13K12ℓfrigid T132K13K12T with a flexible interlayer132K13elastic layercorner12K12thickness change12K12lightweight double leaf1324K13K24rigid cross:'rigid_cross', 'through' / 'corner'rigid T:'rigid_t', 'through' / 'corner'flexible T:'flexible_t', 'through' / 'corner'corner:'corner', 'corner'thickness change:'thickness_change', 'through'lightweight double leaf:'lightweight_double_homogeneous', 'double_leaf'M = lg(m'perp,i / m'i): m'i is the element carrying the path, so the ratio is per path, not per junction.The functions take the RATIO, not M. Annex H.3 floor, ratio 1,61: 'through' -> K13 = 12,5 dB, 'corner' -> K12 = 8,9 dBℓf is the coupling length along the junction line, measured surface to surface. Annex E values are read at 500 Hz, +/- 3 dB. \ No newline at end of file diff --git a/.github/images/diagram_junction_catalogue_es.svg b/.github/images/diagram_junction_catalogue_es.svg new file mode 100644 index 000000000..26975a5ae --- /dev/null +++ b/.github/images/diagram_junction_catalogue_es.svg @@ -0,0 +1 @@ +Tipos de unión del anexo E de la EN 12354-1, ramas de vía y cociente de masascruz rígida1324K13K12ℓfT rígida132K13K12T con capa elástica intermedia132K13capa elásticaesquina12K12cambio de espesor12K12doble hoja ligera1324K13K24cruz rígida:'rigid_cross', 'through' / 'corner'T rígida:'rigid_t', 'through' / 'corner'T flexible:'flexible_t', 'through' / 'corner'esquina:'corner', 'corner'cambio de espesor:'thickness_change', 'through'doble hoja ligera:'lightweight_double_homogeneous', 'double_leaf'M = lg(m'perp,i / m'i): m'i es el elemento que lleva la vía, así que el cociente es por vía, no por unión.Las funciones toman el COCIENTE, no M. Forjado del anexo H.3, cociente 1,61: 'through' -> K13 = 12,5 dB, 'corner' -> K12 = 8,9 dBℓf es la longitud de acoplamiento a lo largo de la unión, medida de superficie a superficie. Los valores del anexo E se leen a 500 Hz, +/- 3 dB. \ No newline at end of file diff --git a/.github/images/diagram_junction_catalogue_es_dark.svg b/.github/images/diagram_junction_catalogue_es_dark.svg new file mode 100644 index 000000000..474aef550 --- /dev/null +++ b/.github/images/diagram_junction_catalogue_es_dark.svg @@ -0,0 +1 @@ +Tipos de unión del anexo E de la EN 12354-1, ramas de vía y cociente de masascruz rígida1324K13K12ℓfT rígida132K13K12T con capa elástica intermedia132K13capa elásticaesquina12K12cambio de espesor12K12doble hoja ligera1324K13K24cruz rígida:'rigid_cross', 'through' / 'corner'T rígida:'rigid_t', 'through' / 'corner'T flexible:'flexible_t', 'through' / 'corner'esquina:'corner', 'corner'cambio de espesor:'thickness_change', 'through'doble hoja ligera:'lightweight_double_homogeneous', 'double_leaf'M = lg(m'perp,i / m'i): m'i es el elemento que lleva la vía, así que el cociente es por vía, no por unión.Las funciones toman el COCIENTE, no M. Forjado del anexo H.3, cociente 1,61: 'through' -> K13 = 12,5 dB, 'corner' -> K12 = 8,9 dBℓf es la longitud de acoplamiento a lo largo de la unión, medida de superficie a superficie. Los valores del anexo E se leen a 500 Hz, +/- 3 dB. \ No newline at end of file diff --git a/.github/images/diagram_mobility_rig_es.svg b/.github/images/diagram_mobility_rig_es.svg index 142979f23..acad24320 100644 --- a/.github/images/diagram_mobility_rig_es.svg +++ b/.github/images/diagram_mobility_rig_es.svg @@ -1 +1 @@ -Medición de movilidad mecánica sobre una viga (ISO 7626)suspensión elástica blandaEstructura bajo ensayo (viga libre-libre)ExcitadorCabeza de impedanciaF y a en el mismo puntoFivipunto de excitación: Yii = vi / Fivjtransferencia: Yji = vj / FiY(f) = v/F [m/(N·s)] · excitador acoplado (Parte 2) · martillo de impacto (Parte 5)una misma medición, tres FRF: x/F receptancia · v/F movilidad · a/F acelerancia \ No newline at end of file +Medición de movilidad mecánica sobre una viga (ISO 7626)suspensión elástica blandaEstructura bajo ensayo (viga libre-libre)ExciterCabeza de impedanciaF y a en el mismo puntoFivipunto de excitación: Yii = vi / Fivjtransferencia: Yji = vj / FiY(f) = v/F [m/(N·s)] · excitador acoplado (Parte 2) · martillo de impacto (Parte 5)una misma medición, tres FRF: x/F receptancia · v/F movilidad · a/F acelerancia \ No newline at end of file diff --git a/.github/images/diagram_mobility_rig_es_dark.svg b/.github/images/diagram_mobility_rig_es_dark.svg index a7120e0d9..a3cc084c8 100644 --- a/.github/images/diagram_mobility_rig_es_dark.svg +++ b/.github/images/diagram_mobility_rig_es_dark.svg @@ -1 +1 @@ -Medición de movilidad mecánica sobre una viga (ISO 7626)suspensión elástica blandaEstructura bajo ensayo (viga libre-libre)ExcitadorCabeza de impedanciaF y a en el mismo puntoFivipunto de excitación: Yii = vi / Fivjtransferencia: Yji = vj / FiY(f) = v/F [m/(N·s)] · excitador acoplado (Parte 2) · martillo de impacto (Parte 5)una misma medición, tres FRF: x/F receptancia · v/F movilidad · a/F acelerancia \ No newline at end of file +Medición de movilidad mecánica sobre una viga (ISO 7626)suspensión elástica blandaEstructura bajo ensayo (viga libre-libre)ExciterCabeza de impedanciaF y a en el mismo puntoFivipunto de excitación: Yii = vi / Fivjtransferencia: Yji = vj / FiY(f) = v/F [m/(N·s)] · excitador acoplado (Parte 2) · martillo de impacto (Parte 5)una misma medición, tres FRF: x/F receptancia · v/F movilidad · a/F acelerancia \ No newline at end of file diff --git a/.github/images/diagram_open_plan_setup.svg b/.github/images/diagram_open_plan_setup.svg new file mode 100644 index 000000000..f48e35698 --- /dev/null +++ b/.github/images/diagram_open_plan_setup.svg @@ -0,0 +1 @@ +Where the ISO 3382-3 measurement line goes (clauses 5.1 and 5.2)(a) Plan — 30 × 12 m floor, two ceiling zonesabsorbent raft ceilingplain plaster ceilingzones measured and reported separately≥ 2.0 m from walls and other reflecting surfacesP1P2P3P4P5P6P7P81.2 m screensP1 at the nearest workstation; the path need not be straightS1S2only 2 m to 16 m enter D2,S≥ 0.5 m from tables(b) Section — both heights are 1.2 m (5.2.2)omnidirectional, pink noise1.2 m1.2 mseated head positionSource (5.1.1):omnidirectional, pink noise, ISO 3382-1directivity; a pink-spectrum sweep orMLS may be used insteadReceiver (5.1.2):class 1 to IEC 61672-1, IEC 61260 octavefilters, omnidirectional capsule,≥ 10 s integrationRoom (5.2.1):furnished, nobody present but theoperators, HVAC and any masking systemat working-day powerLine (5.2.2):6 to 10 positions preferred, 4 the minimum;≥ 2 source positions, or the line walkedin both directions \ No newline at end of file diff --git a/.github/images/diagram_open_plan_setup_dark.svg b/.github/images/diagram_open_plan_setup_dark.svg new file mode 100644 index 000000000..f21fb01f9 --- /dev/null +++ b/.github/images/diagram_open_plan_setup_dark.svg @@ -0,0 +1 @@ +Where the ISO 3382-3 measurement line goes (clauses 5.1 and 5.2)(a) Plan — 30 × 12 m floor, two ceiling zonesabsorbent raft ceilingplain plaster ceilingzones measured and reported separately≥ 2.0 m from walls and other reflecting surfacesP1P2P3P4P5P6P7P81.2 m screensP1 at the nearest workstation; the path need not be straightS1S2only 2 m to 16 m enter D2,S≥ 0.5 m from tables(b) Section — both heights are 1.2 m (5.2.2)omnidirectional, pink noise1.2 m1.2 mseated head positionSource (5.1.1):omnidirectional, pink noise, ISO 3382-1directivity; a pink-spectrum sweep orMLS may be used insteadReceiver (5.1.2):class 1 to IEC 61672-1, IEC 61260 octavefilters, omnidirectional capsule,≥ 10 s integrationRoom (5.2.1):furnished, nobody present but theoperators, HVAC and any masking systemat working-day powerLine (5.2.2):6 to 10 positions preferred, 4 the minimum;≥ 2 source positions, or the line walkedin both directions \ No newline at end of file diff --git a/.github/images/diagram_open_plan_setup_es.svg b/.github/images/diagram_open_plan_setup_es.svg new file mode 100644 index 000000000..e650ce50b --- /dev/null +++ b/.github/images/diagram_open_plan_setup_es.svg @@ -0,0 +1 @@ +Dónde va la línea de medida de la ISO 3382-3 (cláusulas 5.1 y 5.2)(a) Planta — superficie de 30 × 12 m, dos zonas de techotecho con islas absorbentestecho de yeso lisolas zonas se miden y se reportan por separado≥ 2,0 m de paredes y otras superficies reflectantesP1P2P3P4P5P6P7P8mamparas de 1,2 mP1 en el puesto más cercano; la trayectoria no tiene que ser rectaS1S2solo de 2 m a 16 m entran en D2,S≥ 0,5 m de las mesas(b) Sección — ambas alturas son 1,2 m (5.2.2)omnidireccional, ruido rosa1,2 m1,2 mposición de la cabeza sentadaFuente (5.1.1):omnidireccional, ruido rosa, directividadsegún ISO 3382-1; también vale un barridoo un MLS de espectro rosaRecepción (5.1.2):clase 1 según IEC 61672-1, filtros de octavaIEC 61260, micrófono omnidireccional,integración ≥ 10 sSala (5.2.1):amueblada, sin más personas que losoperadores, climatización y enmascaramientoa la potencia de un día normalLínea (5.2.2):de 6 a 10 posiciones preferible, 4 el mínimo;≥ 2 posiciones de fuente, o recorrer la líneaen los dos sentidos \ No newline at end of file diff --git a/.github/images/diagram_open_plan_setup_es_dark.svg b/.github/images/diagram_open_plan_setup_es_dark.svg new file mode 100644 index 000000000..c1172e2d2 --- /dev/null +++ b/.github/images/diagram_open_plan_setup_es_dark.svg @@ -0,0 +1 @@ +Dónde va la línea de medida de la ISO 3382-3 (cláusulas 5.1 y 5.2)(a) Planta — superficie de 30 × 12 m, dos zonas de techotecho con islas absorbentestecho de yeso lisolas zonas se miden y se reportan por separado≥ 2,0 m de paredes y otras superficies reflectantesP1P2P3P4P5P6P7P8mamparas de 1,2 mP1 en el puesto más cercano; la trayectoria no tiene que ser rectaS1S2solo de 2 m a 16 m entran en D2,S≥ 0,5 m de las mesas(b) Sección — ambas alturas son 1,2 m (5.2.2)omnidireccional, ruido rosa1,2 m1,2 mposición de la cabeza sentadaFuente (5.1.1):omnidireccional, ruido rosa, directividadsegún ISO 3382-1; también vale un barridoo un MLS de espectro rosaRecepción (5.1.2):clase 1 según IEC 61672-1, filtros de octavaIEC 61260, micrófono omnidireccional,integración ≥ 10 sSala (5.2.1):amueblada, sin más personas que losoperadores, climatización y enmascaramientoa la potencia de un día normalLínea (5.2.2):de 6 a 10 posiciones preferible, 4 el mínimo;≥ 2 posiciones de fuente, o recorrer la líneaen los dos sentidos \ No newline at end of file diff --git a/.github/images/diagram_reception_plate_rigs.svg b/.github/images/diagram_reception_plate_rigs.svg new file mode 100644 index 000000000..0becb6f0a --- /dev/null +++ b/.github/images/diagram_reception_plate_rigs.svg @@ -0,0 +1 @@ +EN 15657 low- and high-mobility reception platesLow-mobility plate (7.2.2)source0,5 m3,15 m x 2,23 m100 mm concrete, ρ = 2 300 ± 200 kg/m³S = 7,0 m² (≥ 5 m²), sides ≈ √2 : 1η ≥ 0,08 over 50 Hz to 100 Hz≥ 6 velocity positions, ≈ 0,5 m apartand ≥ 0,1 m from any contact pointelastic pads ≤ 100 × 100 mmHigh-mobility plate (7.3.2)source bolted rigidlysupport frame1 mm steel or 1,5 mm aluminium|Y| ≥ 10⁻² m/(N·s)≈ 50 % perforated, ⌀ ≈ 6 mm holes,so the source's own airborne soundcannot drive the sheetTs and Y measured with thesource fitted (7.1)Three-plate bench (Figure 2)whirlpool bath> 10 dB between platesup to three isolated plates,for a source that touchesseveral building elementsthe velocity level differenceis measured per EN ISO 10848-1in every band, with theequipment removedlow-mobility plate -> blocked force (15) -> characteristic power L_Wsn (17)high-mobility plate -> free velocity (18) -> source mobility |Y_S,eq| (19) \ No newline at end of file diff --git a/.github/images/diagram_reception_plate_rigs_dark.svg b/.github/images/diagram_reception_plate_rigs_dark.svg new file mode 100644 index 000000000..4c46151a1 --- /dev/null +++ b/.github/images/diagram_reception_plate_rigs_dark.svg @@ -0,0 +1 @@ +EN 15657 low- and high-mobility reception platesLow-mobility plate (7.2.2)source0,5 m3,15 m x 2,23 m100 mm concrete, ρ = 2 300 ± 200 kg/m³S = 7,0 m² (≥ 5 m²), sides ≈ √2 : 1η ≥ 0,08 over 50 Hz to 100 Hz≥ 6 velocity positions, ≈ 0,5 m apartand ≥ 0,1 m from any contact pointelastic pads ≤ 100 × 100 mmHigh-mobility plate (7.3.2)source bolted rigidlysupport frame1 mm steel or 1,5 mm aluminium|Y| ≥ 10⁻² m/(N·s)≈ 50 % perforated, ⌀ ≈ 6 mm holes,so the source's own airborne soundcannot drive the sheetTs and Y measured with thesource fitted (7.1)Three-plate bench (Figure 2)whirlpool bath> 10 dB between platesup to three isolated plates,for a source that touchesseveral building elementsthe velocity level differenceis measured per EN ISO 10848-1in every band, with theequipment removedlow-mobility plate -> blocked force (15) -> characteristic power L_Wsn (17)high-mobility plate -> free velocity (18) -> source mobility |Y_S,eq| (19) \ No newline at end of file diff --git a/.github/images/diagram_reception_plate_rigs_es.svg b/.github/images/diagram_reception_plate_rigs_es.svg new file mode 100644 index 000000000..ca7921998 --- /dev/null +++ b/.github/images/diagram_reception_plate_rigs_es.svg @@ -0,0 +1 @@ +Placas receptoras de baja y alta movilidad de la EN 15657Placa de baja movilidad (7.2.2)fuente0,5 m3,15 m x 2,23 mhormigón de 100 mm, ρ = 2 300 ± 200 kg/m³S = 7,0 m² (≥ 5 m²), lados ≈ √2 : 1η ≥ 0,08 de 50 Hz a 100 Hz≥ 6 posiciones de velocidad, a ≈ 0,5 m entre síy a ≥ 0,1 m de cualquier punto de contactoapoyos elásticos ≤ 100 × 100 mmPlaca de alta movilidad (7.3.2)fuente atornillada rígidamentebastidor de sujeciónacero de 1 mm o aluminio de 1,5 mm|Y| ≥ 10⁻² m/(N·s)≈ 50 % perforada, agujeros de ⌀ ≈ 6 mm,para que el ruido aéreo de la propia fuenteno excite la láminaTs e Y medidos con lafuente instalada (7.1)Banco de tres placas (figura 2)bañera de hidromasaje> 10 dB entre placashasta tres placas aisladas,para una fuente que tocavarios elementos constructivosla diferencia de nivel de velocidadse mide según la EN ISO 10848-1en cada banda, con elequipo desmontadoplaca de baja movilidad -> fuerza bloqueada (15) -> potencia característica L_Wsn (17)placa de alta movilidad -> velocidad libre (18) -> movilidad de fuente |Y_S,eq| (19) \ No newline at end of file diff --git a/.github/images/diagram_reception_plate_rigs_es_dark.svg b/.github/images/diagram_reception_plate_rigs_es_dark.svg new file mode 100644 index 000000000..4403ce6f1 --- /dev/null +++ b/.github/images/diagram_reception_plate_rigs_es_dark.svg @@ -0,0 +1 @@ +Placas receptoras de baja y alta movilidad de la EN 15657Placa de baja movilidad (7.2.2)fuente0,5 m3,15 m x 2,23 mhormigón de 100 mm, ρ = 2 300 ± 200 kg/m³S = 7,0 m² (≥ 5 m²), lados ≈ √2 : 1η ≥ 0,08 de 50 Hz a 100 Hz≥ 6 posiciones de velocidad, a ≈ 0,5 m entre síy a ≥ 0,1 m de cualquier punto de contactoapoyos elásticos ≤ 100 × 100 mmPlaca de alta movilidad (7.3.2)fuente atornillada rígidamentebastidor de sujeciónacero de 1 mm o aluminio de 1,5 mm|Y| ≥ 10⁻² m/(N·s)≈ 50 % perforada, agujeros de ⌀ ≈ 6 mm,para que el ruido aéreo de la propia fuenteno excite la láminaTs e Y medidos con lafuente instalada (7.1)Banco de tres placas (figura 2)bañera de hidromasaje> 10 dB entre placashasta tres placas aisladas,para una fuente que tocavarios elementos constructivosla diferencia de nivel de velocidadse mide según la EN ISO 10848-1en cada banda, con elequipo desmontadoplaca de baja movilidad -> fuerza bloqueada (15) -> potencia característica L_Wsn (17)placa de alta movilidad -> velocidad libre (18) -> movilidad de fuente |Y_S,eq| (19) \ No newline at end of file diff --git a/.github/images/diagram_resilient_buildups.svg b/.github/images/diagram_resilient_buildups.svg new file mode 100644 index 000000000..2708e72d7 --- /dev/null +++ b/.github/images/diagram_resilient_buildups.svg @@ -0,0 +1 @@ +Resilient layers in section: floating floor, mounts, wall lining(a) floating floor220 mm structural slab35 mm screed, 73,5 kg/m²edge strip, both sidesany rigid bridge hereshort-circuits the springs' = 8 MN/m³ → fo = 52,8 HzΔL = 30 lg(f/fo) or 40 lg(f/fo)(ISO 12354-2 C.1 / C.3)(b) discrete mountsstructural slab50 mm surface, 115 kg/m²reverberant bending field4 mounts per m² of 2 MN/m30 dB per decade, not 40(Vér's two-subsystem SEA model)(c) wall lining: two fixingsmasonryadhesive dabs(D.1) fo = 542 Hz−9,0 dBmasonrystuds + cavity(D.2) fo = 70,8 Hz+13,8 dBthe same board, two fixings: nearly 23 dB between them, and no formula here can see which one was builts' is the EN 29052-1 value measured WITHOUT pre-load, and the series law (C.6) holds only for an uncut layer \ No newline at end of file diff --git a/.github/images/diagram_resilient_buildups_dark.svg b/.github/images/diagram_resilient_buildups_dark.svg new file mode 100644 index 000000000..2fdd71afb --- /dev/null +++ b/.github/images/diagram_resilient_buildups_dark.svg @@ -0,0 +1 @@ +Resilient layers in section: floating floor, mounts, wall lining(a) floating floor220 mm structural slab35 mm screed, 73,5 kg/m²edge strip, both sidesany rigid bridge hereshort-circuits the springs' = 8 MN/m³ → fo = 52,8 HzΔL = 30 lg(f/fo) or 40 lg(f/fo)(ISO 12354-2 C.1 / C.3)(b) discrete mountsstructural slab50 mm surface, 115 kg/m²reverberant bending field4 mounts per m² of 2 MN/m30 dB per decade, not 40(Vér's two-subsystem SEA model)(c) wall lining: two fixingsmasonryadhesive dabs(D.1) fo = 542 Hz−9,0 dBmasonrystuds + cavity(D.2) fo = 70,8 Hz+13,8 dBthe same board, two fixings: nearly 23 dB between them, and no formula here can see which one was builts' is the EN 29052-1 value measured WITHOUT pre-load, and the series law (C.6) holds only for an uncut layer \ No newline at end of file diff --git a/.github/images/diagram_resilient_buildups_es.svg b/.github/images/diagram_resilient_buildups_es.svg new file mode 100644 index 000000000..5c4ed531c --- /dev/null +++ b/.github/images/diagram_resilient_buildups_es.svg @@ -0,0 +1 @@ +Capas elásticas en sección: suelo flotante, apoyos y trasdosado(a) suelo flotanteforjado estructural de 220 mmsolera de 35 mm, 73,5 kg/m²banda perimetral, en ambos ladoscualquier puente rígido aquícortocircuita el muelles' = 8 MN/m³ → fo = 52,8 HzΔL = 30 lg(f/fo) o 40 lg(f/fo)(ISO 12354-2 C.1 / C.3)(b) apoyos discretosforjado estructuralcapa de paso de 50 mm, 115 kg/m²campo reverberante de flexión4 apoyos por m² de 2 MN/m30 dB por década, no 40(modelo SEA de dos subsistemas de Vér)(c) trasdosado: dos fijacionesfábricapelladas(D.1) fo = 542 Hz−9,0 dBfábricamontantes + cámara(D.2) fo = 70,8 Hz+13,8 dBla misma placa, dos fijaciones: casi 23 dB entre ellas, y ninguna fórmula de aquí ve cuál se construyós' es el valor EN 29052-1 medido SIN precarga, y la ley en serie (C.6) solo vale si la capa no está cortada \ No newline at end of file diff --git a/.github/images/diagram_resilient_buildups_es_dark.svg b/.github/images/diagram_resilient_buildups_es_dark.svg new file mode 100644 index 000000000..34775857b --- /dev/null +++ b/.github/images/diagram_resilient_buildups_es_dark.svg @@ -0,0 +1 @@ +Capas elásticas en sección: suelo flotante, apoyos y trasdosado(a) suelo flotanteforjado estructural de 220 mmsolera de 35 mm, 73,5 kg/m²banda perimetral, en ambos ladoscualquier puente rígido aquícortocircuita el muelles' = 8 MN/m³ → fo = 52,8 HzΔL = 30 lg(f/fo) o 40 lg(f/fo)(ISO 12354-2 C.1 / C.3)(b) apoyos discretosforjado estructuralcapa de paso de 50 mm, 115 kg/m²campo reverberante de flexión4 apoyos por m² de 2 MN/m30 dB por década, no 40(modelo SEA de dos subsistemas de Vér)(c) trasdosado: dos fijacionesfábricapelladas(D.1) fo = 542 Hz−9,0 dBfábricamontantes + cámara(D.2) fo = 70,8 Hz+13,8 dBla misma placa, dos fijaciones: casi 23 dB entre ellas, y ninguna fórmula de aquí ve cuál se construyós' es el valor EN 29052-1 medido SIN precarga, y la ley en serie (C.6) solo vale si la capa no está cortada \ No newline at end of file diff --git a/.github/images/diagram_room_measurement.svg b/.github/images/diagram_room_measurement.svg index 8ef431f2c..076d564ad 100644 --- a/.github/images/diagram_room_measurement.svg +++ b/.github/images/diagram_room_measurement.svg @@ -1 +1 @@ -Room-acoustics measurement setup (ISO 3382-1 / ISO 3382-2)Room plan (top view)S1S2M1M2M3M4M5M6≥ 2 m≥ 1 mMicrophone positionLoudspeaker sourceISO 3382-1 (positions):• ≥ 2 source positions• mics ≥ 2 m apart• ≥ 1 m from surfaces• mic height 1.2 md_min = 2√(V/cT)ISO 3382-2 — reverberation-time measurement gradesMethodSource pos.Mic pos.Source–mic comb.Decays / comb.Survey≥ 1≥ 221Engineering≥ 2≥ 262Precision≥ 2≥ 3123 \ No newline at end of file +Room-acoustics measurement setup (ISO 3382-1 / ISO 3382-2)Room plan (top view) — 10.0 × 6.0 m, 3.5 m highd_minS1S2M1M2M3M4M5M6avoid symmetry lines≥ 2 m≥ 1 m2.4 m > d_minMicrophone positionLoudspeaker sourceISO 3382-1 (positions):• ≥ 2 source positions• mics ≥ 2 m apart• ≥ 1 m from surfaces• mic height 1.2 m• source height 1.5 m• off the symmetry axesISO 3382-2 (source clearance):d_min = 2√(V/cT̂) = 2.0 mfor V = 210 m³, T̂ = 0.6 sISO 3382-2 — reverberation-time measurement gradesMethodSource pos.Mic pos.Source–mic comb.Decays / comb.Survey≥ 1≥ 221Engineering≥ 2≥ 262Precision≥ 2≥ 3123 \ No newline at end of file diff --git a/.github/images/diagram_room_measurement_dark.svg b/.github/images/diagram_room_measurement_dark.svg index 450821609..3570dbcab 100644 --- a/.github/images/diagram_room_measurement_dark.svg +++ b/.github/images/diagram_room_measurement_dark.svg @@ -1 +1 @@ -Room-acoustics measurement setup (ISO 3382-1 / ISO 3382-2)Room plan (top view)S1S2M1M2M3M4M5M6≥ 2 m≥ 1 mMicrophone positionLoudspeaker sourceISO 3382-1 (positions):• ≥ 2 source positions• mics ≥ 2 m apart• ≥ 1 m from surfaces• mic height 1.2 md_min = 2√(V/cT)ISO 3382-2 — reverberation-time measurement gradesMethodSource pos.Mic pos.Source–mic comb.Decays / comb.Survey≥ 1≥ 221Engineering≥ 2≥ 262Precision≥ 2≥ 3123 \ No newline at end of file +Room-acoustics measurement setup (ISO 3382-1 / ISO 3382-2)Room plan (top view) — 10.0 × 6.0 m, 3.5 m highd_minS1S2M1M2M3M4M5M6avoid symmetry lines≥ 2 m≥ 1 m2.4 m > d_minMicrophone positionLoudspeaker sourceISO 3382-1 (positions):• ≥ 2 source positions• mics ≥ 2 m apart• ≥ 1 m from surfaces• mic height 1.2 m• source height 1.5 m• off the symmetry axesISO 3382-2 (source clearance):d_min = 2√(V/cT̂) = 2.0 mfor V = 210 m³, T̂ = 0.6 sISO 3382-2 — reverberation-time measurement gradesMethodSource pos.Mic pos.Source–mic comb.Decays / comb.Survey≥ 1≥ 221Engineering≥ 2≥ 262Precision≥ 2≥ 3123 \ No newline at end of file diff --git a/.github/images/diagram_room_measurement_es.svg b/.github/images/diagram_room_measurement_es.svg index 8a3d4d1c0..d64641b2e 100644 --- a/.github/images/diagram_room_measurement_es.svg +++ b/.github/images/diagram_room_measurement_es.svg @@ -1 +1 @@ -Configuración de medición de acústica de salas (ISO 3382-1 / ISO 3382-2)Planta de la sala (vista superior)S1S2M1M2M3M4M5M6≥ 2 m≥ 1 mPosición de micrófonoFuente (altavoz)ISO 3382-1 (posiciones):• ≥ 2 posiciones de fuente• micrófonos ≥ 2 m entre sí• ≥ 1 m de las superficies• altura del micrófono 1,2 md_min = 2√(V/cT)ISO 3382-2 — grados de medición del tiempo de reverberaciónMétodoPos. fuentePos. micróf.Comb. fuente–micróf.Decaim. / comb.Control≥ 1≥ 221Ingeniería≥ 2≥ 262Precisión≥ 2≥ 3123 \ No newline at end of file +Configuración de medición de acústica de salas (ISO 3382-1 / ISO 3382-2)Planta de la sala (vista superior) — 10,0 × 6,0 m, 3,5 m de alturad_minS1S2M1M2M3M4M5M6evitar las líneas de simetría≥ 2 m≥ 1 m2,4 m > d_minPosición de micrófonoFuente (altavoz)ISO 3382-1 (posiciones):• ≥ 2 posiciones de fuente• micrófonos ≥ 2 m entre sí• ≥ 1 m de las superficies• altura del micrófono 1,2 m• fuente a 1,5 m de altura• fuera de los ejes de simetríaISO 3382-2 (separación a la fuente):d_min = 2√(V/cT̂) = 2,0 mpara V = 210 m³, T̂ = 0,6 sISO 3382-2 — grados de medición del tiempo de reverberaciónMétodoPos. fuentePos. micróf.Comb. fuente–micróf.Decaim. / comb.Control≥ 1≥ 221Ingeniería≥ 2≥ 262Precisión≥ 2≥ 3123 \ No newline at end of file diff --git a/.github/images/diagram_room_measurement_es_dark.svg b/.github/images/diagram_room_measurement_es_dark.svg index 98c2c0978..4821decbf 100644 --- a/.github/images/diagram_room_measurement_es_dark.svg +++ b/.github/images/diagram_room_measurement_es_dark.svg @@ -1 +1 @@ -Configuración de medición de acústica de salas (ISO 3382-1 / ISO 3382-2)Planta de la sala (vista superior)S1S2M1M2M3M4M5M6≥ 2 m≥ 1 mPosición de micrófonoFuente (altavoz)ISO 3382-1 (posiciones):• ≥ 2 posiciones de fuente• micrófonos ≥ 2 m entre sí• ≥ 1 m de las superficies• altura del micrófono 1,2 md_min = 2√(V/cT)ISO 3382-2 — grados de medición del tiempo de reverberaciónMétodoPos. fuentePos. micróf.Comb. fuente–micróf.Decaim. / comb.Control≥ 1≥ 221Ingeniería≥ 2≥ 262Precisión≥ 2≥ 3123 \ No newline at end of file +Configuración de medición de acústica de salas (ISO 3382-1 / ISO 3382-2)Planta de la sala (vista superior) — 10,0 × 6,0 m, 3,5 m de alturad_minS1S2M1M2M3M4M5M6evitar las líneas de simetría≥ 2 m≥ 1 m2,4 m > d_minPosición de micrófonoFuente (altavoz)ISO 3382-1 (posiciones):• ≥ 2 posiciones de fuente• micrófonos ≥ 2 m entre sí• ≥ 1 m de las superficies• altura del micrófono 1,2 m• fuente a 1,5 m de altura• fuera de los ejes de simetríaISO 3382-2 (separación a la fuente):d_min = 2√(V/cT̂) = 2,0 mpara V = 210 m³, T̂ = 0,6 sISO 3382-2 — grados de medición del tiempo de reverberaciónMétodoPos. fuentePos. micróf.Comb. fuente–micróf.Decaim. / comb.Control≥ 1≥ 221Ingeniería≥ 2≥ 262Precisión≥ 2≥ 3123 \ No newline at end of file diff --git a/.github/images/diagram_room_measurement_section.svg b/.github/images/diagram_room_measurement_section.svg new file mode 100644 index 000000000..b2f0180bd --- /dev/null +++ b/.github/images/diagram_room_measurement_section.svg @@ -0,0 +1 @@ +The measuring chain in section (ISO 3382-1 clauses 4.2 and 4.3)Section through the same 10.0 × 6.0 × 3.5 m roomdodecahedron1.5 macoustic centred_min = 2.0 m≥ 2 m1.2 m≥ 1 m≥ 1 mM1M2ISO 3382-1 Table 1 — omnidirectionality over gliding 30° arcs125± 1250± 1500± 11000± 32000± 54000± 6Hz / dB, measured at ≥ 1.5 m — in practice a dodecahedron, not a monitorLevel (4.2.1):≥ 45 dB over the backgroundper band for T30, ≥ 35 dB for T20Receiving chain (4.2.2.2):class 1 to IEC 61672-1,IEC 61260 filters, omnidirectionalcapsule, ≤ 13 mm preferred \ No newline at end of file diff --git a/.github/images/diagram_room_measurement_section_dark.svg b/.github/images/diagram_room_measurement_section_dark.svg new file mode 100644 index 000000000..a18995c13 --- /dev/null +++ b/.github/images/diagram_room_measurement_section_dark.svg @@ -0,0 +1 @@ +The measuring chain in section (ISO 3382-1 clauses 4.2 and 4.3)Section through the same 10.0 × 6.0 × 3.5 m roomdodecahedron1.5 macoustic centred_min = 2.0 m≥ 2 m1.2 m≥ 1 m≥ 1 mM1M2ISO 3382-1 Table 1 — omnidirectionality over gliding 30° arcs125± 1250± 1500± 11000± 32000± 54000± 6Hz / dB, measured at ≥ 1.5 m — in practice a dodecahedron, not a monitorLevel (4.2.1):≥ 45 dB over the backgroundper band for T30, ≥ 35 dB for T20Receiving chain (4.2.2.2):class 1 to IEC 61672-1,IEC 61260 filters, omnidirectionalcapsule, ≤ 13 mm preferred \ No newline at end of file diff --git a/.github/images/diagram_room_measurement_section_es.svg b/.github/images/diagram_room_measurement_section_es.svg new file mode 100644 index 000000000..801f400d9 --- /dev/null +++ b/.github/images/diagram_room_measurement_section_es.svg @@ -0,0 +1 @@ +La cadena de medida en sección (ISO 3382-1, cláusulas 4.2 y 4.3)Sección de la misma sala de 10,0 × 6,0 × 3,5 mdodecaedro1,5 mcentro acústicod_min = 2,0 m≥ 2 m1,2 m≥ 1 m≥ 1 mM1M2ISO 3382-1 Tabla 1 — omnidireccionalidad (arcos de 30°)125± 1250± 1500± 11000± 32000± 54000± 6Hz / dB, medido a ≥ 1,5 m — en la práctica un dodecaedro, no un monitorNivel (4.2.1):≥ 45 dB sobre el ruido de fondopor banda para T30; 35 dB para T20Cadena de recepción (4.2.2.2):clase 1 según IEC 61672-1,filtros IEC 61260, micrófonoomnidireccional, ≤ 13 mm preferible \ No newline at end of file diff --git a/.github/images/diagram_room_measurement_section_es_dark.svg b/.github/images/diagram_room_measurement_section_es_dark.svg new file mode 100644 index 000000000..be96447e9 --- /dev/null +++ b/.github/images/diagram_room_measurement_section_es_dark.svg @@ -0,0 +1 @@ +La cadena de medida en sección (ISO 3382-1, cláusulas 4.2 y 4.3)Sección de la misma sala de 10,0 × 6,0 × 3,5 mdodecaedro1,5 mcentro acústicod_min = 2,0 m≥ 2 m1,2 m≥ 1 m≥ 1 mM1M2ISO 3382-1 Tabla 1 — omnidireccionalidad (arcos de 30°)125± 1250± 1500± 11000± 32000± 54000± 6Hz / dB, medido a ≥ 1,5 m — en la práctica un dodecaedro, no un monitorNivel (4.2.1):≥ 45 dB sobre el ruido de fondopor banda para T30; 35 dB para T20Cadena de recepción (4.2.2.2):clase 1 según IEC 61672-1,filtros IEC 61260, micrófonoomnidireccional, ≤ 13 mm preferible \ No newline at end of file diff --git a/.github/images/diagram_room_noise_setup.svg b/.github/images/diagram_room_noise_setup.svg new file mode 100644 index 000000000..9bf0bc9d9 --- /dev/null +++ b/.github/images/diagram_room_noise_setup.svg @@ -0,0 +1 @@ +Measuring the rated spectrum (ANSI/ASA S12.2-2019, clause 5.2.5)ceiling plenumsupply ductdiffuserair handlerdesign condition0.6 m1.2 m2.4 m1.2 m1.6 mL_EQ at the named position — or scan the whole space at ≤ 0.5 m/s for ≥ 20 sgreen dashed: microphone exclusion zones (5.2.5)Microphone height (5.2.5)Adult, standing1.6 mAdult, seated1.2 mChild, standing1.1 mChild, seated0.75 mStandoff (5.2.5)One reflecting surface≥ 0.6 mTwo surfaces meeting≥ 1.2 mThree surfaces meeting≥ 2.4 mInstrument and conditionIntegrating-averaging, L_EQClass 2 minimum (5.1.1)Octave bands 16 Hz – 8 kHzRoom unoccupied, plant runningBefore rating (5.3.2): is the noise steady?screen 16, 31.5 and 63 Hz aurally and on a fast, Z-weighted meter, then check L_MAX − L_EQ and L_10 − L_EQagainst Table 3 — a field that fails belongs to RNC (clause 5.3), not to NC or RC \ No newline at end of file diff --git a/.github/images/diagram_room_noise_setup_dark.svg b/.github/images/diagram_room_noise_setup_dark.svg new file mode 100644 index 000000000..7b938c75b --- /dev/null +++ b/.github/images/diagram_room_noise_setup_dark.svg @@ -0,0 +1 @@ +Measuring the rated spectrum (ANSI/ASA S12.2-2019, clause 5.2.5)ceiling plenumsupply ductdiffuserair handlerdesign condition0.6 m1.2 m2.4 m1.2 m1.6 mL_EQ at the named position — or scan the whole space at ≤ 0.5 m/s for ≥ 20 sgreen dashed: microphone exclusion zones (5.2.5)Microphone height (5.2.5)Adult, standing1.6 mAdult, seated1.2 mChild, standing1.1 mChild, seated0.75 mStandoff (5.2.5)One reflecting surface≥ 0.6 mTwo surfaces meeting≥ 1.2 mThree surfaces meeting≥ 2.4 mInstrument and conditionIntegrating-averaging, L_EQClass 2 minimum (5.1.1)Octave bands 16 Hz – 8 kHzRoom unoccupied, plant runningBefore rating (5.3.2): is the noise steady?screen 16, 31.5 and 63 Hz aurally and on a fast, Z-weighted meter, then check L_MAX − L_EQ and L_10 − L_EQagainst Table 3 — a field that fails belongs to RNC (clause 5.3), not to NC or RC \ No newline at end of file diff --git a/.github/images/diagram_room_noise_setup_es.svg b/.github/images/diagram_room_noise_setup_es.svg new file mode 100644 index 000000000..238159510 --- /dev/null +++ b/.github/images/diagram_room_noise_setup_es.svg @@ -0,0 +1 @@ +Medida del espectro que se califica (ANSI/ASA S12.2-2019, cláusula 5.2.5)plénum del falso techoconducto de impulsióndifusorclimatizadoraen su régimen de diseño0,6 m1,2 m2,4 m1,2 m1,6 mL_EQ en la posición indicada — o barrer toda la sala a ≤ 0,5 m/s durante ≥ 20 sverde discontinuo: zonas excluidas para el micrófono (5.2.5)Altura del micrófono (5.2.5)Adulto, de pie1,6 mAdulto, sentado1,2 mNiño, de pie1,1 mNiño, sentado0,75 mSeparación (5.2.5)Una superficie≥ 0,6 mDos superficies≥ 1,2 mTres superficies≥ 2,4 mInstrumento y condiciónIntegrador-promediador, L_EQClase 2 como mínimo (5.1.1)Bandas de octava 16 Hz – 8 kHzSala vacía, instalación en marchaAntes de calificar (5.3.2): ¿es estacionario el ruido?explorar 16, 31,5 y 63 Hz de oído y con el sonómetro en rápida y ponderación Z; comprobarL_MAX − L_EQ y L_10 − L_EQ frente a la Tabla 3 — si falla, es RNC (cláusula 5.3), no NC ni RC \ No newline at end of file diff --git a/.github/images/diagram_room_noise_setup_es_dark.svg b/.github/images/diagram_room_noise_setup_es_dark.svg new file mode 100644 index 000000000..3ea1f2fb1 --- /dev/null +++ b/.github/images/diagram_room_noise_setup_es_dark.svg @@ -0,0 +1 @@ +Medida del espectro que se califica (ANSI/ASA S12.2-2019, cláusula 5.2.5)plénum del falso techoconducto de impulsióndifusorclimatizadoraen su régimen de diseño0,6 m1,2 m2,4 m1,2 m1,6 mL_EQ en la posición indicada — o barrer toda la sala a ≤ 0,5 m/s durante ≥ 20 sverde discontinuo: zonas excluidas para el micrófono (5.2.5)Altura del micrófono (5.2.5)Adulto, de pie1,6 mAdulto, sentado1,2 mNiño, de pie1,1 mNiño, sentado0,75 mSeparación (5.2.5)Una superficie≥ 0,6 mDos superficies≥ 1,2 mTres superficies≥ 2,4 mInstrumento y condiciónIntegrador-promediador, L_EQClase 2 como mínimo (5.1.1)Bandas de octava 16 Hz – 8 kHzSala vacía, instalación en marchaAntes de calificar (5.3.2): ¿es estacionario el ruido?explorar 16, 31,5 y 63 Hz de oído y con el sonómetro en rápida y ponderación Z; comprobarL_MAX − L_EQ y L_10 − L_EQ frente a la Tabla 3 — si falla, es RNC (cláusula 5.3), no NC ni RC \ No newline at end of file diff --git a/.github/images/diagram_standing_wave_tube.svg b/.github/images/diagram_standing_wave_tube.svg new file mode 100644 index 000000000..bd0473c4d --- /dev/null +++ b/.github/images/diagram_standing_wave_tube.svg @@ -0,0 +1 @@ +Standing-wave-ratio tube: probe traverse and the minima (ISO 10534-1)Loudspeakerone pure tone at a timeTest specimen on the rigid backingx = 0probe microphone on a graduated carriage|p(x)| envelopeL_maxL_minΔL = 9.54 dBx_min,1 = 12 cmminima far from the specimen fill in (wall losses, exaggerated here): read the nearest ones = 10^(ΔL/20) = 3|r| = (s − 1)/(s + 1) = 0.5α = 1 − |r|² = 0.75Φ = 4π x_min,1/λ − π = −54.1°Z/ρc₀ = (1 + r)/(1 − r) = 1.13 − 1.22jone channel: the microphone sensitivity cancels and there is no inter-channel phase mismatchmagnitude from the ratio, phase from the position — which is why Part 1 is the arbitration method \ No newline at end of file diff --git a/.github/images/diagram_standing_wave_tube_dark.svg b/.github/images/diagram_standing_wave_tube_dark.svg new file mode 100644 index 000000000..4caa5d5bf --- /dev/null +++ b/.github/images/diagram_standing_wave_tube_dark.svg @@ -0,0 +1 @@ +Standing-wave-ratio tube: probe traverse and the minima (ISO 10534-1)Loudspeakerone pure tone at a timeTest specimen on the rigid backingx = 0probe microphone on a graduated carriage|p(x)| envelopeL_maxL_minΔL = 9.54 dBx_min,1 = 12 cmminima far from the specimen fill in (wall losses, exaggerated here): read the nearest ones = 10^(ΔL/20) = 3|r| = (s − 1)/(s + 1) = 0.5α = 1 − |r|² = 0.75Φ = 4π x_min,1/λ − π = −54.1°Z/ρc₀ = (1 + r)/(1 − r) = 1.13 − 1.22jone channel: the microphone sensitivity cancels and there is no inter-channel phase mismatchmagnitude from the ratio, phase from the position — which is why Part 1 is the arbitration method \ No newline at end of file diff --git a/.github/images/diagram_standing_wave_tube_es.svg b/.github/images/diagram_standing_wave_tube_es.svg new file mode 100644 index 000000000..d907c82ed --- /dev/null +++ b/.github/images/diagram_standing_wave_tube_es.svg @@ -0,0 +1 @@ +Tubo de onda estacionaria: recorrido de la sonda y los mínimos (ISO 10534-1)Altavozun tono puro cada vezProbeta sobre la terminación rígidax = 0micrófono de sonda sobre carro graduadoenvolvente |p(x)|L_maxL_minΔL = 9.54 dBx_min,1 = 12 cmlos mínimos lejanos a la probeta se rellenan (pérdidas en la pared, exageradas aquí): leer el más cercanos = 10^(ΔL/20) = 3|r| = (s − 1)/(s + 1) = 0.5α = 1 − |r|² = 0.75Φ = 4π x_min,1/λ − π = −54.1°Z/ρc₀ = (1 + r)/(1 − r) = 1.13 − 1.22jun solo canal: la sensibilidad del micrófono se cancela y no hay desajuste de fase entre canalesmagnitud por la razón, fase por la posición — por eso la Parte 1 es el método de arbitraje \ No newline at end of file diff --git a/.github/images/diagram_standing_wave_tube_es_dark.svg b/.github/images/diagram_standing_wave_tube_es_dark.svg new file mode 100644 index 000000000..711a2a182 --- /dev/null +++ b/.github/images/diagram_standing_wave_tube_es_dark.svg @@ -0,0 +1 @@ +Tubo de onda estacionaria: recorrido de la sonda y los mínimos (ISO 10534-1)Altavozun tono puro cada vezProbeta sobre la terminación rígidax = 0micrófono de sonda sobre carro graduadoenvolvente |p(x)|L_maxL_minΔL = 9.54 dBx_min,1 = 12 cmlos mínimos lejanos a la probeta se rellenan (pérdidas en la pared, exageradas aquí): leer el más cercanos = 10^(ΔL/20) = 3|r| = (s − 1)/(s + 1) = 0.5α = 1 − |r|² = 0.75Φ = 4π x_min,1/λ − π = −54.1°Z/ρc₀ = (1 + r)/(1 − r) = 1.13 − 1.22jun solo canal: la sensibilidad del micrófono se cancela y no hay desajuste de fase entre canalesmagnitud por la razón, fase por la posición — por eso la Parte 1 es el método de arbitraje \ No newline at end of file diff --git a/.github/images/diagram_survey_sweep.svg b/.github/images/diagram_survey_sweep.svg new file mode 100644 index 000000000..ac6d48717 --- /dev/null +++ b/.github/images/diagram_survey_sweep.svg @@ -0,0 +1 @@ +The ISO 10052 survey sweep (Clauses 6.2 and 6.3)Plan of the roomseparating element≥ 0.5 m≥ 0.5 mcorner opposite the element,facing into the cornerfacing awayarm's length180° × 4 traverses,≈ 30 s in totalElevation: the same sweepraise and lower the armduring each traverseAlternative (Clause 6.3.1): a rotating microphone on a stand, ≥ 10° to the horizontal, sweep radius ≥ 1 m.Without a real-time octave analyser, repeat the whole sweep once per band and read each 30 s Leq.Tapping machine (6.2.3): centre of the floor, on the diagonal; three positions at 45° to the ribs. \ No newline at end of file diff --git a/.github/images/diagram_survey_sweep_dark.svg b/.github/images/diagram_survey_sweep_dark.svg new file mode 100644 index 000000000..99ef9f9e8 --- /dev/null +++ b/.github/images/diagram_survey_sweep_dark.svg @@ -0,0 +1 @@ +The ISO 10052 survey sweep (Clauses 6.2 and 6.3)Plan of the roomseparating element≥ 0.5 m≥ 0.5 mcorner opposite the element,facing into the cornerfacing awayarm's length180° × 4 traverses,≈ 30 s in totalElevation: the same sweepraise and lower the armduring each traverseAlternative (Clause 6.3.1): a rotating microphone on a stand, ≥ 10° to the horizontal, sweep radius ≥ 1 m.Without a real-time octave analyser, repeat the whole sweep once per band and read each 30 s Leq.Tapping machine (6.2.3): centre of the floor, on the diagonal; three positions at 45° to the ribs. \ No newline at end of file diff --git a/.github/images/diagram_survey_sweep_es.svg b/.github/images/diagram_survey_sweep_es.svg new file mode 100644 index 000000000..09d94dac2 --- /dev/null +++ b/.github/images/diagram_survey_sweep_es.svg @@ -0,0 +1 @@ +El barrido del metodo de control ISO 10052 (apartados 6.2 y 6.3)Planta del recintoelemento separador≥ 0,5 m≥ 0,5 mesquina opuesta al elemento,orientado hacia la esquinade espaldasbrazo extendido180° × 4 barridos,≈ 30 s en totalAlzado: el mismo barridosubir y bajar el brazodurante cada barridoAlternativa (apartado 6.3.1): microfono giratorio sobre soporte, ≥ 10° respecto a la horizontal, radio de barrido ≥ 1 m.Sin analizador de octavas en tiempo real, repetir todo el barrido una vez por banda y leer cada Leq de 30 s.Maquina de impactos (6.2.3): centro del forjado, en la diagonal; tres posiciones a 45° respecto a las viguetas. \ No newline at end of file diff --git a/.github/images/diagram_survey_sweep_es_dark.svg b/.github/images/diagram_survey_sweep_es_dark.svg new file mode 100644 index 000000000..387dd1b55 --- /dev/null +++ b/.github/images/diagram_survey_sweep_es_dark.svg @@ -0,0 +1 @@ +El barrido del metodo de control ISO 10052 (apartados 6.2 y 6.3)Planta del recintoelemento separador≥ 0,5 m≥ 0,5 mesquina opuesta al elemento,orientado hacia la esquinade espaldasbrazo extendido180° × 4 barridos,≈ 30 s en totalAlzado: el mismo barridosubir y bajar el brazodurante cada barridoAlternativa (apartado 6.3.1): microfono giratorio sobre soporte, ≥ 10° respecto a la horizontal, radio de barrido ≥ 1 m.Sin analizador de octavas en tiempo real, repetir todo el barrido una vez por banda y leer cada Leq de 30 s.Maquina de impactos (6.2.3): centro del forjado, en la diagonal; tres posiciones a 45° respecto a las viguetas. \ No newline at end of file diff --git a/.github/images/diagram_sweep_budget.svg b/.github/images/diagram_sweep_budget.svg new file mode 100644 index 000000000..e61000290 --- /dev/null +++ b/.github/images/diagram_sweep_budget.svg @@ -0,0 +1 @@ +Dimensioning the excitation for a room with T = 1.2 s (ISO 18233)1 What you play, and how long you keep recordingsweep, 4.0 s = 3.3 × Tsilence ≈ Trecord window 5.2 s0123456B.3.1: sweep 2–4 × T, silent gap ≈ T | B.6: +3 dB effective SNR per doubling2 If the excitation repeats, the period must exceed T (6.2.2.2)period 1, warm-up: discardedperiod 2, keptorder 17 → 2.73 s ≥ T0.68 sorder 15 is shorter than T: the tail folds onto the head and T comes out short01234563 After linear deconvolution (B.5)H2H3H4kept by default: the linear impulse response and its taildiscarded, or read as distortionthe linear deconvolution's own decaying noise tail — not the room-101234Arrival time relative to the linear impulse response [s] \ No newline at end of file diff --git a/.github/images/diagram_sweep_budget_dark.svg b/.github/images/diagram_sweep_budget_dark.svg new file mode 100644 index 000000000..a5ffd8811 --- /dev/null +++ b/.github/images/diagram_sweep_budget_dark.svg @@ -0,0 +1 @@ +Dimensioning the excitation for a room with T = 1.2 s (ISO 18233)1 What you play, and how long you keep recordingsweep, 4.0 s = 3.3 × Tsilence ≈ Trecord window 5.2 s0123456B.3.1: sweep 2–4 × T, silent gap ≈ T | B.6: +3 dB effective SNR per doubling2 If the excitation repeats, the period must exceed T (6.2.2.2)period 1, warm-up: discardedperiod 2, keptorder 17 → 2.73 s ≥ T0.68 sorder 15 is shorter than T: the tail folds onto the head and T comes out short01234563 After linear deconvolution (B.5)H2H3H4kept by default: the linear impulse response and its taildiscarded, or read as distortionthe linear deconvolution's own decaying noise tail — not the room-101234Arrival time relative to the linear impulse response [s] \ No newline at end of file diff --git a/.github/images/diagram_sweep_budget_es.svg b/.github/images/diagram_sweep_budget_es.svg new file mode 100644 index 000000000..fee398e44 --- /dev/null +++ b/.github/images/diagram_sweep_budget_es.svg @@ -0,0 +1 @@ +Dimensionado de la excitación para una sala con T = 1,2 s (ISO 18233)1 Qué se reproduce, y cuánto se sigue grabandobarrido, 4,0 s = 3,3 × Tsilencio ≈ Tventana de grabación 5,2 s0123456B.3.1: barrido 2–4 × T, silencio ≈ T | B.6: +3 dB de S/R efectiva por duplicación2 Si la excitación se repite, el periodo debe superar T (6.2.2.2)periodo 1, arranque: se descartaperiodo 2, se conservaorden 17 → 2,73 s ≥ T0,68 sel orden 15 es más corto que T: la cola se pliega sobre el inicio y T sale corto01234563 Tras la deconvolución lineal (B.5)H2H3H4se conserva por defecto: la respuesta al impulso lineal y su colase descarta, o se lee como distorsiónla cola de ruido decreciente de la propia deconvolución — no la sala-101234Tiempo de llegada respecto a la respuesta al impulso lineal [s] \ No newline at end of file diff --git a/.github/images/diagram_sweep_budget_es_dark.svg b/.github/images/diagram_sweep_budget_es_dark.svg new file mode 100644 index 000000000..66fc94679 --- /dev/null +++ b/.github/images/diagram_sweep_budget_es_dark.svg @@ -0,0 +1 @@ +Dimensionado de la excitación para una sala con T = 1,2 s (ISO 18233)1 Qué se reproduce, y cuánto se sigue grabandobarrido, 4,0 s = 3,3 × Tsilencio ≈ Tventana de grabación 5,2 s0123456B.3.1: barrido 2–4 × T, silencio ≈ T | B.6: +3 dB de S/R efectiva por duplicación2 Si la excitación se repite, el periodo debe superar T (6.2.2.2)periodo 1, arranque: se descartaperiodo 2, se conservaorden 17 → 2,73 s ≥ T0,68 sel orden 15 es más corto que T: la cola se pliega sobre el inicio y T sale corto01234563 Tras la deconvolución lineal (B.5)H2H3H4se conserva por defecto: la respuesta al impulso lineal y su colase descarta, o se lee como distorsiónla cola de ruido decreciente de la propia deconvolución — no la sala-101234Tiempo de llegada respecto a la respuesta al impulso lineal [s] \ No newline at end of file diff --git a/.github/images/diagram_transfer_stiffness_rig_es.svg b/.github/images/diagram_transfer_stiffness_rig_es.svg index 0f0f81288..8a637b37b 100644 --- a/.github/images/diagram_transfer_stiffness_rig_es.svg +++ b/.github/images/diagram_transfer_stiffness_rig_es.svg @@ -1 +1 @@ -Rigidez de transferencia: métodos directo e indirecto (ISO 10846)Método directo (Parte 2)masa de excitaciónu₁aislador bajo ensayoMétodo indirecto (Parte 3)masa de excitaciónu₁aislador bajo ensayotransductor de fuerzaBase rígidasalida bloqueada: u₂ ≈ 0 → se mide F₂,bk₂,₁ = F₂,b / u₁masa de bloqueo m₂a₂apoyo blandose mide T = u₂ / u₁ (pequeña)k₂,₁ = −(2πf)²·(m₂+mf)·Tválido donde ΔL₁,₂ = La₁ − La₂ ≥ 20 dB, es decir |T| ≤ 0,1 (Parte 3, Desigualdad 2)la fuerza de bloqueo aproxima la fuerza entregada a un receptor rígido (Parte 1, Ec. 7) \ No newline at end of file +Rigidez de transferencia: métodos directo e indirecto (ISO 10846)Método directo (Parte 2)masa de excitaciónu₁aislador bajo ensayoMétodo indirecto (Parte 3)masa de excitaciónu₁aislador bajo ensayotransductor de fuerzaCimentación rígidasalida bloqueada: u₂ ≈ 0 → se mide F₂,bk₂,₁ = F₂,b / u₁masa de bloqueo m₂a₂apoyo blandose mide T = u₂ / u₁ (pequeña)k₂,₁ = −(2πf)²·(m₂+mf)·Tválido donde ΔL₁,₂ = La₁ − La₂ ≥ 20 dB, es decir |T| ≤ 0,1 (Parte 3, Desigualdad 2)la fuerza de bloqueo aproxima la fuerza entregada a un receptor rígido (Parte 1, Ec. 7) \ No newline at end of file diff --git a/.github/images/diagram_transfer_stiffness_rig_es_dark.svg b/.github/images/diagram_transfer_stiffness_rig_es_dark.svg index 1a293dcbd..c2a84982b 100644 --- a/.github/images/diagram_transfer_stiffness_rig_es_dark.svg +++ b/.github/images/diagram_transfer_stiffness_rig_es_dark.svg @@ -1 +1 @@ -Rigidez de transferencia: métodos directo e indirecto (ISO 10846)Método directo (Parte 2)masa de excitaciónu₁aislador bajo ensayoMétodo indirecto (Parte 3)masa de excitaciónu₁aislador bajo ensayotransductor de fuerzaBase rígidasalida bloqueada: u₂ ≈ 0 → se mide F₂,bk₂,₁ = F₂,b / u₁masa de bloqueo m₂a₂apoyo blandose mide T = u₂ / u₁ (pequeña)k₂,₁ = −(2πf)²·(m₂+mf)·Tválido donde ΔL₁,₂ = La₁ − La₂ ≥ 20 dB, es decir |T| ≤ 0,1 (Parte 3, Desigualdad 2)la fuerza de bloqueo aproxima la fuerza entregada a un receptor rígido (Parte 1, Ec. 7) \ No newline at end of file +Rigidez de transferencia: métodos directo e indirecto (ISO 10846)Método directo (Parte 2)masa de excitaciónu₁aislador bajo ensayoMétodo indirecto (Parte 3)masa de excitaciónu₁aislador bajo ensayotransductor de fuerzaCimentación rígidasalida bloqueada: u₂ ≈ 0 → se mide F₂,bk₂,₁ = F₂,b / u₁masa de bloqueo m₂a₂apoyo blandose mide T = u₂ / u₁ (pequeña)k₂,₁ = −(2πf)²·(m₂+mf)·Tválido donde ΔL₁,₂ = La₁ − La₂ ≥ 20 dB, es decir |T| ≤ 0,1 (Parte 3, Desigualdad 2)la fuerza de bloqueo aproxima la fuerza entregada a un receptor rígido (Parte 1, Ec. 7) \ No newline at end of file diff --git a/.github/images/diffuser_modulation.svg b/.github/images/diffuser_modulation.svg new file mode 100644 index 000000000..95f82f8ed --- /dev/null +++ b/.github/images/diffuser_modulation.svg @@ -0,0 +1,820 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + -90° + + + + + + + + -60° + + + + + + + + -30° + + + + + + + + + + + + + + + + 30° + + + + + + + + 60° + + + + + + + + 90° + + + + + + + + + + −40 + + + + + + + + −35 + + + + + + + + −30 + + + + + + + + −25 + + + + + + + + −20 + + + + + + + + −15 + + + + + + + + −10 + + + + + + + + −5 + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + Reflected polar response at 1 kHz + + + + + + + + + + Periodic, 6 x N = 7 (d = 0.22) + + + + + + Modulated, period + inverse (d = 0.32) + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.05 + + + + + + + + + + + + + 0.10 + + + + + + + + + + + + + 0.15 + + + + + + + + + + + + + 0.20 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.30 + + + + + + + + + + + + + 0.35 + + + + + + + + + + + + + 0.40 + + + + + + + + + + + + + 0.45 + + + + Normalised diffusion coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + f0: the one band the + periodic array wins + + + Band by band, same 4.2 m panel + + + + + + + + + + + + + Periodic, 6 x N = 7 + + + + + + + + + Modulated, period + inverse + + + + + + + + + + + + + diff --git a/.github/images/diffuser_modulation_dark.svg b/.github/images/diffuser_modulation_dark.svg new file mode 100644 index 000000000..2edf62f99 --- /dev/null +++ b/.github/images/diffuser_modulation_dark.svg @@ -0,0 +1,820 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + -90° + + + + + + + + -60° + + + + + + + + -30° + + + + + + + + + + + + + + + + 30° + + + + + + + + 60° + + + + + + + + 90° + + + + + + + + + + −40 + + + + + + + + −35 + + + + + + + + −30 + + + + + + + + −25 + + + + + + + + −20 + + + + + + + + −15 + + + + + + + + −10 + + + + + + + + −5 + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + Reflected polar response at 1 kHz + + + + + + + + + + Periodic, 6 x N = 7 (d = 0.22) + + + + + + Modulated, period + inverse (d = 0.32) + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.05 + + + + + + + + + + + + + 0.10 + + + + + + + + + + + + + 0.15 + + + + + + + + + + + + + 0.20 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.30 + + + + + + + + + + + + + 0.35 + + + + + + + + + + + + + 0.40 + + + + + + + + + + + + + 0.45 + + + + Normalised diffusion coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + f0: the one band the + periodic array wins + + + Band by band, same 4.2 m panel + + + + + + + + + + + + + Periodic, 6 x N = 7 + + + + + + + + + Modulated, period + inverse + + + + + + + + + + + + + diff --git a/.github/images/diffuser_modulation_es.svg b/.github/images/diffuser_modulation_es.svg new file mode 100644 index 000000000..0b645fac2 --- /dev/null +++ b/.github/images/diffuser_modulation_es.svg @@ -0,0 +1,820 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + -90° + + + + + + + + -60° + + + + + + + + -30° + + + + + + + + + + + + + + + + 30° + + + + + + + + 60° + + + + + + + + 90° + + + + + + + + + + -40 + + + + + + + + -35 + + + + + + + + -30 + + + + + + + + -25 + + + + + + + + -20 + + + + + + + + -15 + + + + + + + + -10 + + + + + + + + -5 + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + Respuesta polar reflejada a 1 kHz + + + + + + + + + + Periodic, 6 x N = 7 (d = 0,22) + + + + + + Modulated, period + inverse (d = 0,32) + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,05 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,15 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,35 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,45 + + + + Coeficiente de difusión normalizado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + f0: the one band the + periodic array wins + + + Banda a banda, el mismo panel de 4,2 m + + + + + + + + + + + + + Periódico, 6 x N = 7 + + + + + + + + + Modulado, periodo + inverso + + + + + + + + + + + + + diff --git a/.github/images/diffuser_modulation_es_dark.svg b/.github/images/diffuser_modulation_es_dark.svg new file mode 100644 index 000000000..655f01319 --- /dev/null +++ b/.github/images/diffuser_modulation_es_dark.svg @@ -0,0 +1,820 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + -90° + + + + + + + + -60° + + + + + + + + -30° + + + + + + + + + + + + + + + + 30° + + + + + + + + 60° + + + + + + + + 90° + + + + + + + + + + -40 + + + + + + + + -35 + + + + + + + + -30 + + + + + + + + -25 + + + + + + + + -20 + + + + + + + + -15 + + + + + + + + -10 + + + + + + + + -5 + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + Respuesta polar reflejada a 1 kHz + + + + + + + + + + Periodic, 6 x N = 7 (d = 0,22) + + + + + + Modulated, period + inverse (d = 0,32) + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,05 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,15 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,35 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,45 + + + + Coeficiente de difusión normalizado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + f0: the one band the + periodic array wins + + + Banda a banda, el mismo panel de 4,2 m + + + + + + + + + + + + + Periódico, 6 x N = 7 + + + + + + + + + Modulado, periodo + inverso + + + + + + + + + + + + + diff --git a/.github/images/diffusion_measurement_chain.svg b/.github/images/diffusion_measurement_chain.svg new file mode 100644 index 000000000..fc37ce2b6 --- /dev/null +++ b/.github/images/diffusion_measurement_chain.svg @@ -0,0 +1,2998 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (a) h1: sample present + + + + + + + + + + + + + + + + + + + direct + + + room + + + sample + + + From three impulse responses to one level (ISO 17497-2, Clause 7.4) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (b) h2: sample removed + + + + + + + + + + + + + + + + + + + direct + + + room + + + + + + source 10 m, arc 5 m, receiver 60 deg + window 9.7 ms -> analysis from about 103 Hz + S/N >= 40 dB inside it on the flat reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (c) h1 - h2: the room is gone + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (d) h4: deconvolved by h3, Formula (1) + + + + + + + + + + + + + + + + + + + h4 arrives 2 ms earlier than h1: + dividing by h3 removes its delay too + + + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + Time [ms] + + + + + (e) windowed, Clause 7.4.3 + + + + + + + + + + + + + + + + + + + shortest path + 40.0 ms + + + longest path + 48.9 ms + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/diffusion_measurement_chain_dark.svg b/.github/images/diffusion_measurement_chain_dark.svg new file mode 100644 index 000000000..1c14f5c39 --- /dev/null +++ b/.github/images/diffusion_measurement_chain_dark.svg @@ -0,0 +1,2998 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (a) h1: sample present + + + + + + + + + + + + + + + + + + + direct + + + room + + + sample + + + From three impulse responses to one level (ISO 17497-2, Clause 7.4) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (b) h2: sample removed + + + + + + + + + + + + + + + + + + + direct + + + room + + + + + + source 10 m, arc 5 m, receiver 60 deg + window 9.7 ms -> analysis from about 103 Hz + S/N >= 40 dB inside it on the flat reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (c) h1 - h2: the room is gone + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (d) h4: deconvolved by h3, Formula (1) + + + + + + + + + + + + + + + + + + + h4 arrives 2 ms earlier than h1: + dividing by h3 removes its delay too + + + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + Time [ms] + + + + + (e) windowed, Clause 7.4.3 + + + + + + + + + + + + + + + + + + + shortest path + 40.0 ms + + + longest path + 48.9 ms + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/diffusion_measurement_chain_es.svg b/.github/images/diffusion_measurement_chain_es.svg new file mode 100644 index 000000000..311e2df94 --- /dev/null +++ b/.github/images/diffusion_measurement_chain_es.svg @@ -0,0 +1,2998 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (a) h1: con la muestra + + + + + + + + + + + + + + + + + + + directo + + + sala + + + muestra + + + De tres respuestas al impulso a un nivel (ISO 17497-2, capítulo 7,4) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (b) h2: sin la muestra + + + + + + + + + + + + + + + + + + + directo + + + sala + + + + + + source 10 m, arc 5 m, receiver 60 deg + window 9,7 ms -> analysis from about 103 Hz + S/N >= 40 dB inside it on the flat reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (c) h1 - h2: la sala desaparece + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (d) h4: deconvolucionada por h3, Fórmula (1) + + + + + + + + + + + + + + + + + + + h4 arrives 2 ms earlier than h1: + dividing by h3 removes its delay too + + + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + Tiempo [ms] + + + + + (e) enventanada, capítulo 7.4.3 + + + + + + + + + + + + + + + + + + + shortest path + 40,0 ms + + + longest path + 48,9 ms + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/diffusion_measurement_chain_es_dark.svg b/.github/images/diffusion_measurement_chain_es_dark.svg new file mode 100644 index 000000000..e6b58509e --- /dev/null +++ b/.github/images/diffusion_measurement_chain_es_dark.svg @@ -0,0 +1,2998 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (a) h1: con la muestra + + + + + + + + + + + + + + + + + + + directo + + + sala + + + muestra + + + De tres respuestas al impulso a un nivel (ISO 17497-2, capítulo 7,4) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (b) h2: sin la muestra + + + + + + + + + + + + + + + + + + + directo + + + sala + + + + + + source 10 m, arc 5 m, receiver 60 deg + window 9,7 ms -> analysis from about 103 Hz + S/N >= 40 dB inside it on the flat reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (c) h1 - h2: la sala desaparece + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (d) h4: deconvolucionada por h3, Fórmula (1) + + + + + + + + + + + + + + + + + + + h4 arrives 2 ms earlier than h1: + dividing by h3 removes its delay too + + + + + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + Tiempo [ms] + + + + + (e) enventanada, capítulo 7.4.3 + + + + + + + + + + + + + + + + + + + shortest path + 40,0 ms + + + longest path + 48,9 ms + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/effective_kappa.svg b/.github/images/effective_kappa.svg new file mode 100644 index 000000000..0bde2ab99 --- /dev/null +++ b/.github/images/effective_kappa.svg @@ -0,0 +1,647 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + + + + + + + + + + 3.5 + + + + + + + + + + + + + 4.0 + + + + Piston frequency f [Hz] (ISO 9053-2 Clause 6.2: 1 Hz to 4 Hz) + + + + + + + + + + + + + + + + + 1.32 + + + + + + + + + + + + + 1.34 + + + + + + + + + + + + + 1.36 + + + + + + + + + + + + + 1.38 + + + + + + + + + + + + + 1.40 + + + + + + + E + f + f + e + c + t + i + v + e +   + r + a + t + i + o +   + o + f +   + s + p + e + c + i + f + i + c +   + h + e + a + t + s +   + κ + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + d + i + a + b + a + t + i + c +   +   + = +   + 1 + . + 4 + 0 + 0 + 8 + κ + + + + + ISO 9053-2 Annex A Heat-Conduction Correction + + + + + + + + + + S/V = 30 1/m + + + + + + S/V = 60 1/m + + + + + + S/V = 120 1/m + + + + + + + + + + + Annex A.3 example (2 Hz, 1.370) + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + Bias in R if the adiabatic value is used [%] + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/effective_kappa_dark.svg b/.github/images/effective_kappa_dark.svg new file mode 100644 index 000000000..1392698e1 --- /dev/null +++ b/.github/images/effective_kappa_dark.svg @@ -0,0 +1,647 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.5 + + + + + + + + + + + + + 2.0 + + + + + + + + + + + + + 2.5 + + + + + + + + + + + + + 3.0 + + + + + + + + + + + + + 3.5 + + + + + + + + + + + + + 4.0 + + + + Piston frequency f [Hz] (ISO 9053-2 Clause 6.2: 1 Hz to 4 Hz) + + + + + + + + + + + + + + + + + 1.32 + + + + + + + + + + + + + 1.34 + + + + + + + + + + + + + 1.36 + + + + + + + + + + + + + 1.38 + + + + + + + + + + + + + 1.40 + + + + + + + E + f + f + e + c + t + i + v + e +   + r + a + t + i + o +   + o + f +   + s + p + e + c + i + f + i + c +   + h + e + a + t + s +   + κ + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + d + i + a + b + a + t + i + c +   +   + = +   + 1 + . + 4 + 0 + 0 + 8 + κ + + + + + ISO 9053-2 Annex A Heat-Conduction Correction + + + + + + + + + + S/V = 30 1/m + + + + + + S/V = 60 1/m + + + + + + S/V = 120 1/m + + + + + + + + + + + Annex A.3 example (2 Hz, 1.370) + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + Bias in R if the adiabatic value is used [%] + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/effective_kappa_es.svg b/.github/images/effective_kappa_es.svg new file mode 100644 index 000000000..429eba162 --- /dev/null +++ b/.github/images/effective_kappa_es.svg @@ -0,0 +1,647 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 3,5 + + + + + + + + + + + + + 4 + + + + Piston frequency f [Hz] (ISO 9053-2 Clause 6,2: 1 Hz to 4 Hz) + + + + + + + + + + + + + + + + + 1,32 + + + + + + + + + + + + + 1,34 + + + + + + + + + + + + + 1,36 + + + + + + + + + + + + + 1,38 + + + + + + + + + + + + + 1,4 + + + + + + + E + f + f + e + c + t + i + v + e +   + r + a + t + i + o +   + o + f +   + s + p + e + c + i + f + i + c +   + h + e + a + t + s +   + κ + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + d + i + a + b + a + t + i + c +   +   + = +   + 1 + . + 4 + 0 + 0 + 8 + κ + + + + + ISO 9053-2 Annex A Heat-Conduction Correction + + + + + + + + + + S/V = 30 1/m + + + + + + S/V = 60 1/m + + + + + + S/V = 120 1/m + + + + + + + + + + + Annex A.3 example (2 Hz, 1,370) + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + Bias in R if the adiabatic value is used [%] + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/effective_kappa_es_dark.svg b/.github/images/effective_kappa_es_dark.svg new file mode 100644 index 000000000..24e5582d9 --- /dev/null +++ b/.github/images/effective_kappa_es_dark.svg @@ -0,0 +1,647 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 2,5 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 3,5 + + + + + + + + + + + + + 4 + + + + Piston frequency f [Hz] (ISO 9053-2 Clause 6,2: 1 Hz to 4 Hz) + + + + + + + + + + + + + + + + + 1,32 + + + + + + + + + + + + + 1,34 + + + + + + + + + + + + + 1,36 + + + + + + + + + + + + + 1,38 + + + + + + + + + + + + + 1,4 + + + + + + + E + f + f + e + c + t + i + v + e +   + r + a + t + i + o +   + o + f +   + s + p + e + c + i + f + i + c +   + h + e + a + t + s +   + κ + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + d + i + a + b + a + t + i + c +   +   + = +   + 1 + . + 4 + 0 + 0 + 8 + κ + + + + + ISO 9053-2 Annex A Heat-Conduction Correction + + + + + + + + + + S/V = 30 1/m + + + + + + S/V = 60 1/m + + + + + + S/V = 120 1/m + + + + + + + + + + + Annex A.3 example (2 Hz, 1,370) + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + Bias in R if the adiabatic value is used [%] + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_gas_stiffness.svg b/.github/images/enclosed_gas_stiffness.svg new file mode 100644 index 000000000..d56f0b043 --- /dev/null +++ b/.github/images/enclosed_gas_stiffness.svg @@ -0,0 +1,692 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Loaded thickness d [mm] + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dynamic stiffness per unit area [MN/m³] + + + + + + + + + + + + + + + + + + + + + + the worked determination: + d = 20 mm, 4.94 + 5.56 = 10.49 + + + + + + clause 8.2: r >= 100 kPa.s/m2 -> s' = s't + 10 <= r < 100 -> s' = s't + s'a + r < 10 -> s' = s't only if s'a is negligible + + + The gas spring takes over as the layer gets thinner + + + + + + + + + + + + + s't, frame (Formula 4) + + + + + + s'a, enclosed gas (Formula 7, eps = 0.9) + + + + + + s' installed = s't + s'a (clause 8.2) + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 90 + + + + + + + + + + + + + + + + + + + + + + + + + + + + f0 of a 120 kg/m² screed [Hz] + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_gas_stiffness_dark.svg b/.github/images/enclosed_gas_stiffness_dark.svg new file mode 100644 index 000000000..4ec9799ba --- /dev/null +++ b/.github/images/enclosed_gas_stiffness_dark.svg @@ -0,0 +1,692 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Loaded thickness d [mm] + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dynamic stiffness per unit area [MN/m³] + + + + + + + + + + + + + + + + + + + + + + the worked determination: + d = 20 mm, 4.94 + 5.56 = 10.49 + + + + + + clause 8.2: r >= 100 kPa.s/m2 -> s' = s't + 10 <= r < 100 -> s' = s't + s'a + r < 10 -> s' = s't only if s'a is negligible + + + The gas spring takes over as the layer gets thinner + + + + + + + + + + + + + s't, frame (Formula 4) + + + + + + s'a, enclosed gas (Formula 7, eps = 0.9) + + + + + + s' installed = s't + s'a (clause 8.2) + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 90 + + + + + + + + + + + + + + + + + + + + + + + + + + + + f0 of a 120 kg/m² screed [Hz] + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_gas_stiffness_es.svg b/.github/images/enclosed_gas_stiffness_es.svg new file mode 100644 index 000000000..802acfc81 --- /dev/null +++ b/.github/images/enclosed_gas_stiffness_es.svg @@ -0,0 +1,692 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Espesor bajo carga d [mm] + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rigidez dinámica por unidad de superficie [MN/m³] + + + + + + + + + + + + + + + + + + + + + + la determinación del ejemplo: + d = 20 mm, 4,94 + 5,56 = 10,49 + + + + + + capítulo 8,2: r >= 100 kPa.s/m2 -> s' = s't + 10 <= r < 100 -> s' = s't + s'a + r < 10 -> s' = s't solo si s'a es despreciable + + + El resorte de aire domina según adelgaza la capa + + + + + + + + + + + + + s't, esqueleto (Fórmula 4) + + + + + + s'a, aire encerrado (Fórmula 7, eps = 0,9) + + + + + + s' instalada = s't + s'a (capítulo 8,2) + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 90 + + + + + + + + + + + + + + + + + + + + + + + + + + + + f0 de un recrecido de 120 kg/m² [Hz] + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_gas_stiffness_es_dark.svg b/.github/images/enclosed_gas_stiffness_es_dark.svg new file mode 100644 index 000000000..e4ab57b37 --- /dev/null +++ b/.github/images/enclosed_gas_stiffness_es_dark.svg @@ -0,0 +1,692 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Espesor bajo carga d [mm] + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rigidez dinámica por unidad de superficie [MN/m³] + + + + + + + + + + + + + + + + + + + + + + la determinación del ejemplo: + d = 20 mm, 4,94 + 5,56 = 10,49 + + + + + + capítulo 8,2: r >= 100 kPa.s/m2 -> s' = s't + 10 <= r < 100 -> s' = s't + s'a + r < 10 -> s' = s't solo si s'a es despreciable + + + El resorte de aire domina según adelgaza la capa + + + + + + + + + + + + + s't, esqueleto (Fórmula 4) + + + + + + s'a, aire encerrado (Fórmula 7, eps = 0,9) + + + + + + s' instalada = s't + s'a (capítulo 8,2) + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 90 + + + + + + + + + + + + + + + + + + + + + + + + + + + + f0 de un recrecido de 120 kg/m² [Hz] + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_space_air_term.svg b/.github/images/enclosed_space_air_term.svg new file mode 100644 index 000000000..558d21bf0 --- /dev/null +++ b/.github/images/enclosed_space_air_term.svg @@ -0,0 +1,1483 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + i + r +   + t + e + r + m +   + = + 4 + ( + 1 + + ) +   + [ + m + ] + A + m + V + ψ + a + i + r + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S + i + x +   + c + l + i + m + a + t + e +   + p + r + o + f + i + l + e + s + , +   +   + = +   + 2 + 0 + 0 + 0 +   + m + V + 3 + + + + + + + + + + + + + + + 10 °C, 30-50 % RH + + + + + + + + + 10 °C, 50-70 % RH + + + + + + + + + 10 °C, 70-90 % RH + + + + + + + + + 20 °C, 30-50 % RH + + + + + + + + + 20 °C, 50-70 % RH + + + + + + + + + 20 °C, 70-90 % RH + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frequency [Hz] + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.50 + + + + + + + + + + + + + 0.75 + + + + + + + + + + + + + 1.00 + + + + + + + + + + + + + 1.25 + + + + + + + + + + + + + 1.50 + + + + + + + + + + + + + 1.75 + + + + + + + + + + + + + 2.00 + + + + + + + R + e + v + e + r + b + e + r + a + t + i + o + n +   + t + i + m + e +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -42 % at 8 kHz + + + + + + + -1.7 % at 1 kHz + + + The same absorption in two volumes + + + + + + + + + + + + + + + + 6 + 0 +   + m +   + o + f + f + i + c + e +   + ( + n + o +   + a + i + r + ) + 3 + + + + + + + + + + + + + + 6 + 0 +   + m +   + o + f + f + i + c + e +   + ( + 2 + 0 +   + ° + C + , +   + 5 + 0 + - + 7 + 0 +   + % + ) + 3 + + + + + + + + + + + + + + 2 + 0 + 0 + 0 +   + m +   + h + a + l + l +   + ( + n + o +   + a + i + r + ) + 3 + + + + + + + + + + + + + + 2 + 0 + 0 + 0 +   + m +   + h + a + l + l +   + ( + 2 + 0 +   + ° + C + , +   + 5 + 0 + - + 7 + 0 +   + % + ) + 3 + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_space_air_term_dark.svg b/.github/images/enclosed_space_air_term_dark.svg new file mode 100644 index 000000000..03bcd94cc --- /dev/null +++ b/.github/images/enclosed_space_air_term_dark.svg @@ -0,0 +1,1483 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + i + r +   + t + e + r + m +   + = + 4 + ( + 1 + + ) +   + [ + m + ] + A + m + V + ψ + a + i + r + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S + i + x +   + c + l + i + m + a + t + e +   + p + r + o + f + i + l + e + s + , +   +   + = +   + 2 + 0 + 0 + 0 +   + m + V + 3 + + + + + + + + + + + + + + + 10 °C, 30-50 % RH + + + + + + + + + 10 °C, 50-70 % RH + + + + + + + + + 10 °C, 70-90 % RH + + + + + + + + + 20 °C, 30-50 % RH + + + + + + + + + 20 °C, 50-70 % RH + + + + + + + + + 20 °C, 70-90 % RH + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frequency [Hz] + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.50 + + + + + + + + + + + + + 0.75 + + + + + + + + + + + + + 1.00 + + + + + + + + + + + + + 1.25 + + + + + + + + + + + + + 1.50 + + + + + + + + + + + + + 1.75 + + + + + + + + + + + + + 2.00 + + + + + + + R + e + v + e + r + b + e + r + a + t + i + o + n +   + t + i + m + e +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -42 % at 8 kHz + + + + + + + -1.7 % at 1 kHz + + + The same absorption in two volumes + + + + + + + + + + + + + + + + 6 + 0 +   + m +   + o + f + f + i + c + e +   + ( + n + o +   + a + i + r + ) + 3 + + + + + + + + + + + + + + 6 + 0 +   + m +   + o + f + f + i + c + e +   + ( + 2 + 0 +   + ° + C + , +   + 5 + 0 + - + 7 + 0 +   + % + ) + 3 + + + + + + + + + + + + + + 2 + 0 + 0 + 0 +   + m +   + h + a + l + l +   + ( + n + o +   + a + i + r + ) + 3 + + + + + + + + + + + + + + 2 + 0 + 0 + 0 +   + m +   + h + a + l + l +   + ( + 2 + 0 +   + ° + C + , +   + 5 + 0 + - + 7 + 0 +   + % + ) + 3 + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_space_air_term_es.svg b/.github/images/enclosed_space_air_term_es.svg new file mode 100644 index 000000000..4eab5bd3e --- /dev/null +++ b/.github/images/enclosed_space_air_term_es.svg @@ -0,0 +1,1488 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + i + r +   + t + e + r + m +   + = + 4 + ( + 1 + + ) +   + [ + m + ] + A + m + V + ψ + a + i + r + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S + i + x +   + c + l + i + m + a + t + e +   + p + r + o + f + i + l + e + s + , +   +   + = +   + 2 + 0 + 0 + 0 +   + m + V + 3 + + + + + + + + + + + + + + + 10 °C, 30-50 % HR + + + + + + + + + 10 °C, 50-70 % HR + + + + + + + + + 10 °C, 70-90 % HR + + + + + + + + + 20 °C, 30-50 % HR + + + + + + + + + 20 °C, 50-70 % HR + + + + + + + + + 20 °C, 70-90 % HR + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frecuencia [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,75 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,25 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 1,75 + + + + + + + + + + + + + 2 + + + + + + + T + i + e + m + p + o +   + d + e +   + r + e + v + e + r + b + e + r + a + c + i + ó + n +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -42 % at 8 kHz + + + + + + + -1,7 % at 1 kHz + + + The same absorption in two volumes + + + + + + + + + + + + + + + + 6 + 0 +   + m +   + o + f + f + i + c + e +   + ( + n + o +   + a + i + r + ) + 3 + + + + + + + + + + + + + + 6 + 0 +   + m +   + o + f + f + i + c + e +   + ( + 2 + 0 +   + ° + C + , +   + 5 + 0 + - + 7 + 0 +   + % + ) + 3 + + + + + + + + + + + + + + 2 + 0 + 0 + 0 +   + m +   + h + a + l + l +   + ( + n + o +   + a + i + r + ) + 3 + + + + + + + + + + + + + + 2 + 0 + 0 + 0 +   + m +   + h + a + l + l +   + ( + 2 + 0 +   + ° + C + , +   + 5 + 0 + - + 7 + 0 +   + % + ) + 3 + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_space_air_term_es_dark.svg b/.github/images/enclosed_space_air_term_es_dark.svg new file mode 100644 index 000000000..b608b092a --- /dev/null +++ b/.github/images/enclosed_space_air_term_es_dark.svg @@ -0,0 +1,1488 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + i + r +   + t + e + r + m +   + = + 4 + ( + 1 + + ) +   + [ + m + ] + A + m + V + ψ + a + i + r + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S + i + x +   + c + l + i + m + a + t + e +   + p + r + o + f + i + l + e + s + , +   +   + = +   + 2 + 0 + 0 + 0 +   + m + V + 3 + + + + + + + + + + + + + + + 10 °C, 30-50 % HR + + + + + + + + + 10 °C, 50-70 % HR + + + + + + + + + 10 °C, 70-90 % HR + + + + + + + + + 20 °C, 30-50 % HR + + + + + + + + + 20 °C, 50-70 % HR + + + + + + + + + 20 °C, 70-90 % HR + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frecuencia [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,75 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,25 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 1,75 + + + + + + + + + + + + + 2 + + + + + + + T + i + e + m + p + o +   + d + e +   + r + e + v + e + r + b + e + r + a + c + i + ó + n +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -42 % at 8 kHz + + + + + + + -1,7 % at 1 kHz + + + The same absorption in two volumes + + + + + + + + + + + + + + + + 6 + 0 +   + m +   + o + f + f + i + c + e +   + ( + n + o +   + a + i + r + ) + 3 + + + + + + + + + + + + + + 6 + 0 +   + m +   + o + f + f + i + c + e +   + ( + 2 + 0 +   + ° + C + , +   + 5 + 0 + - + 7 + 0 +   + % + ) + 3 + + + + + + + + + + + + + + 2 + 0 + 0 + 0 +   + m +   + h + a + l + l +   + ( + n + o +   + a + i + r + ) + 3 + + + + + + + + + + + + + + 2 + 0 + 0 + 0 +   + m +   + h + a + l + l +   + ( + 2 + 0 +   + ° + C + , +   + 5 + 0 + - + 7 + 0 +   + % + ) + 3 + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_space_objects.svg b/.github/images/enclosed_space_objects.svg new file mode 100644 index 000000000..267269480 --- /dev/null +++ b/.github/images/enclosed_space_objects.svg @@ -0,0 +1,1223 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Octave-band centre frequency [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + E + q + u + i + v + a + l + e + n + t +   + a + b + s + o + r + p + t + i + o + n +   + a + r + e + a +   +   + [ + m + ] + A + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Where the absorption comes from + + + bare + + + furnished + + + + + + + + + + surfaces + + + + + + air + + + + + + objects (Formula 4) + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frequency [Hz] + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.50 + + + + + + + + + + + + + 0.75 + + + + + + + + + + + + + 1.00 + + + + + + + + + + + + + 1.25 + + + + + + + + + + + + + 1.50 + + + + + + + + + + + + + 1.75 + + + + + + + + + + + + + 2.00 + + + + + + + R + e + v + e + r + b + e + r + a + t + i + o + n +   + t + i + m + e +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + t + h + e +   + g + a + p +   + i + s +   +   + a + l + o + n + e + : +   + 7 + . + 2 +   + % + ψ + + + + + The volume the objects displace + + + + + + + + + + + + + bare + + + + + + + + + + + + f + u + r + n + i + s + h + e + d + , +   +   + = +   + 0 +   + ( + a + b + s + o + r + p + t + i + o + n +   + o + n + l + y + ) + ψ + + + + + + + + + + + + + + f + u + r + n + i + s + h + e + d + , +   +   + = +   + 0 + . + 0 + 7 + 2 + ψ + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_space_objects_dark.svg b/.github/images/enclosed_space_objects_dark.svg new file mode 100644 index 000000000..7d3e640a4 --- /dev/null +++ b/.github/images/enclosed_space_objects_dark.svg @@ -0,0 +1,1223 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Octave-band centre frequency [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + E + q + u + i + v + a + l + e + n + t +   + a + b + s + o + r + p + t + i + o + n +   + a + r + e + a +   +   + [ + m + ] + A + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Where the absorption comes from + + + bare + + + furnished + + + + + + + + + + surfaces + + + + + + air + + + + + + objects (Formula 4) + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frequency [Hz] + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.50 + + + + + + + + + + + + + 0.75 + + + + + + + + + + + + + 1.00 + + + + + + + + + + + + + 1.25 + + + + + + + + + + + + + 1.50 + + + + + + + + + + + + + 1.75 + + + + + + + + + + + + + 2.00 + + + + + + + R + e + v + e + r + b + e + r + a + t + i + o + n +   + t + i + m + e +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + t + h + e +   + g + a + p +   + i + s +   +   + a + l + o + n + e + : +   + 7 + . + 2 +   + % + ψ + + + + + The volume the objects displace + + + + + + + + + + + + + bare + + + + + + + + + + + + f + u + r + n + i + s + h + e + d + , +   +   + = +   + 0 +   + ( + a + b + s + o + r + p + t + i + o + n +   + o + n + l + y + ) + ψ + + + + + + + + + + + + + + f + u + r + n + i + s + h + e + d + , +   +   + = +   + 0 + . + 0 + 7 + 2 + ψ + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_space_objects_es.svg b/.github/images/enclosed_space_objects_es.svg new file mode 100644 index 000000000..2f8771ab6 --- /dev/null +++ b/.github/images/enclosed_space_objects_es.svg @@ -0,0 +1,1231 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frecuencia central de banda de octava [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + Á + r + e + a +   + d + e +   + a + b + s + o + r + c + i + ó + n +   + e + q + u + i + v + a + l + e + n + t + e +   +   + [ + m + ] + A + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Where the absorption comes from + + + bare + + + furnished + + + + + + + + + + surfaces + + + + + + air + + + + + + objects (Formula 4) + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frecuencia [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,75 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,25 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 1,75 + + + + + + + + + + + + + 2 + + + + + + + T + i + e + m + p + o +   + d + e +   + r + e + v + e + r + b + e + r + a + c + i + ó + n +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + t + h + e +   + g + a + p +   + i + s +   +   + a + l + o + n + e + : +   + 7 + . + 2 +   + % + ψ + + + + + The volume the objects displace + + + + + + + + + + + + + bare + + + + + + + + + + + + f + u + r + n + i + s + h + e + d + , +   +   + = +   + 0 +   + ( + a + b + s + o + r + p + t + i + o + n +   + o + n + l + y + ) + ψ + + + + + + + + + + + + + + f + u + r + n + i + s + h + e + d + , +   +   + = +   + 0 + . + 0 + 7 + 2 + ψ + + + + + + + + + + + + + + + diff --git a/.github/images/enclosed_space_objects_es_dark.svg b/.github/images/enclosed_space_objects_es_dark.svg new file mode 100644 index 000000000..e786ef81d --- /dev/null +++ b/.github/images/enclosed_space_objects_es_dark.svg @@ -0,0 +1,1231 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frecuencia central de banda de octava [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + Á + r + e + a +   + d + e +   + a + b + s + o + r + c + i + ó + n +   + e + q + u + i + v + a + l + e + n + t + e +   +   + [ + m + ] + A + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Where the absorption comes from + + + bare + + + furnished + + + + + + + + + + surfaces + + + + + + air + + + + + + objects (Formula 4) + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + Frecuencia [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,75 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,25 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 1,75 + + + + + + + + + + + + + 2 + + + + + + + T + i + e + m + p + o +   + d + e +   + r + e + v + e + r + b + e + r + a + c + i + ó + n +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + t + h + e +   + g + a + p +   + i + s +   +   + a + l + o + n + e + : +   + 7 + . + 2 +   + % + ψ + + + + + The volume the objects displace + + + + + + + + + + + + + bare + + + + + + + + + + + + f + u + r + n + i + s + h + e + d + , +   +   + = +   + 0 +   + ( + a + b + s + o + r + p + t + i + o + n +   + o + n + l + y + ) + ψ + + + + + + + + + + + + + + f + u + r + n + i + s + h + e + d + , +   +   + = +   + 0 + . + 0 + 7 + 2 + ψ + + + + + + + + + + + + + + + diff --git a/.github/images/excitation_robustness.svg b/.github/images/excitation_robustness.svg new file mode 100644 index 000000000..e80ab2814 --- /dev/null +++ b/.github/images/excitation_robustness.svg @@ -0,0 +1,37586 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.1 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.3 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.5 + + + + Time [s] + + + + + + + + + + + + + + + + + −80 + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + 0 + + + + Level re peak [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the MLS floor rises to the room's own early decay: + the tail is gone + + + + + + + sweep: the two traces lie on top of each other + + + Time variance costs the MLS its dynamic range, not the sweep + + + + + + + + + + sweep, stationary + + + + + + MLS, stationary + + + + + + sweep, +0.3 K during the take + + + + + + MLS, +0.3 K during the take + + + + + + + + + + diff --git a/.github/images/excitation_robustness_dark.svg b/.github/images/excitation_robustness_dark.svg new file mode 100644 index 000000000..a3a7c90f4 --- /dev/null +++ b/.github/images/excitation_robustness_dark.svg @@ -0,0 +1,37586 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.1 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.3 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.5 + + + + Time [s] + + + + + + + + + + + + + + + + + −80 + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + 0 + + + + Level re peak [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the MLS floor rises to the room's own early decay: + the tail is gone + + + + + + + sweep: the two traces lie on top of each other + + + Time variance costs the MLS its dynamic range, not the sweep + + + + + + + + + + sweep, stationary + + + + + + MLS, stationary + + + + + + sweep, +0.3 K during the take + + + + + + MLS, +0.3 K during the take + + + + + + + + + + diff --git a/.github/images/excitation_robustness_es.svg b/.github/images/excitation_robustness_es.svg new file mode 100644 index 000000000..376d67adb --- /dev/null +++ b/.github/images/excitation_robustness_es.svg @@ -0,0 +1,37586 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,5 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + -80 + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + 0 + + + + Nivel re pico [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + el suelo del MLS sube hasta la primera caída de la sala: + la cola ha desaparecido + + + + + + + barrido: las dos trazas quedan superpuestas + + + La variación temporal le cuesta el rango dinámico al MLS, no al barrido + + + + + + + + + + barrido, estacionario + + + + + + MLS, estacionario + + + + + + barrido, +0,3 K durante la toma + + + + + + MLS, +0,3 K durante la toma + + + + + + + + + + diff --git a/.github/images/excitation_robustness_es_dark.svg b/.github/images/excitation_robustness_es_dark.svg new file mode 100644 index 000000000..410a8d635 --- /dev/null +++ b/.github/images/excitation_robustness_es_dark.svg @@ -0,0 +1,37586 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,5 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + -80 + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + 0 + + + + Nivel re pico [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + el suelo del MLS sube hasta la primera caída de la sala: + la cola ha desaparecido + + + + + + + barrido: las dos trazas quedan superpuestas + + + La variación temporal le cuesta el rango dinámico al MLS, no al barrido + + + + + + + + + + barrido, estacionario + + + + + + MLS, estacionario + + + + + + barrido, +0,3 K durante la toma + + + + + + MLS, +0,3 K durante la toma + + + + + + + + + + diff --git a/.github/images/fast_reverberation_correction.svg b/.github/images/fast_reverberation_correction.svg new file mode 100644 index 000000000..793468c8d --- /dev/null +++ b/.github/images/fast_reverberation_correction.svg @@ -0,0 +1,1320 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + Receiving-room reverberation time T [s] + + + + + + + + + + + + + + + + + −4 + + + + + + + + + + + + + −2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + Term subtracted from the measured level [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T = T0 = 0,5 s + both terms vanish + + + + + + + T = 1,7275 s: C = 1, g = 1/e + + + + + + + at T = 5 s the energy average has grown to 10.0 dB + while the Fast term has saturated at 5.1 dB + + + A Fast detector cannot follow a long decay + + + + + + + + + + + + + + + + more than 1 dB apart + + + + + + Fast maximum: 10 lg[g(C)/g(C0)] (ISO 16283-2) + + + + + + energy average: 10 lg(T/T0) + + + + + + + + + + diff --git a/.github/images/fast_reverberation_correction_dark.svg b/.github/images/fast_reverberation_correction_dark.svg new file mode 100644 index 000000000..fd5876dc5 --- /dev/null +++ b/.github/images/fast_reverberation_correction_dark.svg @@ -0,0 +1,1320 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + Receiving-room reverberation time T [s] + + + + + + + + + + + + + + + + + −4 + + + + + + + + + + + + + −2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + Term subtracted from the measured level [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T = T0 = 0,5 s + both terms vanish + + + + + + + T = 1,7275 s: C = 1, g = 1/e + + + + + + + at T = 5 s the energy average has grown to 10.0 dB + while the Fast term has saturated at 5.1 dB + + + A Fast detector cannot follow a long decay + + + + + + + + + + + + + + + + more than 1 dB apart + + + + + + Fast maximum: 10 lg[g(C)/g(C0)] (ISO 16283-2) + + + + + + energy average: 10 lg(T/T0) + + + + + + + + + + diff --git a/.github/images/fast_reverberation_correction_es.svg b/.github/images/fast_reverberation_correction_es.svg new file mode 100644 index 000000000..69007b16f --- /dev/null +++ b/.github/images/fast_reverberation_correction_es.svg @@ -0,0 +1,1320 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + Tiempo de reverberacion del recinto receptor T [s] + + + + + + + + + + + + + + + + + -4 + + + + + + + + + + + + + -2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + Termino restado al nivel medido [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T = T0 = 0,5 s + ambos terminos se anulan + + + + + + + T = 1,7275 s: C = 1, g = 1/e + + + + + + + at T = 5 s the energy average has grown to 10,0 dB + while the Fast term has saturated at 5,1 dB + + + Un detector Fast no puede seguir una caida larga + + + + + + + + + + + + + + + + mas de 1 dB de diferencia + + + + + + maximo Fast: 10 lg[g(C)/g(C0)] (ISO 16283-2) + + + + + + promedio energetico: 10 lg(T/T0) + + + + + + + + + + diff --git a/.github/images/fast_reverberation_correction_es_dark.svg b/.github/images/fast_reverberation_correction_es_dark.svg new file mode 100644 index 000000000..0290021a2 --- /dev/null +++ b/.github/images/fast_reverberation_correction_es_dark.svg @@ -0,0 +1,1320 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + Tiempo de reverberacion del recinto receptor T [s] + + + + + + + + + + + + + + + + + -4 + + + + + + + + + + + + + -2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + Termino restado al nivel medido [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T = T0 = 0,5 s + ambos terminos se anulan + + + + + + + T = 1,7275 s: C = 1, g = 1/e + + + + + + + at T = 5 s the energy average has grown to 10,0 dB + while the Fast term has saturated at 5,1 dB + + + Un detector Fast no puede seguir una caida larga + + + + + + + + + + + + + + + + mas de 1 dB de diferencia + + + + + + maximo Fast: 10 lg[g(C)/g(C0)] (ISO 16283-2) + + + + + + promedio energetico: 10 lg(T/T0) + + + + + + + + + + diff --git a/.github/images/floating_floor_transmissibility.svg b/.github/images/floating_floor_transmissibility.svg new file mode 100644 index 000000000..4d4e5d656 --- /dev/null +++ b/.github/images/floating_floor_transmissibility.svg @@ -0,0 +1,1132 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −15 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + −5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + Load-plate response [dB re static] + + + + + + + + + + + + + + + + + + + + + + + + + this peak is the whole measurement + (Formula 4), extrapolated to F -> 0 + + + On the rig: reading fr + + + + + + + + + + small excitation: fr = 25.0 Hz + + + + + + over-driven: peak lower and at 22 Hz + + + + + + + + + + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Improvement of impact insulation [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + amplification below + sqrt(2) f0 = 67 Hz + + + 30 lg(f/f0): 30.8 dB + against 35.6 dB at 500 Hz + + + Installed: only well above f0 + + + + + + + + + + ideal mass-spring isolation + + + + + + + + + s' = 10.5 MN/m3, f0 = 47 Hz + + + + + + + + + s' = 5.0 MN/m3, f0 = 32 Hz + + + + + + + + + + + + + diff --git a/.github/images/floating_floor_transmissibility_dark.svg b/.github/images/floating_floor_transmissibility_dark.svg new file mode 100644 index 000000000..086d1a3ee --- /dev/null +++ b/.github/images/floating_floor_transmissibility_dark.svg @@ -0,0 +1,1132 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −15 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + −5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + Load-plate response [dB re static] + + + + + + + + + + + + + + + + + + + + + + + + + this peak is the whole measurement + (Formula 4), extrapolated to F -> 0 + + + On the rig: reading fr + + + + + + + + + + small excitation: fr = 25.0 Hz + + + + + + over-driven: peak lower and at 22 Hz + + + + + + + + + + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Improvement of impact insulation [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + amplification below + sqrt(2) f0 = 67 Hz + + + 30 lg(f/f0): 30.8 dB + against 35.6 dB at 500 Hz + + + Installed: only well above f0 + + + + + + + + + + ideal mass-spring isolation + + + + + + + + + s' = 10.5 MN/m3, f0 = 47 Hz + + + + + + + + + s' = 5.0 MN/m3, f0 = 32 Hz + + + + + + + + + + + + + diff --git a/.github/images/floating_floor_transmissibility_es.svg b/.github/images/floating_floor_transmissibility_es.svg new file mode 100644 index 000000000..238266a86 --- /dev/null +++ b/.github/images/floating_floor_transmissibility_es.svg @@ -0,0 +1,1132 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -15 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + -5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + Respuesta de la placa de carga [dB re estático] + + + + + + + + + + + + + + + + + + + + + + + + + this peak is the whole measurement + (Formula 4), extrapolated to F -> 0 + + + En el banco: leer fr + + + + + + + + + + excitación pequeña: fr = 25,0 Hz + + + + + + sobreexcitado: pico más bajo y en 22 Hz + + + + + + + + + + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Mejora del aislamiento a impactos [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + amplification below + sqrt(2) f0 = 67 Hz + + + 30 lg(f/f0): 30,8 dB + against 35,6 dB at 500 Hz + + + Instalado: solo muy por encima de f0 + + + + + + + + + + aislamiento masa-resorte ideal + + + + + + + + + s' = 10,5 MN/m3, f0 = 47 Hz + + + + + + + + + s' = 5,0 MN/m3, f0 = 32 Hz + + + + + + + + + + + + + diff --git a/.github/images/floating_floor_transmissibility_es_dark.svg b/.github/images/floating_floor_transmissibility_es_dark.svg new file mode 100644 index 000000000..bd2032c84 --- /dev/null +++ b/.github/images/floating_floor_transmissibility_es_dark.svg @@ -0,0 +1,1132 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -15 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + -5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + Respuesta de la placa de carga [dB re estático] + + + + + + + + + + + + + + + + + + + + + + + + + this peak is the whole measurement + (Formula 4), extrapolated to F -> 0 + + + En el banco: leer fr + + + + + + + + + + excitación pequeña: fr = 25,0 Hz + + + + + + sobreexcitado: pico más bajo y en 22 Hz + + + + + + + + + + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Mejora del aislamiento a impactos [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + amplification below + sqrt(2) f0 = 67 Hz + + + 30 lg(f/f0): 30,8 dB + against 35,6 dB at 500 Hz + + + Instalado: solo muy por encima de f0 + + + + + + + + + + aislamiento masa-resorte ideal + + + + + + + + + s' = 10,5 MN/m3, f0 = 47 Hz + + + + + + + + + s' = 5,0 MN/m3, f0 = 32 Hz + + + + + + + + + + + + + diff --git a/.github/images/flow_resistivity_window.svg b/.github/images/flow_resistivity_window.svg new file mode 100644 index 000000000..bf06e99a5 --- /dev/null +++ b/.github/images/flow_resistivity_window.svg @@ -0,0 +1,1918 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + N + o + r + m + a + l + - + i + n + c + i + d + e + n + c + e +   + a + b + s + o + r + p + t + i + o + n +   + α + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 mm hard-backed layer + + + + + + + + + + + + + 2 +   + k + P + a +   + s + / + m +   +   + ( + t + o + o +   + t + r + a + n + s + p + a + r + e + n + t + ) + 2 + + + + + + + + + + + 8 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 2 + 0 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 3 + 3 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 1 + 0 + 0 +   + k + P + a +   + s + / + m +   +   + ( + t + o + o +   + r + e + f + l + e + c + t + i + n + g + ) + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + σ + d + ρ + c + / + ( + ) + 0 + 0 + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Absorption coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ρ + c + σ + d + ρ + c + 0 + 0 + 0 + 0 + + + 4 + + + + + The design window + + + + + + + + + + + + + + + + α + ( + 0 + ° + ) +   + a + t +   + 5 + 0 + 0 +   + H + z + + + + + + + + + + + + + + α + ( + 0 + ° + ) +   + a + t +   + 1 + 0 + 0 + 0 +   + H + z + + + + + + + + + + + α + d + i + f +   + a + t +   + 1 +   + k + H + z + + + + + + + + + + + + + + + diff --git a/.github/images/flow_resistivity_window_dark.svg b/.github/images/flow_resistivity_window_dark.svg new file mode 100644 index 000000000..e3f3c26cf --- /dev/null +++ b/.github/images/flow_resistivity_window_dark.svg @@ -0,0 +1,1918 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + N + o + r + m + a + l + - + i + n + c + i + d + e + n + c + e +   + a + b + s + o + r + p + t + i + o + n +   + α + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 mm hard-backed layer + + + + + + + + + + + + + 2 +   + k + P + a +   + s + / + m +   +   + ( + t + o + o +   + t + r + a + n + s + p + a + r + e + n + t + ) + 2 + + + + + + + + + + + 8 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 2 + 0 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 3 + 3 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 1 + 0 + 0 +   + k + P + a +   + s + / + m +   +   + ( + t + o + o +   + r + e + f + l + e + c + t + i + n + g + ) + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + σ + d + ρ + c + / + ( + ) + 0 + 0 + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Absorption coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ρ + c + σ + d + ρ + c + 0 + 0 + 0 + 0 + + + 4 + + + + + The design window + + + + + + + + + + + + + + + + α + ( + 0 + ° + ) +   + a + t +   + 5 + 0 + 0 +   + H + z + + + + + + + + + + + + + + α + ( + 0 + ° + ) +   + a + t +   + 1 + 0 + 0 + 0 +   + H + z + + + + + + + + + + + α + d + i + f +   + a + t +   + 1 +   + k + H + z + + + + + + + + + + + + + + + diff --git a/.github/images/flow_resistivity_window_es.svg b/.github/images/flow_resistivity_window_es.svg new file mode 100644 index 000000000..9853b8f25 --- /dev/null +++ b/.github/images/flow_resistivity_window_es.svg @@ -0,0 +1,1918 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + N + o + r + m + a + l + - + i + n + c + i + d + e + n + c + e +   + a + b + s + o + r + p + t + i + o + n +   + α + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 mm hard-backed layer + + + + + + + + + + + + + 2 +   + k + P + a +   + s + / + m +   +   + ( + t + o + o +   + t + r + a + n + s + p + a + r + e + n + t + ) + 2 + + + + + + + + + + + 8 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 2 + 0 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 3 + 3 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 1 + 0 + 0 +   + k + P + a +   + s + / + m +   +   + ( + t + o + o +   + r + e + f + l + e + c + t + i + n + g + ) + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + σ + d + ρ + c + / + ( + ) + 0 + 0 + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Coeficiente de absorcion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ρ + c + σ + d + ρ + c + 0 + 0 + 0 + 0 + + + 4 + + + + + The design window + + + + + + + + + + + + + + + + α + ( + 0 + ° + ) +   + a + t +   + 5 + 0 + 0 +   + H + z + + + + + + + + + + + + + + α + ( + 0 + ° + ) +   + a + t +   + 1 + 0 + 0 + 0 +   + H + z + + + + + + + + + + + α + d + i + f +   + a + t +   + 1 +   + k + H + z + + + + + + + + + + + + + + + diff --git a/.github/images/flow_resistivity_window_es_dark.svg b/.github/images/flow_resistivity_window_es_dark.svg new file mode 100644 index 000000000..275b3b4e6 --- /dev/null +++ b/.github/images/flow_resistivity_window_es_dark.svg @@ -0,0 +1,1918 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + N + o + r + m + a + l + - + i + n + c + i + d + e + n + c + e +   + a + b + s + o + r + p + t + i + o + n +   + α + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 mm hard-backed layer + + + + + + + + + + + + + 2 +   + k + P + a +   + s + / + m +   +   + ( + t + o + o +   + t + r + a + n + s + p + a + r + e + n + t + ) + 2 + + + + + + + + + + + 8 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 2 + 0 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 3 + 3 +   + k + P + a +   + s + / + m +   +   + ( + w + i + n + d + o + w + ) + 2 + + + + + + + + + + + 1 + 0 + 0 +   + k + P + a +   + s + / + m +   +   + ( + t + o + o +   + r + e + f + l + e + c + t + i + n + g + ) + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + σ + d + ρ + c + / + ( + ) + 0 + 0 + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Coeficiente de absorcion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ρ + c + σ + d + ρ + c + 0 + 0 + 0 + 0 + + + 4 + + + + + The design window + + + + + + + + + + + + + + + + α + ( + 0 + ° + ) +   + a + t +   + 5 + 0 + 0 +   + H + z + + + + + + + + + + + + + + α + ( + 0 + ° + ) +   + a + t +   + 1 + 0 + 0 + 0 +   + H + z + + + + + + + + + + + α + d + i + f +   + a + t +   + 1 +   + k + H + z + + + + + + + + + + + + + + + diff --git a/.github/images/graded_slit_absorber.svg b/.github/images/graded_slit_absorber.svg new file mode 100644 index 000000000..17421feec --- /dev/null +++ b/.github/images/graded_slit_absorber.svg @@ -0,0 +1,1133 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 300 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 600 + + + + + + + + + + + + + 700 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Absorption coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 38 Hz above 0.8 + + + 51 Hz above 0.8 + + + 22 Hz above 0.8 + + + + + + α +   + = +   + 0 + . + 8 + + + + + What a Chain of Resonators Buys, and What It Costs + + + + + + + + + + one cell, L = 30 mm + + + + + + four graded, L = 120 mm + + + + + + four identical, L = 120 mm + + + + + + + + + + diff --git a/.github/images/graded_slit_absorber_dark.svg b/.github/images/graded_slit_absorber_dark.svg new file mode 100644 index 000000000..ac937520d --- /dev/null +++ b/.github/images/graded_slit_absorber_dark.svg @@ -0,0 +1,1133 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 300 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 600 + + + + + + + + + + + + + 700 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Absorption coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 38 Hz above 0.8 + + + 51 Hz above 0.8 + + + 22 Hz above 0.8 + + + + + + α +   + = +   + 0 + . + 8 + + + + + What a Chain of Resonators Buys, and What It Costs + + + + + + + + + + one cell, L = 30 mm + + + + + + four graded, L = 120 mm + + + + + + four identical, L = 120 mm + + + + + + + + + + diff --git a/.github/images/graded_slit_absorber_es.svg b/.github/images/graded_slit_absorber_es.svg new file mode 100644 index 000000000..5e62d2239 --- /dev/null +++ b/.github/images/graded_slit_absorber_es.svg @@ -0,0 +1,1133 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 300 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 600 + + + + + + + + + + + + + 700 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Coeficiente de absorcion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 38 Hz above 0,8 + + + 51 Hz above 0,8 + + + 22 Hz above 0,8 + + + + + + α +   + = +   + 0 + . + 8 + + + + + What a Chain of Resonators Buys, and What It Costs + + + + + + + + + + one cell, L = 30 mm + + + + + + four graded, L = 120 mm + + + + + + four identical, L = 120 mm + + + + + + + + + + diff --git a/.github/images/graded_slit_absorber_es_dark.svg b/.github/images/graded_slit_absorber_es_dark.svg new file mode 100644 index 000000000..4dbda784d --- /dev/null +++ b/.github/images/graded_slit_absorber_es_dark.svg @@ -0,0 +1,1133 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 300 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 600 + + + + + + + + + + + + + 700 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Coeficiente de absorcion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 38 Hz above 0,8 + + + 51 Hz above 0,8 + + + 22 Hz above 0,8 + + + + + + α +   + = +   + 0 + . + 8 + + + + + What a Chain of Resonators Buys, and What It Costs + + + + + + + + + + one cell, L = 30 mm + + + + + + four graded, L = 120 mm + + + + + + four identical, L = 120 mm + + + + + + + + + + diff --git a/.github/images/image_source_anisotropy.svg b/.github/images/image_source_anisotropy.svg new file mode 100644 index 000000000..2f9acb771 --- /dev/null +++ b/.github/images/image_source_anisotropy.svg @@ -0,0 +1,513 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + R + o + o + m +   + e + l + o + n + g + a + t + i + o + n +   +   + : + = + L + L + L + x + y + z + + + + + + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.50 + + + + + + + + + + + + + 0.75 + + + + + + + + + + + + + 1.00 + + + + + + + + + + + + + 1.25 + + + + + + + + + + + + + 1.50 + + + + + + + + + + + + + 1.75 + + + + Reverberation time [s] + + + + + + + + + + + + + + + + x1.05 + + + x1.30 + + + x2.50 + + + + + + V = 105 m^3 and mean alpha = 0.12 held fixed + cube (1:1) through a 6:1 corridor + mean of 4 source-receiver pairs, max_order = 60 + + + Where the specular decay leaves the diffuse-field estimate + + + + + + + + + + + + + + + + + + + + + + + + + + + + ± +   + 1 + 0 +   + % +   + a + r + o + u + n + d +   + E + y + r + i + n + g + + + + + + + + + + + Eyring (diffuse field) + + + + + + + + + + + + specular (image source) + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/image_source_anisotropy_dark.svg b/.github/images/image_source_anisotropy_dark.svg new file mode 100644 index 000000000..0c75dd017 --- /dev/null +++ b/.github/images/image_source_anisotropy_dark.svg @@ -0,0 +1,513 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + R + o + o + m +   + e + l + o + n + g + a + t + i + o + n +   +   + : + = + L + L + L + x + y + z + + + + + + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.50 + + + + + + + + + + + + + 0.75 + + + + + + + + + + + + + 1.00 + + + + + + + + + + + + + 1.25 + + + + + + + + + + + + + 1.50 + + + + + + + + + + + + + 1.75 + + + + Reverberation time [s] + + + + + + + + + + + + + + + + x1.05 + + + x1.30 + + + x2.50 + + + + + + V = 105 m^3 and mean alpha = 0.12 held fixed + cube (1:1) through a 6:1 corridor + mean of 4 source-receiver pairs, max_order = 60 + + + Where the specular decay leaves the diffuse-field estimate + + + + + + + + + + + + + + + + + + + + + + + + + + + + ± +   + 1 + 0 +   + % +   + a + r + o + u + n + d +   + E + y + r + i + n + g + + + + + + + + + + + Eyring (diffuse field) + + + + + + + + + + + + specular (image source) + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/image_source_anisotropy_es.svg b/.github/images/image_source_anisotropy_es.svg new file mode 100644 index 000000000..e7d0f918b --- /dev/null +++ b/.github/images/image_source_anisotropy_es.svg @@ -0,0 +1,513 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + R + o + o + m +   + e + l + o + n + g + a + t + i + o + n +   +   + : + = + L + L + L + x + y + z + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,75 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,25 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 1,75 + + + + Reverberation time [s] + + + + + + + + + + + + + + + + x1.05 + + + x1.30 + + + x2.50 + + + + + + V = 105 m^3 and mean alpha = 0,12 held fixed + cube (1:1) through a 6:1 corridor + mean of 4 source-receiver pairs, max_order = 60 + + + Where the specular decay leaves the diffuse-field estimate + + + + + + + + + + + + + + + + + + + + + + + + + + + + ± +   + 1 + 0 +   + % +   + a + r + o + u + n + d +   + E + y + r + i + n + g + + + + + + + + + + + Eyring (diffuse field) + + + + + + + + + + + + specular (image source) + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/image_source_anisotropy_es_dark.svg b/.github/images/image_source_anisotropy_es_dark.svg new file mode 100644 index 000000000..b21ccdab7 --- /dev/null +++ b/.github/images/image_source_anisotropy_es_dark.svg @@ -0,0 +1,513 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + R + o + o + m +   + e + l + o + n + g + a + t + i + o + n +   +   + : + = + L + L + L + x + y + z + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,75 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,25 + + + + + + + + + + + + + 1,5 + + + + + + + + + + + + + 1,75 + + + + Reverberation time [s] + + + + + + + + + + + + + + + + x1.05 + + + x1.30 + + + x2.50 + + + + + + V = 105 m^3 and mean alpha = 0,12 held fixed + cube (1:1) through a 6:1 corridor + mean of 4 source-receiver pairs, max_order = 60 + + + Where the specular decay leaves the diffuse-field estimate + + + + + + + + + + + + + + + + + + + + + + + + + + + + ± +   + 1 + 0 +   + % +   + a + r + o + u + n + d +   + E + y + r + i + n + g + + + + + + + + + + + Eyring (diffuse field) + + + + + + + + + + + + specular (image source) + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/image_source_bands.svg b/.github/images/image_source_bands.svg new file mode 100644 index 000000000..b4d5aa46d --- /dev/null +++ b/.github/images/image_source_bands.svg @@ -0,0 +1,10911 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.2 + + + + + + + + + + + + + 1.4 + + + + + + + + + + + + + 1.6 + + + + Time [s] + + + + + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −50 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −30 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + 0 + + + + Level re steady state [dB] + + + + + + + + + + + + + + + + + + + room 7 x 5 x 3 m, max_order = 60 + wall alpha 0.10 -> 0.50 with frequency + air at 20 C / 50 % RH: -0.4 % of T30 at 250 Hz, + -4.4 % at 4 kHz + + + Per-band decay: solid without air, dashed with air + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 Hz + + + + + + 500 Hz + + + + + + 1000 Hz + + + + + + 2000 Hz + + + + + + 4000 Hz + + + + + + + + + + diff --git a/.github/images/image_source_bands_dark.svg b/.github/images/image_source_bands_dark.svg new file mode 100644 index 000000000..1d0637cf2 --- /dev/null +++ b/.github/images/image_source_bands_dark.svg @@ -0,0 +1,10911 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.2 + + + + + + + + + + + + + 1.4 + + + + + + + + + + + + + 1.6 + + + + Time [s] + + + + + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −50 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −30 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + 0 + + + + Level re steady state [dB] + + + + + + + + + + + + + + + + + + + room 7 x 5 x 3 m, max_order = 60 + wall alpha 0.10 -> 0.50 with frequency + air at 20 C / 50 % RH: -0.4 % of T30 at 250 Hz, + -4.4 % at 4 kHz + + + Per-band decay: solid without air, dashed with air + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 Hz + + + + + + 500 Hz + + + + + + 1000 Hz + + + + + + 2000 Hz + + + + + + 4000 Hz + + + + + + + + + + diff --git a/.github/images/image_source_bands_es.svg b/.github/images/image_source_bands_es.svg new file mode 100644 index 000000000..5c7e082ef --- /dev/null +++ b/.github/images/image_source_bands_es.svg @@ -0,0 +1,10911 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,2 + + + + + + + + + + + + + 1,4 + + + + + + + + + + + + + 1,6 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -50 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -30 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + 0 + + + + Nivel re estado estacionario [dB] + + + + + + + + + + + + + + + + + + + room 7 x 5 x 3 m, max_order = 60 + wall alpha 0,10 -> 0,50 with frequency + air at 20 C / 50 % RH: -0,4 % of T30 at 250 Hz, + -4,4 % at 4 kHz + + + Per-band decay: solid without air, dashed with air + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 Hz + + + + + + 500 Hz + + + + + + 1000 Hz + + + + + + 2000 Hz + + + + + + 4000 Hz + + + + + + + + + + diff --git a/.github/images/image_source_bands_es_dark.svg b/.github/images/image_source_bands_es_dark.svg new file mode 100644 index 000000000..f0b69467b --- /dev/null +++ b/.github/images/image_source_bands_es_dark.svg @@ -0,0 +1,10911 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,2 + + + + + + + + + + + + + 1,4 + + + + + + + + + + + + + 1,6 + + + + Tiempo [s] + + + + + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -50 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -30 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + 0 + + + + Nivel re estado estacionario [dB] + + + + + + + + + + + + + + + + + + + room 7 x 5 x 3 m, max_order = 60 + wall alpha 0,10 -> 0,50 with frequency + air at 20 C / 50 % RH: -0,4 % of T30 at 250 Hz, + -4,4 % at 4 kHz + + + Per-band decay: solid without air, dashed with air + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 Hz + + + + + + 500 Hz + + + + + + 1000 Hz + + + + + + 2000 Hz + + + + + + 4000 Hz + + + + + + + + + + diff --git a/.github/images/image_source_order_convergence.svg b/.github/images/image_source_order_convergence.svg new file mode 100644 index 000000000..e59c2e666 --- /dev/null +++ b/.github/images/image_source_order_convergence.svg @@ -0,0 +1,722 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Reflection-order cut-off max_order + + + + + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + F + i + t + t + e + d +   +   + [ + s + ] + T + 3 + 0 + + + + + + + + + + + + + + + + + + + + + + crosses Eyring at order 51 + and keeps rising + + + + + + room 7 x 5 x 3 m, alpha = 0.12 + V = 105 m^3, S = 142 m^2, fs = 48 kHz + shaded: +/- 10 % around Eyring + + + The image lattice is a time horizon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Eyring, 0.93 s + + + + + + + + + T30 from the synthetic RIR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + 1 + 0 + 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Audible images + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/image_source_order_convergence_dark.svg b/.github/images/image_source_order_convergence_dark.svg new file mode 100644 index 000000000..ee4588fc5 --- /dev/null +++ b/.github/images/image_source_order_convergence_dark.svg @@ -0,0 +1,722 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Reflection-order cut-off max_order + + + + + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + F + i + t + t + e + d +   +   + [ + s + ] + T + 3 + 0 + + + + + + + + + + + + + + + + + + + + + + crosses Eyring at order 51 + and keeps rising + + + + + + room 7 x 5 x 3 m, alpha = 0.12 + V = 105 m^3, S = 142 m^2, fs = 48 kHz + shaded: +/- 10 % around Eyring + + + The image lattice is a time horizon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Eyring, 0.93 s + + + + + + + + + T30 from the synthetic RIR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + 1 + 0 + 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Audible images + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/image_source_order_convergence_es.svg b/.github/images/image_source_order_convergence_es.svg new file mode 100644 index 000000000..fb60cc373 --- /dev/null +++ b/.github/images/image_source_order_convergence_es.svg @@ -0,0 +1,722 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Reflection-order cut-off max_order + + + + + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + F + i + t + t + e + d +   +   + [ + s + ] + T + 3 + 0 + + + + + + + + + + + + + + + + + + + + + + crosses Eyring at order 51 + and keeps rising + + + + + + room 7 x 5 x 3 m, alpha = 0,12 + V = 105 m^3, S = 142 m^2, fs = 48 kHz + shaded: +/- 10 % around Eyring + + + The image lattice is a time horizon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Eyring, 0,93 s + + + + + + + + + T30 from the synthetic RIR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + 1 + 0 + 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Audible images + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/image_source_order_convergence_es_dark.svg b/.github/images/image_source_order_convergence_es_dark.svg new file mode 100644 index 000000000..c57feaa87 --- /dev/null +++ b/.github/images/image_source_order_convergence_es_dark.svg @@ -0,0 +1,722 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + Reflection-order cut-off max_order + + + + + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + F + i + t + t + e + d +   +   + [ + s + ] + T + 3 + 0 + + + + + + + + + + + + + + + + + + + + + + crosses Eyring at order 51 + and keeps rising + + + + + + room 7 x 5 x 3 m, alpha = 0,12 + V = 105 m^3, S = 142 m^2, fs = 48 kHz + shaded: +/- 10 % around Eyring + + + The image lattice is a time horizon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Eyring, 0,93 s + + + + + + + + + T30 from the synthetic RIR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + 1 + 0 + 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Audible images + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/insitu_method_windows.svg b/.github/images/insitu_method_windows.svg new file mode 100644 index 000000000..719409945 --- /dev/null +++ b/.github/images/insitu_method_windows.svg @@ -0,0 +1,578 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 315-1600 Hz: the interval in which + Part 2 expects the two to agree + + + Two in-situ methods, two reported bands + + + ISO 13472-1, subtraction + + + ISO 13472-2, spot tube + + + + + + + + + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 120 + + + + + + + + + + + + + 140 + + + + Tube diameter d [mm] + + + + + + + + + + + + + + + + + 1500 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3000 + + + + + + + + + + + + + 3500 + + + + Plane-wave ceiling [Hz] + + + + + + + + + + + + + + + + + + + + + + the 100 mm bore of the worked + example: 1989 Hz + + + 1800 Hz, the top edge of the 1600 Hz band: + a bore above 111 mm no longer covers it + + + The bore that seals is the bore that caps the band + + + + + + + + + + + + + f_u = 0.58 c0 / d (Clause 5.4) + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/insitu_method_windows_dark.svg b/.github/images/insitu_method_windows_dark.svg new file mode 100644 index 000000000..6ac0aed71 --- /dev/null +++ b/.github/images/insitu_method_windows_dark.svg @@ -0,0 +1,578 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 315-1600 Hz: the interval in which + Part 2 expects the two to agree + + + Two in-situ methods, two reported bands + + + ISO 13472-1, subtraction + + + ISO 13472-2, spot tube + + + + + + + + + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 120 + + + + + + + + + + + + + 140 + + + + Tube diameter d [mm] + + + + + + + + + + + + + + + + + 1500 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3000 + + + + + + + + + + + + + 3500 + + + + Plane-wave ceiling [Hz] + + + + + + + + + + + + + + + + + + + + + + the 100 mm bore of the worked + example: 1989 Hz + + + 1800 Hz, the top edge of the 1600 Hz band: + a bore above 111 mm no longer covers it + + + The bore that seals is the bore that caps the band + + + + + + + + + + + + + f_u = 0.58 c0 / d (Clause 5.4) + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/insitu_method_windows_es.svg b/.github/images/insitu_method_windows_es.svg new file mode 100644 index 000000000..b311d193b --- /dev/null +++ b/.github/images/insitu_method_windows_es.svg @@ -0,0 +1,578 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 315-1600 Hz: the interval in which + Part 2 expects the two to agree + + + Dos métodos in situ, dos bandas declaradas + + + ISO 13472-1, sustracción + + + ISO 13472-2, tubo puntual + + + + + + + + + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 120 + + + + + + + + + + + + + 140 + + + + Diámetro del tubo d [mm] + + + + + + + + + + + + + + + + + 1500 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3000 + + + + + + + + + + + + + 3500 + + + + Techo de onda plana [Hz] + + + + + + + + + + + + + + + + + + + + + + the 100 mm bore of the worked + example: 1989 Hz + + + 1800 Hz, the top edge of the 1600 Hz band: + a bore above 111 mm no longer covers it + + + El diámetro que sella es el que limita la banda + + + + + + + + + + + + + f_u = 0,58 c0 / d (capítulo 5,4) + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/insitu_method_windows_es_dark.svg b/.github/images/insitu_method_windows_es_dark.svg new file mode 100644 index 000000000..08011950e --- /dev/null +++ b/.github/images/insitu_method_windows_es_dark.svg @@ -0,0 +1,578 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 315-1600 Hz: the interval in which + Part 2 expects the two to agree + + + Dos métodos in situ, dos bandas declaradas + + + ISO 13472-1, sustracción + + + ISO 13472-2, tubo puntual + + + + + + + + + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 120 + + + + + + + + + + + + + 140 + + + + Diámetro del tubo d [mm] + + + + + + + + + + + + + + + + + 1500 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3000 + + + + + + + + + + + + + 3500 + + + + Techo de onda plana [Hz] + + + + + + + + + + + + + + + + + + + + + + the 100 mm bore of the worked + example: 1989 Hz + + + 1800 Hz, the top edge of the 1600 Hz band: + a bore above 111 mm no longer covers it + + + El diámetro que sella es el que limita la banda + + + + + + + + + + + + + f_u = 0,58 c0 / d (capítulo 5,4) + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/insulation_adaptation_terms.svg b/.github/images/insulation_adaptation_terms.svg new file mode 100644 index 000000000..7a89bc7a6 --- /dev/null +++ b/.github/images/insulation_adaptation_terms.svg @@ -0,0 +1,903 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Sound reduction index R [dB] + + + + + + + + + + + + + + + + + + + + + + + mass-air-mass resonance at 82 Hz, below the + rated range: the double leaf enters it still climbing + + + Same weighted rating, different spectrum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + shifted reference (both, Rw = 49 dB) + + + + + + + + + 150 mm dense concrete + + + + + + + + + double leaf, 12 kg/m2 + 90 mm + + + + + + + + + + + + + + + + + + + Rw + + + + + + + + + + + + + Rw + C + + + + + + + + + + + + + Rw + Ctr + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + Single number [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 49 + + + 49 + + + 47 + + + 44 + + + 42 + + + 36 + + + + + + + 6 dB apart + against traffic + + + Rw alone is not a specification + + + + + + + + + + concrete + + + + + + double leaf + + + + + + + + + + + + + diff --git a/.github/images/insulation_adaptation_terms_dark.svg b/.github/images/insulation_adaptation_terms_dark.svg new file mode 100644 index 000000000..d36c2c26a --- /dev/null +++ b/.github/images/insulation_adaptation_terms_dark.svg @@ -0,0 +1,903 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Sound reduction index R [dB] + + + + + + + + + + + + + + + + + + + + + + + mass-air-mass resonance at 82 Hz, below the + rated range: the double leaf enters it still climbing + + + Same weighted rating, different spectrum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + shifted reference (both, Rw = 49 dB) + + + + + + + + + 150 mm dense concrete + + + + + + + + + double leaf, 12 kg/m2 + 90 mm + + + + + + + + + + + + + + + + + + + Rw + + + + + + + + + + + + + Rw + C + + + + + + + + + + + + + Rw + Ctr + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + Single number [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 49 + + + 49 + + + 47 + + + 44 + + + 42 + + + 36 + + + + + + + 6 dB apart + against traffic + + + Rw alone is not a specification + + + + + + + + + + concrete + + + + + + double leaf + + + + + + + + + + + + + diff --git a/.github/images/insulation_adaptation_terms_es.svg b/.github/images/insulation_adaptation_terms_es.svg new file mode 100644 index 000000000..43d669c33 --- /dev/null +++ b/.github/images/insulation_adaptation_terms_es.svg @@ -0,0 +1,903 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Índice de reducción acústica R [dB] + + + + + + + + + + + + + + + + + + + + + + + resonancia masa-aire-masa en 82 Hz, por debajo del + rango valorado: la doble hoja entra aun subiendo + + + El mismo indice ponderado, distinto espectro + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + curva de referencia desplazada (ambas, Rw = 49 dB) + + + + + + + + + hormigon denso de 150 mm + + + + + + + + + doble hoja, 12 kg/m2 + 90 mm + + + + + + + + + + + + + + + + + + + Rw + + + + + + + + + + + + + Rw + C + + + + + + + + + + + + + Rw + Ctr + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + Numero global [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 49 + + + 49 + + + 47 + + + 44 + + + 42 + + + 36 + + + + + + + 6 dB de diferencia + frente al trafico + + + Rw por si solo no es una especificacion + + + + + + + + + + hormigon + + + + + + doble hoja + + + + + + + + + + + + + diff --git a/.github/images/insulation_adaptation_terms_es_dark.svg b/.github/images/insulation_adaptation_terms_es_dark.svg new file mode 100644 index 000000000..c7fca9b02 --- /dev/null +++ b/.github/images/insulation_adaptation_terms_es_dark.svg @@ -0,0 +1,903 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Índice de reducción acústica R [dB] + + + + + + + + + + + + + + + + + + + + + + + resonancia masa-aire-masa en 82 Hz, por debajo del + rango valorado: la doble hoja entra aun subiendo + + + El mismo indice ponderado, distinto espectro + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + curva de referencia desplazada (ambas, Rw = 49 dB) + + + + + + + + + hormigon denso de 150 mm + + + + + + + + + doble hoja, 12 kg/m2 + 90 mm + + + + + + + + + + + + + + + + + + + Rw + + + + + + + + + + + + + Rw + C + + + + + + + + + + + + + Rw + Ctr + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + Numero global [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 49 + + + 49 + + + 47 + + + 44 + + + 42 + + + 36 + + + + + + + 6 dB de diferencia + frente al trafico + + + Rw por si solo no es una especificacion + + + + + + + + + + hormigon + + + + + + doble hoja + + + + + + + + + + + + + diff --git a/.github/images/intensity_field_indicator.svg b/.github/images/intensity_field_indicator.svg new file mode 100644 index 000000000..d63de6cd0 --- /dev/null +++ b/.github/images/intensity_field_indicator.svg @@ -0,0 +1,599 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + Surface pressure-intensity indicator FpI [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + remedy in order: +5 to 10 cm of measurement distance first, + then absorption in the receiving room + + + Qualifying the measurement surface (ISO 15186-1, 6.4.2) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + surface not qualified + + + + + + + + + FpI = Lp - LIn (Formula (10)) + + + + + + 10 dB: reflecting specimen (6.4.2) + + + + + + 6 dB: absorbing specimen + + + + + + + + + + diff --git a/.github/images/intensity_field_indicator_dark.svg b/.github/images/intensity_field_indicator_dark.svg new file mode 100644 index 000000000..1ceac81b7 --- /dev/null +++ b/.github/images/intensity_field_indicator_dark.svg @@ -0,0 +1,599 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + Surface pressure-intensity indicator FpI [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + remedy in order: +5 to 10 cm of measurement distance first, + then absorption in the receiving room + + + Qualifying the measurement surface (ISO 15186-1, 6.4.2) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + surface not qualified + + + + + + + + + FpI = Lp - LIn (Formula (10)) + + + + + + 10 dB: reflecting specimen (6.4.2) + + + + + + 6 dB: absorbing specimen + + + + + + + + + + diff --git a/.github/images/intensity_field_indicator_es.svg b/.github/images/intensity_field_indicator_es.svg new file mode 100644 index 000000000..4015cad0d --- /dev/null +++ b/.github/images/intensity_field_indicator_es.svg @@ -0,0 +1,599 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + Indicador superficial presion-intensidad FpI [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + remedio en orden: primero +5 a 10 cm de distancia de medicion, + despues absorcion en el recinto receptor + + + Calificacion de la superficie de medicion (ISO 15186-1, 6.4.2) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + superficie no calificada + + + + + + + + + FpI = Lp - LIn (Formula (10)) + + + + + + 10 dB: probeta reflectante (6.4.2) + + + + + + 6 dB: probeta absorbente + + + + + + + + + + diff --git a/.github/images/intensity_field_indicator_es_dark.svg b/.github/images/intensity_field_indicator_es_dark.svg new file mode 100644 index 000000000..0b613885a --- /dev/null +++ b/.github/images/intensity_field_indicator_es_dark.svg @@ -0,0 +1,599 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + Indicador superficial presion-intensidad FpI [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + remedio en orden: primero +5 a 10 cm de distancia de medicion, + despues absorcion en el recinto receptor + + + Calificacion de la superficie de medicion (ISO 15186-1, 6.4.2) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + superficie no calificada + + + + + + + + + FpI = Lp - LIn (Formula (10)) + + + + + + 10 dB: probeta reflectante (6.4.2) + + + + + + 6 dB: probeta absorbente + + + + + + + + + + diff --git a/.github/images/lab_versus_field_insulation.svg b/.github/images/lab_versus_field_insulation.svg new file mode 100644 index 000000000..410039f7e --- /dev/null +++ b/.github/images/lab_versus_field_insulation.svg @@ -0,0 +1,670 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Sound reduction index [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 dB: normal + + + + + + + + 7 dB: find the path + + + The same wall, in the laboratory and in two buildings + (EN 12354-1 flanking over twelve paths) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + laboratory R (Rw = 49 dB) + + + + + + + + + field R', good junctions (R'w = 47 dB) + + + + + + + + + field R', flanking dominant (R'w = 42 dB) + + + + + + + + + + diff --git a/.github/images/lab_versus_field_insulation_dark.svg b/.github/images/lab_versus_field_insulation_dark.svg new file mode 100644 index 000000000..4294487d9 --- /dev/null +++ b/.github/images/lab_versus_field_insulation_dark.svg @@ -0,0 +1,670 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Sound reduction index [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 dB: normal + + + + + + + + 7 dB: find the path + + + The same wall, in the laboratory and in two buildings + (EN 12354-1 flanking over twelve paths) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + laboratory R (Rw = 49 dB) + + + + + + + + + field R', good junctions (R'w = 47 dB) + + + + + + + + + field R', flanking dominant (R'w = 42 dB) + + + + + + + + + + diff --git a/.github/images/lab_versus_field_insulation_es.svg b/.github/images/lab_versus_field_insulation_es.svg new file mode 100644 index 000000000..7431bfc78 --- /dev/null +++ b/.github/images/lab_versus_field_insulation_es.svg @@ -0,0 +1,670 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Índice de reducción acústica [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 dB: normal + + + + + + + + 7 dB: busque el camino + + + La misma pared, en laboratorio y en dos edificios + (transmision por flancos EN 12354-1 sobre doce caminos) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R de laboratorio (Rw = 49 dB) + + + + + + + + + R' in situ, uniones buenas (R'w = 47 dB) + + + + + + + + + R' in situ, flancos dominantes (R'w = 42 dB) + + + + + + + + + + diff --git a/.github/images/lab_versus_field_insulation_es_dark.svg b/.github/images/lab_versus_field_insulation_es_dark.svg new file mode 100644 index 000000000..2df037483 --- /dev/null +++ b/.github/images/lab_versus_field_insulation_es_dark.svg @@ -0,0 +1,670 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 1250 + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 3150 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + Índice de reducción acústica [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 dB: normal + + + + + + + + 7 dB: busque el camino + + + La misma pared, en laboratorio y en dos edificios + (transmision por flancos EN 12354-1 sobre doce caminos) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R de laboratorio (Rw = 49 dB) + + + + + + + + + R' in situ, uniones buenas (R'w = 47 dB) + + + + + + + + + R' in situ, flancos dominantes (R'w = 42 dB) + + + + + + + + + + diff --git a/.github/images/metadiffuser_absorption.svg b/.github/images/metadiffuser_absorption.svg new file mode 100644 index 000000000..a966bd724 --- /dev/null +++ b/.github/images/metadiffuser_absorption.svg @@ -0,0 +1,660 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1800 + + + + + + + + + + + + + 1900 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2100 + + + + + + + + + + + + + 2200 + + + + + + + + + + + + + 2300 + + + + + + + + + + + + + 2400 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 2600 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Absorption coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + design frequency: + face average 0.032 + + + The absorption a metadiffuser pays for its phases + + + + + + + + + + + + + slit 1 + + + + + + slit 2 + + + + + + slit 3 + + + + + + slit 4 + + + + + + slit 5 + + + + + + face average (what a room model consumes) + + + + + + + + + + diff --git a/.github/images/metadiffuser_absorption_dark.svg b/.github/images/metadiffuser_absorption_dark.svg new file mode 100644 index 000000000..dbed92100 --- /dev/null +++ b/.github/images/metadiffuser_absorption_dark.svg @@ -0,0 +1,660 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1800 + + + + + + + + + + + + + 1900 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2100 + + + + + + + + + + + + + 2200 + + + + + + + + + + + + + 2300 + + + + + + + + + + + + + 2400 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 2600 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Absorption coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + design frequency: + face average 0.032 + + + The absorption a metadiffuser pays for its phases + + + + + + + + + + + + + slit 1 + + + + + + slit 2 + + + + + + slit 3 + + + + + + slit 4 + + + + + + slit 5 + + + + + + face average (what a room model consumes) + + + + + + + + + + diff --git a/.github/images/metadiffuser_absorption_es.svg b/.github/images/metadiffuser_absorption_es.svg new file mode 100644 index 000000000..ce7286d9a --- /dev/null +++ b/.github/images/metadiffuser_absorption_es.svg @@ -0,0 +1,660 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1800 + + + + + + + + + + + + + 1900 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2100 + + + + + + + + + + + + + 2200 + + + + + + + + + + + + + 2300 + + + + + + + + + + + + + 2400 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 2600 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Coeficiente de absorcion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + design frequency: + face average 0,032 + + + La absorción que un metadifusor paga por sus fases + + + + + + + + + + + + + slit 1 + + + + + + slit 2 + + + + + + slit 3 + + + + + + slit 4 + + + + + + slit 5 + + + + + + media en la cara (lo que consume un modelo de sala) + + + + + + + + + + diff --git a/.github/images/metadiffuser_absorption_es_dark.svg b/.github/images/metadiffuser_absorption_es_dark.svg new file mode 100644 index 000000000..104c39e69 --- /dev/null +++ b/.github/images/metadiffuser_absorption_es_dark.svg @@ -0,0 +1,660 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1800 + + + + + + + + + + + + + 1900 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2100 + + + + + + + + + + + + + 2200 + + + + + + + + + + + + + 2300 + + + + + + + + + + + + + 2400 + + + + + + + + + + + + + 2500 + + + + + + + + + + + + + 2600 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Coeficiente de absorcion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + design frequency: + face average 0,032 + + + La absorción que un metadifusor paga por sus fases + + + + + + + + + + + + + slit 1 + + + + + + slit 2 + + + + + + slit 3 + + + + + + slit 4 + + + + + + slit 5 + + + + + + media en la cara (lo que consume un modelo de sala) + + + + + + + + + + diff --git a/.github/images/metadiffuser_phase_match.svg b/.github/images/metadiffuser_phase_match.svg new file mode 100644 index 000000000..c61dd7aa6 --- /dev/null +++ b/.github/images/metadiffuser_phase_match.svg @@ -0,0 +1,924 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + Slit index n + + + + + + + + + + + + + + + + + −100 + + + + + + + + + + + + + −50 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 100 + + + + Reflection phase [deg] + + + + + + + + + + + + + + + + + + + + + + + + + + + + |R| = 0.97 + + + |R| = 1.00 + + + |R| = 1.00 + + + |R| = 0.97 + + + |R| = 0.98 + + + At the 2 kHz design frequency + + + + + + + + + + + + + + + + + + + + + + + + QRD target, wells to 27.4 cm + + + + + + + + Metadiffuser, panel 2 cm + + + + + + + + + + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 1800 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2200 + + + + + + + + + + + + + 2400 + + + + + + + + + + + + + 2600 + + + + Frequency [Hz] + + + + + + + + + + + + + + −100 + + + + + + + + + + + + + −75 + + + + + + + + + + + + + −50 + + + + + + + + + + + + + −25 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 100 + + + + Phase error against the QRD target [deg] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + within 10 deg of the target + + + Across the band: exact only where it was tuned + + + + + + + + + + slit 1 + + + + + + slit 2 + + + + + + slit 3 + + + + + + slit 4 + + + + + + slit 5 + + + + + + + + + + + + + diff --git a/.github/images/metadiffuser_phase_match_dark.svg b/.github/images/metadiffuser_phase_match_dark.svg new file mode 100644 index 000000000..84d821079 --- /dev/null +++ b/.github/images/metadiffuser_phase_match_dark.svg @@ -0,0 +1,924 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + Slit index n + + + + + + + + + + + + + + + + + −100 + + + + + + + + + + + + + −50 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 100 + + + + Reflection phase [deg] + + + + + + + + + + + + + + + + + + + + + + + + + + + + |R| = 0.97 + + + |R| = 1.00 + + + |R| = 1.00 + + + |R| = 0.97 + + + |R| = 0.98 + + + At the 2 kHz design frequency + + + + + + + + + + + + + + + + + + + + + + + + QRD target, wells to 27.4 cm + + + + + + + + Metadiffuser, panel 2 cm + + + + + + + + + + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 1800 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2200 + + + + + + + + + + + + + 2400 + + + + + + + + + + + + + 2600 + + + + Frequency [Hz] + + + + + + + + + + + + + + −100 + + + + + + + + + + + + + −75 + + + + + + + + + + + + + −50 + + + + + + + + + + + + + −25 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 100 + + + + Phase error against the QRD target [deg] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + within 10 deg of the target + + + Across the band: exact only where it was tuned + + + + + + + + + + slit 1 + + + + + + slit 2 + + + + + + slit 3 + + + + + + slit 4 + + + + + + slit 5 + + + + + + + + + + + + + diff --git a/.github/images/metadiffuser_phase_match_es.svg b/.github/images/metadiffuser_phase_match_es.svg new file mode 100644 index 000000000..40a1099ed --- /dev/null +++ b/.github/images/metadiffuser_phase_match_es.svg @@ -0,0 +1,924 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + Índice de rendija n + + + + + + + + + + + + + + + + + -100 + + + + + + + + + + + + + -50 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 100 + + + + Fase de reflexión [grados] + + + + + + + + + + + + + + + + + + + + + + + + + + + + |R| = 0,97 + + + |R| = 1,00 + + + |R| = 1,00 + + + |R| = 0,97 + + + |R| = 0,98 + + + A la frecuencia de diseño de 2 kHz + + + + + + + + + + + + + + + + + + + + + + + + Objetivo QRD, pozos de hasta 27,4 cm + + + + + + + + Metadifusor, panel de 2 cm + + + + + + + + + + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 1800 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2200 + + + + + + + + + + + + + 2400 + + + + + + + + + + + + + 2600 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + -100 + + + + + + + + + + + + + -75 + + + + + + + + + + + + + -50 + + + + + + + + + + + + + -25 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 100 + + + + Error de fase frente al objetivo QRD [grados] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dentro de 10 grados del objetivo + + + En toda la banda: exacto solo donde se sintonizó + + + + + + + + + + slit 1 + + + + + + slit 2 + + + + + + slit 3 + + + + + + slit 4 + + + + + + slit 5 + + + + + + + + + + + + + diff --git a/.github/images/metadiffuser_phase_match_es_dark.svg b/.github/images/metadiffuser_phase_match_es_dark.svg new file mode 100644 index 000000000..448ed4df1 --- /dev/null +++ b/.github/images/metadiffuser_phase_match_es_dark.svg @@ -0,0 +1,924 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + Índice de rendija n + + + + + + + + + + + + + + + + + -100 + + + + + + + + + + + + + -50 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 100 + + + + Fase de reflexión [grados] + + + + + + + + + + + + + + + + + + + + + + + + + + + + |R| = 0,97 + + + |R| = 1,00 + + + |R| = 1,00 + + + |R| = 0,97 + + + |R| = 0,98 + + + A la frecuencia de diseño de 2 kHz + + + + + + + + + + + + + + + + + + + + + + + + Objetivo QRD, pozos de hasta 27,4 cm + + + + + + + + Metadifusor, panel de 2 cm + + + + + + + + + + + + + + + + + + + + + + 1600 + + + + + + + + + + + + + 1800 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 2200 + + + + + + + + + + + + + 2400 + + + + + + + + + + + + + 2600 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + -100 + + + + + + + + + + + + + -75 + + + + + + + + + + + + + -50 + + + + + + + + + + + + + -25 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 100 + + + + Error de fase frente al objetivo QRD [grados] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dentro de 10 grados del objetivo + + + En toda la banda: exacto solo donde se sintonizó + + + + + + + + + + slit 1 + + + + + + slit 2 + + + + + + slit 3 + + + + + + slit 4 + + + + + + slit 5 + + + + + + + + + + + + + diff --git a/.github/images/metadiffuser_spectrum.svg b/.github/images/metadiffuser_spectrum.svg new file mode 100644 index 000000000..664c6359c --- /dev/null +++ b/.github/images/metadiffuser_spectrum.svg @@ -0,0 +1,489 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.05 + + + + + + + + + + + + + 0.10 + + + + + + + + + + + + + 0.15 + + + + + + + + + + + + + 0.20 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.30 + + + + + + + + + + + + + 0.35 + + + + + + + + + + + + + 0.40 + + + + + + + + + + + + + 0.45 + + + + Normalised diffusion coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tuned here: + 0.32 against 0.32 + + + below c/L = 980 Hz no grating + lobe exists: neither panel can + beat the flat reference + + + The honest bandwidth of the trick + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + QRD, wells up to 27.4 cm + + + + + + + + + Metadiffuser, panel 2 cm + + + + + + + + + + diff --git a/.github/images/metadiffuser_spectrum_dark.svg b/.github/images/metadiffuser_spectrum_dark.svg new file mode 100644 index 000000000..a54ed5e95 --- /dev/null +++ b/.github/images/metadiffuser_spectrum_dark.svg @@ -0,0 +1,489 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.00 + + + + + + + + + + + + + 0.05 + + + + + + + + + + + + + 0.10 + + + + + + + + + + + + + 0.15 + + + + + + + + + + + + + 0.20 + + + + + + + + + + + + + 0.25 + + + + + + + + + + + + + 0.30 + + + + + + + + + + + + + 0.35 + + + + + + + + + + + + + 0.40 + + + + + + + + + + + + + 0.45 + + + + Normalised diffusion coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tuned here: + 0.32 against 0.32 + + + below c/L = 980 Hz no grating + lobe exists: neither panel can + beat the flat reference + + + The honest bandwidth of the trick + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + QRD, wells up to 27.4 cm + + + + + + + + + Metadiffuser, panel 2 cm + + + + + + + + + + diff --git a/.github/images/metadiffuser_spectrum_es.svg b/.github/images/metadiffuser_spectrum_es.svg new file mode 100644 index 000000000..0efd13929 --- /dev/null +++ b/.github/images/metadiffuser_spectrum_es.svg @@ -0,0 +1,489 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,05 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,15 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,35 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,45 + + + + Coeficiente de difusión normalizado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tuned here: + 0,32 against 0,32 + + + below c/L = 980 Hz no grating + lobe exists: neither panel can + beat the flat reference + + + El ancho de banda real del truco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + QRD, pozos de hasta 27,4 cm + + + + + + + + + Metadifusor, panel de 2 cm + + + + + + + + + + diff --git a/.github/images/metadiffuser_spectrum_es_dark.svg b/.github/images/metadiffuser_spectrum_es_dark.svg new file mode 100644 index 000000000..906720b5f --- /dev/null +++ b/.github/images/metadiffuser_spectrum_es_dark.svg @@ -0,0 +1,489 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,05 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,15 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,25 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,35 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,45 + + + + Coeficiente de difusión normalizado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tuned here: + 0,32 against 0,32 + + + below c/L = 980 Hz no grating + lobe exists: neither panel can + beat the flat reference + + + El ancho de banda real del truco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + QRD, pozos de hasta 27,4 cm + + + + + + + + + Metadifusor, panel de 2 cm + + + + + + + + + + diff --git a/.github/images/modal_count_per_band.svg b/.github/images/modal_count_per_band.svg new file mode 100644 index 000000000..2a13bc869 --- /dev/null +++ b/.github/images/modal_count_per_band.svg @@ -0,0 +1,1214 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + 1 + 0 + 5 + + + + + + + + + + + + + + + + + + 1 + 0 + 6 + + + + + + + + + + + + + + + + + + 1 + 0 + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modes inside the octave band + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13 + + + 77 + + + 514 + + + 3,735 + + + 28,412 + + + 221,512 + + + 1,749,162 + + + Schroeder frequency 185 Hz + + + What the analysis band averages over (7 × 5 × 3 m room, V = 105 m³) + + + + + + + + + + Below the Schroeder frequency + + + + + + Above it + + + + + + + + + + diff --git a/.github/images/modal_count_per_band_dark.svg b/.github/images/modal_count_per_band_dark.svg new file mode 100644 index 000000000..eac8dcc6e --- /dev/null +++ b/.github/images/modal_count_per_band_dark.svg @@ -0,0 +1,1214 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + 1 + 0 + 5 + + + + + + + + + + + + + + + + + + 1 + 0 + 6 + + + + + + + + + + + + + + + + + + 1 + 0 + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modes inside the octave band + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13 + + + 77 + + + 514 + + + 3,735 + + + 28,412 + + + 221,512 + + + 1,749,162 + + + Schroeder frequency 185 Hz + + + What the analysis band averages over (7 × 5 × 3 m room, V = 105 m³) + + + + + + + + + + Below the Schroeder frequency + + + + + + Above it + + + + + + + + + + diff --git a/.github/images/modal_count_per_band_es.svg b/.github/images/modal_count_per_band_es.svg new file mode 100644 index 000000000..55c78a521 --- /dev/null +++ b/.github/images/modal_count_per_band_es.svg @@ -0,0 +1,1214 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + 1 + 0 + 5 + + + + + + + + + + + + + + + + + + 1 + 0 + 6 + + + + + + + + + + + + + + + + + + 1 + 0 + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modos dentro de la banda de octava + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13 + + + 77 + + + 514 + + + 3,735 + + + 28,412 + + + 221,512 + + + 1,749,162 + + + Frecuencia de Schroeder 185 Hz + + + Sobre qué promedia la banda de análisis (sala de 7 × 5 × 3 m, V = 105 m³) + + + + + + + + + + Por debajo de la frecuencia de Schroeder + + + + + + Por encima + + + + + + + + + + diff --git a/.github/images/modal_count_per_band_es_dark.svg b/.github/images/modal_count_per_band_es_dark.svg new file mode 100644 index 000000000..b74e3a06e --- /dev/null +++ b/.github/images/modal_count_per_band_es_dark.svg @@ -0,0 +1,1214 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + 1 + 0 + 5 + + + + + + + + + + + + + + + + + + 1 + 0 + 6 + + + + + + + + + + + + + + + + + + 1 + 0 + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modos dentro de la banda de octava + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13 + + + 77 + + + 514 + + + 3,735 + + + 28,412 + + + 221,512 + + + 1,749,162 + + + Frecuencia de Schroeder 185 Hz + + + Sobre qué promedia la banda de análisis (sala de 7 × 5 × 3 m, V = 105 m³) + + + + + + + + + + Por debajo de la frecuencia de Schroeder + + + + + + Por encima + + + + + + + + + + diff --git a/.github/images/nc_blind_spot.svg b/.github/images/nc_blind_spot.svg new file mode 100644 index 000000000..ec0047a95 --- /dev/null +++ b/.github/images/nc_blind_spot.svg @@ -0,0 +1,1468 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 8000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Octave-band center frequency [Hz] + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Octave-band sound pressure level [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + + 20 + + + 25 + + + 30 + + + 35 + + + 40 + + + 45 + + + 50 + + + 55 + + + 60 + + + 65 + + + 70 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + One rating: NC-40 for both rooms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Duct rumble — tangent at 125 Hz + + + + + + + + + Diffuser hiss — tangent at 4000 Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 8000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Octave-band center frequency [Hz] + + + + + + + + + + + + + + −15 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + −5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + Level minus the room's own RC curve [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Two ratings: the RC Mark II tag reads the character + + + + + + + + + + Tag threshold (D.3): +5 / +3 dB + + + + + + + + + Duct rumble — RC-34(R) + + + + + + + + + Diffuser hiss — RC-36(H) + + + + + + + + + + + + + diff --git a/.github/images/nc_blind_spot_dark.svg b/.github/images/nc_blind_spot_dark.svg new file mode 100644 index 000000000..2ebb018e2 --- /dev/null +++ b/.github/images/nc_blind_spot_dark.svg @@ -0,0 +1,1468 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 8000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Octave-band center frequency [Hz] + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Octave-band sound pressure level [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + + 20 + + + 25 + + + 30 + + + 35 + + + 40 + + + 45 + + + 50 + + + 55 + + + 60 + + + 65 + + + 70 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + One rating: NC-40 for both rooms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Duct rumble — tangent at 125 Hz + + + + + + + + + Diffuser hiss — tangent at 4000 Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 8000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Octave-band center frequency [Hz] + + + + + + + + + + + + + + −15 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + −5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + Level minus the room's own RC curve [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Two ratings: the RC Mark II tag reads the character + + + + + + + + + + Tag threshold (D.3): +5 / +3 dB + + + + + + + + + Duct rumble — RC-34(R) + + + + + + + + + Diffuser hiss — RC-36(H) + + + + + + + + + + + + + diff --git a/.github/images/nc_blind_spot_es.svg b/.github/images/nc_blind_spot_es.svg new file mode 100644 index 000000000..96a2b7262 --- /dev/null +++ b/.github/images/nc_blind_spot_es.svg @@ -0,0 +1,1468 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 8000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia central de banda de octava [Hz] + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Nivel de presión acústica por banda de octava [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + + 20 + + + 25 + + + 30 + + + 35 + + + 40 + + + 45 + + + 50 + + + 55 + + + 60 + + + 65 + + + 70 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Una calificación: NC-40 en las dos salas + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Retumbo de conducto — tangente en 125 Hz + + + + + + + + + Siseo de difusor — tangente en 4000 Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 8000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia central de banda de octava [Hz] + + + + + + + + + + + + + + -15 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + -5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + Nivel menos la curva RC propia de la sala [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dos calificaciones: la etiqueta RC Mark II lee el carácter + + + + + + + + + + Umbral de etiqueta (D.3): +5 / +3 dB + + + + + + + + + Retumbo de conducto — RC-34(R) + + + + + + + + + Siseo de difusor — RC-36(H) + + + + + + + + + + + + + diff --git a/.github/images/nc_blind_spot_es_dark.svg b/.github/images/nc_blind_spot_es_dark.svg new file mode 100644 index 000000000..f2f4ac683 --- /dev/null +++ b/.github/images/nc_blind_spot_es_dark.svg @@ -0,0 +1,1468 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 8000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia central de banda de octava [Hz] + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Nivel de presión acústica por banda de octava [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + + 20 + + + 25 + + + 30 + + + 35 + + + 40 + + + 45 + + + 50 + + + 55 + + + 60 + + + 65 + + + 70 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Una calificación: NC-40 en las dos salas + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Retumbo de conducto — tangente en 125 Hz + + + + + + + + + Siseo de difusor — tangente en 4000 Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 8000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia central de banda de octava [Hz] + + + + + + + + + + + + + + -15 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + -5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + Nivel menos la curva RC propia de la sala [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dos calificaciones: la etiqueta RC Mark II lee el carácter + + + + + + + + + + Umbral de etiqueta (D.3): +5 / +3 dB + + + + + + + + + Retumbo de conducto — RC-34(R) + + + + + + + + + Siseo de difusor — RC-36(H) + + + + + + + + + + + + + diff --git a/.github/images/oblique_absorption.svg b/.github/images/oblique_absorption.svg new file mode 100644 index 000000000..c533dad20 --- /dev/null +++ b/.github/images/oblique_absorption.svg @@ -0,0 +1,1920 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Incidence angle θ [°] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + α + θ + ( + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 78° truncation + + + The integrand: solid bulk-reacting, dashed locally reacting + + + + + + + + + + 250 Hz, bulk + + + + + + 500 Hz, bulk + + + + + + 1000 Hz, bulk + + + + + + 2000 Hz, bulk + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Absorption coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.951 ceiling of the closed form + + + The two averages, and the tube + + + + + + + + + + + + + α + d + i + f +   +   + b + u + l + k +   + ( + P + a + r + i + s +   + i + n + t + e + g + r + a + l + ) + + + + + + + + + + + α + s + t +   +   + l + o + c + a + l + l + y +   + r + e + a + c + t + i + n + g +   + ( + c + l + o + s + e + d +   + f + o + r + m + ) + + + + + + + + + + + α + ( + 0 + ° + ) +   +   + w + h + a + t +   + t + h + e +   + t + u + b + e +   + r + e + a + d + s + + + + + + + + + + + + + + + diff --git a/.github/images/oblique_absorption_dark.svg b/.github/images/oblique_absorption_dark.svg new file mode 100644 index 000000000..06e3ac564 --- /dev/null +++ b/.github/images/oblique_absorption_dark.svg @@ -0,0 +1,1920 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Incidence angle θ [°] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + α + θ + ( + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 78° truncation + + + The integrand: solid bulk-reacting, dashed locally reacting + + + + + + + + + + 250 Hz, bulk + + + + + + 500 Hz, bulk + + + + + + 1000 Hz, bulk + + + + + + 2000 Hz, bulk + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Absorption coefficient + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.951 ceiling of the closed form + + + The two averages, and the tube + + + + + + + + + + + + + α + d + i + f +   +   + b + u + l + k +   + ( + P + a + r + i + s +   + i + n + t + e + g + r + a + l + ) + + + + + + + + + + + α + s + t +   +   + l + o + c + a + l + l + y +   + r + e + a + c + t + i + n + g +   + ( + c + l + o + s + e + d +   + f + o + r + m + ) + + + + + + + + + + + α + ( + 0 + ° + ) +   +   + w + h + a + t +   + t + h + e +   + t + u + b + e +   + r + e + a + d + s + + + + + + + + + + + + + + + diff --git a/.github/images/oblique_absorption_es.svg b/.github/images/oblique_absorption_es.svg new file mode 100644 index 000000000..e54fb521f --- /dev/null +++ b/.github/images/oblique_absorption_es.svg @@ -0,0 +1,1920 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Incidence angle θ [°] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + α + θ + ( + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 78° truncation + + + The integrand: solid bulk-reacting, dashed locally reacting + + + + + + + + + + 250 Hz, bulk + + + + + + 500 Hz, bulk + + + + + + 1000 Hz, bulk + + + + + + 2000 Hz, bulk + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Coeficiente de absorcion + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0,951 ceiling of the closed form + + + The two averages, and the tube + + + + + + + + + + + + + α + d + i + f +   +   + b + u + l + k +   + ( + P + a + r + i + s +   + i + n + t + e + g + r + a + l + ) + + + + + + + + + + + α + s + t +   +   + l + o + c + a + l + l + y +   + r + e + a + c + t + i + n + g +   + ( + c + l + o + s + e + d +   + f + o + r + m + ) + + + + + + + + + + + α + ( + 0 + ° + ) +   +   + w + h + a + t +   + t + h + e +   + t + u + b + e +   + r + e + a + d + s + + + + + + + + + + + + + + + diff --git a/.github/images/oblique_absorption_es_dark.svg b/.github/images/oblique_absorption_es_dark.svg new file mode 100644 index 000000000..6abae6a86 --- /dev/null +++ b/.github/images/oblique_absorption_es_dark.svg @@ -0,0 +1,1920 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 20 + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 90 + + + + Incidence angle θ [°] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + α + θ + ( + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 78° truncation + + + The integrand: solid bulk-reacting, dashed locally reacting + + + + + + + + + + 250 Hz, bulk + + + + + + 500 Hz, bulk + + + + + + 1000 Hz, bulk + + + + + + 2000 Hz, bulk + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Coeficiente de absorcion + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0,951 ceiling of the closed form + + + The two averages, and the tube + + + + + + + + + + + + + α + d + i + f +   +   + b + u + l + k +   + ( + P + a + r + i + s +   + i + n + t + e + g + r + a + l + ) + + + + + + + + + + + α + s + t +   +   + l + o + c + a + l + l + y +   + r + e + a + c + t + i + n + g +   + ( + c + l + o + s + e + d +   + f + o + r + m + ) + + + + + + + + + + + α + ( + 0 + ° + ) +   +   + w + h + a + t +   + t + h + e +   + t + u + b + e +   + r + e + a + d + s + + + + + + + + + + + + + + + diff --git a/.github/images/open_plan_quality.svg b/.github/images/open_plan_quality.svg new file mode 100644 index 000000000..6569b9ee3 --- /dev/null +++ b/.github/images/open_plan_quality.svg @@ -0,0 +1,942 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + A-weighted speech level [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lp,A,S,4m > 50 dB: poor + + + Lp,A,S,4m ≤ 48 dB: good target + + + The same two quantities at the two ends of Annex A + + + + + + + + + + + + Treated: D2,S = 8 dB, Lp,A,S,4m = 47 dB + + + + + + + + Untreated: D2,S = 4 dB, Lp,A,S,4m = 52 dB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 11 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distance from the talker r [m] + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.1 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.3 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.7 + + + + + + + + + + + + + 0.8 + + + + Speech transmission index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rD ≤ 5 m: good + + + rD > 10 m: poor + + + STI = 0.50 + + + STI = 0.20 + + + + + + + + + + + + Treated: rD = 4.5 m, rP = 16 m + + + + + + + + Untreated: rD = 11.0 m, rP = 24 m + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/open_plan_quality_dark.svg b/.github/images/open_plan_quality_dark.svg new file mode 100644 index 000000000..32f4a8dbf --- /dev/null +++ b/.github/images/open_plan_quality_dark.svg @@ -0,0 +1,942 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + A-weighted speech level [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lp,A,S,4m > 50 dB: poor + + + Lp,A,S,4m ≤ 48 dB: good target + + + The same two quantities at the two ends of Annex A + + + + + + + + + + + + Treated: D2,S = 8 dB, Lp,A,S,4m = 47 dB + + + + + + + + Untreated: D2,S = 4 dB, Lp,A,S,4m = 52 dB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 11 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distance from the talker r [m] + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.1 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.3 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.7 + + + + + + + + + + + + + 0.8 + + + + Speech transmission index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rD ≤ 5 m: good + + + rD > 10 m: poor + + + STI = 0.50 + + + STI = 0.20 + + + + + + + + + + + + Treated: rD = 4.5 m, rP = 16 m + + + + + + + + Untreated: rD = 11.0 m, rP = 24 m + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/open_plan_quality_es.svg b/.github/images/open_plan_quality_es.svg new file mode 100644 index 000000000..ae0f81169 --- /dev/null +++ b/.github/images/open_plan_quality_es.svg @@ -0,0 +1,942 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + Nivel de habla ponderado A [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lp,A,S,4m > 50 dB: deficiente + + + Lp,A,S,4m ≤ 48 dB: objetivo bueno + + + Las mismas dos magnitudes en los dos extremos del Anexo A + + + + + + + + + + + + Tratada: D2,S = 8 dB, Lp,A,S,4m = 47 dB + + + + + + + + Sin tratar: D2,S = 4 dB, Lp,A,S,4m = 52 dB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 11 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distancia al hablante r [m] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,7 + + + + + + + + + + + + + 0,8 + + + + Índice de transmisión del habla + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rD ≤ 5 m: bueno + + + rD > 10 m: deficiente + + + STI = 0,50 + + + STI = 0,20 + + + + + + + + + + + + Tratada: rD = 4,5 m, rP = 16 m + + + + + + + + Sin tratar: rD = 11,0 m, rP = 24 m + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/open_plan_quality_es_dark.svg b/.github/images/open_plan_quality_es_dark.svg new file mode 100644 index 000000000..2e6c79413 --- /dev/null +++ b/.github/images/open_plan_quality_es_dark.svg @@ -0,0 +1,942 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 35 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 45 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 55 + + + + + + + + + + + + + 60 + + + + Nivel de habla ponderado A [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lp,A,S,4m > 50 dB: deficiente + + + Lp,A,S,4m ≤ 48 dB: objetivo bueno + + + Las mismas dos magnitudes en los dos extremos del Anexo A + + + + + + + + + + + + Tratada: D2,S = 8 dB, Lp,A,S,4m = 47 dB + + + + + + + + Sin tratar: D2,S = 4 dB, Lp,A,S,4m = 52 dB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 11 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distancia al hablante r [m] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,7 + + + + + + + + + + + + + 0,8 + + + + Índice de transmisión del habla + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rD ≤ 5 m: bueno + + + rD > 10 m: deficiente + + + STI = 0,50 + + + STI = 0,20 + + + + + + + + + + + + Tratada: rD = 4,5 m, rP = 16 m + + + + + + + + Sin tratar: rD = 11,0 m, rP = 24 m + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/orthotropic_transmission_loss.svg b/.github/images/orthotropic_transmission_loss.svg index 0c9ae60bd..e6736a1d9 100644 --- a/.github/images/orthotropic_transmission_loss.svg +++ b/.github/images/orthotropic_transmission_loss.svg @@ -1,7 +1,7 @@ - + @@ -21,35 +21,35 @@ - - +" clip-path="url(#pd10b97a888)" style="fill: #def0de"/> - + @@ -58,353 +58,353 @@ L 0 3.5 " style="stroke: #000000; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - + - + - 4000 + 4000 - + - + - 5000 + 5000 - + - + - 6300 + 6300 - + - + - 8000 + 8000 - + - + - 10000 + 10000 - + - + - 12500 + 12500 - + - + - 16000 + 16000 - Frequency [Hz] + Frequency [Hz] - + @@ -413,214 +413,269 @@ L -3.5 0 " style="stroke: #000000; stroke-width: 0.8"/> - + - 10 + 10 - + - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - + - + - 40 + 40 - + - + - 45 + 45 - Transmission loss TL [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - - - - - 1 mm steel sheet, m'' = 7.8 kg/m², flat fc = 11.9 kHz - corrugated H = 10 mm, L = 100 mm, m'' = 8.5 kg/m², fc1 = 1165 Hz, fc2 = 13.1 kHz - worst penalty 13 dB at 2500 Hz, for a stiffer and only 9 % heavier panel + 1 mm steel sheet, m'' = 7.8 kg/m², flat fc = 11.9 kHz + corrugated H = 10 mm, L = 100 mm, m'' = 8.5 kg/m², fc1 = 1165 Hz, fc2 = 13.1 kHz + worst penalty 13 dB at 2500 Hz, for a stiffer and only 9 % heavier panel - Corrugating a Sheet Flattens Its Sound Reduction Index + Corrugating a Sheet Flattens Its Sound Reduction Index - + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + c o @@ -777,17 +832,17 @@ z - - + - + f l @@ -831,32 +886,32 @@ L 67.025781 53.610234 - - + - corrugated sheet (orthotropic, diffuse-field integral) + corrugated sheet (orthotropic, diffuse-field integral) - - Heckl's approximation + Heckl's approximation - - + + diff --git a/.github/images/orthotropic_transmission_loss_dark.svg b/.github/images/orthotropic_transmission_loss_dark.svg index 84c3ab2a6..615496fac 100644 --- a/.github/images/orthotropic_transmission_loss_dark.svg +++ b/.github/images/orthotropic_transmission_loss_dark.svg @@ -1,7 +1,7 @@ - + @@ -21,35 +21,35 @@ - - +" clip-path="url(#pd10b97a888)" style="fill: #071807"/> - + @@ -58,353 +58,353 @@ L 0 3.5 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - + - + - 4000 + 4000 - + - + - 5000 + 5000 - + - + - 6300 + 6300 - + - + - 8000 + 8000 - + - + - 10000 + 10000 - + - + - 12500 + 12500 - + - + - 16000 + 16000 - Frequency [Hz] + Frequency [Hz] - + @@ -413,214 +413,269 @@ L -3.5 0 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 10 + 10 - + - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - + - + - 40 + 40 - + - + - 45 + 45 - Transmission loss TL [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - - - - - 1 mm steel sheet, m'' = 7.8 kg/m², flat fc = 11.9 kHz - corrugated H = 10 mm, L = 100 mm, m'' = 8.5 kg/m², fc1 = 1165 Hz, fc2 = 13.1 kHz - worst penalty 13 dB at 2500 Hz, for a stiffer and only 9 % heavier panel + 1 mm steel sheet, m'' = 7.8 kg/m², flat fc = 11.9 kHz + corrugated H = 10 mm, L = 100 mm, m'' = 8.5 kg/m², fc1 = 1165 Hz, fc2 = 13.1 kHz + worst penalty 13 dB at 2500 Hz, for a stiffer and only 9 % heavier panel - Corrugating a Sheet Flattens Its Sound Reduction Index + Corrugating a Sheet Flattens Its Sound Reduction Index - + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + c o @@ -777,17 +832,17 @@ z - - + - + f l @@ -831,32 +886,32 @@ L 67.025781 53.610234 - - + - corrugated sheet (orthotropic, diffuse-field integral) + corrugated sheet (orthotropic, diffuse-field integral) - - Heckl's approximation + Heckl's approximation - - + + diff --git a/.github/images/orthotropic_transmission_loss_es.svg b/.github/images/orthotropic_transmission_loss_es.svg index 35b316e16..bedb7a58b 100644 --- a/.github/images/orthotropic_transmission_loss_es.svg +++ b/.github/images/orthotropic_transmission_loss_es.svg @@ -1,7 +1,7 @@ - + @@ -20,36 +20,36 @@ - - - +" clip-path="url(#pf40bbc6edf)" style="fill: #def0de"/> - + @@ -58,353 +58,353 @@ L 0 3.5 " style="stroke: #000000; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - + - + - 4000 + 4000 - + - + - 5000 + 5000 - + - + - 6300 + 6300 - + - + - 8000 + 8000 - + - + - 10000 + 10000 - + - + - 12500 + 12500 - + - + - 16000 + 16000 - Frecuencia [Hz] + Frecuencia [Hz] - + @@ -413,214 +413,269 @@ L -3.5 0 " style="stroke: #000000; stroke-width: 0.8"/> - + - 10 + 10 - + - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - + - + - 40 + 40 - + - + - 45 + 45 - Pérdida por transmisión TL [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - - - - - chapa de acero de 1 mm, m'' = 7,8 kg/m², fc plana = 11,9 kHz - grecada H = 10 mm, L = 100 mm, m'' = 8,5 kg/m², fc1 = 1165 Hz, fc2 = 13,1 kHz - penalización máxima 13 dB a 2500 Hz, con un panel más rígido y solo un 9 % más pesado + chapa de acero de 1 mm, m'' = 7,8 kg/m², fc plana = 11,9 kHz + grecada H = 10 mm, L = 100 mm, m'' = 8,5 kg/m², fc1 = 1165 Hz, fc2 = 13,1 kHz + penalización máxima 13 dB a 2500 Hz, con un panel más rígido y solo un 9 % más pesado - Grecar una chapa aplana su índice de reducción acústica + Grecar una chapa aplana su índice de reducción acústica - + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + r a @@ -780,17 +835,17 @@ z - - + - + c h @@ -838,32 +893,32 @@ L 67.425781 54.450234 - - + - chapa grecada (ortótropa, integral en campo difuso) + chapa grecada (ortótropa, integral en campo difuso) - - aproximación de Heckl + aproximación de Heckl - - + + diff --git a/.github/images/orthotropic_transmission_loss_es_dark.svg b/.github/images/orthotropic_transmission_loss_es_dark.svg index 7796c43e7..b0ed023a2 100644 --- a/.github/images/orthotropic_transmission_loss_es_dark.svg +++ b/.github/images/orthotropic_transmission_loss_es_dark.svg @@ -1,7 +1,7 @@ - + @@ -20,36 +20,36 @@ - - - +" clip-path="url(#pf40bbc6edf)" style="fill: #071807"/> - + @@ -58,353 +58,353 @@ L 0 3.5 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - + - + - 4000 + 4000 - + - + - 5000 + 5000 - + - + - 6300 + 6300 - + - + - 8000 + 8000 - + - + - 10000 + 10000 - + - + - 12500 + 12500 - + - + - 16000 + 16000 - Frecuencia [Hz] + Frecuencia [Hz] - + @@ -413,214 +413,269 @@ L -3.5 0 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 10 + 10 - + - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - + - + - 40 + 40 - + - + - 45 + 45 - Pérdida por transmisión TL [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - - - - - chapa de acero de 1 mm, m'' = 7,8 kg/m², fc plana = 11,9 kHz - grecada H = 10 mm, L = 100 mm, m'' = 8,5 kg/m², fc1 = 1165 Hz, fc2 = 13,1 kHz - penalización máxima 13 dB a 2500 Hz, con un panel más rígido y solo un 9 % más pesado + chapa de acero de 1 mm, m'' = 7,8 kg/m², fc plana = 11,9 kHz + grecada H = 10 mm, L = 100 mm, m'' = 8,5 kg/m², fc1 = 1165 Hz, fc2 = 13,1 kHz + penalización máxima 13 dB a 2500 Hz, con un panel más rígido y solo un 9 % más pesado - Grecar una chapa aplana su índice de reducción acústica + Grecar una chapa aplana su índice de reducción acústica - + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + r a @@ -780,17 +835,17 @@ z - - + - + c h @@ -838,32 +893,32 @@ L 67.425781 54.450234 - - + - chapa grecada (ortótropa, integral en campo difuso) + chapa grecada (ortótropa, integral en campo difuso) - - aproximación de Heckl + aproximación de Heckl - - + + diff --git a/.github/images/panel_insulation_concept.svg b/.github/images/panel_insulation_concept.svg index c20ea2f79..13b7878d7 100644 --- a/.github/images/panel_insulation_concept.svg +++ b/.github/images/panel_insulation_concept.svg @@ -466,7 +466,62 @@ L 425.3 57.969958 - Sound reduction index R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + @@ -997,7 +1052,62 @@ L 849.5 63.562922 - Sound reduction index R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + @@ -2347,7 +2457,62 @@ L 849.5 371.367106 - Sound reduction index R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + diff --git a/.github/images/panel_insulation_concept_dark.svg b/.github/images/panel_insulation_concept_dark.svg index d32667bc7..daab956e2 100644 --- a/.github/images/panel_insulation_concept_dark.svg +++ b/.github/images/panel_insulation_concept_dark.svg @@ -466,7 +466,62 @@ L 425.3 57.969958 - Sound reduction index R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + @@ -997,7 +1052,62 @@ L 849.5 63.562922 - Sound reduction index R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + @@ -2347,7 +2457,62 @@ L 849.5 371.367106 - Sound reduction index R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + diff --git a/.github/images/panel_insulation_concept_es.svg b/.github/images/panel_insulation_concept_es.svg index 197830565..3d15df166 100644 --- a/.github/images/panel_insulation_concept_es.svg +++ b/.github/images/panel_insulation_concept_es.svg @@ -466,7 +466,62 @@ L 425.7 57.969958 - Índice de reducción acústica R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + @@ -997,7 +1052,62 @@ L 849.9 63.562922 - Índice de reducción acústica R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + @@ -2350,7 +2460,62 @@ L 849.9 371.367106 - Índice de reducción acústica R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + diff --git a/.github/images/panel_insulation_concept_es_dark.svg b/.github/images/panel_insulation_concept_es_dark.svg index 1466dd788..946ef5d49 100644 --- a/.github/images/panel_insulation_concept_es_dark.svg +++ b/.github/images/panel_insulation_concept_es_dark.svg @@ -466,7 +466,62 @@ L 425.7 57.969958 - Índice de reducción acústica R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + @@ -997,7 +1052,62 @@ L 849.9 63.562922 - Índice de reducción acústica R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + @@ -2350,7 +2460,62 @@ L 849.9 371.367106 - Índice de reducción acústica R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + diff --git a/.github/images/plateau_transmission_loss.svg b/.github/images/plateau_transmission_loss.svg index 8d666e231..4a9ccd9dc 100644 --- a/.github/images/plateau_transmission_loss.svg +++ b/.github/images/plateau_transmission_loss.svg @@ -1,7 +1,7 @@ - + @@ -21,35 +21,35 @@ - - +" clip-path="url(#pd10b97a888)" style="fill: #f9dede"/> - + @@ -58,323 +58,323 @@ L 0 3.5 " style="stroke: #000000; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - + - + - 4000 + 4000 - + - + - 5000 + 5000 - + - + - 6300 + 6300 - + - + - 8000 + 8000 - + - + - 10000 + 10000 - Frequency [Hz] + Frequency [Hz] - + @@ -383,191 +383,246 @@ L -3.5 0 " style="stroke: #000000; stroke-width: 0.8"/> - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - + - + - 40 + 40 - + - + - 45 + 45 - + - + - 50 + 50 - Transmission loss TL [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - - - - - 6 mm float glass, m'' = 14.8 kg/m², η = 0.02 - plateau height 27 dB, B/A = 10 → A = 374 Hz, B = 3742 Hz - identical below A; the plateau replaces the whole coincidence region + 6 mm float glass, m'' = 14.8 kg/m², η = 0.02 + plateau height 27 dB, B/A = 10 → A = 374 Hz, B = 3742 Hz + identical below A; the plateau replaces the whole coincidence region - Plateau Estimate Against the Physical Panel Model + Plateau Estimate Against the Physical Panel Model - + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - coincidence plateau (A to B) + coincidence plateau (A to B) - - + - physical model (mass law + coincidence + damping) + physical model (mass law + coincidence + damping) - - + - plateau estimate (Norton Table 3.1) + plateau estimate (Norton Table 3.1) - - critical frequency fc + critical frequency fc - - + + diff --git a/.github/images/plateau_transmission_loss_dark.svg b/.github/images/plateau_transmission_loss_dark.svg index cca4a45e0..07e35676a 100644 --- a/.github/images/plateau_transmission_loss_dark.svg +++ b/.github/images/plateau_transmission_loss_dark.svg @@ -1,7 +1,7 @@ - + @@ -21,35 +21,35 @@ - - +" clip-path="url(#pd10b97a888)" style="fill: #1f0606"/> - + @@ -58,323 +58,323 @@ L 0 3.5 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - + - + - 4000 + 4000 - + - + - 5000 + 5000 - + - + - 6300 + 6300 - + - + - 8000 + 8000 - + - + - 10000 + 10000 - Frequency [Hz] + Frequency [Hz] - + @@ -383,191 +383,246 @@ L -3.5 0 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - + - + - 40 + 40 - + - + - 45 + 45 - + - + - 50 + 50 - Transmission loss TL [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - - - - - 6 mm float glass, m'' = 14.8 kg/m², η = 0.02 - plateau height 27 dB, B/A = 10 → A = 374 Hz, B = 3742 Hz - identical below A; the plateau replaces the whole coincidence region + 6 mm float glass, m'' = 14.8 kg/m², η = 0.02 + plateau height 27 dB, B/A = 10 → A = 374 Hz, B = 3742 Hz + identical below A; the plateau replaces the whole coincidence region - Plateau Estimate Against the Physical Panel Model + Plateau Estimate Against the Physical Panel Model - + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - coincidence plateau (A to B) + coincidence plateau (A to B) - - + - physical model (mass law + coincidence + damping) + physical model (mass law + coincidence + damping) - - + - plateau estimate (Norton Table 3.1) + plateau estimate (Norton Table 3.1) - - critical frequency fc + critical frequency fc - - + + diff --git a/.github/images/plateau_transmission_loss_es.svg b/.github/images/plateau_transmission_loss_es.svg index a40fcdb26..cd034f286 100644 --- a/.github/images/plateau_transmission_loss_es.svg +++ b/.github/images/plateau_transmission_loss_es.svg @@ -1,7 +1,7 @@ - + @@ -20,36 +20,36 @@ - - - +" clip-path="url(#pf40bbc6edf)" style="fill: #f9dede"/> - + @@ -58,323 +58,323 @@ L 0 3.5 " style="stroke: #000000; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - + - + - 4000 + 4000 - + - + - 5000 + 5000 - + - + - 6300 + 6300 - + - + - 8000 + 8000 - + - + - 10000 + 10000 - Frecuencia [Hz] + Frecuencia [Hz] - + @@ -383,191 +383,246 @@ L -3.5 0 " style="stroke: #000000; stroke-width: 0.8"/> - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - + - + - 40 + 40 - + - + - 45 + 45 - + - + - 50 + 50 - Pérdida por transmisión TL [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - - - - - vidrio float de 6 mm, m'' = 14,8 kg/m², η = 0,02 - altura de meseta 27 dB, B/A = 10 → A = 374 Hz, B = 3742 Hz - idénticas por debajo de A; la meseta sustituye toda la región de coincidencia + vidrio float de 6 mm, m'' = 14,8 kg/m², η = 0,02 + altura de meseta 27 dB, B/A = 10 → A = 374 Hz, B = 3742 Hz + idénticas por debajo de A; la meseta sustituye toda la región de coincidencia - Estimación por meseta frente al modelo físico del panel + Estimación por meseta frente al modelo físico del panel - + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - meseta de coincidencia (A a B) + meseta de coincidencia (A a B) - - + - modelo físico (ley de masas + coincidencia + amortiguamiento) + modelo físico (ley de masas + coincidencia + amortiguamiento) - - + - estimación por meseta (Norton, tabla 3,1) + estimación por meseta (Norton, tabla 3,1) - - frecuencia crítica fc + frecuencia crítica fc - - + + diff --git a/.github/images/plateau_transmission_loss_es_dark.svg b/.github/images/plateau_transmission_loss_es_dark.svg index 3d3b34d0e..882b54029 100644 --- a/.github/images/plateau_transmission_loss_es_dark.svg +++ b/.github/images/plateau_transmission_loss_es_dark.svg @@ -1,7 +1,7 @@ - + @@ -20,36 +20,36 @@ - - - +" clip-path="url(#pf40bbc6edf)" style="fill: #1f0606"/> - + @@ -58,323 +58,323 @@ L 0 3.5 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - + - + - 4000 + 4000 - + - + - 5000 + 5000 - + - + - 6300 + 6300 - + - + - 8000 + 8000 - + - + - 10000 + 10000 - Frecuencia [Hz] + Frecuencia [Hz] - + @@ -383,191 +383,246 @@ L -3.5 0 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - + - + - 40 + 40 - + - + - 45 + 45 - + - + - 50 + 50 - Pérdida por transmisión TL [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - - - - - vidrio float de 6 mm, m'' = 14,8 kg/m², η = 0,02 - altura de meseta 27 dB, B/A = 10 → A = 374 Hz, B = 3742 Hz - idénticas por debajo de A; la meseta sustituye toda la región de coincidencia + vidrio float de 6 mm, m'' = 14,8 kg/m², η = 0,02 + altura de meseta 27 dB, B/A = 10 → A = 374 Hz, B = 3742 Hz + idénticas por debajo de A; la meseta sustituye toda la región de coincidencia - Estimación por meseta frente al modelo físico del panel + Estimación por meseta frente al modelo físico del panel - + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - meseta de coincidencia (A a B) + meseta de coincidencia (A a B) - - + - modelo físico (ley de masas + coincidencia + amortiguamiento) + modelo físico (ley de masas + coincidencia + amortiguamiento) - - + - estimación por meseta (Norton, tabla 3,1) + estimación por meseta (Norton, tabla 3,1) - - frecuencia crítica fc + frecuencia crítica fc - - + + diff --git a/.github/images/porous_model_comparison.svg b/.github/images/porous_model_comparison.svg new file mode 100644 index 000000000..aee42f375 --- /dev/null +++ b/.github/images/porous_model_comparison.svg @@ -0,0 +1,2033 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + 16k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Z + ρ + c + c + / + ( + ) + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.01 < X < 1 + + + + + + C + h + a + r + a + c + t + e + r + i + s + t + i + c +   + i + m + p + e + d + a + n + c + e + , +   +   + = +   + 2 + 0 +   + k + P + a +   + s + / + m + σ + 2 + + + + + + + + + + + + Delany-Bazley, Re + + + + + + Delany-Bazley, -Im + + + + + + Miki, Re + + + + + + Miki, -Im + + + + + + JCA, Re + + + + + + JCA, -Im + + + + + + + + + + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + 16k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + −8 + + + + + + + + + + + + + −6 + + + + + + + + + + + + + −4 + + + + + + + + + + + + + −2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + R + e + ( + ) + / + ( + ) + , +   +   + 5 + 0 +   + m + m +   + h + a + r + d + - + b + a + c + k + e + d +   + l + a + y + e + r + Z + ρ + c + s + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Delany-Bazley returns a NEGATIVE resistance + below 74.6 Hz: a passive layer generating energy + + + Where the extrapolation fails + + + + + + + + + + Delany-Bazley + + + + + + Miki + + + + + + JCA + + + + + + + + + + + + + diff --git a/.github/images/porous_model_comparison_dark.svg b/.github/images/porous_model_comparison_dark.svg new file mode 100644 index 000000000..6c62bf9b7 --- /dev/null +++ b/.github/images/porous_model_comparison_dark.svg @@ -0,0 +1,2033 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + 16k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Z + ρ + c + c + / + ( + ) + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.01 < X < 1 + + + + + + C + h + a + r + a + c + t + e + r + i + s + t + i + c +   + i + m + p + e + d + a + n + c + e + , +   +   + = +   + 2 + 0 +   + k + P + a +   + s + / + m + σ + 2 + + + + + + + + + + + + Delany-Bazley, Re + + + + + + Delany-Bazley, -Im + + + + + + Miki, Re + + + + + + Miki, -Im + + + + + + JCA, Re + + + + + + JCA, -Im + + + + + + + + + + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + 16k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + −8 + + + + + + + + + + + + + −6 + + + + + + + + + + + + + −4 + + + + + + + + + + + + + −2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + R + e + ( + ) + / + ( + ) + , +   +   + 5 + 0 +   + m + m +   + h + a + r + d + - + b + a + c + k + e + d +   + l + a + y + e + r + Z + ρ + c + s + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Delany-Bazley returns a NEGATIVE resistance + below 74.6 Hz: a passive layer generating energy + + + Where the extrapolation fails + + + + + + + + + + Delany-Bazley + + + + + + Miki + + + + + + JCA + + + + + + + + + + + + + diff --git a/.github/images/porous_model_comparison_es.svg b/.github/images/porous_model_comparison_es.svg new file mode 100644 index 000000000..c8a0e15f7 --- /dev/null +++ b/.github/images/porous_model_comparison_es.svg @@ -0,0 +1,2033 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + 16k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Z + ρ + c + c + / + ( + ) + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0,01 < X < 1 + + + + + + C + h + a + r + a + c + t + e + r + i + s + t + i + c +   + i + m + p + e + d + a + n + c + e + , +   +   + = +   + 2 + 0 +   + k + P + a +   + s + / + m + σ + 2 + + + + + + + + + + + + Delany-Bazley, Re + + + + + + Delany-Bazley, -Im + + + + + + Miki, Re + + + + + + Miki, -Im + + + + + + JCA, Re + + + + + + JCA, -Im + + + + + + + + + + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + 16k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + -8 + + + + + + + + + + + + + -6 + + + + + + + + + + + + + -4 + + + + + + + + + + + + + -2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + R + e + ( + ) + / + ( + ) + , +   +   + 5 + 0 +   + m + m +   + h + a + r + d + - + b + a + c + k + e + d +   + l + a + y + e + r + Z + ρ + c + s + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Delany-Bazley returns a NEGATIVE resistance + below 74,6 Hz: a passive layer generating energy + + + Where the extrapolation fails + + + + + + + + + + Delany-Bazley + + + + + + Miki + + + + + + JCA + + + + + + + + + + + + + diff --git a/.github/images/porous_model_comparison_es_dark.svg b/.github/images/porous_model_comparison_es_dark.svg new file mode 100644 index 000000000..d099531b2 --- /dev/null +++ b/.github/images/porous_model_comparison_es_dark.svg @@ -0,0 +1,2033 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + 16k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Z + ρ + c + c + / + ( + ) + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0,01 < X < 1 + + + + + + C + h + a + r + a + c + t + e + r + i + s + t + i + c +   + i + m + p + e + d + a + n + c + e + , +   +   + = +   + 2 + 0 +   + k + P + a +   + s + / + m + σ + 2 + + + + + + + + + + + + Delany-Bazley, Re + + + + + + Delany-Bazley, -Im + + + + + + Miki, Re + + + + + + Miki, -Im + + + + + + JCA, Re + + + + + + JCA, -Im + + + + + + + + + + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + 16k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + -8 + + + + + + + + + + + + + -6 + + + + + + + + + + + + + -4 + + + + + + + + + + + + + -2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + R + e + ( + ) + / + ( + ) + , +   +   + 5 + 0 +   + m + m +   + h + a + r + d + - + b + a + c + k + e + d +   + l + a + y + e + r + Z + ρ + c + s + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Delany-Bazley returns a NEGATIVE resistance + below 74,6 Hz: a passive layer generating energy + + + Where the extrapolation fails + + + + + + + + + + Delany-Bazley + + + + + + Miki + + + + + + JCA + + + + + + + + + + + + + diff --git a/.github/images/qrd_working_band.svg b/.github/images/qrd_working_band.svg new file mode 100644 index 000000000..4b6ce897b --- /dev/null +++ b/.github/images/qrd_working_band.svg @@ -0,0 +1,848 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 3000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 5000 + + + + + + + + + + + + + 6000 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.1 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.3 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.5 + + + + Predicted diffusion coefficient d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N f0 = 3500 Hz: every well + back in phase, flat again + + + f_max = c/(2w) = 1715 Hz: + the well stops being + a single-mode waveguide + + + f0 = 500 Hz + + + The working band of a Schroeder design + + + + + + + + + + + + + N = 7 QRD, f0 = 500 Hz, 5 periods + + + + + + Flat panel, same footprint + + + + + + + + + + diff --git a/.github/images/qrd_working_band_dark.svg b/.github/images/qrd_working_band_dark.svg new file mode 100644 index 000000000..89bce6ae7 --- /dev/null +++ b/.github/images/qrd_working_band_dark.svg @@ -0,0 +1,848 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 3000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 5000 + + + + + + + + + + + + + 6000 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.1 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.3 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.5 + + + + Predicted diffusion coefficient d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N f0 = 3500 Hz: every well + back in phase, flat again + + + f_max = c/(2w) = 1715 Hz: + the well stops being + a single-mode waveguide + + + f0 = 500 Hz + + + The working band of a Schroeder design + + + + + + + + + + + + + N = 7 QRD, f0 = 500 Hz, 5 periods + + + + + + Flat panel, same footprint + + + + + + + + + + diff --git a/.github/images/qrd_working_band_es.svg b/.github/images/qrd_working_band_es.svg new file mode 100644 index 000000000..8617ed512 --- /dev/null +++ b/.github/images/qrd_working_band_es.svg @@ -0,0 +1,848 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 3000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 5000 + + + + + + + + + + + + + 6000 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,5 + + + + Coeficiente de difusión predicho d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N f0 = 3500 Hz: every well + back in phase, flat again + + + f_max = c/(2w) = 1715 Hz: + the well stops being + a single-mode waveguide + + + f0 = 500 Hz + + + La banda útil de un difusor de Schroeder + + + + + + + + + + + + + QRD N = 7, f0 = 500 Hz, 5 periodos + + + + + + Panel plano, misma huella + + + + + + + + + + diff --git a/.github/images/qrd_working_band_es_dark.svg b/.github/images/qrd_working_band_es_dark.svg new file mode 100644 index 000000000..09184b469 --- /dev/null +++ b/.github/images/qrd_working_band_es_dark.svg @@ -0,0 +1,848 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 3000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + 5000 + + + + + + + + + + + + + 6000 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,5 + + + + Coeficiente de difusión predicho d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N f0 = 3500 Hz: every well + back in phase, flat again + + + f_max = c/(2w) = 1715 Hz: + the well stops being + a single-mode waveguide + + + f0 = 500 Hz + + + La banda útil de un difusor de Schroeder + + + + + + + + + + + + + QRD N = 7, f0 = 500 Hz, 5 periodos + + + + + + Panel plano, misma huella + + + + + + + + + + diff --git a/.github/images/radiation_efficiency_panels.svg b/.github/images/radiation_efficiency_panels.svg new file mode 100644 index 000000000..8a8182a9c --- /dev/null +++ b/.github/images/radiation_efficiency_panels.svg @@ -0,0 +1,1002 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Radiation efficiency sigma + + + + + + + + + + + + + + + + + + + + + + + + + + coincidence peak: sigma = 2.60 + + + + + + at 100 Hz the small pane radiates 3.1 times better: + the uncancelled edge strip is a larger fraction of it + + + Edge Radiation, Coincidence and the Slow Return to Unity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.5 m x 1.25 m pane + + + + + + + + + 0.5 m x 0.4 m pane, same glass + + + + + + sigma = 1 (as efficient as a piston) + + + + + + critical frequency fc = 2107 Hz + + + + + + + + + + + + Baffled plate (simply_supported) + + + + + + + + + + + + + 1.5 m + + + 1.25 m + + + + + + + + + + + + + + + + + + diff --git a/.github/images/radiation_efficiency_panels_dark.svg b/.github/images/radiation_efficiency_panels_dark.svg new file mode 100644 index 000000000..fb960a50b --- /dev/null +++ b/.github/images/radiation_efficiency_panels_dark.svg @@ -0,0 +1,1002 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Radiation efficiency sigma + + + + + + + + + + + + + + + + + + + + + + + + + + coincidence peak: sigma = 2.60 + + + + + + at 100 Hz the small pane radiates 3.1 times better: + the uncancelled edge strip is a larger fraction of it + + + Edge Radiation, Coincidence and the Slow Return to Unity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.5 m x 1.25 m pane + + + + + + + + + 0.5 m x 0.4 m pane, same glass + + + + + + sigma = 1 (as efficient as a piston) + + + + + + critical frequency fc = 2107 Hz + + + + + + + + + + + + Baffled plate (simply_supported) + + + + + + + + + + + + + 1.5 m + + + 1.25 m + + + + + + + + + + + + + + + + + + diff --git a/.github/images/radiation_efficiency_panels_es.svg b/.github/images/radiation_efficiency_panels_es.svg new file mode 100644 index 000000000..b1c0c1ad5 --- /dev/null +++ b/.github/images/radiation_efficiency_panels_es.svg @@ -0,0 +1,1002 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Eficiencia de radiación sigma + + + + + + + + + + + + + + + + + + + + + + + + + + pico de coincidencia: sigma = 2,60 + + + + + + a 100 Hz el vidrio pequeño radia 3,1 veces mejor: + la franja de borde no cancelada es una fracción mayor de él + + + Radiación de bordes, coincidencia y el lento retorno a la unidad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vidrio de 1,5 m x 1,25 m + + + + + + + + + vidrio de 0,5 m x 0,4 m, el mismo material + + + + + + sigma = 1 (tan eficiente como un pistón) + + + + + + frecuencia crítica fc = 2107 Hz + + + + + + + + + + + + Baffled plate (simply_supported) + + + + + + + + + + + + + 1,5 m + + + 1,25 m + + + + + + + + + + + + + + + + + + diff --git a/.github/images/radiation_efficiency_panels_es_dark.svg b/.github/images/radiation_efficiency_panels_es_dark.svg new file mode 100644 index 000000000..555d7c445 --- /dev/null +++ b/.github/images/radiation_efficiency_panels_es_dark.svg @@ -0,0 +1,1002 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Eficiencia de radiación sigma + + + + + + + + + + + + + + + + + + + + + + + + + + pico de coincidencia: sigma = 2,60 + + + + + + a 100 Hz el vidrio pequeño radia 3,1 veces mejor: + la franja de borde no cancelada es una fracción mayor de él + + + Radiación de bordes, coincidencia y el lento retorno a la unidad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vidrio de 1,5 m x 1,25 m + + + + + + + + + vidrio de 0,5 m x 0,4 m, el mismo material + + + + + + sigma = 1 (tan eficiente como un pistón) + + + + + + frecuencia crítica fc = 2107 Hz + + + + + + + + + + + + Baffled plate (simply_supported) + + + + + + + + + + + + + 1,5 m + + + 1,25 m + + + + + + + + + + + + + + + + + + diff --git a/.github/images/reverberation_model_absorption.svg b/.github/images/reverberation_model_absorption.svg new file mode 100644 index 000000000..63e3b3a22 --- /dev/null +++ b/.github/images/reverberation_model_absorption.svg @@ -0,0 +1,994 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R + e + v + e + r + b + e + r + a + t + i + o + n +   + t + i + m + e +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + Sabine stays finite: + + + + 0 + . + 1 + 2 +   + s +   + a + t +   + = + 1 + α + + + + + + + + + Eyring falls to zero + + + Model behaviour against the mean absorption + + + + + + + + + + + + + + + + Sabine + + + + + + Eyring + + + + + + Millington-Sette + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + M + e + a + n +   + a + b + s + o + r + p + t + i + o + n +   + c + o + e + f + f + i + c + i + e + n + t +   + ̄ + α + + + + + + + + + + + + + + + + −80 + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + 0 + + + + Departure from + Sabine [%] + + + + + + + + + + + + + + + + -10 % + + + -28 % + + + -61 % + + + + + + room 8 x 5 x 3 m + V = 120 m^3, S = 158 m^2 + uniform absorption, no air term + shaded: outside Sabine's domain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/reverberation_model_absorption_dark.svg b/.github/images/reverberation_model_absorption_dark.svg new file mode 100644 index 000000000..dca412379 --- /dev/null +++ b/.github/images/reverberation_model_absorption_dark.svg @@ -0,0 +1,994 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R + e + v + e + r + b + e + r + a + t + i + o + n +   + t + i + m + e +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + Sabine stays finite: + + + + 0 + . + 1 + 2 +   + s +   + a + t +   + = + 1 + α + + + + + + + + + Eyring falls to zero + + + Model behaviour against the mean absorption + + + + + + + + + + + + + + + + Sabine + + + + + + Eyring + + + + + + Millington-Sette + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + M + e + a + n +   + a + b + s + o + r + p + t + i + o + n +   + c + o + e + f + f + i + c + i + e + n + t +   + ̄ + α + + + + + + + + + + + + + + + + −80 + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + 0 + + + + Departure from + Sabine [%] + + + + + + + + + + + + + + + + -10 % + + + -28 % + + + -61 % + + + + + + room 8 x 5 x 3 m + V = 120 m^3, S = 158 m^2 + uniform absorption, no air term + shaded: outside Sabine's domain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/reverberation_model_absorption_es.svg b/.github/images/reverberation_model_absorption_es.svg new file mode 100644 index 000000000..def04e209 --- /dev/null +++ b/.github/images/reverberation_model_absorption_es.svg @@ -0,0 +1,999 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T + i + e + m + p + o +   + d + e +   + r + e + v + e + r + b + e + r + a + c + i + ó + n +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + Sabine stays finite: + + + + 0 + . + 1 + 2 +   + s +   + a + t +   + = + 1 + α + + + + + + + + + Eyring falls to zero + + + Model behaviour against the mean absorption + + + + + + + + + + + + + + + + Sabine + + + + + + Eyring + + + + + + Millington-Sette + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + M + e + a + n +   + a + b + s + o + r + p + t + i + o + n +   + c + o + e + f + f + i + c + i + e + n + t +   + ̄ + α + + + + + + + + + + + + + + + + -80 + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + 0 + + + + Departure from + Sabine [%] + + + + + + + + + + + + + + + + -10 % + + + -28 % + + + -61 % + + + + + + room 8 x 5 x 3 m + V = 120 m^3, S = 158 m^2 + uniform absorption, no air term + shaded: outside Sabine's domain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/reverberation_model_absorption_es_dark.svg b/.github/images/reverberation_model_absorption_es_dark.svg new file mode 100644 index 000000000..d1d01afae --- /dev/null +++ b/.github/images/reverberation_model_absorption_es_dark.svg @@ -0,0 +1,999 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T + i + e + m + p + o +   + d + e +   + r + e + v + e + r + b + e + r + a + c + i + ó + n +   +   + [ + s + ] + T + + + + + + + + + + + + + + + + + + + + + + Sabine stays finite: + + + + 0 + . + 1 + 2 +   + s +   + a + t +   + = + 1 + α + + + + + + + + + Eyring falls to zero + + + Model behaviour against the mean absorption + + + + + + + + + + + + + + + + Sabine + + + + + + Eyring + + + + + + Millington-Sette + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + M + e + a + n +   + a + b + s + o + r + p + t + i + o + n +   + c + o + e + f + f + i + c + i + e + n + t +   + ̄ + α + + + + + + + + + + + + + + + + -80 + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + 0 + + + + Departure from + Sabine [%] + + + + + + + + + + + + + + + + -10 % + + + -28 % + + + -61 % + + + + + + room 8 x 5 x 3 m + V = 120 m^3, S = 158 m^2 + uniform absorption, no air term + shaded: outside Sabine's domain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/room_noise_criteria.svg b/.github/images/room_noise_criteria.svg index cc0a285ad..8dbc1b543 100644 --- a/.github/images/room_noise_criteria.svg +++ b/.github/images/room_noise_criteria.svg @@ -799,44 +799,44 @@ z - - + - - + @@ -1137,94 +1137,202 @@ L 867.570817 26.318125 - - + - 20 + 10 - - + - 30 + 20 - - + - 40 + 30 - - + - 50 + 40 - - + - 60 + 50 - + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + Octave-band sound pressure level [dB] - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + @@ -1267,36 +1375,67 @@ L 885.763437 342.995328 L 885.763437 26.318125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - - + 25 + + + 30 + + + 35 + + + 40 + + + 45 + + + 50 + + + + + + + 55 dB floor + (16 Hz = 31.5 Hz) + + + - - - - - - - - - - + + + + + + + + + + - + Room Criteria Mark II RC-35(R) - + - + - + Reference RC-35 - + - + Rumble tol. (+5 dB) - + - + Hiss tol. (+3 dB) - + - + Measured diff --git a/.github/images/room_noise_criteria_dark.svg b/.github/images/room_noise_criteria_dark.svg index 91218fd0b..097066973 100644 --- a/.github/images/room_noise_criteria_dark.svg +++ b/.github/images/room_noise_criteria_dark.svg @@ -799,44 +799,44 @@ z - - + - - + @@ -1137,94 +1137,202 @@ L 867.570817 26.318125 - - + - 20 + 10 - - + - 30 + 20 - - + - 40 + 30 - - + - 50 + 40 - - + - 60 + 50 - + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + Octave-band sound pressure level [dB] - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + @@ -1267,36 +1375,67 @@ L 885.763437 342.995328 L 885.763437 26.318125 " style="fill: none; stroke: #ffffff; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - - + 25 + + + 30 + + + 35 + + + 40 + + + 45 + + + 50 + + + + + + + 55 dB floor + (16 Hz = 31.5 Hz) + + + - - - - - - - - - - + + + + + + + + + + - + Room Criteria Mark II RC-35(R) - + - + - + Reference RC-35 - + - + Rumble tol. (+5 dB) - + - + Hiss tol. (+3 dB) - + - + Measured diff --git a/.github/images/room_noise_criteria_es.svg b/.github/images/room_noise_criteria_es.svg index bafc763db..3991609bd 100644 --- a/.github/images/room_noise_criteria_es.svg +++ b/.github/images/room_noise_criteria_es.svg @@ -799,44 +799,44 @@ z - - + - - + @@ -1137,94 +1137,202 @@ L 867.970817 26.798125 - - + - 20 + 10 - - + - 30 + 20 - - + - 40 + 30 - - + - 50 + 40 - - + - 60 + 50 - + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + Nivel de presión acústica por banda de octava [dB] - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + @@ -1267,36 +1375,67 @@ L 886.163437 343.475328 L 886.163437 26.798125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - - + 25 + + + 30 + + + 35 + + + 40 + + + 45 + + + 50 + + + + + + + suelo de 55 dB + (16 Hz = 31,5 Hz) + + + - - - - - - - - - - + + + + + + + + + + - + Criterios de sala Mark II RC-35(R) - + - + - + Referencia RC-35 - + - + Tol. retumbo (+5 dB) - + - + Tol. siseo (+3 dB) - + - + Medido diff --git a/.github/images/room_noise_criteria_es_dark.svg b/.github/images/room_noise_criteria_es_dark.svg index 2371b9552..577bd8c14 100644 --- a/.github/images/room_noise_criteria_es_dark.svg +++ b/.github/images/room_noise_criteria_es_dark.svg @@ -799,44 +799,44 @@ z - - + - - + @@ -1137,94 +1137,202 @@ L 867.970817 26.798125 - - + - 20 + 10 - - + - 30 + 20 - - + - 40 + 30 - - + - 50 + 40 - - + - 60 + 50 - + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + Nivel de presión acústica por banda de octava [dB] - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + @@ -1267,36 +1375,67 @@ L 886.163437 343.475328 L 886.163437 26.798125 " style="fill: none; stroke: #ffffff; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - - + 25 + + + 30 + + + 35 + + + 40 + + + 45 + + + 50 + + + + + + + suelo de 55 dB + (16 Hz = 31,5 Hz) + + + - - - - - - - - - - + + + + + + + + + + - + Criterios de sala Mark II RC-35(R) - + - + - + Referencia RC-35 - + - + Tol. retumbo (+5 dB) - + - + Tol. siseo (+3 dB) - + - + Medido diff --git a/.github/images/room_proportion_modes.svg b/.github/images/room_proportion_modes.svg new file mode 100644 index 000000000..05ba3cd6e --- /dev/null +++ b/.github/images/room_proportion_modes.svg @@ -0,0 +1,2465 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cube + 4.72 x 4.72 x 4.72 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 132 modes, 26 distinct frequencies; largest gap 15.0 Hz + + + + + + T + h + r + e + e +   + r + o + o + m + s +   + o + f +   + 1 + 0 + 5 +   + m + , +   + m + o + d + e + s +   + u + p +   + t + o +   + 2 + 0 + 0 +   + H + z + 3 + + + + + + + + + + + + axial + + + + + + tangential + + + + + + oblique + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 : 1 : 1 + 7.49 x 3.74 x 3.74 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 129 modes, 36 distinct frequencies; largest gap 22.9 Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bolt 1 : 1.4 : 1.9 + 3.40 x 4.77 x 6.47 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 126 modes, 121 distinct frequencies; largest gap 9.5 Hz + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 150 + + + + + + + + + + + + + 175 + + + + + + + + + + + + + 200 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + + + + + + + + + + 20 + + + + Spacing to the next + distinct mode [Hz] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cube + + + + + + 2 : 1 : 1 + + + + + + Bolt 1 : 1.4 : 1.9 + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/room_proportion_modes_dark.svg b/.github/images/room_proportion_modes_dark.svg new file mode 100644 index 000000000..205d9ab39 --- /dev/null +++ b/.github/images/room_proportion_modes_dark.svg @@ -0,0 +1,2465 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cube + 4.72 x 4.72 x 4.72 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 132 modes, 26 distinct frequencies; largest gap 15.0 Hz + + + + + + T + h + r + e + e +   + r + o + o + m + s +   + o + f +   + 1 + 0 + 5 +   + m + , +   + m + o + d + e + s +   + u + p +   + t + o +   + 2 + 0 + 0 +   + H + z + 3 + + + + + + + + + + + + axial + + + + + + tangential + + + + + + oblique + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 : 1 : 1 + 7.49 x 3.74 x 3.74 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 129 modes, 36 distinct frequencies; largest gap 22.9 Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bolt 1 : 1.4 : 1.9 + 3.40 x 4.77 x 6.47 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 126 modes, 121 distinct frequencies; largest gap 9.5 Hz + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 150 + + + + + + + + + + + + + 175 + + + + + + + + + + + + + 200 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + + + + + + + + + + 20 + + + + Spacing to the next + distinct mode [Hz] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cube + + + + + + 2 : 1 : 1 + + + + + + Bolt 1 : 1.4 : 1.9 + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/room_proportion_modes_es.svg b/.github/images/room_proportion_modes_es.svg new file mode 100644 index 000000000..b1113c52a --- /dev/null +++ b/.github/images/room_proportion_modes_es.svg @@ -0,0 +1,2465 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cube + 4,72 x 4,72 x 4,72 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 132 modes, 26 distinct frequencies; largest gap 15,0 Hz + + + + + + T + h + r + e + e +   + r + o + o + m + s +   + o + f +   + 1 + 0 + 5 +   + m + , +   + m + o + d + e + s +   + u + p +   + t + o +   + 2 + 0 + 0 +   + H + z + 3 + + + + + + + + + + + + axial + + + + + + tangential + + + + + + oblique + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 : 1 : 1 + 7,49 x 3,74 x 3,74 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 129 modes, 36 distinct frequencies; largest gap 22,9 Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bolt 1 : 1,4 : 1,9 + 3,40 x 4,77 x 6,47 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 126 modes, 121 distinct frequencies; largest gap 9,5 Hz + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 150 + + + + + + + + + + + + + 175 + + + + + + + + + + + + + 200 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + + + + + + + + + + 20 + + + + Spacing to the next + distinct mode [Hz] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cube + + + + + + 2 : 1 : 1 + + + + + + Bolt 1 : 1,4 : 1,9 + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/room_proportion_modes_es_dark.svg b/.github/images/room_proportion_modes_es_dark.svg new file mode 100644 index 000000000..fb016f56c --- /dev/null +++ b/.github/images/room_proportion_modes_es_dark.svg @@ -0,0 +1,2465 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cube + 4,72 x 4,72 x 4,72 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 132 modes, 26 distinct frequencies; largest gap 15,0 Hz + + + + + + T + h + r + e + e +   + r + o + o + m + s +   + o + f +   + 1 + 0 + 5 +   + m + , +   + m + o + d + e + s +   + u + p +   + t + o +   + 2 + 0 + 0 +   + H + z + 3 + + + + + + + + + + + + axial + + + + + + tangential + + + + + + oblique + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 : 1 : 1 + 7,49 x 3,74 x 3,74 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 129 modes, 36 distinct frequencies; largest gap 22,9 Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bolt 1 : 1,4 : 1,9 + 3,40 x 4,77 x 6,47 m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 126 modes, 121 distinct frequencies; largest gap 9,5 Hz + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 25 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 150 + + + + + + + + + + + + + 175 + + + + + + + + + + + + + 200 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + + + + + + + + + + 20 + + + + Spacing to the next + distinct mode [Hz] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cube + + + + + + 2 : 1 : 1 + + + + + + Bolt 1 : 1,4 : 1,9 + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/scattering_coefficient.svg b/.github/images/scattering_coefficient.svg index e2bb48406..e99ad4de7 100644 --- a/.github/images/scattering_coefficient.svg +++ b/.github/images/scattering_coefficient.svg @@ -1,7 +1,7 @@ - + @@ -20,8 +20,8 @@ - - - +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> @@ -50,72 +50,57 @@ L 0 3.5 " style="stroke: #000000; stroke-width: 0.8"/> - + - - 250 - - +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 500 - - +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 1000 - - +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 2000 - - +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 4000 - @@ -125,62 +110,59 @@ L 0 2 " style="stroke: #000000; stroke-width: 0.6"/> - + - + - + - + - + - + - + - - Frequency [Hz] - - + @@ -189,105 +171,142 @@ L -3.5 0 " style="stroke: #000000; stroke-width: 0.8"/> - + - - 0.0 + + 0.0 - + - + - - 0.2 + + 0.2 - + - + - - 0.4 + + 0.4 - + - + - - 0.6 + + 0.6 - + - + - - 0.8 + + 0.8 +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + 1.0 - - Scattering coefficient s + + Absorption coefficient + + + + + + + + - - - @@ -296,22 +315,412 @@ L 705.581563 28.318125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + Random-incidence scattering coefficient (ISO 17497-1) + + + + + + + + + + alpha_spec - alpha_s (numerator of Eq. (5)) + + + + + + + + + alpha_spec, rotating turntable (T3, T4) + + + + + + + + + alpha_s, static turntable (T1, T2) + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Scattering coefficient s + + + + + + + + + + + + + + + + + + +" style="stroke: #000000; stroke-width: 1.4"/> - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - Random-incidence scattering coefficient (ISO 17497-1) + + + + + s = (alpha_spec - alpha_s) / (1 - alpha_s) Eq. (5) - - + + + + + diff --git a/.github/images/scattering_coefficient_dark.svg b/.github/images/scattering_coefficient_dark.svg index 52f9b7d82..c00370583 100644 --- a/.github/images/scattering_coefficient_dark.svg +++ b/.github/images/scattering_coefficient_dark.svg @@ -1,7 +1,7 @@ - + @@ -20,8 +20,8 @@ - - - +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> @@ -50,72 +50,57 @@ L 0 3.5 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - - 250 - - +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 500 - - +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 1000 - - +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 2000 - - +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 4000 - @@ -125,62 +110,59 @@ L 0 2 " style="stroke: #ffffff; stroke-width: 0.6"/> - + - + - + - + - + - + - + - - Frequency [Hz] - - + @@ -189,105 +171,142 @@ L -3.5 0 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - - 0.0 + + 0.0 - + - + - - 0.2 + + 0.2 - + - + - - 0.4 + + 0.4 - + - + - - 0.6 + + 0.6 - + - + - - 0.8 + + 0.8 +" clip-path="url(#pba4d54f062)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + 1.0 - - Scattering coefficient s + + Absorption coefficient + + + + + + + + - - - @@ -296,22 +315,412 @@ L 705.581563 28.318125 " style="fill: none; stroke: #ffffff; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + Random-incidence scattering coefficient (ISO 17497-1) + + + + + + + + + + alpha_spec - alpha_s (numerator of Eq. (5)) + + + + + + + + + alpha_spec, rotating turntable (T3, T4) + + + + + + + + + alpha_s, static turntable (T1, T2) + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Scattering coefficient s + + + + + + + + + + + + + + + + + + +" style="stroke: #ffffff; stroke-width: 1.4"/> - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - Random-incidence scattering coefficient (ISO 17497-1) + + + + + s = (alpha_spec - alpha_s) / (1 - alpha_s) Eq. (5) - - + + + + + diff --git a/.github/images/scattering_coefficient_es.svg b/.github/images/scattering_coefficient_es.svg index ec59e257f..03c62ea88 100644 --- a/.github/images/scattering_coefficient_es.svg +++ b/.github/images/scattering_coefficient_es.svg @@ -1,7 +1,7 @@ - + @@ -20,8 +20,8 @@ - - - +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> @@ -50,72 +50,57 @@ L 0 3.5 " style="stroke: #000000; stroke-width: 0.8"/> - + - - 250 - - +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 500 - - +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 1000 - - +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 2000 - - +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 4000 - @@ -125,62 +110,59 @@ L 0 2 " style="stroke: #000000; stroke-width: 0.6"/> - + - + - + - + - + - + - + - - Frecuencia [Hz] - - + @@ -189,105 +171,142 @@ L -3.5 0 " style="stroke: #000000; stroke-width: 0.8"/> - + - - 0 + + 0 - + - + - - 0,2 + + 0,2 - + - + - - 0,4 + + 0,4 - + - + - - 0,6 + + 0,6 - + - + - - 0,8 + + 0,8 +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #e0e0e0; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + 1 - - Coeficiente de dispersión s + + Coeficiente de absorcion + + + + + + + + - - - @@ -296,22 +315,412 @@ L 705.981563 28.798125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + Coeficiente de dispersión de incidencia aleatoria (ISO 17497-1) + + + + + + + + + + alpha_spec - alpha_s (numerador de la Ec. (5)) + + + + + + + + + alpha_spec, plataforma giratoria (T3, T4) + + + + + + + + + alpha_s, plataforma estática (T1, T2) + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Coeficiente de dispersión s + + + + + + + + + + + + + + + + + + +" style="stroke: #000000; stroke-width: 1.4"/> - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - Coeficiente de dispersión de incidencia aleatoria (ISO 17497-1) + + + + + s = (alpha_spec - alpha_s) / (1 - alpha_s) Ec. (5) - - + + + + + diff --git a/.github/images/scattering_coefficient_es_dark.svg b/.github/images/scattering_coefficient_es_dark.svg index ebf7edf2e..e716addcd 100644 --- a/.github/images/scattering_coefficient_es_dark.svg +++ b/.github/images/scattering_coefficient_es_dark.svg @@ -1,7 +1,7 @@ - + @@ -20,8 +20,8 @@ - - - +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> @@ -50,72 +50,57 @@ L 0 3.5 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - - 250 - - +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 500 - - +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 1000 - - +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 2000 - - +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + - - 4000 - @@ -125,62 +110,59 @@ L 0 2 " style="stroke: #ffffff; stroke-width: 0.6"/> - + - + - + - + - + - + - + - - Frecuencia [Hz] - - + @@ -189,105 +171,142 @@ L -3.5 0 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - - 0 + + 0 - + - + - - 0,2 + + 0,2 - + - + - - 0,4 + + 0,4 - + - + - - 0,6 + + 0,6 - + - + - - 0,8 + + 0,8 +" clip-path="url(#pff7ace742f)" style="fill: none; stroke: #555555; stroke-opacity: 0.5; stroke-width: 0.8; stroke-linecap: square"/> - + 1 - - Coeficiente de dispersión s + + Coeficiente de absorcion + + + + + + + + - - - @@ -296,22 +315,412 @@ L 705.981563 28.798125 " style="fill: none; stroke: #ffffff; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + Coeficiente de dispersión de incidencia aleatoria (ISO 17497-1) + + + + + + + + + + alpha_spec - alpha_s (numerador de la Ec. (5)) + + + + + + + + + alpha_spec, plataforma giratoria (T3, T4) + + + + + + + + + alpha_s, plataforma estática (T1, T2) + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + 4000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Coeficiente de dispersión s + + + + + + + + + + + + + + + + + + +" style="stroke: #ffffff; stroke-width: 1.4"/> - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - Coeficiente de dispersión de incidencia aleatoria (ISO 17497-1) + + + + + s = (alpha_spec - alpha_s) / (1 - alpha_s) Ec. (5) - - + + + + + diff --git a/.github/images/sheet_transfer_impedance.svg b/.github/images/sheet_transfer_impedance.svg new file mode 100644 index 000000000..740436590 --- /dev/null +++ b/.github/images/sheet_transfer_impedance.svg @@ -0,0 +1,1007 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + A + b + s + o + r + p + t + i + o + n +   +   + o + f +   + t + h + e +   + s + t + a + c + k + α + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + −2 + + + + + + + + + + + + + −1 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + N + o + r + m + a + l + i + s + e + d +   + t + r + a + n + s + f + e + r +   + i + m + p + e + d + a + n + c + e +   + / + z + ρ + c + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the reactances meet at 677 Hz + there r = 1.53, so 4r/(1+r)² = 0.96 + + + Where a Resonant Sheet Resonates, and How Well It Absorbs + + + + + + + + + + + + + p + a + n + e + l +   + r + e + s + i + s + t + a + n + c + e +   + r + + + + + + + + + + + p + a + n + e + l +   + r + e + a + c + t + a + n + c + e +   + x + + + + + + + + + + + c + a + v + i + t + y +   + c + o + t + ( + / + ) + , +   +   + D +   + = +   + 6 + 0 +   + m + m + ω + D + c + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/sheet_transfer_impedance_dark.svg b/.github/images/sheet_transfer_impedance_dark.svg new file mode 100644 index 000000000..bba823fdc --- /dev/null +++ b/.github/images/sheet_transfer_impedance_dark.svg @@ -0,0 +1,1007 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + A + b + s + o + r + p + t + i + o + n +   +   + o + f +   + t + h + e +   + s + t + a + c + k + α + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + −2 + + + + + + + + + + + + + −1 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + N + o + r + m + a + l + i + s + e + d +   + t + r + a + n + s + f + e + r +   + i + m + p + e + d + a + n + c + e +   + / + z + ρ + c + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the reactances meet at 677 Hz + there r = 1.53, so 4r/(1+r)² = 0.96 + + + Where a Resonant Sheet Resonates, and How Well It Absorbs + + + + + + + + + + + + + p + a + n + e + l +   + r + e + s + i + s + t + a + n + c + e +   + r + + + + + + + + + + + p + a + n + e + l +   + r + e + a + c + t + a + n + c + e +   + x + + + + + + + + + + + c + a + v + i + t + y +   + c + o + t + ( + / + ) + , +   +   + D +   + = +   + 6 + 0 +   + m + m + ω + D + c + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/sheet_transfer_impedance_es.svg b/.github/images/sheet_transfer_impedance_es.svg new file mode 100644 index 000000000..8bf8dcadf --- /dev/null +++ b/.github/images/sheet_transfer_impedance_es.svg @@ -0,0 +1,1007 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + A + b + s + o + r + p + t + i + o + n +   +   + o + f +   + t + h + e +   + s + t + a + c + k + α + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + -2 + + + + + + + + + + + + + -1 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + N + o + r + m + a + l + i + s + e + d +   + t + r + a + n + s + f + e + r +   + i + m + p + e + d + a + n + c + e +   + / + z + ρ + c + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the reactances meet at 677 Hz + there r = 1,53, so 4r/(1+r)² = 0,96 + + + Where a Resonant Sheet Resonates, and How Well It Absorbs + + + + + + + + + + + + + p + a + n + e + l +   + r + e + s + i + s + t + a + n + c + e +   + r + + + + + + + + + + + p + a + n + e + l +   + r + e + a + c + t + a + n + c + e +   + x + + + + + + + + + + + c + a + v + i + t + y +   + c + o + t + ( + / + ) + , +   +   + D +   + = +   + 6 + 0 +   + m + m + ω + D + c + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/sheet_transfer_impedance_es_dark.svg b/.github/images/sheet_transfer_impedance_es_dark.svg new file mode 100644 index 000000000..17a95bbf0 --- /dev/null +++ b/.github/images/sheet_transfer_impedance_es_dark.svg @@ -0,0 +1,1007 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + A + b + s + o + r + p + t + i + o + n +   +   + o + f +   + t + h + e +   + s + t + a + c + k + α + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + -2 + + + + + + + + + + + + + -1 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + N + o + r + m + a + l + i + s + e + d +   + t + r + a + n + s + f + e + r +   + i + m + p + e + d + a + n + c + e +   + / + z + ρ + c + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the reactances meet at 677 Hz + there r = 1,53, so 4r/(1+r)² = 0,96 + + + Where a Resonant Sheet Resonates, and How Well It Absorbs + + + + + + + + + + + + + p + a + n + e + l +   + r + e + s + i + s + t + a + n + c + e +   + r + + + + + + + + + + + p + a + n + e + l +   + r + e + a + c + t + a + n + c + e +   + x + + + + + + + + + + + c + a + v + i + t + y +   + c + o + t + ( + / + ) + , +   +   + D +   + = +   + 6 + 0 +   + m + m + ω + D + c + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/single_panel_rating.svg b/.github/images/single_panel_rating.svg index 7361c5083..b87a40980 100644 --- a/.github/images/single_panel_rating.svg +++ b/.github/images/single_panel_rating.svg @@ -1,7 +1,7 @@ - + @@ -21,27 +21,27 @@ - - + @@ -50,248 +50,248 @@ L 0 3.5 " style="stroke: #000000; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - Frequency [Hz] + Frequency [Hz] - + @@ -300,174 +300,229 @@ L -3.5 0 " style="stroke: #000000; stroke-width: 0.8"/> - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - Sound reduction index R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - + +" clip-path="url(#p4236f9f71f)" style="fill: #d62728; fill-opacity: 0.25; stroke: #d62728; stroke-opacity: 0.25"/> - - - - - - Rw(C;Ctr) = 32(-1;-4) dB - 6 mm float glass, m'' = 15 kg/m², η = 0.024 + Rw(C;Ctr) = 32(-1;-4) dB + 6 mm float glass, m'' = 15 kg/m², η = 0.024 - Predicted Single-Panel Insulation Rated per ISO 717-1 + Predicted Single-Panel Insulation Rated per ISO 717-1 - + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - + - predicted R (Sharp) + predicted R (Sharp) - - + - shifted reference + shifted reference - - unfavourable deviations + unfavourable deviations - - coincidence fc = 2107 Hz + coincidence fc = 2107 Hz - - + + diff --git a/.github/images/single_panel_rating_dark.svg b/.github/images/single_panel_rating_dark.svg index b67f326e4..e23060598 100644 --- a/.github/images/single_panel_rating_dark.svg +++ b/.github/images/single_panel_rating_dark.svg @@ -1,7 +1,7 @@ - + @@ -21,27 +21,27 @@ - - + @@ -50,248 +50,248 @@ L 0 3.5 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - Frequency [Hz] + Frequency [Hz] - + @@ -300,174 +300,229 @@ L -3.5 0 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - Sound reduction index R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - + +" clip-path="url(#p4236f9f71f)" style="fill: #d62728; fill-opacity: 0.25; stroke: #d62728; stroke-opacity: 0.25"/> - - - - - - Rw(C;Ctr) = 32(-1;-4) dB - 6 mm float glass, m'' = 15 kg/m², η = 0.024 + Rw(C;Ctr) = 32(-1;-4) dB + 6 mm float glass, m'' = 15 kg/m², η = 0.024 - Predicted Single-Panel Insulation Rated per ISO 717-1 + Predicted Single-Panel Insulation Rated per ISO 717-1 - + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - + - predicted R (Sharp) + predicted R (Sharp) - - + - shifted reference + shifted reference - - unfavourable deviations + unfavourable deviations - - coincidence fc = 2107 Hz + coincidence fc = 2107 Hz - - + + diff --git a/.github/images/single_panel_rating_es.svg b/.github/images/single_panel_rating_es.svg index 15798b8af..7f02374a5 100644 --- a/.github/images/single_panel_rating_es.svg +++ b/.github/images/single_panel_rating_es.svg @@ -1,7 +1,7 @@ - + @@ -21,27 +21,27 @@ - - + @@ -50,248 +50,248 @@ L 0 3.5 " style="stroke: #000000; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - Frecuencia [Hz] + Frecuencia [Hz] - + @@ -300,174 +300,229 @@ L -3.5 0 " style="stroke: #000000; stroke-width: 0.8"/> - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - Índice de reducción acústica R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - + +" clip-path="url(#p2524020840)" style="fill: #d62728; fill-opacity: 0.25; stroke: #d62728; stroke-opacity: 0.25"/> - - - - - - Rw(C;Ctr) = 32(-1;-4) dB - vidrio flotado de 6 mm, m'' = 15 kg/m², η = 0,024 + Rw(C;Ctr) = 32(-1;-4) dB + vidrio flotado de 6 mm, m'' = 15 kg/m², η = 0,024 - Aislamiento previsto de panel simple evaluado según ISO 717-1 + Aislamiento previsto de panel simple evaluado según ISO 717-1 - + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - + - R previsto (Sharp) + R previsto (Sharp) - - + - referencia desplazada + referencia desplazada - - desviaciones desfavorables + desviaciones desfavorables - - coincidencia fc = 2107 Hz + coincidencia fc = 2107 Hz - - + + diff --git a/.github/images/single_panel_rating_es_dark.svg b/.github/images/single_panel_rating_es_dark.svg index 4701267e7..1d193396b 100644 --- a/.github/images/single_panel_rating_es_dark.svg +++ b/.github/images/single_panel_rating_es_dark.svg @@ -1,7 +1,7 @@ - + @@ -21,27 +21,27 @@ - - + @@ -50,248 +50,248 @@ L 0 3.5 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 100 + 100 - + - + - 125 + 125 - + - + - 160 + 160 - + - + - 200 + 200 - + - + - 250 + 250 - + - + - 315 + 315 - + - + - 400 + 400 - + - + - 500 + 500 - + - + - 630 + 630 - + - + - 800 + 800 - + - + - 1000 + 1000 - + - + - 1250 + 1250 - + - + - 1600 + 1600 - + - + - 2000 + 2000 - + - + - 2500 + 2500 - + - + - 3150 + 3150 - Frecuencia [Hz] + Frecuencia [Hz] - + @@ -300,174 +300,229 @@ L -3.5 0 " style="stroke: #ffffff; stroke-width: 0.8"/> - + - 15 + 15 - + - + - 20 + 20 - + - + - 25 + 25 - + - + - 30 + 30 - + - + - 35 + 35 - Índice de reducción acústica R [dB] + + + + S + o + u + n + d +   + r + e + d + u + c + t + i + o + n +   + i + n + d + e + x +   +   + ( + t + r + a + n + s + m + i + s + s + i + o + n +   + l + o + s + s +   + ) +   + [ + d + B + ] + R + T + L + + - - + +" clip-path="url(#p2524020840)" style="fill: #d62728; fill-opacity: 0.25; stroke: #d62728; stroke-opacity: 0.25"/> - - - - - - Rw(C;Ctr) = 32(-1;-4) dB - vidrio flotado de 6 mm, m'' = 15 kg/m², η = 0,024 + Rw(C;Ctr) = 32(-1;-4) dB + vidrio flotado de 6 mm, m'' = 15 kg/m², η = 0,024 - Aislamiento previsto de panel simple evaluado según ISO 717-1 + Aislamiento previsto de panel simple evaluado según ISO 717-1 - + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - + - R previsto (Sharp) + R previsto (Sharp) - - + - referencia desplazada + referencia desplazada - - desviaciones desfavorables + desviaciones desfavorables - - coincidencia fc = 2107 Hz + coincidencia fc = 2107 Hz - - + + diff --git a/.github/images/slow_sound_dispersion.svg b/.github/images/slow_sound_dispersion.svg new file mode 100644 index 000000000..b6800ac62 --- /dev/null +++ b/.github/images/slow_sound_dispersion.svg @@ -0,0 +1,691 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.2 + + + + + + + P + h + a + s + e +   + s + p + e + e + d +   + i + n +   + t + h + e +   + s + l + i + t +   +   + / + c + c + e + f + f + 0 + + + + + + + + + + + + + + + + + + + + + + + + branch closed above the + resonator resonance (485 Hz) + + + + + + + + + + 0 + . + 0 + 8 +   +   + a + t +   + 3 + 7 + 9 +   + H + z + c + 0 + + + + + + + + + + + + d + e + s + i + g + n +   + p + o + i + n + t + : +   + 0 + . + 1 + 1 +   +   + = +   + 3 + 7 +   + m + / + s + , + c + 0 + + + so the 30 mm depth is a quarter wave at 308 Hz + + + an empty 30 mm slit is a quarter wave at 2858 Hz + + + Slow Sound: the Phase Speed Inside a Loaded Slit + + + + + + + + + + loaded slit + + + + + + empty slit + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/slow_sound_dispersion_dark.svg b/.github/images/slow_sound_dispersion_dark.svg new file mode 100644 index 000000000..6e0493640 --- /dev/null +++ b/.github/images/slow_sound_dispersion_dark.svg @@ -0,0 +1,691 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.2 + + + + + + + P + h + a + s + e +   + s + p + e + e + d +   + i + n +   + t + h + e +   + s + l + i + t +   +   + / + c + c + e + f + f + 0 + + + + + + + + + + + + + + + + + + + + + + + + branch closed above the + resonator resonance (485 Hz) + + + + + + + + + + 0 + . + 0 + 8 +   +   + a + t +   + 3 + 7 + 9 +   + H + z + c + 0 + + + + + + + + + + + + d + e + s + i + g + n +   + p + o + i + n + t + : +   + 0 + . + 1 + 1 +   +   + = +   + 3 + 7 +   + m + / + s + , + c + 0 + + + so the 30 mm depth is a quarter wave at 308 Hz + + + an empty 30 mm slit is a quarter wave at 2858 Hz + + + Slow Sound: the Phase Speed Inside a Loaded Slit + + + + + + + + + + loaded slit + + + + + + empty slit + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/slow_sound_dispersion_es.svg b/.github/images/slow_sound_dispersion_es.svg new file mode 100644 index 000000000..862d0c774 --- /dev/null +++ b/.github/images/slow_sound_dispersion_es.svg @@ -0,0 +1,691 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,2 + + + + + + + P + h + a + s + e +   + s + p + e + e + d +   + i + n +   + t + h + e +   + s + l + i + t +   +   + / + c + c + e + f + f + 0 + + + + + + + + + + + + + + + + + + + + + + + + branch closed above the + resonator resonance (485 Hz) + + + + + + + + + + 0 + . + 0 + 8 +   +   + a + t +   + 3 + 7 + 9 +   + H + z + c + 0 + + + + + + + + + + + + d + e + s + i + g + n +   + p + o + i + n + t + : +   + 0 + . + 1 + 1 +   +   + = +   + 3 + 7 +   + m + / + s + , + c + 0 + + + so the 30 mm depth is a quarter wave at 308 Hz + + + an empty 30 mm slit is a quarter wave at 2858 Hz + + + Slow Sound: the Phase Speed Inside a Loaded Slit + + + + + + + + + + loaded slit + + + + + + empty slit + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/slow_sound_dispersion_es_dark.svg b/.github/images/slow_sound_dispersion_es_dark.svg new file mode 100644 index 000000000..a9c7df34a --- /dev/null +++ b/.github/images/slow_sound_dispersion_es_dark.svg @@ -0,0 +1,691 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,2 + + + + + + + P + h + a + s + e +   + s + p + e + e + d +   + i + n +   + t + h + e +   + s + l + i + t +   +   + / + c + c + e + f + f + 0 + + + + + + + + + + + + + + + + + + + + + + + + branch closed above the + resonator resonance (485 Hz) + + + + + + + + + + 0 + . + 0 + 8 +   +   + a + t +   + 3 + 7 + 9 +   + H + z + c + 0 + + + + + + + + + + + + d + e + s + i + g + n +   + p + o + i + n + t + : +   + 0 + . + 1 + 1 +   +   + = +   + 3 + 7 +   + m + / + s + , + c + 0 + + + so the 30 mm depth is a quarter wave at 308 Hz + + + an empty 30 mm slit is a quarter wave at 2858 Hz + + + Slow Sound: the Phase Speed Inside a Loaded Slit + + + + + + + + + + loaded slit + + + + + + empty slit + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/sound_absorption_inversion.svg b/.github/images/sound_absorption_inversion.svg new file mode 100644 index 000000000..8c2195fd7 --- /dev/null +++ b/.github/images/sound_absorption_inversion.svg @@ -0,0 +1,1537 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + Reverberation time [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the two decays nearly coincide: + 0.6 s out of 9 s + + + ISO 354: What the Sabine Inversion Consumes + + + + + + + + + + + + + + + + T + 1 +   +   + e + m + p + t + y +   + r + o + o + m + + + + + + + + + + + + + + T + 2 +   +   + s + p + e + c + i + m + e + n +   + i + n + s + t + a + l + l + e + d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 1.25k + + + + + + + + + + + + + 1.6k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 2.5k + + + + + + + + + + + + + 3.15k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 5k + + + + Frequency [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + E + q + u + i + v + a + l + e + n + t +   + a + b + s + o + r + p + t + i + o + n +   + a + r + e + a +   + [ + m + ] + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + . + 4 +   + m +   + / +   + 1 + 0 + . + 8 +   + m +   + = +   + 0 + . + 6 + 9 + 2 + 2 + + + + + + + + + + + + + + + + + + A + 1 +   +   + e + m + p + t + y +   + r + o + o + m + + + + + + + + + + + + + + A + 2 +   +   + w + i + t + h +   + s + p + e + c + i + m + e + n + + + + + + + + + + + A + A + 2 + 1 + +   +   + t + h + e +   + s + p + e + c + i + m + e + n + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.2 + + + + + + + B + a + n + d +   + h + e + i + g + h + t +   + a + s +   + = + ( + + ) + / + α + A + A + S + s + 2 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/sound_absorption_inversion_dark.svg b/.github/images/sound_absorption_inversion_dark.svg new file mode 100644 index 000000000..03180b2b4 --- /dev/null +++ b/.github/images/sound_absorption_inversion_dark.svg @@ -0,0 +1,1537 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + Reverberation time [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the two decays nearly coincide: + 0.6 s out of 9 s + + + ISO 354: What the Sabine Inversion Consumes + + + + + + + + + + + + + + + + T + 1 +   +   + e + m + p + t + y +   + r + o + o + m + + + + + + + + + + + + + + T + 2 +   +   + s + p + e + c + i + m + e + n +   + i + n + s + t + a + l + l + e + d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 1.25k + + + + + + + + + + + + + 1.6k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 2.5k + + + + + + + + + + + + + 3.15k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 5k + + + + Frequency [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + E + q + u + i + v + a + l + e + n + t +   + a + b + s + o + r + p + t + i + o + n +   + a + r + e + a +   + [ + m + ] + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + . + 4 +   + m +   + / +   + 1 + 0 + . + 8 +   + m +   + = +   + 0 + . + 6 + 9 + 2 + 2 + + + + + + + + + + + + + + + + + + A + 1 +   +   + e + m + p + t + y +   + r + o + o + m + + + + + + + + + + + + + + A + 2 +   +   + w + i + t + h +   + s + p + e + c + i + m + e + n + + + + + + + + + + + A + A + 2 + 1 + +   +   + t + h + e +   + s + p + e + c + i + m + e + n + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + 1.2 + + + + + + + B + a + n + d +   + h + e + i + g + h + t +   + a + s +   + = + ( + + ) + / + α + A + A + S + s + 2 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/sound_absorption_inversion_es.svg b/.github/images/sound_absorption_inversion_es.svg new file mode 100644 index 000000000..efafc4be2 --- /dev/null +++ b/.github/images/sound_absorption_inversion_es.svg @@ -0,0 +1,1537 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + Reverberation time [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the two decays nearly coincide: + 0,6 s out of 9 s + + + ISO 354: What the Sabine Inversion Consumes + + + + + + + + + + + + + + + + T + 1 +   +   + e + m + p + t + y +   + r + o + o + m + + + + + + + + + + + + + + T + 2 +   +   + s + p + e + c + i + m + e + n +   + i + n + s + t + a + l + l + e + d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 1,25k + + + + + + + + + + + + + 1,6k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 2,5k + + + + + + + + + + + + + 3,15k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 5k + + + + Frecuencia [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + E + q + u + i + v + a + l + e + n + t +   + a + b + s + o + r + p + t + i + o + n +   + a + r + e + a +   + [ + m + ] + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + . + 4 +   + m +   + / +   + 1 + 0 + . + 8 +   + m +   + = +   + 0 + . + 6 + 9 + 2 + 2 + + + + + + + + + + + + + + + + + + A + 1 +   +   + e + m + p + t + y +   + r + o + o + m + + + + + + + + + + + + + + A + 2 +   +   + w + i + t + h +   + s + p + e + c + i + m + e + n + + + + + + + + + + + A + A + 2 + 1 + +   +   + t + h + e +   + s + p + e + c + i + m + e + n + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,2 + + + + + + + B + a + n + d +   + h + e + i + g + h + t +   + a + s +   + = + ( + + ) + / + α + A + A + S + s + 2 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/sound_absorption_inversion_es_dark.svg b/.github/images/sound_absorption_inversion_es_dark.svg new file mode 100644 index 000000000..bbb5a2549 --- /dev/null +++ b/.github/images/sound_absorption_inversion_es_dark.svg @@ -0,0 +1,1537 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + Reverberation time [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the two decays nearly coincide: + 0,6 s out of 9 s + + + ISO 354: What the Sabine Inversion Consumes + + + + + + + + + + + + + + + + T + 1 +   +   + e + m + p + t + y +   + r + o + o + m + + + + + + + + + + + + + + T + 2 +   +   + s + p + e + c + i + m + e + n +   + i + n + s + t + a + l + l + e + d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 160 + + + + + + + + + + + + + 200 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 315 + + + + + + + + + + + + + 400 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 630 + + + + + + + + + + + + + 800 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 1,25k + + + + + + + + + + + + + 1,6k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 2,5k + + + + + + + + + + + + + 3,15k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 5k + + + + Frecuencia [Hz] + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + E + q + u + i + v + a + l + e + n + t +   + a + b + s + o + r + p + t + i + o + n +   + a + r + e + a +   + [ + m + ] + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + . + 4 +   + m +   + / +   + 1 + 0 + . + 8 +   + m +   + = +   + 0 + . + 6 + 9 + 2 + 2 + + + + + + + + + + + + + + + + + + A + 1 +   +   + e + m + p + t + y +   + r + o + o + m + + + + + + + + + + + + + + A + 2 +   +   + w + i + t + h +   + s + p + e + c + i + m + e + n + + + + + + + + + + + A + A + 2 + 1 + +   +   + t + h + e +   + s + p + e + c + i + m + e + n + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 1,2 + + + + + + + B + a + n + d +   + h + e + i + g + h + t +   + a + s +   + = + ( + + ) + / + α + A + A + S + s + 2 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/source_distance_bias.svg b/.github/images/source_distance_bias.svg new file mode 100644 index 000000000..33a8df4e1 --- /dev/null +++ b/.github/images/source_distance_bias.svg @@ -0,0 +1,805 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.1 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.3 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.7 + + + + + + + + + + + + + 0.8 + + + + Decay time [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + excluded: r < d_min = 2.0 m + + + critical distance 1.5 m + + + A microphone inside d_min returns wrong numbers, not noisy ones + + + + + + + + + + + + + T30 (500–1000 Hz) + + + + + + + + + EDT (500–1000 Hz) + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 7 + + + + Source–receiver distance [m] + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + + + + + + + + + + 20 + + + + Clarity C80 [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C80 (500–1000 Hz) + + + + + + + + + + + + + diff --git a/.github/images/source_distance_bias_dark.svg b/.github/images/source_distance_bias_dark.svg new file mode 100644 index 000000000..64156ddfd --- /dev/null +++ b/.github/images/source_distance_bias_dark.svg @@ -0,0 +1,805 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.1 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.3 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.7 + + + + + + + + + + + + + 0.8 + + + + Decay time [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + excluded: r < d_min = 2.0 m + + + critical distance 1.5 m + + + A microphone inside d_min returns wrong numbers, not noisy ones + + + + + + + + + + + + + T30 (500–1000 Hz) + + + + + + + + + EDT (500–1000 Hz) + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 7 + + + + Source–receiver distance [m] + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + + + + + + + + + + 20 + + + + Clarity C80 [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C80 (500–1000 Hz) + + + + + + + + + + + + + diff --git a/.github/images/source_distance_bias_es.svg b/.github/images/source_distance_bias_es.svg new file mode 100644 index 000000000..80939753f --- /dev/null +++ b/.github/images/source_distance_bias_es.svg @@ -0,0 +1,805 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,7 + + + + + + + + + + + + + 0,8 + + + + Tiempo de caída [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + excluida: r < d_min = 2,0 m + + + distancia crítica 1,5 m + + + Un micrófono dentro de d_min da números equivocados, no ruidosos + + + + + + + + + + + + + T30 (500–1000 Hz) + + + + + + + + + EDT (500–1000 Hz) + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 7 + + + + Distancia fuente–receptor [m] + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + + + + + + + + + + 20 + + + + Claridad C80 [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C80 (500–1000 Hz) + + + + + + + + + + + + + diff --git a/.github/images/source_distance_bias_es_dark.svg b/.github/images/source_distance_bias_es_dark.svg new file mode 100644 index 000000000..d42ff0316 --- /dev/null +++ b/.github/images/source_distance_bias_es_dark.svg @@ -0,0 +1,805 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,1 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,3 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,5 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,7 + + + + + + + + + + + + + 0,8 + + + + Tiempo de caída [s] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + excluida: r < d_min = 2,0 m + + + distancia crítica 1,5 m + + + Un micrófono dentro de d_min da números equivocados, no ruidosos + + + + + + + + + + + + + T30 (500–1000 Hz) + + + + + + + + + EDT (500–1000 Hz) + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 3 + + + + + + + + + + + + + 4 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 6 + + + + + + + + + + + + + 7 + + + + Distancia fuente–receptor [m] + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 12 + + + + + + + + + + + + + 14 + + + + + + + + + + + + + 16 + + + + + + + + + + + + + 18 + + + + + + + + + + + + + 20 + + + + Claridad C80 [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C80 (500–1000 Hz) + + + + + + + + + + + + + diff --git a/.github/images/standing_wave_envelope.svg b/.github/images/standing_wave_envelope.svg new file mode 100644 index 000000000..5e475c2fa --- /dev/null +++ b/.github/images/standing_wave_envelope.svg @@ -0,0 +1,1332 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Distance from the specimen face x [m] (towards the source) + + + + + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −15 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + −5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + + + + E + n + v + e + l + o + p + e +   + l + e + v + e + l +   + 2 + 0 + l + o + g + ( + | + ( + ) + | + / + ) +   + [ + d + B + ] + 1 + 0 + p + x + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + minima at 12, 46 and 81 cm: -5.99, -5.92, -5.85 dB + (read the nearest one, and extrapolate to x = 0) + + + + + + + + + + x + m + i + n + , + 1 +   + = +   + 1 + 2 +   + c + m + + + + + + + + + + + + + λ + / + 4 +   + = +   + 1 + 7 + . + 2 +   + c + m + + + + + specimen face x = 0 + + + What the Probe Carriage Traverses (500 Hz, 100 mm tube) + + + + + + + + + + + + + r + i + g + i + d +   + w + a + l + l +   +   + | + r + | +   + = +   + 1 +   +   + ( + Δ + + + ) + L + + + + + + + + + + + t + h + e +   + w + o + r + k + e + d +   + s + a + m + p + l + e +   +   + | + r + | +   + = +   + 0 + . + 5 +   +   + ( + Δ +   + = +   + 9 + . + 5 + 4 +   + d + B + ) + L + + + + + + + + + + + n + e + a + r + - + a + n + e + c + h + o + i + c +   +   + | + r + | +   + = +   + 0 + . + 1 +   +   + ( + Δ +   + = +   + 1 + . + 7 + 4 +   + d + B + ) + L + + + + + + + + the same, with tube loss (k₀'' = 0.013 Np/m) + + + + + + + + + + diff --git a/.github/images/standing_wave_envelope_dark.svg b/.github/images/standing_wave_envelope_dark.svg new file mode 100644 index 000000000..419a00d4b --- /dev/null +++ b/.github/images/standing_wave_envelope_dark.svg @@ -0,0 +1,1332 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + + + + + + + + + + 0.6 + + + + + + + + + + + + + 0.8 + + + + + + + + + + + + + 1.0 + + + + Distance from the specimen face x [m] (towards the source) + + + + + + + + + + + + + + + + + −20 + + + + + + + + + + + + + −15 + + + + + + + + + + + + + −10 + + + + + + + + + + + + + −5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + + + + E + n + v + e + l + o + p + e +   + l + e + v + e + l +   + 2 + 0 + l + o + g + ( + | + ( + ) + | + / + ) +   + [ + d + B + ] + 1 + 0 + p + x + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + minima at 12, 46 and 81 cm: -5.99, -5.92, -5.85 dB + (read the nearest one, and extrapolate to x = 0) + + + + + + + + + + x + m + i + n + , + 1 +   + = +   + 1 + 2 +   + c + m + + + + + + + + + + + + + λ + / + 4 +   + = +   + 1 + 7 + . + 2 +   + c + m + + + + + specimen face x = 0 + + + What the Probe Carriage Traverses (500 Hz, 100 mm tube) + + + + + + + + + + + + + r + i + g + i + d +   + w + a + l + l +   +   + | + r + | +   + = +   + 1 +   +   + ( + Δ + + + ) + L + + + + + + + + + + + t + h + e +   + w + o + r + k + e + d +   + s + a + m + p + l + e +   +   + | + r + | +   + = +   + 0 + . + 5 +   +   + ( + Δ +   + = +   + 9 + . + 5 + 4 +   + d + B + ) + L + + + + + + + + + + + n + e + a + r + - + a + n + e + c + h + o + i + c +   +   + | + r + | +   + = +   + 0 + . + 1 +   +   + ( + Δ +   + = +   + 1 + . + 7 + 4 +   + d + B + ) + L + + + + + + + + the same, with tube loss (k₀'' = 0.013 Np/m) + + + + + + + + + + diff --git a/.github/images/standing_wave_envelope_es.svg b/.github/images/standing_wave_envelope_es.svg new file mode 100644 index 000000000..5a0496bad --- /dev/null +++ b/.github/images/standing_wave_envelope_es.svg @@ -0,0 +1,1332 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Distance from the specimen face x [m] (towards the source) + + + + + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -15 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + -5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + + + + E + n + v + e + l + o + p + e +   + l + e + v + e + l +   + 2 + 0 + l + o + g + ( + | + ( + ) + | + / + ) +   + [ + d + B + ] + 1 + 0 + p + x + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + minima at 12, 46 and 81 cm: -5,99, -5,92, -5,85 dB + (read the nearest one, and extrapolate to x = 0) + + + + + + + + + + x + m + i + n + , + 1 +   + = +   + 1 + 2 +   + c + m + + + + + + + + + + + + + λ + / + 4 +   + = +   + 1 + 7 + . + 2 +   + c + m + + + + + specimen face x = 0 + + + What the Probe Carriage Traverses (500 Hz, 100 mm tube) + + + + + + + + + + + + + r + i + g + i + d +   + w + a + l + l +   +   + | + r + | +   + = +   + 1 +   +   + ( + Δ + + + ) + L + + + + + + + + + + + t + h + e +   + w + o + r + k + e + d +   + s + a + m + p + l + e +   +   + | + r + | +   + = +   + 0 + . + 5 +   +   + ( + Δ +   + = +   + 9 + . + 5 + 4 +   + d + B + ) + L + + + + + + + + + + + n + e + a + r + - + a + n + e + c + h + o + i + c +   +   + | + r + | +   + = +   + 0 + . + 1 +   +   + ( + Δ +   + = +   + 1 + . + 7 + 4 +   + d + B + ) + L + + + + + + + + the same, with tube loss (k₀'' = 0,013 Np/m) + + + + + + + + + + diff --git a/.github/images/standing_wave_envelope_es_dark.svg b/.github/images/standing_wave_envelope_es_dark.svg new file mode 100644 index 000000000..b0926d06a --- /dev/null +++ b/.github/images/standing_wave_envelope_es_dark.svg @@ -0,0 +1,1332 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + + + + + + + + + + 0,6 + + + + + + + + + + + + + 0,8 + + + + + + + + + + + + + 1 + + + + Distance from the specimen face x [m] (towards the source) + + + + + + + + + + + + + + + + + -20 + + + + + + + + + + + + + -15 + + + + + + + + + + + + + -10 + + + + + + + + + + + + + -5 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 15 + + + + + + + E + n + v + e + l + o + p + e +   + l + e + v + e + l +   + 2 + 0 + l + o + g + ( + | + ( + ) + | + / + ) +   + [ + d + B + ] + 1 + 0 + p + x + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + minima at 12, 46 and 81 cm: -5,99, -5,92, -5,85 dB + (read the nearest one, and extrapolate to x = 0) + + + + + + + + + + x + m + i + n + , + 1 +   + = +   + 1 + 2 +   + c + m + + + + + + + + + + + + + λ + / + 4 +   + = +   + 1 + 7 + . + 2 +   + c + m + + + + + specimen face x = 0 + + + What the Probe Carriage Traverses (500 Hz, 100 mm tube) + + + + + + + + + + + + + r + i + g + i + d +   + w + a + l + l +   +   + | + r + | +   + = +   + 1 +   +   + ( + Δ + + + ) + L + + + + + + + + + + + t + h + e +   + w + o + r + k + e + d +   + s + a + m + p + l + e +   +   + | + r + | +   + = +   + 0 + . + 5 +   +   + ( + Δ +   + = +   + 9 + . + 5 + 4 +   + d + B + ) + L + + + + + + + + + + + n + e + a + r + - + a + n + e + c + h + o + i + c +   +   + | + r + | +   + = +   + 0 + . + 1 +   +   + ( + Δ +   + = +   + 1 + . + 7 + 4 +   + d + B + ) + L + + + + + + + + the same, with tube loss (k₀'' = 0,013 Np/m) + + + + + + + + + + diff --git a/.github/images/steady_state_directivity.svg b/.github/images/steady_state_directivity.svg new file mode 100644 index 000000000..5e3127955 --- /dev/null +++ b/.github/images/steady_state_directivity.svg @@ -0,0 +1,1538 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distance from source [m] + + + + + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 85 + + + + + + + + + + + + + 90 + + + + + + + + + + + + + 95 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 105 + + + + Sound pressure level [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 x 8 x 4 m workshop, S = 352 m^2, Lw = 90 dB re 1 pW + + + + + + Q + r +   + m + o + v + e + s +   + , +   + n + o + t +   + t + h + e +   + p + l + a + t + e + a + u + c + + + + + + + + + + + + + + + + + + + + + + + + + + + Q +   + = +   + 1 +   +   + ( +   + = +   + 1 + . + 1 + 1 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 2 +   +   + ( +   + = +   + 1 + . + 5 + 7 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 4 +   +   + ( +   + = +   + 2 + . + 2 + 2 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 8 +   +   + ( +   + = +   + 3 + . + 1 + 4 +   + m + ) + r + c + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distance from source [m] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10.1 dB = 10 lg(R2/R1) + + + Absorption moves the plateau, not the direct field + + + + + + + + + + + + + + + + + + + + + +   + ̄ + = +   + 0 + . + 0 + 5 +   +   + ( +   + = +   + 1 + 9 +   + m + ) + α + R + 2 + + + + + + + + + + +   + ̄ + = +   + 0 + . + 1 + 5 +   +   + ( +   + = +   + 6 + 2 +   + m + ) + α + R + 2 + + + + + + + + + + +   + ̄ + = +   + 0 + . + 3 + 5 +   +   + ( +   + = +   + 1 + 9 + 0 +   + m + ) + α + R + 2 + + + + + + + + + + + + + + + diff --git a/.github/images/steady_state_directivity_dark.svg b/.github/images/steady_state_directivity_dark.svg new file mode 100644 index 000000000..c5eed32e4 --- /dev/null +++ b/.github/images/steady_state_directivity_dark.svg @@ -0,0 +1,1538 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distance from source [m] + + + + + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 85 + + + + + + + + + + + + + 90 + + + + + + + + + + + + + 95 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 105 + + + + Sound pressure level [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 x 8 x 4 m workshop, S = 352 m^2, Lw = 90 dB re 1 pW + + + + + + Q + r +   + m + o + v + e + s +   + , +   + n + o + t +   + t + h + e +   + p + l + a + t + e + a + u + c + + + + + + + + + + + + + + + + + + + + + + + + + + + Q +   + = +   + 1 +   +   + ( +   + = +   + 1 + . + 1 + 1 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 2 +   +   + ( +   + = +   + 1 + . + 5 + 7 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 4 +   +   + ( +   + = +   + 2 + . + 2 + 2 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 8 +   +   + ( +   + = +   + 3 + . + 1 + 4 +   + m + ) + r + c + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distance from source [m] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10.1 dB = 10 lg(R2/R1) + + + Absorption moves the plateau, not the direct field + + + + + + + + + + + + + + + + + + + + + +   + ̄ + = +   + 0 + . + 0 + 5 +   +   + ( +   + = +   + 1 + 9 +   + m + ) + α + R + 2 + + + + + + + + + + +   + ̄ + = +   + 0 + . + 1 + 5 +   +   + ( +   + = +   + 6 + 2 +   + m + ) + α + R + 2 + + + + + + + + + + +   + ̄ + = +   + 0 + . + 3 + 5 +   +   + ( +   + = +   + 1 + 9 + 0 +   + m + ) + α + R + 2 + + + + + + + + + + + + + + + diff --git a/.github/images/steady_state_directivity_es.svg b/.github/images/steady_state_directivity_es.svg new file mode 100644 index 000000000..84cbdcaea --- /dev/null +++ b/.github/images/steady_state_directivity_es.svg @@ -0,0 +1,1538 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distance from source [m] + + + + + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 85 + + + + + + + + + + + + + 90 + + + + + + + + + + + + + 95 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 105 + + + + Sound pressure level [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 x 8 x 4 m workshop, S = 352 m^2, Lw = 90 dB re 1 pW + + + + + + Q + r +   + m + o + v + e + s +   + , +   + n + o + t +   + t + h + e +   + p + l + a + t + e + a + u + c + + + + + + + + + + + + + + + + + + + + + + + + + + + Q +   + = +   + 1 +   +   + ( +   + = +   + 1 + . + 1 + 1 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 2 +   +   + ( +   + = +   + 1 + . + 5 + 7 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 4 +   +   + ( +   + = +   + 2 + . + 2 + 2 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 8 +   +   + ( +   + = +   + 3 + . + 1 + 4 +   + m + ) + r + c + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distance from source [m] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10,1 dB = 10 lg(R2/R1) + + + Absorption moves the plateau, not the direct field + + + + + + + + + + + + + + + + + + + + + +   + ̄ + = +   + 0 + . + 0 + 5 +   +   + ( +   + = +   + 1 + 9 +   + m + ) + α + R + 2 + + + + + + + + + + +   + ̄ + = +   + 0 + . + 1 + 5 +   +   + ( +   + = +   + 6 + 2 +   + m + ) + α + R + 2 + + + + + + + + + + +   + ̄ + = +   + 0 + . + 3 + 5 +   +   + ( +   + = +   + 1 + 9 + 0 +   + m + ) + α + R + 2 + + + + + + + + + + + + + + + diff --git a/.github/images/steady_state_directivity_es_dark.svg b/.github/images/steady_state_directivity_es_dark.svg new file mode 100644 index 000000000..54db94a55 --- /dev/null +++ b/.github/images/steady_state_directivity_es_dark.svg @@ -0,0 +1,1538 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distance from source [m] + + + + + + + + + + + + + + + + + 75 + + + + + + + + + + + + + 80 + + + + + + + + + + + + + 85 + + + + + + + + + + + + + 90 + + + + + + + + + + + + + 95 + + + + + + + + + + + + + 100 + + + + + + + + + + + + + 105 + + + + Sound pressure level [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 x 8 x 4 m workshop, S = 352 m^2, Lw = 90 dB re 1 pW + + + + + + Q + r +   + m + o + v + e + s +   + , +   + n + o + t +   + t + h + e +   + p + l + a + t + e + a + u + c + + + + + + + + + + + + + + + + + + + + + + + + + + + Q +   + = +   + 1 +   +   + ( +   + = +   + 1 + . + 1 + 1 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 2 +   +   + ( +   + = +   + 1 + . + 5 + 7 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 4 +   +   + ( +   + = +   + 2 + . + 2 + 2 +   + m + ) + r + c + + + + + + + + + + + Q +   + = +   + 8 +   +   + ( +   + = +   + 3 + . + 1 + 4 +   + m + ) + r + c + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distance from source [m] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10,1 dB = 10 lg(R2/R1) + + + Absorption moves the plateau, not the direct field + + + + + + + + + + + + + + + + + + + + + +   + ̄ + = +   + 0 + . + 0 + 5 +   +   + ( +   + = +   + 1 + 9 +   + m + ) + α + R + 2 + + + + + + + + + + +   + ̄ + = +   + 0 + . + 1 + 5 +   +   + ( +   + = +   + 6 + 2 +   + m + ) + α + R + 2 + + + + + + + + + + +   + ̄ + = +   + 0 + . + 3 + 5 +   +   + ( +   + = +   + 1 + 9 + 0 +   + m + ) + α + R + 2 + + + + + + + + + + + + + + + diff --git a/.github/images/structure_borne_conversion.svg b/.github/images/structure_borne_conversion.svg new file mode 100644 index 000000000..ae45d3ffa --- /dev/null +++ b/.github/images/structure_borne_conversion.svg @@ -0,0 +1,495 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + Structure-borne power level [dB re 1 pW] + + + + + + + + + + + + + + + + + + + + + +6.8 dB = 10 lg(24.1/5.0): + a lighter receiver accepts more power + + + + + + EN 12354-5 Annex I.3 flushing cistern, wall contact + markers reproduce the printed Table I.8 columns + + + One Source, Four Levels: the EN 15657 Conversion Chain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L_Ws measured on the test plate (Y = 5.34e-6) + + + + + + + + + L_Wsn on the standard plate (Y = 5e-6): what is declared + + + + + + + + + L_Ws,inst on the receiving wall (Y = 24.1e-6) + + + + + + + + + L_Ws,c with the source mobility (Y = 1e-3): the input to EN 12354-5 + + + + + + + + + + + L_Ws,c - D_C, D_C = 16.2 dB: back to L_Ws,inst + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/structure_borne_conversion_dark.svg b/.github/images/structure_borne_conversion_dark.svg new file mode 100644 index 000000000..ee8afc4e1 --- /dev/null +++ b/.github/images/structure_borne_conversion_dark.svg @@ -0,0 +1,495 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + Structure-borne power level [dB re 1 pW] + + + + + + + + + + + + + + + + + + + + + +6.8 dB = 10 lg(24.1/5.0): + a lighter receiver accepts more power + + + + + + EN 12354-5 Annex I.3 flushing cistern, wall contact + markers reproduce the printed Table I.8 columns + + + One Source, Four Levels: the EN 15657 Conversion Chain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L_Ws measured on the test plate (Y = 5.34e-6) + + + + + + + + + L_Wsn on the standard plate (Y = 5e-6): what is declared + + + + + + + + + L_Ws,inst on the receiving wall (Y = 24.1e-6) + + + + + + + + + L_Ws,c with the source mobility (Y = 1e-3): the input to EN 12354-5 + + + + + + + + + + + L_Ws,c - D_C, D_C = 16.2 dB: back to L_Ws,inst + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/structure_borne_conversion_es.svg b/.github/images/structure_borne_conversion_es.svg new file mode 100644 index 000000000..2701c94ca --- /dev/null +++ b/.github/images/structure_borne_conversion_es.svg @@ -0,0 +1,495 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + Nivel de potencia estructural [dB re 1 pW] + + + + + + + + + + + + + + + + + + + + + +6,8 dB = 10 lg(24,1/5,0): + un receptor más ligero acepta más potencia + + + + + + Cisterna del anexo I.3 de la EN 12354-5, contacto en el muro + los marcadores reproducen las columnas impresas de la tabla I.8 + + + Una fuente, cuatro niveles: la cadena de conversión de la EN 15657 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L_Ws medido sobre la placa de ensayo (Y = 5,34e-6) + + + + + + + + + L_Wsn sobre la placa normalizada (Y = 5e-6): lo que se declara + + + + + + + + + L_Ws,inst sobre el muro receptor (Y = 24,1e-6) + + + + + + + + + L_Ws,c con la movilidad de la fuente (Y = 1e-3): la entrada de la EN 12354-5 + + + + + + + + + + + L_Ws,c - D_C, D_C = 16,2 dB: de vuelta a L_Ws,inst + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/structure_borne_conversion_es_dark.svg b/.github/images/structure_borne_conversion_es_dark.svg new file mode 100644 index 000000000..1522e3770 --- /dev/null +++ b/.github/images/structure_borne_conversion_es_dark.svg @@ -0,0 +1,495 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1000 + + + + + + + + + + + + + 2000 + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + + 40 + + + + + + + + + + + + + 50 + + + + + + + + + + + + + 60 + + + + + + + + + + + + + 70 + + + + + + + + + + + + + 80 + + + + Nivel de potencia estructural [dB re 1 pW] + + + + + + + + + + + + + + + + + + + + + +6,8 dB = 10 lg(24,1/5,0): + un receptor más ligero acepta más potencia + + + + + + Cisterna del anexo I.3 de la EN 12354-5, contacto en el muro + los marcadores reproducen las columnas impresas de la tabla I.8 + + + Una fuente, cuatro niveles: la cadena de conversión de la EN 15657 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L_Ws medido sobre la placa de ensayo (Y = 5,34e-6) + + + + + + + + + L_Wsn sobre la placa normalizada (Y = 5e-6): lo que se declara + + + + + + + + + L_Ws,inst sobre el muro receptor (Y = 24,1e-6) + + + + + + + + + L_Ws,c con la movilidad de la fuente (Y = 1e-3): la entrada de la EN 12354-5 + + + + + + + + + + + L_Ws,c - D_C, D_C = 16,2 dB: de vuelta a L_Ws,inst + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/structure_borne_power.svg b/.github/images/structure_borne_power.svg index 80aae5292..2b1aafe23 100644 --- a/.github/images/structure_borne_power.svg +++ b/.github/images/structure_borne_power.svg @@ -39,64 +39,64 @@ z @@ -111,40 +111,40 @@ z @@ -286,107 +286,107 @@ L -3.5 0 - - + - 10 + 10 - - + - 20 + 20 - - + - 30 + 30 - - + - 40 + 40 - - + - 50 + 50 - - + - 60 + 60 - - + - 70 + 70 diff --git a/.github/images/structure_borne_power_dark.svg b/.github/images/structure_borne_power_dark.svg index 0523af919..a557802a3 100644 --- a/.github/images/structure_borne_power_dark.svg +++ b/.github/images/structure_borne_power_dark.svg @@ -39,64 +39,64 @@ z @@ -111,40 +111,40 @@ z @@ -286,107 +286,107 @@ L -3.5 0 - - + - 10 + 10 - - + - 20 + 20 - - + - 30 + 30 - - + - 40 + 40 - - + - 50 + 50 - - + - 60 + 60 - - + - 70 + 70 diff --git a/.github/images/structure_borne_power_es.svg b/.github/images/structure_borne_power_es.svg index b2248be19..8d86b55d6 100644 --- a/.github/images/structure_borne_power_es.svg +++ b/.github/images/structure_borne_power_es.svg @@ -39,64 +39,64 @@ z @@ -111,40 +111,40 @@ z @@ -286,107 +286,107 @@ L -3.5 0 - - + - 10 + 10 - - + - 20 + 20 - - + - 30 + 30 - - + - 40 + 40 - - + - 50 + 50 - - + - 60 + 60 - - + - 70 + 70 diff --git a/.github/images/structure_borne_power_es_dark.svg b/.github/images/structure_borne_power_es_dark.svg index d1f215035..1e1ba9e4f 100644 --- a/.github/images/structure_borne_power_es_dark.svg +++ b/.github/images/structure_borne_power_es_dark.svg @@ -39,64 +39,64 @@ z @@ -111,40 +111,40 @@ z @@ -286,107 +286,107 @@ L -3.5 0 - - + - 10 + 10 - - + - 20 + 20 - - + - 30 + 30 - - + - 40 + 40 - - + - 50 + 50 - - + - 60 + 60 - - + - 70 + 70 diff --git a/.github/images/sweep_distortion_separation.svg b/.github/images/sweep_distortion_separation.svg new file mode 100644 index 000000000..c592c9c21 --- /dev/null +++ b/.github/images/sweep_distortion_separation.svg @@ -0,0 +1,11459 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + −0.6 + + + + + + + + + + + + + −0.4 + + + + + + + + + + + + + −0.2 + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + Arrival time relative to the linear impulse response [s] + + + + + + + + + + + + + + + + + −80 + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + 0 + + + + Level re peak [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + H2 + −0.30 s + + + H3 + −0.48 s + + + H4 + −0.60 s + + + causal part: what impulse_response() returns + + + Harmonic distortion lands before t = 0 (ISO 18233 B.5) + + + + + + + + + diff --git a/.github/images/sweep_distortion_separation_dark.svg b/.github/images/sweep_distortion_separation_dark.svg new file mode 100644 index 000000000..f4c43e325 --- /dev/null +++ b/.github/images/sweep_distortion_separation_dark.svg @@ -0,0 +1,11459 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + −0.6 + + + + + + + + + + + + + −0.4 + + + + + + + + + + + + + −0.2 + + + + + + + + + + + + + 0.0 + + + + + + + + + + + + + 0.2 + + + + + + + + + + + + + 0.4 + + + + Arrival time relative to the linear impulse response [s] + + + + + + + + + + + + + + + + + −80 + + + + + + + + + + + + + −60 + + + + + + + + + + + + + −40 + + + + + + + + + + + + + −20 + + + + + + + + + + + + + 0 + + + + Level re peak [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + H2 + −0.30 s + + + H3 + −0.48 s + + + H4 + −0.60 s + + + causal part: what impulse_response() returns + + + Harmonic distortion lands before t = 0 (ISO 18233 B.5) + + + + + + + + + diff --git a/.github/images/sweep_distortion_separation_es.svg b/.github/images/sweep_distortion_separation_es.svg new file mode 100644 index 000000000..a2d74dfb2 --- /dev/null +++ b/.github/images/sweep_distortion_separation_es.svg @@ -0,0 +1,11459 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0,6 + + + + + + + + + + + + + -0,4 + + + + + + + + + + + + + -0,2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + Tiempo de llegada respecto a la respuesta al impulso lineal [s] + + + + + + + + + + + + + + + + + -80 + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + 0 + + + + Nivel re pico [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + H2 + −0,30 s + + + H3 + −0,48 s + + + H4 + −0,60 s + + + parte causal: lo que devuelve impulse_response() + + + La distorsión armónica cae antes de t = 0 (ISO 18233 B.5) + + + + + + + + + diff --git a/.github/images/sweep_distortion_separation_es_dark.svg b/.github/images/sweep_distortion_separation_es_dark.svg new file mode 100644 index 000000000..9ae60e867 --- /dev/null +++ b/.github/images/sweep_distortion_separation_es_dark.svg @@ -0,0 +1,11459 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0,6 + + + + + + + + + + + + + -0,4 + + + + + + + + + + + + + -0,2 + + + + + + + + + + + + + 0 + + + + + + + + + + + + + 0,2 + + + + + + + + + + + + + 0,4 + + + + Tiempo de llegada respecto a la respuesta al impulso lineal [s] + + + + + + + + + + + + + + + + + -80 + + + + + + + + + + + + + -60 + + + + + + + + + + + + + -40 + + + + + + + + + + + + + -20 + + + + + + + + + + + + + 0 + + + + Nivel re pico [dB] + + + + + + + + + + + + + + + + + + + + + + + + + + + + H2 + −0,30 s + + + H3 + −0,48 s + + + H4 + −0,60 s + + + parte causal: lo que devuelve impulse_response() + + + La distorsión armónica cae antes de t = 0 (ISO 18233 B.5) + + + + + + + + + diff --git a/.github/images/tapping_force_spectrum.svg b/.github/images/tapping_force_spectrum.svg new file mode 100644 index 000000000..3ec211d66 --- /dev/null +++ b/.github/images/tapping_force_spectrum.svg @@ -0,0 +1,1002 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Line force |Fn| [N] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + f_limit = 555 Hz + + + + + + + + 6.0 dB in mean square + (4.43 N to 8.86 N) + + + + + + 0.5 kg hammer dropped 40 mm, 10 impacts per second + building acoustics range shaded + + + Tapping-Machine Force: the Floor Decides the Excitation + + + + + + + + + + + + + + + + + + + + + + 140 mm concrete slab (under-critical, fco = 6948 Hz) + + + + + + 22 mm chipboard walking surface (over-critical, fco = 589 Hz) + + + + + + |Fn|upper = 2 m vh / Ti (rebound) + + + + + + |Fn|lower = m vh / Ti (no rebound) + + + + + + + + + + diff --git a/.github/images/tapping_force_spectrum_dark.svg b/.github/images/tapping_force_spectrum_dark.svg new file mode 100644 index 000000000..88c0b93b5 --- /dev/null +++ b/.github/images/tapping_force_spectrum_dark.svg @@ -0,0 +1,1002 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Line force |Fn| [N] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + f_limit = 555 Hz + + + + + + + + 6.0 dB in mean square + (4.43 N to 8.86 N) + + + + + + 0.5 kg hammer dropped 40 mm, 10 impacts per second + building acoustics range shaded + + + Tapping-Machine Force: the Floor Decides the Excitation + + + + + + + + + + + + + + + + + + + + + + 140 mm concrete slab (under-critical, fco = 6948 Hz) + + + + + + 22 mm chipboard walking surface (over-critical, fco = 589 Hz) + + + + + + |Fn|upper = 2 m vh / Ti (rebound) + + + + + + |Fn|lower = m vh / Ti (no rebound) + + + + + + + + + + diff --git a/.github/images/tapping_force_spectrum_es.svg b/.github/images/tapping_force_spectrum_es.svg new file mode 100644 index 000000000..3c9749a9d --- /dev/null +++ b/.github/images/tapping_force_spectrum_es.svg @@ -0,0 +1,1002 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fuerza por línea |Fn| [N] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + f_límite = 555 Hz + + + + + + + + 6,0 dB en valor cuadrático medio + (de 4,43 N a 8,86 N) + + + + + + martillo de 0,5 kg desde 40 mm, 10 impactos por segundo + rango de acústica de la edificación sombreado + + + Fuerza de la máquina de impactos: el forjado decide la excitación + + + + + + + + + + + + + + + + + + + + + + forjado de hormigón de 140 mm (subcrítico, fco = 6948 Hz) + + + + + + tablero de partículas de 22 mm (supercrítico, fco = 589 Hz) + + + + + + |Fn|superior = 2 m vh / Ti (con rebote) + + + + + + |Fn|inferior = m vh / Ti (sin rebote) + + + + + + + + + + diff --git a/.github/images/tapping_force_spectrum_es_dark.svg b/.github/images/tapping_force_spectrum_es_dark.svg new file mode 100644 index 000000000..79f41689d --- /dev/null +++ b/.github/images/tapping_force_spectrum_es_dark.svg @@ -0,0 +1,1002 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + + 1 + 0 + 3 + + + + + + + + + + + + + + + + + + 1 + 0 + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + 1 + 0 + + 1 + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + + + + + + + + + + + + + + + + + + 1 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fuerza por línea |Fn| [N] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + f_límite = 555 Hz + + + + + + + + 6,0 dB en valor cuadrático medio + (de 4,43 N a 8,86 N) + + + + + + martillo de 0,5 kg desde 40 mm, 10 impactos por segundo + rango de acústica de la edificación sombreado + + + Fuerza de la máquina de impactos: el forjado decide la excitación + + + + + + + + + + + + + + + + + + + + + + forjado de hormigón de 140 mm (subcrítico, fco = 6948 Hz) + + + + + + tablero de partículas de 22 mm (supercrítico, fco = 589 Hz) + + + + + + |Fn|superior = 2 m vh / Ti (con rebote) + + + + + + |Fn|inferior = m vh / Ti (sin rebote) + + + + + + + + + + diff --git a/.github/images/tube_working_ranges.svg b/.github/images/tube_working_ranges.svg new file mode 100644 index 000000000..684cf586c --- /dev/null +++ b/.github/images/tube_working_ranges.svg @@ -0,0 +1,504 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 172 + + + 1544 Hz + + + 100 mm bore, s = 100 mm · top end: spacing 0.45 c/s + + + 343 + + + 1991 Hz + + + 100 mm bore, s = 50 mm · top end: cut-on 0.58 c/d + + + 858 + + + 6864 Hz + + + 29 mm bore, s = 20 mm · top end: cut-on 0.58 c/d + + + 34 + + + 1373 Hz + + + 100 mm bore, s = 100 mm (ASTM E2611) · top end: spacing 0.40 c/s + + + splice band + (the two tubes must agree) + + + Plane-Wave Working Range of an Impedance Tube + + + + + + + + + diff --git a/.github/images/tube_working_ranges_dark.svg b/.github/images/tube_working_ranges_dark.svg new file mode 100644 index 000000000..7aebc08de --- /dev/null +++ b/.github/images/tube_working_ranges_dark.svg @@ -0,0 +1,504 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31.5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequency [Hz] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 172 + + + 1544 Hz + + + 100 mm bore, s = 100 mm · top end: spacing 0.45 c/s + + + 343 + + + 1991 Hz + + + 100 mm bore, s = 50 mm · top end: cut-on 0.58 c/d + + + 858 + + + 6864 Hz + + + 29 mm bore, s = 20 mm · top end: cut-on 0.58 c/d + + + 34 + + + 1373 Hz + + + 100 mm bore, s = 100 mm (ASTM E2611) · top end: spacing 0.40 c/s + + + splice band + (the two tubes must agree) + + + Plane-Wave Working Range of an Impedance Tube + + + + + + + + + diff --git a/.github/images/tube_working_ranges_es.svg b/.github/images/tube_working_ranges_es.svg new file mode 100644 index 000000000..052d6f627 --- /dev/null +++ b/.github/images/tube_working_ranges_es.svg @@ -0,0 +1,504 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 172 + + + 1544 Hz + + + 100 mm bore, s = 100 mm · top end: spacing 0,45 c/s + + + 343 + + + 1991 Hz + + + 100 mm bore, s = 50 mm · top end: cut-on 0,58 c/d + + + 858 + + + 6864 Hz + + + 29 mm bore, s = 20 mm · top end: cut-on 0,58 c/d + + + 34 + + + 1373 Hz + + + 100 mm bore, s = 100 mm (ASTM E2611) · top end: spacing 0,40 c/s + + + splice band + (the two tubes must agree) + + + Plane-Wave Working Range of an Impedance Tube + + + + + + + + + diff --git a/.github/images/tube_working_ranges_es_dark.svg b/.github/images/tube_working_ranges_es_dark.svg new file mode 100644 index 000000000..26c48795c --- /dev/null +++ b/.github/images/tube_working_ranges_es_dark.svg @@ -0,0 +1,504 @@ + + + + + + + + image/svg+xml + + + Matplotlib v3.11.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31,5 + + + + + + + + + + + + + 63 + + + + + + + + + + + + + 125 + + + + + + + + + + + + + 250 + + + + + + + + + + + + + 500 + + + + + + + + + + + + + 1k + + + + + + + + + + + + + 2k + + + + + + + + + + + + + 4k + + + + + + + + + + + + + 8k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frecuencia [Hz] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 172 + + + 1544 Hz + + + 100 mm bore, s = 100 mm · top end: spacing 0,45 c/s + + + 343 + + + 1991 Hz + + + 100 mm bore, s = 50 mm · top end: cut-on 0,58 c/d + + + 858 + + + 6864 Hz + + + 29 mm bore, s = 20 mm · top end: cut-on 0,58 c/d + + + 34 + + + 1373 Hz + + + 100 mm bore, s = 100 mm (ASTM E2611) · top end: spacing 0,40 c/s + + + splice band + (the two tubes must agree) + + + Plane-Wave Working Range of an Impedance Tube + + + + + + + + + diff --git a/.github/reports/en15657_structure_borne_power_example.pdf b/.github/reports/en15657_structure_borne_power_example.pdf index 61c3318c8..af90f5882 100644 Binary files a/.github/reports/en15657_structure_borne_power_example.pdf and b/.github/reports/en15657_structure_borne_power_example.pdf differ diff --git a/.github/reports/en15657_structure_borne_power_example.webp b/.github/reports/en15657_structure_borne_power_example.webp index 56e4ce140..a46010607 100644 Binary files a/.github/reports/en15657_structure_borne_power_example.webp and b/.github/reports/en15657_structure_borne_power_example.webp differ diff --git a/docs/buildings/design/index.md b/docs/buildings/design/index.md index f4d965c51..288e6cada 100644 --- a/docs/buildings/design/index.md +++ b/docs/buildings/design/index.md @@ -38,10 +38,12 @@ detailed model buys is the spectrum behind the single number. [Predicting Panel Sound Insulation](panel-sound-insulation.md) goes one level deeper, to where the element $R$ itself comes from: the mass law -and the coincidence dip of a single panel, the mass-spring-mass behaviour of a -double wall, transmission through slits and apertures, plate radiation -efficiency and point mobilities. It is the physics a catalogue value expresses -in one number. +and the coincidence dip of a single panel, the plateau shortcut that estimates +the whole curve by hand, the coincidence *range* of a corrugated or ribbed sheet, +the mass-spring-mass behaviour of a double wall and the wall-tie bridge that +limits a masonry cavity one, transmission through slits and apertures, plate +radiation efficiency and point mobilities. It is the physics a catalogue value +expresses in one number. Two pages here carry the floor half of any design, one measuring and one predicting. @@ -70,15 +72,29 @@ takes that source description, loses part of it to the coupling term the source and receiver mobilities set, and carries the rest to a room that may be several junctions away. -One bookkeeping note runs through the whole section: the family exists as -EN 12354:2000 and as ISO 12354:2017, and the two are not interchangeable in -every clause. The simplified models on -[Predicting Sound Insulation](insulation-prediction.md) -follow the 2000 text — including the tabulated flanking correction $K$ that the -2017 impact part replaced with explicit per-path formulae — while -[Detailed Per-Band Prediction](detailed-prediction.md) -follows the 2017 text. Check which edition your regulation calls up before -quoting a correction from either. +**EN 12354 or ISO 12354?** One bookkeeping note runs through the whole section. +The prediction family was published by CEN as EN 12354-1 to -6 and later +reissued by ISO as a second edition, ISO 12354-1:2017 and ISO 12354-2:2017, +which is not word for word the earlier text: where a formula changed between the +prints, the [errata registry](https://jmrplens.github.io/phonometry/reference/errata/) records both. Parts +3 to 6 keep their EN designation in the editions used here. Every guide names +the edition it was read from — EN 12354-1:2000 and EN 12354-2:2000 for the +simplified models on +[Predicting Sound Insulation](insulation-prediction.md), +including the tabulated flanking correction $K$ that the 2017 impact part +replaced with explicit per-path formulae; ISO 12354-1:2017 and ISO 12354-2:2017 +for the per-band models and the Annex L/G worked examples of +[Detailed Per-Band Prediction](detailed-prediction.md); +and EN 12354-3:2000 to EN 12354-6:2003 for façades, service equipment and +enclosed spaces. Check which edition your regulation calls up before quoting a +clause or a correction from either. + +And one caveat both parts print, in Clause 5: the models predict the *measured* +performance of buildings **assuming good workmanship and high measurement +accuracy**. A prediction is therefore a statement about a correctly built +construction, not about the one that will be built; the standard's own advice is +to vary the uncertain inputs and read the spread in the answer, which +ISO 12354-1:2017 Annex K systematises into an uncertainty on the result. Every prediction here starts from measured data that came from somewhere else, and the design report has to say where. The element $R$ and $L_n$ come from @@ -103,9 +119,11 @@ measurement in [Sound insulation](../insulation/index.md). junction conversion, the flanking indices per band and the per-path contributions behind the rating. - [Predicting Panel Sound Insulation](panel-sound-insulation.md): - the mass law and coincidence dip (Sharp), double walls (Bies), slits and - apertures (Gomperts, Wilson-Soroka), radiation efficiency - (Leppington/Maidanik) and point mobilities (Cremer). + the mass law, the plateau shortcut and the coincidence dip of a single panel + (Sharp, Norton), the coincidence range of a corrugated or ribbed sheet + (Vigran/Heckl), double walls and the wall-tie bridge of a masonry cavity wall + (Bies, Hopkins), slits and apertures (Gomperts, Wilson-Soroka), radiation + efficiency (Leppington/Maidanik) and point mobilities (Cremer). - [Floor-Covering Impact Improvement (ISO 16251-1)](impact-improvement.md): the weighted improvement of a soft floor covering measured on a small heavyweight mock-up. diff --git a/docs/buildings/index.md b/docs/buildings/index.md index 80ac5d6f1..377a28aba 100644 --- a/docs/buildings/index.md +++ b/docs/buildings/index.md @@ -71,7 +71,8 @@ laboratory, and predicted from element data. the rubber ball and the bang machine, the impact force exposure level that specifies them and the ISO 717-2 Annex D single number. - [Laboratory Flanking Transmission (ISO 10848)](insulation/flanking-lab.md): - the measured junction vibration reduction index and the flanking descriptors. + the measured junction vibration reduction index, the flanking descriptors, + and the suspended-ceiling plenum path with its ceiling attenuation class. - [Insulation Ratings (ISO 717)](insulation/insulation-ratings.md): the reference-curve engines behind Rw, DnT,w, Ln,w and their adaptation terms. - [Façade Sound Insulation](insulation/facade-insulation.md): the diff --git a/docs/buildings/insulation/index.md b/docs/buildings/insulation/index.md index 14b890acd..61d8a9ffe 100644 --- a/docs/buildings/insulation/index.md +++ b/docs/buildings/insulation/index.md @@ -76,8 +76,9 @@ related EN 12354-5, lives in the octave-band control method, its reverberation index and its survey quantities. - [Laboratory Flanking Transmission (ISO 10848)](flanking-lab.md): - the measured vibration reduction index Kij and the flanking descriptors - Dn,f and Ln,f. + the measured vibration reduction index Kij, the flanking descriptors Dn,f + and Ln,f, and the suspended-ceiling plenum path with its normalized ceiling + attenuation Dn,c and ceiling attenuation class. - [Heavy and Soft Impact Sources (ISO 16283-2)](heavy-impact-sources.md): the rubber ball and the bang machine, the impact force exposure levels that specify them, the Fast-weighted maximum level and the ISO 717-2 Annex D diff --git a/docs/buildings/rooms/room-image-sources.md b/docs/buildings/rooms/room-image-sources.md index b4f79e053..a6d3491d2 100644 --- a/docs/buildings/rooms/room-image-sources.md +++ b/docs/buildings/rooms/room-image-sources.md @@ -182,6 +182,26 @@ plt.show() +### `image_source_rir()` parameters + +| Parameter | Type | Units | Range / default | Notes | +| :--- | :--- | :--- | :--- | :--- | +| `dimensions` | (float, float, float) | m | all > 0 | Room lengths `(Lx, Ly, Lz)` | +| `source` / `receiver` | (float, float, float) | m | strictly inside the room | Positions `(x, y, z)` | +| `absorption` | scalar / (6,) / (n,) / (6, n) | -- | `[0, 1]` | Uniform, per-wall, per-band, or per-wall per-band | +| `fs` | int | Hz | > 0 | Sample rate | +| `max_order` | int | -- | >= 0, default 20 | Reflection-order cut-off | +| `speed_of_sound` | float | m/s | > 0, default 343 | Speed of sound `c` | +| `air_attenuation` | float or (n,) | Np/m | >= 0, default 0 | Air power (intensity) attenuation coefficient `m` | +| `duration` | float, optional | s | > 0 | RIR length (default: last image arrival) | +| `frequencies` | (n,), optional | Hz | -- | Band centres labelling a per-band result | + +Returns an `ImageSourceResult` (`ir`, `fs`, `frequencies`, and the exact +`times`/`distances`/`orders`/`amplitudes`/`image_positions` reflection table) +with `.plot()`, `.plot_geometry()` and a `direct_time` property. +`audible_image_count(order)` gives the shoebox image count and +`reflection_density(t, volume)` the density $4\pi c^3 t^2 / V$. + **Reproducing the statistical decay.** The fitted initial decay slope of the reverberant energy density of the synthetic RIR recovers the **Eyring** reverberation time $T = -24 V \ln 10 / (c S \ln(1 - \bar\alpha))$ (Kuttruff @@ -292,6 +312,26 @@ plt.show() +### `steady_state_field()` parameters + +| Parameter | Type | Units | Range / default | Notes | +| :--- | :--- | :--- | :--- | :--- | +| `sound_power_level` | float | dB re 1 pW | -- | Source power level `Lw` | +| `surface_area` | float | m2 | > 0 | Total boundary area `S` | +| `mean_absorption` | float | -- | `(0, 1)` | Mean Sabine absorption `alpha_bar` | +| `distances` | 1D array, optional | m | > 0 | Distance grid (default: `0.1 rc` to `10 rc`) | +| `directivity` | float | -- | > 0, default 1 | Source directivity factor `Q` | +| `characteristic_impedance` | float, optional | Pa*s/m | > 0 | Adds the `10 lg(rho c / 400)` term | + +Returns a `SteadyFieldResult` (`distances`, `direct`, `reverberant`, `total`, +`critical_distance`, `room_constant`) with `.plot()`. The pieces +`room_constant`, `critical_distance`, `schroeder_frequency` and +`steady_state_spl` are also callable directly, and each accepts per-band arrays. +`steady_state_spl` additionally takes `source_model`, one of `constant_power` +(the default), `constant_volume` or `constant_pressure`: whether the mounting +that raises `Q` also raises the radiated power is a modelling choice worth up to +18 dB for a corner source, and it should be stated in any report. + The **Schroeder frequency** $$ diff --git a/docs/materials/resilient/dynamic-stiffness.md b/docs/materials/resilient/dynamic-stiffness.md index 2a356a2c2..4d17437db 100644 --- a/docs/materials/resilient/dynamic-stiffness.md +++ b/docs/materials/resilient/dynamic-stiffness.md @@ -61,7 +61,7 @@ $$ s'_t = 4\pi^2\,m'_t\,f_r^2 . $$ -ISO 9052-1 resonance rig: a vertical exciter and an accelerometer on the load plate over the 200 mm by 200 mm resilient specimen, read as a mass-spring system whose response peak gives the resonant frequency and the apparent dynamic stiffness +EN 29052-1 resonance rig in three panels: the three excitation arrangements of Figures 1 to 3, one on a rigid foundation with the load plate driven and measured, two on an isolated baseplate of at least 100 kg where both plates are measured and the exciter drives either the load plate or the baseplate; below, the specimen and load requirements with the plaster bed, the steel load plate and the petroleum-jelly fillet, and the mass-spring model whose response peak gives the resonant frequency In the test arrangement the specimen lies between the rigid foundation and a load plate whose total mass per unit area, plate plus added load, is diff --git a/docs/reference/glossary.md b/docs/reference/glossary.md index 334a61b11..70b43d94b 100644 --- a/docs/reference/glossary.md +++ b/docs/reference/glossary.md @@ -152,14 +152,14 @@ check that pins each quantity to its standard's own expected value. | Symbol | Definition | Unit | Defined in | Computed in | | :--- | :--- | :--- | :--- | :--- | -| $T_{20}$ | Reverberation time extrapolated to a 60 dB decay from a least-squares fit over −5 dB to −25 dB of the Schroeder curve. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room Acoustics](../buildings/rooms/room-acoustics.md) | -| $T_{30}$ | The same extrapolation from a fit over −5 dB to −35 dB, the usual choice when the decay range allows it. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room Acoustics](../buildings/rooms/room-acoustics.md) | -| $T_{60}$, RT | Reverberation time as such: the time for the sound energy to fall by 60 dB. Measured in practice as $T_{20}$ or $T_{30}$. | s | ISO 3382-1:2009 | [Room Acoustics](../buildings/rooms/room-acoustics.md) | -| EDT | Early decay time: the same slope taken over the first 10 dB of decay, which tracks perceived reverberance rather than the tail. | s | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room Acoustics](../buildings/rooms/room-acoustics.md) | -| $C_{50}$ | Clarity for speech: the energy ratio between the first 50 ms of the impulse response and everything after it. | dB | ISO 3382-1:2009 | [Room Acoustics](../buildings/rooms/room-acoustics.md) | -| $C_{80}$ | Clarity for music: the same ratio with the boundary at 80 ms. | dB | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room Acoustics](../buildings/rooms/room-acoustics.md) | -| $D_{50}$ | Definition, or Deutlichkeit: the fraction of the total energy arriving in the first 50 ms. | dimensionless | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room Acoustics](../buildings/rooms/room-acoustics.md) | -| $T_s$ (centre time) | Centre time: the centre of gravity of the squared impulse response in time, a boundary-free alternative to the clarity indices. It runs to tens of milliseconds in a room; the building-prediction guides write $T_s$ for something else entirely, the structural reverberation time of a plate, which is seconds. | s | ISO 3382-1:2009, Equation (A.13) | [Room Acoustics](../buildings/rooms/room-acoustics.md) | +| $T_{20}$ | Reverberation time extrapolated to a 60 dB decay from a least-squares fit over −5 dB to −25 dB of the Schroeder curve. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room acoustic parameters (ISO 3382-1/2)](../buildings/rooms/room-acoustics.md) | +| $T_{30}$ | The same extrapolation from a fit over −5 dB to −35 dB, the usual choice when the decay range allows it. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room acoustic parameters (ISO 3382-1/2)](../buildings/rooms/room-acoustics.md) | +| $T_{60}$, RT | Reverberation time as such: the time for the sound energy to fall by 60 dB. Measured in practice as $T_{20}$ or $T_{30}$. | s | ISO 3382-1:2009 | [Room acoustic parameters (ISO 3382-1/2)](../buildings/rooms/room-acoustics.md) | +| EDT | Early decay time: the same slope taken over the first 10 dB of decay, which tracks perceived reverberance rather than the tail. | s | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room acoustic parameters (ISO 3382-1/2)](../buildings/rooms/room-acoustics.md) | +| $C_{50}$ | Clarity for speech: the energy ratio between the first 50 ms of the impulse response and everything after it. | dB | ISO 3382-1:2009 | [Room acoustic parameters (ISO 3382-1/2)](../buildings/rooms/room-acoustics.md) | +| $C_{80}$ | Clarity for music: the same ratio with the boundary at 80 ms. | dB | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room acoustic parameters (ISO 3382-1/2)](../buildings/rooms/room-acoustics.md) | +| $D_{50}$ | Definition, or Deutlichkeit: the fraction of the total energy arriving in the first 50 ms. | dimensionless | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room acoustic parameters (ISO 3382-1/2)](../buildings/rooms/room-acoustics.md) | +| $T_s$ (centre time) | Centre time: the centre of gravity of the squared impulse response in time, a boundary-free alternative to the clarity indices. It runs to tens of milliseconds in a room; the building-prediction guides write $T_s$ for something else entirely, the structural reverberation time of a plate, which is seconds. | s | ISO 3382-1:2009, Equation (A.13) | [Room acoustic parameters (ISO 3382-1/2)](../buildings/rooms/room-acoustics.md) | | $A$ | Equivalent sound absorption area of a room: the area of a perfectly absorbing surface that would give the same reverberation time. | m² | ISO 354:2003, Equations (5) and (7) | [Sound Absorption Measurement and Rating](../materials/absorbers/absorption-measurement.md) | | NC | Noise criteria rating of a background spectrum: the speech interference level selects the curve, and the tangency method rates the spectrum when a band exceeds it. | dB (index) | ANSI/ASA S12.2-2019, 5.2.2 and 5.2.3 (curves in Table 1) | [Room-noise criteria (NC / RC Mark II)](../buildings/rooms/room-noise.md) | | SIL | Speech interference level: the average of the 500, 1000, 2000 and 4000 Hz octave-band levels. | dB | ANSI/ASA S12.2-2019, clause 3.2 | [Room-noise criteria (NC / RC Mark II)](../buildings/rooms/room-noise.md) | diff --git a/llms-full.txt b/llms-full.txt index 34d93b121..fd987d7c4 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -2518,10 +2518,12 @@ detailed model buys is the spectrum behind the single number. [Predicting Panel Sound Insulation](https://jmrplens.github.io/phonometry/buildings/design/panel-sound-insulation/) goes one level deeper, to where the element $R$ itself comes from: the mass law -and the coincidence dip of a single panel, the mass-spring-mass behaviour of a -double wall, transmission through slits and apertures, plate radiation -efficiency and point mobilities. It is the physics a catalogue value expresses -in one number. +and the coincidence dip of a single panel, the plateau shortcut that estimates +the whole curve by hand, the coincidence *range* of a corrugated or ribbed sheet, +the mass-spring-mass behaviour of a double wall and the wall-tie bridge that +limits a masonry cavity one, transmission through slits and apertures, plate +radiation efficiency and point mobilities. It is the physics a catalogue value +expresses in one number. Two pages here carry the floor half of any design, one measuring and one predicting. @@ -2550,15 +2552,29 @@ takes that source description, loses part of it to the coupling term the source and receiver mobilities set, and carries the rest to a room that may be several junctions away. -One bookkeeping note runs through the whole section: the family exists as -EN 12354:2000 and as ISO 12354:2017, and the two are not interchangeable in -every clause. The simplified models on -[Predicting Sound Insulation](https://jmrplens.github.io/phonometry/buildings/design/insulation-prediction/) -follow the 2000 text — including the tabulated flanking correction $K$ that the -2017 impact part replaced with explicit per-path formulae — while -[Detailed Per-Band Prediction](https://jmrplens.github.io/phonometry/buildings/design/detailed-prediction/) -follows the 2017 text. Check which edition your regulation calls up before -quoting a correction from either. +**EN 12354 or ISO 12354?** One bookkeeping note runs through the whole section. +The prediction family was published by CEN as EN 12354-1 to -6 and later +reissued by ISO as a second edition, ISO 12354-1:2017 and ISO 12354-2:2017, +which is not word for word the earlier text: where a formula changed between the +prints, the [errata registry](https://jmrplens.github.io/phonometry/reference/errata/) records both. Parts +3 to 6 keep their EN designation in the editions used here. Every guide names +the edition it was read from — EN 12354-1:2000 and EN 12354-2:2000 for the +simplified models on +[Predicting Sound Insulation](https://jmrplens.github.io/phonometry/buildings/design/insulation-prediction/), +including the tabulated flanking correction $K$ that the 2017 impact part +replaced with explicit per-path formulae; ISO 12354-1:2017 and ISO 12354-2:2017 +for the per-band models and the Annex L/G worked examples of +[Detailed Per-Band Prediction](https://jmrplens.github.io/phonometry/buildings/design/detailed-prediction/); +and EN 12354-3:2000 to EN 12354-6:2003 for façades, service equipment and +enclosed spaces. Check which edition your regulation calls up before quoting a +clause or a correction from either. + +And one caveat both parts print, in Clause 5: the models predict the *measured* +performance of buildings **assuming good workmanship and high measurement +accuracy**. A prediction is therefore a statement about a correctly built +construction, not about the one that will be built; the standard's own advice is +to vary the uncertain inputs and read the spread in the answer, which +ISO 12354-1:2017 Annex K systematises into an uncertainty on the result. Every prediction here starts from measured data that came from somewhere else, and the design report has to say where. The element $R$ and $L_n$ come from @@ -2583,9 +2599,11 @@ measurement in [Sound insulation](https://jmrplens.github.io/phonometry/building junction conversion, the flanking indices per band and the per-path contributions behind the rating. - [Predicting Panel Sound Insulation](https://jmrplens.github.io/phonometry/buildings/design/panel-sound-insulation/): - the mass law and coincidence dip (Sharp), double walls (Bies), slits and - apertures (Gomperts, Wilson-Soroka), radiation efficiency - (Leppington/Maidanik) and point mobilities (Cremer). + the mass law, the plateau shortcut and the coincidence dip of a single panel + (Sharp, Norton), the coincidence range of a corrugated or ribbed sheet + (Vigran/Heckl), double walls and the wall-tie bridge of a masonry cavity wall + (Bies, Hopkins), slits and apertures (Gomperts, Wilson-Soroka), radiation + efficiency (Leppington/Maidanik) and point mobilities (Cremer). - [Floor-Covering Impact Improvement (ISO 16251-1)](https://jmrplens.github.io/phonometry/buildings/design/impact-improvement/): the weighted improvement of a soft floor covering measured on a small heavyweight mock-up. @@ -4820,7 +4838,8 @@ laboratory, and predicted from element data. the rubber ball and the bang machine, the impact force exposure level that specifies them and the ISO 717-2 Annex D single number. - [Laboratory Flanking Transmission (ISO 10848)](https://jmrplens.github.io/phonometry/buildings/insulation/flanking-lab/): - the measured junction vibration reduction index and the flanking descriptors. + the measured junction vibration reduction index, the flanking descriptors, + and the suspended-ceiling plenum path with its ceiling attenuation class. - [Insulation Ratings (ISO 717)](https://jmrplens.github.io/phonometry/buildings/insulation/insulation-ratings/): the reference-curve engines behind Rw, DnT,w, Ln,w and their adaptation terms. - [Façade Sound Insulation](https://jmrplens.github.io/phonometry/buildings/insulation/facade-insulation/): the @@ -6259,8 +6278,9 @@ related EN 12354-5, lives in the octave-band control method, its reverberation index and its survey quantities. - [Laboratory Flanking Transmission (ISO 10848)](https://jmrplens.github.io/phonometry/buildings/insulation/flanking-lab/): - the measured vibration reduction index Kij and the flanking descriptors - Dn,f and Ln,f. + the measured vibration reduction index Kij, the flanking descriptors Dn,f + and Ln,f, and the suspended-ceiling plenum path with its normalized ceiling + attenuation Dn,c and ceiling attenuation class. - [Heavy and Soft Impact Sources (ISO 16283-2)](https://jmrplens.github.io/phonometry/buildings/insulation/heavy-impact-sources/): the rubber ball and the bang machine, the impact force exposure levels that specify them, the Fast-weighted maximum level and the ISO 717-2 Annex D @@ -10133,6 +10153,26 @@ plt.show() +### `image_source_rir()` parameters + +| Parameter | Type | Units | Range / default | Notes | +| :--- | :--- | :--- | :--- | :--- | +| `dimensions` | (float, float, float) | m | all > 0 | Room lengths `(Lx, Ly, Lz)` | +| `source` / `receiver` | (float, float, float) | m | strictly inside the room | Positions `(x, y, z)` | +| `absorption` | scalar / (6,) / (n,) / (6, n) | -- | `[0, 1]` | Uniform, per-wall, per-band, or per-wall per-band | +| `fs` | int | Hz | > 0 | Sample rate | +| `max_order` | int | -- | >= 0, default 20 | Reflection-order cut-off | +| `speed_of_sound` | float | m/s | > 0, default 343 | Speed of sound `c` | +| `air_attenuation` | float or (n,) | Np/m | >= 0, default 0 | Air power (intensity) attenuation coefficient `m` | +| `duration` | float, optional | s | > 0 | RIR length (default: last image arrival) | +| `frequencies` | (n,), optional | Hz | -- | Band centres labelling a per-band result | + +Returns an `ImageSourceResult` (`ir`, `fs`, `frequencies`, and the exact +`times`/`distances`/`orders`/`amplitudes`/`image_positions` reflection table) +with `.plot()`, `.plot_geometry()` and a `direct_time` property. +`audible_image_count(order)` gives the shoebox image count and +`reflection_density(t, volume)` the density $4\pi c^3 t^2 / V$. + **Reproducing the statistical decay.** The fitted initial decay slope of the reverberant energy density of the synthetic RIR recovers the **Eyring** reverberation time $T = -24 V \ln 10 / (c S \ln(1 - \bar\alpha))$ (Kuttruff @@ -10243,6 +10283,26 @@ plt.show() +### `steady_state_field()` parameters + +| Parameter | Type | Units | Range / default | Notes | +| :--- | :--- | :--- | :--- | :--- | +| `sound_power_level` | float | dB re 1 pW | -- | Source power level `Lw` | +| `surface_area` | float | m2 | > 0 | Total boundary area `S` | +| `mean_absorption` | float | -- | `(0, 1)` | Mean Sabine absorption `alpha_bar` | +| `distances` | 1D array, optional | m | > 0 | Distance grid (default: `0.1 rc` to `10 rc`) | +| `directivity` | float | -- | > 0, default 1 | Source directivity factor `Q` | +| `characteristic_impedance` | float, optional | Pa*s/m | > 0 | Adds the `10 lg(rho c / 400)` term | + +Returns a `SteadyFieldResult` (`distances`, `direct`, `reverberant`, `total`, +`critical_distance`, `room_constant`) with `.plot()`. The pieces +`room_constant`, `critical_distance`, `schroeder_frequency` and +`steady_state_spl` are also callable directly, and each accepts per-band arrays. +`steady_state_spl` additionally takes `source_model`, one of `constant_power` +(the default), `constant_volume` or `constant_pressure`: whether the mounting +that raises `Q` also raises the radiated power is a modelling choice worth up to +18 dB for a corner source, and it should be stated in any report. + The **Schroeder frequency** $$ @@ -25150,7 +25210,7 @@ $$ s'_t = 4\pi^2\,m'_t\,f_r^2 . $$ -ISO 9052-1 resonance rig: a vertical exciter and an accelerometer on the load plate over the 200 mm by 200 mm resilient specimen, read as a mass-spring system whose response peak gives the resonant frequency and the apparent dynamic stiffness +EN 29052-1 resonance rig in three panels: the three excitation arrangements of Figures 1 to 3, one on a rigid foundation with the load plate driven and measured, two on an isolated baseplate of at least 100 kg where both plates are measured and the exciter drives either the load plate or the baseplate; below, the specimen and load requirements with the plaster bed, the steel load plate and the petroleum-jelly fillet, and the mass-spring model whose response peak gives the resonant frequency In the test arrangement the specimen lies between the rigid foundation and a load plate whose total mass per unit area, plate plus added load, is @@ -32861,14 +32921,14 @@ check that pins each quantity to its standard's own expected value. | Symbol | Definition | Unit | Defined in | Computed in | | :--- | :--- | :--- | :--- | :--- | -| $T_{20}$ | Reverberation time extrapolated to a 60 dB decay from a least-squares fit over −5 dB to −25 dB of the Schroeder curve. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $T_{30}$ | The same extrapolation from a fit over −5 dB to −35 dB, the usual choice when the decay range allows it. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $T_{60}$, RT | Reverberation time as such: the time for the sound energy to fall by 60 dB. Measured in practice as $T_{20}$ or $T_{30}$. | s | ISO 3382-1:2009 | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| EDT | Early decay time: the same slope taken over the first 10 dB of decay, which tracks perceived reverberance rather than the tail. | s | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $C_{50}$ | Clarity for speech: the energy ratio between the first 50 ms of the impulse response and everything after it. | dB | ISO 3382-1:2009 | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $C_{80}$ | Clarity for music: the same ratio with the boundary at 80 ms. | dB | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $D_{50}$ | Definition, or Deutlichkeit: the fraction of the total energy arriving in the first 50 ms. | dimensionless | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $T_s$ (centre time) | Centre time: the centre of gravity of the squared impulse response in time, a boundary-free alternative to the clarity indices. It runs to tens of milliseconds in a room; the building-prediction guides write $T_s$ for something else entirely, the structural reverberation time of a plate, which is seconds. | s | ISO 3382-1:2009, Equation (A.13) | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $T_{20}$ | Reverberation time extrapolated to a 60 dB decay from a least-squares fit over −5 dB to −25 dB of the Schroeder curve. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $T_{30}$ | The same extrapolation from a fit over −5 dB to −35 dB, the usual choice when the decay range allows it. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $T_{60}$, RT | Reverberation time as such: the time for the sound energy to fall by 60 dB. Measured in practice as $T_{20}$ or $T_{30}$. | s | ISO 3382-1:2009 | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| EDT | Early decay time: the same slope taken over the first 10 dB of decay, which tracks perceived reverberance rather than the tail. | s | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $C_{50}$ | Clarity for speech: the energy ratio between the first 50 ms of the impulse response and everything after it. | dB | ISO 3382-1:2009 | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $C_{80}$ | Clarity for music: the same ratio with the boundary at 80 ms. | dB | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $D_{50}$ | Definition, or Deutlichkeit: the fraction of the total energy arriving in the first 50 ms. | dimensionless | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $T_s$ (centre time) | Centre time: the centre of gravity of the squared impulse response in time, a boundary-free alternative to the clarity indices. It runs to tens of milliseconds in a room; the building-prediction guides write $T_s$ for something else entirely, the structural reverberation time of a plate, which is seconds. | s | ISO 3382-1:2009, Equation (A.13) | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | | $A$ | Equivalent sound absorption area of a room: the area of a perfectly absorbing surface that would give the same reverberation time. | m² | ISO 354:2003, Equations (5) and (7) | [Sound Absorption Measurement and Rating](https://jmrplens.github.io/phonometry/materials/absorbers/absorption-measurement/) | | NC | Noise criteria rating of a background spectrum: the speech interference level selects the curve, and the tangency method rates the spectrum when a band exceeds it. | dB (index) | ANSI/ASA S12.2-2019, 5.2.2 and 5.2.3 (curves in Table 1) | [Room-noise criteria (NC / RC Mark II)](https://jmrplens.github.io/phonometry/buildings/rooms/room-noise/) | | SIL | Speech interference level: the average of the 500, 1000, 2000 and 4000 Hz octave-band levels. | dB | ANSI/ASA S12.2-2019, clause 3.2 | [Room-noise criteria (NC / RC Mark II)](https://jmrplens.github.io/phonometry/buildings/rooms/room-noise/) | diff --git a/scripts/check_doc_snippets.py b/scripts/check_doc_snippets.py index 4bde201fd..1951bbbe8 100644 --- a/scripts/check_doc_snippets.py +++ b/scripts/check_doc_snippets.py @@ -73,7 +73,6 @@ "correlation-delay": "excerpt: starts from the record of the prose", "detailed-prediction": "excerpt: starts from the paths of the prose", "electroacoustics": "excerpt: starts from the captured signal of the prose", - "flanking-lab": "excerpt: starts from the measured levels of the prose", "impulsive-sound": "excerpt: starts from the recording of the prose", "intensity": "excerpt: starts from the band levels of the prose", "machine-diagnostics": "excerpt: starts from the record of the prose", diff --git a/scripts/diagrams/buildings.py b/scripts/diagrams/buildings.py index 0ad7cc2ca..c5ecb0967 100644 --- a/scripts/diagrams/buildings.py +++ b/scripts/diagrams/buildings.py @@ -11,7 +11,7 @@ from __future__ import annotations from .canvas import SVG, Theme -from .parts import _accel, _rot_arrow, _spring_v +from .parts import _accel, _accel_wall, _rot_arrow, _spring_v # --------------------------------------------------------------------------- # d8 - Airborne sound insulation setup (ISO 16283-1) @@ -119,6 +119,113 @@ def box(x: float, y: float, title: str, subs: list[str], color: str, "microphone signal.", 18, th.fg) +def _d_sweep_budget(s: SVG, th: Theme) -> None: + """Dimensioning the excitation for a room with T = 1.2 s (ISO 18233). + + Three time lanes on one page: the sweep with its appended silence + (B.3.1), the MLS period against the reverberation time (6.2.2.2, + Eq. (10)) with the discarded warm-up, and the deconvolved record where + the harmonic products land at negative arrival times (B.5). + """ + reverberation = 1.2 + x0, x1 = 118.0, 838.0 + span = 6.0 # seconds across the lanes + ppm = (x1 - x0) / span # pixels per second + + def tick_axis(y: float, first: float, last: float, step: float, + origin: float = 0.0) -> None: + s.line(x0, y, x1, y, th.fg, 2.0) + value = first + while value <= last + 1e-9: + xx = x0 + (value - origin) * ppm + s.line(xx, y, xx, y + 7, th.fg, 1.4) + s.text(xx, y + 25, f"{value:g}", 14, th.muted, "middle") + value += step + + # --- Lane 1: the sweep and the silence that follows it ----------------- + y1 = 150.0 + s.text(x0, 80, "1 What you play, and how long you keep recording", 18, + th.fg, "start", bold=True) + sweep_end = 4.0 + record_end = sweep_end + reverberation + s.rect(x0, y1 - 34, sweep_end * ppm, 34, th.primary, th.fg, rx=4, sw=1.6) + s.text(x0 + sweep_end * ppm / 2, y1 - 12, "sweep, 4.0 s = 3.3 × T", 16, + th.bg, "middle", bold=True) + s.rect(x0 + sweep_end * ppm, y1 - 34, reverberation * ppm, 34, th.panel, + th.fg, rx=4, sw=1.6, dash="5,4") + s.text(x0 + (sweep_end + reverberation / 2) * ppm, y1 - 12, "silence ≈ T", + 15, th.fg, "middle") + s.dim(x0, y1 - 46, x0 + record_end * ppm, y1 - 46, + "record window 5.2 s", offset=0, size=15) + tick_axis(y1, 0.0, 6.0, 1.0) + s.text(x1, y1 + 46, "B.3.1: sweep 2–4 × T, silent gap ≈ T | " + "B.6: +3 dB effective SNR per doubling", 14, th.muted, + "end") + + # --- Lane 2: the MLS period against the reverberation time ------------- + y2 = 296.0 + s.text(x0, 228, "2 If the excitation repeats, the period must exceed T " + "(6.2.2.2)", 18, th.fg, "start", bold=True) + period = (2 ** 17 - 1) / 48000.0 # order 17 at 48 kHz = 2.73 s + for index in range(2): + left = x0 + index * period * ppm + good = index > 0 + s.rect(left, y2 - 30, period * ppm, 30, + th.panel if good else th.bg, th.fg, rx=3, sw=1.5, + dash="" if good else "4,4") + s.text(left + period * ppm / 2, y2 - 10, + "period 2, kept" if good else "period 1, warm-up: discarded", + 15, th.fg if good else th.muted, "middle", bold=good) + s.dim(x0, y2 - 46, x0 + period * ppm, y2 - 46, + "order 17 → 2.73 s ≥ T", offset=0, size=15) + # The failure: an order too low folds the tail onto the head. + short = (2 ** 15 - 1) / 48000.0 # order 15 = 0.68 s < T + s.rect(x0, y2 + 40, short * ppm, 26, th.bg, th.secondary, rx=3, sw=1.6) + s.text(x0 + short * ppm / 2, y2 + 58, f"{short:.2f} s", 13, th.secondary, + "middle", bold=True) + s.text(x0 + short * ppm + 14, y2 + 58, + "order 15 is shorter than T: the tail folds onto the head and " + "T comes out short", 15, th.secondary, "start") + tick_axis(y2, 0.0, 6.0, 1.0) + + # --- Lane 3: what the deconvolution returns ---------------------------- + y3 = 470.0 + origin = 1.2 # the axis starts at -1.2 s + s.text(x0, 386, "3 After linear deconvolution (B.5)", 18, th.fg, "start", + bold=True) + zero = x0 + origin * ppm + # Harmonic packets at t = -T_sweep ln N / ln(f2/f1), f2/f1 = 1000. + import math + for order, height in ((2, 46.0), (3, 34.0), (4, 24.0)): + advance = sweep_end * math.log(order) / math.log(1000.0) + xx = zero - advance * ppm + s.line(xx, y3, xx, y3 - height, th.secondary, 2.4) + s.text(xx, y3 - height - 8, f"H{order:d}", 14, th.secondary, "middle", + bold=True) + # The linear impulse response and its decaying tail. + s.line(zero, y3, zero, y3 - 92, th.primary, 3.0) + tail = "M " + " L ".join( + f"{zero + t * ppm:.1f} {y3 - 92 * math.exp(-3.0 * t):.1f}" + for t in [i * 0.05 for i in range(1, 25)] + ) + s.path(tail, stroke=th.primary, sw=1.6) + s.line(zero, y3 - 118, zero, y3 + 16, th.fg, 1.6, dash="6,4") + s.text(zero + 10, y3 + 34, "kept by default: the linear impulse response and its tail", 15, th.primary, "start", bold=True) + s.text(zero - 14, y3 + 34, "discarded, or read as distortion", 15, + th.secondary, "end") + # The deconvolution's own noise tail, decaying and low-passed. + late = "M " + " L ".join( + f"{zero + t * ppm:.1f} {y3 - 30 * math.exp(-0.9 * (t - 1.2)):.1f}" + for t in [1.2 + i * 0.1 for i in range(1, 30)] + ) + s.path(late, stroke=th.muted, sw=1.4, dash="5,4") + s.text(x1, y3 - 44, "the linear deconvolution's own decaying noise tail — " + "not the room", 14, th.muted, "end") + tick_axis(y3, -1.0, 4.0, 1.0, origin=-origin) + s.text(x1, y3 + 58, "Arrival time relative to the linear impulse response " + "[s]", 15, th.fg, "end") + + # --------------------------------------------------------------------------- # d11 - ISO 16283-2 impact sound insulation setup # --------------------------------------------------------------------------- @@ -298,9 +405,29 @@ def _d_room_measurement(s: SVG, th: Theme) -> None: ISO 3382-2:2008 Table 1 minimum position counts for the three grades. """ # --- Room plan (top view) ------------------------------------------------ + # A 10.0 x 6.0 m room drawn at 50 px per metre; with a 3.5 m ceiling that + # is V = 210 m3, so an expected T of 0.6 s gives d_min = 2.0 m exactly. rx, ry, rw, rh = 60.0, 96.0, 500.0, 300.0 + d_min = 2.0 * 50.0 # 2.0 m at 50 px per metre s.rect(rx, ry, rw, rh, th.panel, th.fg, rx=6, sw=2.4) - s.text(rx + 10, ry - 12, "Room plan (top view)", 20, th.fg, "start", bold=True) + s.text(rx + 10, ry - 12, "Room plan (top view) — 10.0 × 6.0 m, " + "3.5 m high", 20, th.fg, "start", bold=True) + + # The two symmetry axes: positions on them sample mirror-image fields. + s.line(rx + rw / 2, ry, rx + rw / 2, ry + rh, th.muted, 1.2, dash="9,4,2,4") + s.line(rx, ry + rh / 2, rx + rw, ry + rh / 2, th.muted, 1.2, dash="9,4,2,4") + + # The d_min exclusion zones, clipped to the room so the plan stays a plan. + s1 = (rx + 70, ry + 70) + s2 = (rx + 430, ry + 224) + s.add(f'' + f'') + for cx, cy in (s1, s2): + s.circle(cx, cy, d_min, "none", th.secondary, 1.6) + s.add("") + s.text(s2[0] - d_min - 6, s2[1] - 12, "d_min", 16, th.secondary, "end", + bold=True) # Two loudspeaker source positions (ISO 3382-1: at least two). def _speaker(x: float, y: float, label: str) -> None: @@ -308,34 +435,34 @@ def _speaker(x: float, y: float, label: str) -> None: s.circle(x, y, 5, th.bg, th.fg, 1.2) s.text(x, y - 18, label, 18, th.primary, "middle", bold=True) - _speaker(rx + 70, ry + 70, "S1") - _speaker(rx + rw - 80, ry + rh - 70, "S2") + _speaker(*s1, "S1") + _speaker(*s2, "S2") - # Six microphone positions, asymmetric (ISO 3382-1: >= 2 m apart, - # >= 1 m from surfaces; >= 3 receivers per source in ISO 3382-2 precision). + # Six microphone positions: >= 2 m apart, >= 1 m from every surface, + # outside both d_min circles and off both symmetry axes. mics = [ - (rx + 180, ry + 90, "M1"), - (rx + 300, ry + 55, "M2"), - (rx + 420, ry + 130, "M3"), - (rx + 250, ry + 220, "M4"), - (rx + 380, ry + 250, "M5"), - (rx + 130, ry + 210, "M6"), + (250.0, 150.0, "M1"), (390.0, 150.0, "M2"), (510.0, 190.0, "M3"), + (160.0, 290.0, "M4"), (265.0, 330.0, "M5"), (395.0, 285.0, "M6"), ] for mx, my, label in mics: s.circle(mx, my, 7, th.secondary, th.fg, 1.4) s.text(mx + 12, my + 6, label, 17, th.fg, "start", bold=True) + # The position the standard tells you not to take: on a symmetry axis. + gx, gy = rx + rw / 2, ry + 104.0 + s.circle(gx, gy, 7, "none", th.muted, 1.4) + s.line(gx - 10, gy - 10, gx + 10, gy + 10, th.muted, 1.8) + s.line(gx - 10, gy + 10, gx + 10, gy - 10, th.muted, 1.8) + s.text(gx + 16, gy - 8, "avoid symmetry lines", 15, th.muted, "start") + # Spacing annotations. - m1 = (rx + 180, ry + 90) - m2 = (rx + 300, ry + 55) - s.line(m1[0], m1[1], m2[0], m2[1], th.accent, 1.6, dash="5,4") - s.text((m1[0] + m2[0]) / 2, (m1[1] + m2[1]) / 2 - 8, - "≥ 2 m", 17, th.accent, "middle", bold=True) - m6 = (rx + 130, ry + 210) - s.arrow(m6[0], m6[1] + 9, m6[0], ry + rh, th.muted, 1.4) - s.text(m6[0] - 8, (m6[1] + ry + rh) / 2 + 6, "≥ 1 m", 16, th.fg, "end") - # Minimum source-receiver distance guideline. - s.line(rx + 70, ry + 70, m1[0], m1[1], th.primary, 1.3, dash="4,4") + s.line(250.0, 150.0, 390.0, 150.0, th.accent, 1.6, dash="5,4") + s.text(320.0, 142.0, "≥ 2 m", 17, th.accent, "middle", bold=True) + s.arrow(160.0, 299.0, 160.0, ry + rh, th.muted, 1.4) + s.text(152.0, 350.0, "≥ 1 m", 16, th.fg, "end") + # The source-receiver distance, dimensioned outside the exclusion circle. + s.line(s1[0], s1[1], 250.0, 150.0, th.primary, 1.3, dash="4,4") + s.text(212.0, 182.0, "2.4 m > d_min", 15, th.primary, "middle") # Legend + ISO 3382-1 rules, to the right of the plan. lx = rx + rw + 24 @@ -349,10 +476,15 @@ def _speaker(x: float, y: float, label: str) -> None: "• mics ≥ 2 m apart", "• ≥ 1 m from surfaces", "• mic height 1.2 m", - "d_min = 2√(V/cT)", + "• source height 1.5 m", + "• off the symmetry axes", + "ISO 3382-2 (source clearance):", + "d_min = 2√(V/cT̂) = 2.0 m", + "for V = 210 m³, T̂ = 0.6 s", )): - bold = i == 0 or line.startswith("d_min") - s.text(lx, ry + 88 + i * 30, line, 17, th.fg, "start", bold=bold) + bold = line.endswith(":") + color = th.secondary if i >= 7 else th.fg + s.text(lx, ry + 88 + i * 28, line, 17, color, "start", bold=bold) # --- ISO 3382-2 Table 1: minimum measurement positions per grade --------- ty = ry + rh + 46.0 @@ -384,6 +516,229 @@ def _speaker(x: float, y: float, label: str) -> None: s.text(cx, yy + 26, value, 17, col, anchor, bold=(cx == 70.0)) +def _d_open_plan_setup(s: SVG, th: Theme) -> None: + """Where the ISO 3382-3 line goes (clauses 5.1 and 5.2). + + Panel (a): plan of a 30 x 12 m open-plan floor with two ceiling zones, + the non-straight measurement path, both source positions and every + clearance the standard names. Panel (b): the section that fixes both + heights at 1.2 m. + """ + ppm = 24.0 # 30.0 m over 720 px + x0, y0 = 96.0, 92.0 + x1, y1 = x0 + 30.0 * ppm, y0 + 12.0 * ppm # 30 x 12 m floor + + # --- Panel (a): the floor in plan --------------------------------------- + s.text(x0, y0 - 14, "(a) Plan — 30 × 12 m floor, two ceiling zones", 18, + th.fg, "start", bold=True) + zone = x0 + 18.0 * ppm + s.rect(x0, y0, zone - x0, y1 - y0, th.panel, th.fg, sw=2.4) + s.rect(zone, y0, x1 - zone, y1 - y0, th.bg, th.fg, sw=2.4) + s.text(x0 + 20, y0 + 22, "absorbent raft ceiling", 14, th.muted, "start") + s.text(x1 - 20, y0 + 22, "plain plaster ceiling", 14, th.muted, "end") + s.line(zone, y0, zone, y1, th.fg, 1.6, dash="9,5") + s.text(zone, y1 + 34, "zones measured and reported separately", 14, + th.muted, "middle") + + # The 2.0 m keep-out band along every wall (5.2.2). + band = 2.0 * ppm + s.rect(x0 + band, y0 + band, (x1 - x0) - 2 * band, (y1 - y0) - 2 * band, + "none", th.accent, sw=1.4, dash="6,4") + s.text(x0 + band + 8, y0 + band + 18, "≥ 2.0 m from walls and other " + "reflecting surfaces", 14, th.accent, + "start") + + # Desk clusters with 1.2 m screens between them. + for col in range(6): + for row in (0, 1): + dx = x0 + (4.0 + col * 4.2) * ppm + dy = y0 + (3.6 + row * 4.6) * ppm + s.rect(dx - 30, dy - 14, 60, 28, th.panel, th.muted, rx=2, sw=1.2) + s.line(dx - 30, dy - 14, dx + 30, dy - 14, th.secondary, 2.4) + + # The measurement path: not a straight line (Figure 1, path A). Distances + # are metres from S1, which itself keeps 2.6 m off the end wall. + src = (x0 + 2.6 * ppm, y0 + 6.0 * ppm) + path = [(2.0, -0.8), (3.4, 0.6), (5.5, -0.9), (7.8, 0.7), (10.5, -0.7), + (13.0, 0.8), (16.0, -0.6), (19.5, 0.5)] + pts = [(src[0] + dx * ppm, src[1] + dy * ppm) for dx, dy in path] + s.path("M " + " L ".join(f"{px:.1f} {py:.1f}" for px, py in [src, *pts]), + stroke=th.primary, sw=1.6, dash="6,4") + for index, (px, py) in enumerate(pts, start=1): + s.circle(px, py, 6, th.secondary, th.fg, 1.3) + s.text(px, py - 12, f"P{index:d}", 13, th.fg, "middle", bold=True) + s.text(x0 + band + 8, y1 - band - 22, "1.2 m screens", 14, th.secondary, + "start") + s.text(x0 + band + 8, y1 - band - 2, "P1 at the nearest workstation; " + "the path need not be straight", 14, + th.primary, "start") + + # Both source positions: S2 fires back along the same line (5.2.2). + for (sx, sy), label in ((src, "S1"), ((x1 - 3.0 * ppm, src[1] + 0.4 * ppm), + "S2")): + s.rect(sx - 12, sy - 10, 24, 20, th.primary, th.fg, rx=3, sw=1.5) + s.circle(sx, sy, 4.5, th.bg, th.fg, 1.1) + s.text(sx, sy - 16, label, 16, th.primary, "middle", bold=True) + + # The 2 m to 16 m regression window (6.2). + w_lo, w_hi = src[0] + 2.0 * ppm, src[0] + 16.0 * ppm + s.dim(w_lo, y1 - 22, w_hi, y1 - 22, "only 2 m to 16 m enter D2,S", offset=0, + size=15) + for xx in (w_lo, w_hi): + s.line(xx, y1 - 36, xx, y1 - 12, th.fg, 1.2, dash="4,3") + # One 0.5 m clearance called out at a desk, and the screens named once. + s.dim(pts[1][0], pts[1][1] + 6, pts[1][0], pts[1][1] + 0.5 * ppm + 6, + "≥ 0.5 m from tables", offset=0, size=14, label_side="right") + + # --- Panel (b): the section that fixes the heights ---------------------- + sy0 = y1 + 78.0 + floor_y = sy0 + 118.0 + s.text(x0, sy0 - 12, "(b) Section — both heights are 1.2 m (5.2.2)", 18, + th.fg, "start", bold=True) + s.ground(floor_y, x0, x0 + 460) + hpm = 74.0 # taller scale for one person + s.person(x0 + 300, floor_y, h=1.2 * hpm, seated=True) + # The omnidirectional source at head height, radiating pink noise. + src_x, src_y = x0 + 90, floor_y - 1.2 * hpm + s.circle(src_x, src_y, 17, th.panel, th.primary, 2.0) + for radius in (30.0, 46.0): + s.path(f"M {src_x + radius * 0.28:.1f} {src_y - radius:.1f} " + f"A {radius} {radius} 0 0 1 {src_x + radius:.1f} " + f"{src_y - radius * 0.28:.1f}", stroke=th.primary, sw=1.2, + dash="4,4") + s.line(src_x, src_y + 17, src_x, floor_y, th.fg, 2.2) + s.line(src_x - 16, floor_y, src_x + 16, floor_y, th.fg, 2.2) + s.text(src_x, floor_y + 34, "omnidirectional, pink noise", 14, th.primary, + "middle", bold=True) + s.dim(src_x - 40, floor_y, src_x - 40, src_y, "1.2 m", offset=0, size=15, + label_side="left") + mic_x = x0 + 210 + s.mic(mic_x, floor_y - 1.2 * hpm, floor_y, scale=0.8) + s.dim(mic_x + 40, floor_y, mic_x + 40, floor_y - 1.2 * hpm, "1.2 m", + offset=0, size=15, label_side="right") + s.text(x0 + 300, floor_y + 34, "seated head position", 14, th.muted, + "middle") + + # --- The clause list, beside the section -------------------------------- + lx = x0 + 486 + for i, line in enumerate(( + "Source (5.1.1):", + "omnidirectional, pink noise, ISO 3382-1", + "directivity; a pink-spectrum sweep or", + "MLS may be used instead", + "Receiver (5.1.2):", + "class 1 to IEC 61672-1, IEC 61260 octave", + "filters, omnidirectional capsule,", + "≥ 10 s integration", + "Room (5.2.1):", + "furnished, nobody present but the", + "operators, HVAC and any masking system", + "at working-day power", + "Line (5.2.2):", + "6 to 10 positions preferred, 4 the minimum;", + "≥ 2 source positions, or the line walked", + "in both directions", + )): + s.text(lx, sy0 - 14 + i * 20, line, 14, + th.primary if line.endswith(":") else th.fg, "start", + bold=line.endswith(":")) + + +def _d_room_measurement_section(s: SVG, th: Theme) -> None: + """The measuring chain in section (ISO 3382-1 clauses 4.2, 4.3). + + The same 10.0 x 6.0 x 3.5 m room as the plan, cut along its length: the + dodecahedron with its acoustic centre at 1.5 m, microphones at 1.2 m, the + quarter-wavelength clearances including the floor, and the Table 1 + directivity tolerances the source has to meet. + """ + ppm = 58.0 # 10.0 m over 580 px + x0, x1 = 70.0, 70.0 + 10.0 * ppm + floor_y = 336.0 + ceil_y = floor_y - 3.5 * ppm # 3.5 m high + + s.rect(x0, ceil_y, x1 - x0, floor_y - ceil_y, th.panel, th.fg, sw=2.6) + s.ground(floor_y, x0 - 20, x1 + 20) + s.text(x0, ceil_y - 16, "Section through the same 10.0 × 6.0 × 3.5 m room", + 19, th.fg, "start", bold=True) + + # --- The dodecahedron on its stand ------------------------------------- + src_x = x0 + 2.0 * ppm + src_y = floor_y - 1.5 * ppm # acoustic centre at 1.5 m + s.line(src_x, src_y + 22, src_x, floor_y, th.fg, 2.4) + s.line(src_x - 20, floor_y, src_x + 20, floor_y, th.fg, 2.4) + s.path(f"M {src_x - 26} {src_y} L {src_x - 13} {src_y - 24} " + f"L {src_x + 13} {src_y - 24} L {src_x + 26} {src_y} " + f"L {src_x + 13} {src_y + 24} L {src_x - 13} {src_y + 24} Z", + fill=th.panel, stroke=th.primary, sw=2.2) + s.line(src_x - 13, src_y - 24, src_x - 13, src_y + 24, th.primary, 1.0) + s.line(src_x + 13, src_y - 24, src_x + 13, src_y + 24, th.primary, 1.0) + s.circle(src_x, src_y, 4, th.secondary) + s.text(src_x, src_y - 34, "dodecahedron", 15, th.primary, "middle", + bold=True) + s.dim(src_x - 40, floor_y, src_x - 40, src_y, "1.5 m", offset=0, size=15, + label_side="left") + s.text(src_x + 32, src_y + 5, "acoustic centre", 14, th.secondary, "start") + + # --- The d_min exclusion zone, clipped to the room --------------------- + d_min = 2.0 * ppm + s.add(f'' + f'') + s.circle(src_x, src_y, d_min, "none", th.secondary, 1.6) + s.add("") + s.text(src_x + d_min - 6, floor_y - 16, "d_min = 2.0 m", 15, th.secondary, + "end", bold=True) + + # --- Two microphones at seated-ear height ------------------------------ + mic_y = floor_y - 1.2 * ppm + m1_x, m2_x = x0 + 5.0 * ppm, x0 + 8.2 * ppm + for mx in (m1_x, m2_x): + s.mic(mx, mic_y, floor_y, scale=0.85) + s.dim(m1_x, mic_y - 30, m2_x, mic_y - 30, "≥ 2 m", offset=0, size=16) + s.dim(m2_x + 40, floor_y, m2_x + 40, mic_y, "1.2 m", offset=0, size=15, + label_side="right") + # Quarter-wavelength clearances: the floor counts as a surface too. + s.dim(m1_x - 34, mic_y, m1_x - 34, ceil_y, "≥ 1 m", offset=0, size=15, + label_side="left") + s.arrow(m2_x, mic_y + 8, m2_x, floor_y - 6, th.muted, 1.3) + s.arrow(m2_x + 8, mic_y, x1 - 4, mic_y, th.muted, 1.3) + s.text((m2_x + x1) / 2, mic_y - 8, "≥ 1 m", 15, th.fg, "middle") + s.text(m1_x, floor_y + 34, "M1", 17, th.fg, "middle", bold=True) + s.text(m2_x, floor_y + 34, "M2", 17, th.fg, "middle", bold=True) + + # --- The equipment clause, as a band under the section ----------------- + ty = 424.0 + s.text(70, ty - 12, "ISO 3382-1 Table 1 — omnidirectionality over " + "gliding 30° arcs", 18, th.fg, "start", bold=True) + cols = [125.0, 250.0, 500.0, 1000.0, 2000.0, 4000.0] + tol = ["± 1", "± 1", "± 1", "± 3", "± 5", "± 6"] + tw, row_h = 516.0, 36.0 + s.rect(70, ty, tw, row_h * 2, "none", th.fg, rx=6, sw=1.8) + s.rect(70, ty, tw, row_h, th.panel, th.fg, rx=6, sw=1.8) + for i, (freq, value) in enumerate(zip(cols, tol)): + cx = 70 + tw * (i + 0.5) / len(cols) + s.text(cx, ty + 24, f"{freq:g}", 16, th.fg, "middle", bold=True) + s.text(cx, ty + 24 + row_h, value, 16, th.primary, "middle") + s.text(70, ty + row_h * 2 + 24, "Hz / dB, measured at ≥ 1.5 m — in " + "practice a dodecahedron, not a monitor", + 15, th.muted, "start") + + lx = 606.0 + for i, line in enumerate(( + "Level (4.2.1):", + "≥ 45 dB over the background", + "per band for T30, ≥ 35 dB for T20", + "Receiving chain (4.2.2.2):", + "class 1 to IEC 61672-1,", + "IEC 61260 filters, omnidirectional", + "capsule, ≤ 13 mm preferred", + )): + s.text(lx, ty - 34 + i * 26, line, 15, + th.fg if not line.endswith(":") else th.primary, "start", + bold=line.endswith(":")) + + def _d_room_noise(s: SVG, th: Theme) -> None: """Room-noise rating methods (ANSI/ASA S12.2-2019): NC and RC Mark II. @@ -440,6 +795,130 @@ def _step(cxx: float, y: float, l1: str, l2: str, color: str) -> None: s.text(rxc, 525, "RC-NN(A)", 23, th.fg, "middle", bold=True) +def _d_room_noise_setup(s: SVG, th: Theme) -> None: + """Where the rated spectrum is measured (ANSI/ASA S12.2-2019, 5.2.5). + + Section through a 6.0 x 2.7 m office served by a ceiling diffuser, with + the ear-height rule, the three standoff distances, the alternative slow + room scan, and the clause 5.3.2 screen that decides whether a single + spectrum may be rated at all. + """ + # 72 px per metre: a 6.0 m x 2.7 m section, floor at y = 408. + ppm = 72.0 + x0, x1 = 118.0, 118.0 + 6.0 * ppm # 6.0 m span + floor_y, ceil_y = 408.0, 408.0 - 2.7 * ppm + + # --- Room shell, plenum and the air-handling plant ---------------------- + s.rect(x0, ceil_y, x1 - x0, floor_y - ceil_y, th.panel, th.fg, sw=2.6) + s.rect(x0, ceil_y - 42, x1 - x0, 42, th.bg, th.muted, sw=1.6) + s.text(x1 - 10, ceil_y - 15, "ceiling plenum", 14, th.muted, "end") + s.ground(floor_y, x0 - 22, x1 + 22) + + # Duct run in the plenum, branching into one diffuser. + s.rect(x0 + 18, ceil_y - 36, 206, 24, th.panel, th.secondary, rx=4, sw=1.8) + s.text(x0 + 121, ceil_y - 19, "supply duct", 14, th.secondary, "middle") + dif_x = x0 + 300 + s.line(x0 + 224, ceil_y - 24, dif_x, ceil_y - 24, th.secondary, 1.8) + s.line(dif_x, ceil_y - 24, dif_x, ceil_y - 10, th.secondary, 1.8) + s.path(f"M {dif_x - 24} {ceil_y - 10} L {dif_x + 24} {ceil_y - 10} " + f"L {dif_x + 13} {ceil_y + 6} L {dif_x - 13} {ceil_y + 6} Z", + fill=th.panel, stroke=th.secondary, sw=1.8) + s.text(dif_x + 38, ceil_y + 28, "diffuser", 14, th.secondary, "start") + for r in (30.0, 52.0): + s.path(f"M {dif_x - r * 0.75:.1f} {ceil_y + 6 + r * 0.66:.1f} " + f"A {r} {r} 0 0 1 {dif_x + r * 0.75:.1f} {ceil_y + 6 + r * 0.66:.1f}", + stroke=th.secondary, sw=1.2, dash="4,4") + # Air handler beyond the wall, at its design operating condition. + s.rect(x0 - 74, ceil_y - 30, 54, 72, th.panel, th.secondary, rx=5, sw=2) + s.circle(x0 - 47, ceil_y + 6, 15, "none", th.secondary, 1.8) + s.line(x0 - 58, ceil_y - 5, x0 - 36, ceil_y + 17, th.secondary, 1.6) + s.line(x0 - 58, ceil_y + 17, x0 - 36, ceil_y - 5, th.secondary, 1.6) + s.text(x0 - 47, ceil_y + 62, "air handler", 14, th.secondary, "middle") + s.text(x0 - 47, ceil_y + 80, "design condition", 12, th.muted, "middle") + + # --- Standoff exclusion zones (clause 5.2.5) ---------------------------- + # 0.6 m from any single reflecting surface: a band under the ceiling. + s.rect(x0, ceil_y, x1 - x0, 0.6 * ppm, "none", th.accent, sw=1.2, + dash="5,4") + s.text(x0 + 130, ceil_y + 29, "0.6 m", 15, th.accent, "middle", bold=True) + # 1.2 m from a two-surface intersection: the right wall-floor edge. + r2 = 1.2 * ppm + s.path(f"M {x1 - r2} {floor_y} A {r2} {r2} 0 0 0 {x1} {floor_y - r2} Z", + fill="none", stroke=th.accent, sw=1.4, dash="5,4") + s.text(x1 - 40, floor_y - 34, "1.2 m", 15, th.accent, "middle", bold=True) + # 2.4 m from a trihedral corner: the left wall meeting floor and end wall. + r3 = 2.4 * ppm + s.path(f"M {x0 + r3} {floor_y} A {r3} {r3} 0 0 1 {x0} {floor_y - r3} Z", + fill="none", stroke=th.accent, sw=1.4, dash="5,4") + s.text(x0 + 132, floor_y - 112, "2.4 m", 15, th.accent, "start", bold=True) + + # --- Alternative: the slow scan of the whole space ---------------------- + scan_y = floor_y - 1.05 * ppm + s.path(f"M {x0 + 150} {scan_y + 16} C {x0 + 210} {scan_y - 18}, " + f"{x0 + 275} {scan_y + 18}, {x0 + 340} {scan_y - 16} S " + f"{x0 + 400} {scan_y + 16}, {x1 - 30} {scan_y - 8}", + stroke=th.primary, sw=1.8, dash="7,5") + + # --- Seated occupant and the microphone at ear height ------------------- + s.person(x0 + 70, floor_y, h=1.2 * ppm, seated=True) + mic_x = x0 + 330 + s.mic(mic_x, floor_y - 1.2 * ppm, floor_y, scale=0.85) + s.dim(mic_x - 46, floor_y, mic_x - 46, floor_y - 1.2 * ppm, "1.2 m", + offset=0, size=17, label_side="left") + # The ghosted standing ear height on the same stand. + s.circle(mic_x, floor_y - 1.6 * ppm, 6, "none", th.muted, 1.4) + s.text(mic_x + 14, floor_y - 1.6 * ppm + 5, "1.6 m", 14, th.muted, "start") + + # --- Reading the section ------------------------------------------------ + s.text(x0 - 74, 448, "L_EQ at the named position — or scan the whole " + "space at ≤ 0.5 m/s for ≥ 20 s", 15, th.primary, + "start", bold=True) + s.text(x0 - 74, 470, "green dashed: microphone exclusion zones (5.2.5)", + 14, th.muted, "start") + + # --- Right column: heights, standoffs and the meter --------------------- + cx = 616.0 + s.text(cx, 88, "Microphone height (5.2.5)", 17, th.fg, "start", bold=True) + for i, (who, height) in enumerate(( + ("Adult, standing", "1.6 m"), + ("Adult, seated", "1.2 m"), + ("Child, standing", "1.1 m"), + ("Child, seated", "0.75 m"), + )): + s.text(cx, 114 + i * 24, who, 15, th.fg, "start") + s.text(878, 114 + i * 24, height, 15, th.primary, "end", bold=True) + s.line(cx, 206, 878, 206, th.muted, 1.0) + + s.text(cx, 232, "Standoff (5.2.5)", 17, th.fg, "start", bold=True) + for i, (what, dist) in enumerate(( + ("One reflecting surface", "≥ 0.6 m"), + ("Two surfaces meeting", "≥ 1.2 m"), + ("Three surfaces meeting", "≥ 2.4 m"), + )): + s.text(cx, 258 + i * 24, what, 15, th.fg, "start") + s.text(878, 258 + i * 24, dist, 15, th.accent, "end", bold=True) + s.line(cx, 326, 878, 326, th.muted, 1.0) + + s.text(cx, 352, "Instrument and condition", 17, th.fg, "start", bold=True) + for i, line in enumerate(( + "Integrating-averaging, L_EQ", + "Class 2 minimum (5.1.1)", + "Octave bands 16 Hz – 8 kHz", + "Room unoccupied, plant running", + )): + s.text(cx, 378 + i * 22, line, 14, th.fg, "start") + + # --- The screen that decides whether a single spectrum may be rated ----- + s.rect(44, 488, 812, 96, th.panel, th.secondary, rx=10, sw=2.2) + s.text(64, 514, "Before rating (5.3.2): is the noise steady?", 17, + th.secondary, "start", bold=True) + s.text(64, 538, "screen 16, 31.5 and 63 Hz aurally and on a fast, " + "Z-weighted meter, then check L_MAX − L_EQ and " + "L_10 − L_EQ", 15, th.fg, "start") + s.text(64, 560, "against Table 3 — a field that fails belongs to RNC " + "(clause 5.3), not to NC or RC", 15, th.fg, "start") + + def _d_enclosed_space_absorption(s: SVG, th: Theme) -> None: """Absorption area and reverberation time of a room (EN 12354-6:2003).""" cx = 450.0 @@ -1027,3 +1506,1056 @@ def y(my: float) -> float: s.text(80, 638, "in-plane images up to order 2 shown; the full lattice adds floor, ceiling and outer mirror rooms", 17, th.muted, anchor="start") + + +# --------------------------------------------------------------------------- +# EN 15657 reception plates: the low- and high-mobility rigs, and the bench +# --------------------------------------------------------------------------- + +def _d_reception_plate_rigs(s: SVG, th: Theme) -> None: + """The two plates EN 15657 clauses 7.2.2 and 7.3.2 specify, and the + three-plate bench of its Figure 2, drawn with conforming dimensions.""" + top = 74.0 + + # ===== Panel 1: the low-mobility plate in plan (clause 7.2.2) ===== + # 3,15 m x 2,23 m = 7,0 m2, drawn at 71,7 px per metre so the 0,5 m + # position spacing of clause 7.1 is the length the dimension states. + px0, py0, pw, ph = 48.0, top + 52.0, 226.0, 160.0 + cx1 = px0 + pw / 2 + s.text(cx1, top + 22, "Low-mobility plate (7.2.2)", 19, th.fg, bold=True) + s.rect(px0, py0, pw, ph, th.panel, th.fg, sw=2.4) + for cx, cy in ((px0 + 13, py0 + 13), (px0 + pw - 13, py0 + 13), + (px0 + 13, py0 + ph - 13), (px0 + pw - 13, py0 + ph - 13)): + s.rect(cx - 8, cy - 8, 16, 16, th.accent, th.fg, rx=3, sw=1.4) + + # Source footprint (0,9 m x 0,6 m) near the centre, contacts at its corners. + fw, fh = 65.0, 43.0 + fx, fy = px0 + (pw - fw) / 2, py0 + (ph - fh) / 2 + s.rect(fx, fy, fw, fh, th.panel, th.primary, rx=5, sw=2.0, dash="7,4") + for cx in (fx + 9, fx + fw - 9): + for cy in (fy + 8, fy + fh - 8): + s.circle(cx, cy, 4.0, th.primary) + s.text(fx + fw / 2, fy - 9, "source", 15, th.primary, italic=True) + + # Six velocity positions in two columns, 0,5 m apart within a column. + for col in (px0 + 36, px0 + pw - 36): + for row in (py0 + 30, py0 + 66, py0 + 102): + s.circle(col, row, 6.0, th.secondary, th.fg, 1.3) + s.dim(px0 + 36, py0 + 30, px0 + 36, py0 + 66, "0,5 m", offset=0, size=15, + label_side="right") + s.dim(px0, py0 + ph + 18, px0 + pw, py0 + ph + 18, "3,15 m x 2,23 m", + offset=0, size=16) + + for i, txt in enumerate(( + "100 mm concrete, ρ = 2 300 ± 200 kg/m³", + "S = 7,0 m² (≥ 5 m²), sides ≈ √2 : 1", + "η ≥ 0,08 over 50 Hz to 100 Hz", + "≥ 6 velocity positions, ≈ 0,5 m apart", + "and ≥ 0,1 m from any contact point", + "elastic pads ≤ 100 × 100 mm")): + s.text(cx1, py0 + ph + 58 + 24 * i, txt, 15, th.fg) + + # ===== Panel 2: the high-mobility plate (clause 7.3.2) ===== + cx2 = 450.0 + s.text(cx2, top + 22, "High-mobility plate (7.3.2)", 19, th.fg, bold=True) + frame_y = top + 128.0 + s.rect(cx2 - 118, frame_y - 18, 236, 112, "none", th.muted, rx=5, sw=3.0) + s.rect(cx2 - 104, frame_y, 208, 22, th.panel, th.fg, sw=2.2) + for hx in range(int(cx2) - 94, int(cx2) + 100, 14): + s.circle(hx, frame_y + 11, 3.2, th.bg, th.muted, 1.0) + # Source bolted rigidly to the sheet (no springs: clause 7.3.3). + s.rect(cx2 - 37, frame_y - 56, 74, 56, th.panel, th.primary, rx=6, sw=2.2) + for bx in (cx2 - 23, cx2 + 23): + s.line(bx, frame_y - 2, bx, frame_y + 22, th.fg, 2.6) + s.text(cx2, frame_y - 66, "source bolted rigidly", 14, th.primary, + italic=True) + _accel(s, cx2 - 76, frame_y + 50) + _accel(s, cx2 + 76, frame_y + 50) + s.text(cx2, frame_y + 112, "support frame", 14, th.muted, italic=True) + + for i, txt in enumerate(( + "1 mm steel or 1,5 mm aluminium", + "|Y| ≥ 10⁻² m/(N·s)", + "≈ 50 % perforated, ⌀ ≈ 6 mm holes,", + "so the source's own airborne sound", + "cannot drive the sheet", + "Ts and Y measured with the", + "source fitted (7.1)")): + s.text(cx2, frame_y + 142 + 22 * i, txt, 15, th.fg) + + # ===== Panel 3: the Figure 2 three-plate bench ===== + cx3 = 748.0 + s.text(cx3, top + 22, "Three-plate bench (Figure 2)", 19, th.fg, bold=True) + bench_y = top + 138.0 + plate_x = (cx3 - 118, cx3 - 34, cx3 + 50) + for bx in plate_x: + s.rect(bx, bench_y, 68.0, 20, th.panel, th.fg, sw=2.2) + _spring_v(s, bx + 34.0, bench_y + 20, bench_y + 58, th.accent, + coils=2, width=7.0, sw=1.6) + s.ground(bench_y + 58, cx3 - 130, cx3 + 130) + # A whirlpool bath bridging all three plates. + s.path(f"M {cx3 - 104} {bench_y - 12} L {cx3 + 104} {bench_y - 12} " + f"L {cx3 + 86} {bench_y - 58} L {cx3 - 86} {bench_y - 58} Z", + fill=th.panel, stroke=th.primary, sw=2.2) + s.text(cx3, bench_y - 70, "whirlpool bath", 15, th.primary, italic=True) + for bx in plate_x: + s.line(bx + 34.0, bench_y - 12, bx + 34.0, bench_y, th.fg, 2.4) + s.text(cx3, bench_y + 86, "> 10 dB between plates", 16, th.secondary, + bold=True) + + for i, txt in enumerate(( + "up to three isolated plates,", + "for a source that touches", + "several building elements", + "the velocity level difference", + "is measured per EN ISO 10848-1", + "in every band, with the", + "equipment removed")): + s.text(cx3, bench_y + 122 + 22 * i, txt, 15, th.fg) + + # ===== Footer: which plate feeds which formula ===== + s.rect(48, 502, 804, 72, "none", th.muted, rx=10, dash="6,5") + s.text(450, 528, + "low-mobility plate -> blocked force (15) -> " + "characteristic power L_Wsn (17)", 15, th.fg, mono=True) + s.text(450, 556, + "high-mobility plate -> free velocity (18) -> " + "source mobility |Y_S,eq| (19)", 15, th.fg, mono=True) + + +# --------------------------------------------------------------------------- +# ISO 16251-1 small floor mock-up for a floor covering +# --------------------------------------------------------------------------- + +def _d_iso16251_mockup(s: SVG, th: Theme) -> None: + """The Annex A rig: the 1 200 x 800 x 200 mm slab on four elastic pads, + the covering specimen, the tapping machine and the accelerometers.""" + top = 74.0 + + # ===== Left: a section through the rig ===== + sx0, sw_ = 48.0, 372.0 + s.text(sx0 + sw_ / 2, top + 22, "Section", 19, th.fg, bold=True) + slab_top, slab_h = top + 172.0, 62.0 # 200 mm at 310 px per metre + s.rect(sx0, slab_top, sw_, slab_h, th.panel, th.fg, sw=2.4) + s.text(sx0 + sw_ - 10, slab_top + slab_h - 14, + "concrete slab, 200 ± 10 mm", 15, th.fg, anchor="end") + # Covering specimen on top, big enough to carry the whole machine. + s.rect(sx0 + 10, slab_top - 13, sw_ - 20, 13, th.accent, th.fg, sw=1.6) + s.text(sx0 + 12, slab_top - 22, "covering specimen", 15, th.accent, + anchor="start", italic=True) + # Four elastic supports (two visible in section) and the laboratory floor. + for bx in (sx0 + 40, sx0 + sw_ - 40): + s.rect(bx - 18, slab_top + slab_h, 36, 22, th.panel, th.accent, rx=3, + sw=2.0) + s.ground(slab_top + slab_h + 22, sx0 - 10, sx0 + sw_ + 10) + + # Tapping machine standing wholly on the specimen (five hammers). + mx = sx0 + 186.0 + body_y = slab_top - 78.0 + s.rect(mx - 66, body_y, 132, 30, th.primary, th.fg, rx=5, sw=2) + for hx in range(-44, 45, 22): + s.line(mx + hx, body_y + 30, mx + hx, slab_top - 15, th.fg, 2.4) + s.circle(mx + hx, slab_top - 15, 4.2, th.fg) + s.text(mx, body_y - 14, "tapping machine (ISO 10140-5)", 16, th.fg, + bold=True) + s.text(mx, body_y - 34, "5 hammers, 0,5 kg from 40 mm, 10 s⁻¹", 14, + th.muted) + + # Accelerometer glued under the slab, with its cable route. + _accel_wall(s, sx0 + 232, slab_top + slab_h + 11) + s.line(sx0 + 240, slab_top + slab_h + 11, sx0 + 316, + slab_top + slab_h + 11, th.fg, 1.3) + s.text(sx0 + sw_ - 10, slab_top + slab_h + 46, + "accelerometer screwed or glued underneath", 14, th.secondary, + anchor="end") + s.text(sx0 + 40, slab_top + slab_h + 46, "elastic pads", 14, th.accent, + anchor="middle") + + for i, txt in enumerate(( + "four elastic pads at the corners, each ≤ 100 × 100 mm", + "vertical resonance of the slab on its pads < 20 Hz", + "top flat to ± 1 mm in a line edge to edge")): + s.text(sx0 + sw_ / 2, slab_top + slab_h + 82 + 24 * i, txt, 15, + th.secondary if i == 1 else th.fg, bold=(i == 1)) + + # ===== Right: the plan of the slab ===== + qx0, qy0, qw, qh = 480.0, top + 66.0, 342.0, 220.0 # 1 200 x 800 mm + s.text(qx0 + qw / 2, top + 22, "Plan", 19, th.fg, bold=True) + s.text(qx0 + qw / 2, top + 46, + "machine positions above, accelerometers below", 15, th.muted) + s.rect(qx0, qy0, qw, qh, th.panel, th.fg, sw=2.4) + # The 100 mm edge keep-out band for the accelerometer positions. + s.rect(qx0 + 28, qy0 + 28, qw - 56, qh - 56, "none", th.muted, sw=1.4, + dash="6,4") + + # Two tapping-machine footprints, skew to the edges, ≥ 300 mm apart. + for fx, fy, tilt in ((qx0 + 82, qy0 + 62, 11.0), + (qx0 + 232, qy0 + 158, -9.0)): + pts = [] + for dx, dy in ((-42, -25), (42, -25), (42, 25), (-42, 25)): + pts.append((fx + dx - tilt * dy / 25.0, fy + dy + tilt * dx / 42.0)) + s.path("M " + " L ".join(f"{a:.1f} {b:.1f}" for a, b in pts) + " Z", + fill="none", stroke=th.primary, sw=2.0, dash="7,4") + for dx in (-26, -13, 0, 13, 26): + s.circle(fx + dx, fy + tilt * dx / 42.0, 3.4, th.primary) + s.line(qx0 + 82, qy0 + 62, qx0 + 232, qy0 + 158, th.muted, 1.0, dash="4,4") + s.text(qx0 + 160, qy0 + 104, "≥ 300 mm", 15, th.fg) + + # Four accelerometer positions on the underside: random, off the axes. + for ax_, ay_ in ((qx0 + 50, qy0 + 190), (qx0 + 158, qy0 + 200), + (qx0 + 268, qy0 + 54), (qx0 + 300, qy0 + 148)): + s.circle(ax_, ay_, 7.0, th.secondary, th.fg, 1.4) + s.dim(qx0, qy0 + qh + 20, qx0 + qw, qy0 + qh + 20, + "1 200 × 800 mm (± 50 mm)", offset=0, size=16) + + for i, txt in enumerate(( + "≥ 2 machine positions, skew to the edges,", + "no hammer within 100 mm of an edge, all feet on the specimen", + "≥ 4 accelerometer positions, uniform but random,", + "off the symmetry lines and ≥ 100 mm from every edge")): + s.text(qx0 + qw / 2, qy0 + qh + 48 + 22 * i, txt, 15, + th.primary if i < 2 else th.secondary) + + # ===== Footer: the three measurement cycles ===== + s.rect(48, 496, 804, 84, "none", th.muted, rx=10, dash="6,5") + s.text(450, 522, + "three cycles: with specimen | without specimen (hammers " + "repeated within ± 20 mm) | background", 15, th.fg) + s.text(450, 546, + "≥ 20 s per level; background rule: unchanged ≥ 15 dB, energy " + "subtraction 6-15 dB, −1,3 dB below 6 dB", 15, th.fg) + s.text(450, 570, + "L_a = 10 lg(/a₀²), a₀ = 10⁻⁶ m/s² (Formula 1)", 15, + th.primary, mono=True) + + +def _d_en12354_6_takeoff(s: SVG, th: Theme) -> None: + """The EN 12354-6 Annex E room turned into the three input lists.""" + # Annex E: 4.54 x 2.73 x 2.40 m, V = 29.75 m3, 1 kHz octave band. + ox, oy = 70.0, 300.0 # near-bottom-left corner of the floor + px, py = 152.0, 0.0 # +x (length, 4.54 m) + qx, qy = 74.0, -46.0 # +y (depth, 2.73 m), receding + hx, hy = 0.0, -132.0 # +z (height, 2.40 m) + + def pt(u: float, v: float, w: float) -> tuple[float, float]: + return (ox + u * px + v * qx + w * hx, oy + u * py + v * qy + w * hy) + + floor = [pt(0, 0, 0), pt(1, 0, 0), pt(1, 1, 0), pt(0, 1, 0)] + back = [pt(0, 1, 0), pt(1, 1, 0), pt(1, 1, 1), pt(0, 1, 1)] + side = [pt(0, 0, 0), pt(0, 1, 0), pt(0, 1, 1), pt(0, 0, 1)] + ceiling = [pt(0, 0, 1), pt(1, 0, 1), pt(1, 1, 1), pt(0, 1, 1)] + + def poly(points: list[tuple[float, float]], fill: str, stroke: str, + sw: float = 1.6, dash: str = "") -> None: + d = "M " + " L ".join(f"{x:.1f} {y:.1f}" for x, y in points) + " Z" + s.path(d, fill=fill, stroke=stroke, sw=sw, dash=dash) + + poly(floor, th.panel, th.fg, 1.8) + poly(back, th.panel, th.fg, 1.8) + poly(side, th.panel, th.fg, 1.8) + poly(ceiling, "none", th.muted, 1.2, dash="6,5") + s.line(*pt(1, 0, 0), *pt(1, 0, 1), th.muted, 1.2) + s.line(*pt(1, 0, 1), *pt(1, 1, 1), th.muted, 1.2) + + # The glass facade is the far long wall; hatch it so it is identifiable. + for k in range(1, 9): + a = pt(k / 9.0, 1, 0) + b = pt(k / 9.0, 1, 1) + s.line(a[0], a[1], b[0], b[1], th.primary, 0.9, dash="4,4") + + s.dim(*pt(0, 0, 0), *pt(1, 0, 0), "4.54 m", offset=40, size=15) + s.dim(*pt(0, 0, 0), *pt(0, 0, 1), "2.40 m", offset=-40, size=14, + label_side="right") + s.dim(*pt(1, 0, 0), *pt(1, 1, 0), "2.73 m", offset=34, size=15) + s.text(183, 94, "V = 29.75 m³", 18, th.fg, "middle", bold=True) + s.text(183, 112, "1000 Hz octave band", 12, th.muted, "middle") + + # Tags outside the body, each on a leader to the surface it names. + tags = ( + ((330.0, 76.0), "start", pt(0.55, 0.55, 1.0), + "ceiling 12.39 m² αs 0.02"), + ((330.0, 100.0), "start", pt(0.60, 1.0, 0.72), + "glass facade 10.90 m² αs 0.04"), + ((330.0, 124.0), "start", pt(0.42, 0.16, 0.0), + "floor 12.39 m² αs 0.05"), + ((330.0, 148.0), "start", pt(0.0, 0.55, 0.55), + "short wall 6.55 m² αs 0.04 (x2)"), + ((330.0, 172.0), "start", pt(0.86, 0.62, 0.30), + "long wall (brick) 10.90 m² αs 0.04"), + ) + for (tx, ty), anchor, target, label in tags: + s.text(tx, ty, label, 13, th.primary, anchor) + s.line(tx - 6, ty - 4, target[0], target[1], th.muted, 0.9, dash="3,3") + + # The furniture of Annex E case 2. + boxes = ((0.14, 0.62, 0.16, 0.10, "0.65"), (0.34, 0.60, 0.14, 0.09, "0.65"), + (0.55, 0.30, 0.15, 0.07, "0.60"), (0.74, 0.34, 0.10, 0.05, "0.15"), + (0.30, 0.22, 0.07, 0.04, "0.05"), (0.46, 0.14, 0.07, 0.04, "0.05")) + for u, v, du, dh, vol in boxes: + base = pt(u, v, 0.0) + top = pt(u, v, dh * 3.0) + far = pt(u + du, v, dh * 3.0) + near = pt(u + du, v, 0.0) + poly([base, near, far, top], th.accent, th.fg, 1.2) + _ = vol + s.text(ox + 170, oy + 72, "objects: 0.15, 0.60, 2 × 0.05, 2 × 0.65 m³", 13, + th.accent, "middle") + + # The lists the room becomes. + lx, lw = 545.0, 320.0 + s.rect(lx, 60, lw, 214, th.panel, th.primary, rx=10, sw=2) + s.text(lx + 14, 86, "surfaces = [", 15, th.fg, "start", mono=True) + rows = (" (12.39, 0.05), # floor", " (12.39, 0.02), # ceiling", + " (10.90, 0.04), # long wall", " (10.90, 0.04), # facade", + " (6.55, 0.04), # short wall", + " (6.55, 0.04), # short wall", "]") + for k, row in enumerate(rows): + s.text(lx + 14, 110 + 21 * k, row, 14, th.fg, "start", mono=True) + s.text(lx + lw / 2, 264, "A = 2.26 m² (Formula 1)", 15, th.primary, + "middle", bold=True) + + s.rect(lx, 292, lw, 96, th.panel, th.accent, rx=10, sw=2) + s.text(lx + 14, 316, "objects = hard_object_absorption(volumes)", 13, th.fg, + "start", mono=True) + s.text(lx + 14, 337, "psi = object_fraction(volumes, 29.75)", 13, th.fg, + "start", mono=True) + s.text(lx + lw / 2, 362, "Aobj = 2.77 m² ψ = 0.072", 15, th.accent, + "middle", bold=True) + s.text(lx + lw / 2, 380, "(Formula 4, then Formula 3)", 12, th.muted, + "middle") + + # The inset: one wall split by a window. + ix, iy, iw, ih = 70.0, 400.0, 400.0, 132.0 + s.rect(ix, iy, iw, ih, "none", th.muted, rx=10, sw=1.4, dash="6,5") + s.text(ix + 12, iy + 24, "One wall, two rows", 15, th.fg, "start", bold=True) + wx, wy, ww, wh = ix + 20, iy + 40, 190.0, 74.0 + s.rect(wx, wy, ww, wh, th.panel, th.fg, sw=1.6) + s.rect(wx + 28, wy + 16, 78, 42, "none", th.primary, sw=1.8) + s.text(wx + 67, wy + 42, "window", 12, th.primary, "middle") + s.text(wx + ww / 2, wy + wh + 15, "one wall on the drawing", 12, th.muted, + "middle") + s.arrow(wx + ww + 8, wy + wh / 2, wx + ww + 44, wy + wh / 2, th.fg, 1.8) + s.text(wx + ww + 52, wy + 26, "(Swall − Swin, αwall)", 13, th.fg, "start", + mono=True) + s.text(wx + ww + 52, wy + 48, "(Swin, αwin)", 13, th.fg, "start", mono=True) + s.text(wx + ww + 52, wy + 72, "areas sum to the wall", 12, th.muted, "start") + + s.text(450, 552, "Never average a lining into its wall by hand: the areas " + "are weighted inside the formula.", 14, th.muted, "middle") + + +def _d_directivity_factor(s: SVG, th: Theme) -> None: + """Q as four mountings, with the critical distance each one produces.""" + import math + + cells = ( + (1, "4π", "free space", "on a stand", 1.11), + (2, "2π", "hard floor", "on the slab", 1.57), + (4, "π", "floor-wall edge", "against a wall on the slab", 2.22), + (8, "π/2", "trihedral corner", "in the corner of the workshop", 3.14), + ) + cw = 210.0 + for k, (q, solid, place, mounting, rc) in enumerate(cells): + x0 = 15.0 + cw * k + cx = x0 + cw / 2 + s.rect(x0 + 8, 72, cw - 16, 246, th.panel, th.muted, rx=10, sw=1.4) + + gy = 268.0 # the slab surface inside the cell + wx = cx - 62.0 # the wall face + colour = (th.primary, th.accent, th.fg, th.secondary)[k] + + if q == 1: + sx, sy = cx, 208.0 + start_a, end_a = -180.0, 180.0 + elif q == 2: + sx, sy = cx, gy + start_a, end_a = -180.0, 0.0 + s.rect(cx - 74, gy, 148, 11, th.muted, th.fg, sw=1.2) + elif q == 4: + sx, sy = wx, gy + start_a, end_a = -90.0, 0.0 + s.rect(wx - 11, gy, 159, 11, th.muted, th.fg, sw=1.2) + s.rect(wx - 11, gy - 92, 11, 92, th.muted, th.fg, sw=1.2) + else: + sx, sy = wx, gy + start_a, end_a = -90.0, 0.0 + s.rect(wx - 11, gy, 159, 11, th.muted, th.fg, sw=1.2) + s.rect(wx - 11, gy - 92, 11, 92, th.muted, th.fg, sw=1.2) + s.rect(wx - 11, gy - 103, 148, 11, th.muted, th.fg, sw=1.2) + + steps = 16 + for i in range(steps + 1): + ang = math.radians(start_a + (end_a - start_a) * i / steps) + s.line(sx, sy, sx + 62 * math.cos(ang), sy + 62 * math.sin(ang), + colour, 1.1) + s.circle(sx, sy, 8, colour, th.fg, 1.4) + s.text(sx, sy + 4, "S", 12, th.bg, "middle", bold=True) + + s.text(cx, 102, f"Q = {q}", 22, colour, "middle", bold=True) + s.text(cx, 126, f"radiates into {solid} sr", 14, th.fg, "middle") + s.text(cx, 148, place, 13, th.muted, "middle") + s.text(cx, 300, mounting, 12, th.fg, "middle") + s.text(cx, 336, f"rc = {rc:.2f} m", 16, colour, "middle", bold=True) + + s.text(450, 56, "The same compact source, four mountings " + "(workshop with R = 62 m²)", 14, th.muted, "middle") + s.text(450, 366, "Q multiplies the direct term only: the reverberant " + "plateau does not move.", 15, th.fg, "middle", bold=True) + s.text(450, 390, "rc = √(Q·R/16π), so two steps of mounting move the " + "crossover by a factor of 2.", 13, th.muted, "middle") + + +def _d_decay_range(s: SVG, th: Theme) -> None: + """The level budget of one band: INR, the truncation point and the three + ISO 3382 evaluation windows with their 15 dB margins.""" + x0, x1 = 118.0, 588.0 # time axis + y0, y1 = 84.0, 384.0 # 0 dB to -70 dB + per_db = (y1 - y0) / 70.0 + + def y_of(level: float) -> float: + return y0 - level * per_db + + # ===== Axes ===== + s.line(x0, y0 - 12, x0, y1 + 8, th.fg, 2.0) + s.line(x0 - 8, y1, x1 + 46, y1, th.fg, 2.0) + s.text(x1 + 46, y1 + 24, "time", 16, th.fg, anchor="end") + for level in range(0, -71, -10): + yy = y_of(float(level)) + s.line(x0 - 6, yy, x0, yy, th.muted, 1.2) + s.text(x0 - 12, yy + 5, f"{level}", 14, th.muted, anchor="end") + s.text(x0 - 12, y0 - 24, "Level [dB]", 16, th.fg, anchor="end") + + # ===== The band-filtered squared impulse response ===== + noise = -55.0 + x_peak, x_cross = x0 + 26.0, x0 + 322.0 + s.circle(x_peak, y_of(0.0), 5.0, th.primary) + s.text(x_peak + 10, y_of(0.0) - 8, "peak", 15, th.primary, anchor="start") + s.line(x_peak, y_of(0.0), x_cross, y_of(noise), th.primary, 2.6) + s.line(x_cross, y_of(noise), x_cross + 92.0, y_of(-70.0), th.primary, 1.6, + dash="6,4") + s.line(x0, y_of(noise), x1, y_of(noise), th.secondary, 2.2, dash="9,5") + s.text(x0 + 8, y_of(noise) - 10, "background noise", 15, th.secondary, + anchor="start") + + # The compensated tail: everything past the crossing. + s.rect(x_cross, y_of(noise), x1 - x_cross, y1 - y_of(noise), th.panel, + th.muted, sw=1.2, dash="4,4") + s.circle(x_cross, y_of(noise), 5.5, th.bg, th.fg, 2.0) + s.text(x_cross - 12, y_of(-64.0), + "integration truncated here (t₁)", 15, th.fg, anchor="end") + s.text(x_cross + (x1 - x_cross) / 2, y_of(noise) + 26, + "tail compensated as", 14, th.muted) + s.text(x_cross + (x1 - x_cross) / 2, y_of(noise) + 46, + "an exponential decay (C)", 14, th.muted) + + # The INR bracket between the peak and the noise floor. + s.dim(x_peak - 12, y_of(0.0), x_peak - 12, y_of(noise), "INR = 55 dB", + offset=0, size=16, label_side="right") + + # ===== The three evaluation windows, to the same dB scale ===== + wx = 604.0 + s.text(wx + 100, y0 - 24, "Evaluation windows", 17, th.fg, bold=True) + # The library's tightened flags first, so the window boxes overlay them. + for flag in (-46.0, -54.0): + fy = y_of(flag) + s.line(wx, fy, wx + 196, fy, th.accent, 1.8, dash="7,4") + s.text(wx + 202, fy + 5, f"{-flag:.0f} dB", 14, th.accent, + anchor="start") + windows = (("EDT", 0.0, -10.0), ("T20", -5.0, -25.0), ("T30", -5.0, -35.0)) + for i, (name, hi, lo) in enumerate(windows): + bx = wx + 16 + 64 * i + s.rect(bx, y_of(hi), 38, (hi - lo) * per_db, th.panel, th.primary, + sw=2.0) + s.text(bx + 19, y_of(hi) - 8, name, 16, th.primary, bold=True) + # The 15 dB margin ISO 3382-1 asks for beyond the window. + top = y_of(lo) + s.rect(bx, top, 38, 15.0 * per_db, th.bg, th.muted, sw=1.2, dash="5,4") + for k in range(4): + yy = top + 5 + k * (15.0 * per_db - 10) / 3.0 + s.line(bx + 3, yy, bx + 35, yy + 5, th.muted, 0.9) + + # ===== Footer: what the windows need, and the remedy order ===== + s.rect(48, 416, 804, 88, "none", th.muted, rx=10, dash="6,5") + s.text(450, 442, + "hatched: the 15 dB margin ISO 3382-1 asks for beyond each window " + "— EDT needs 25 dB, T20 35 dB, T30 45 dB", 14, th.fg) + s.text(450, 466, + "the library flags at 46 dB and 54 dB instead, where the fit's " + "positive bias crosses 5 %", 14, th.accent) + s.text(450, 490, + "short of range? T20 instead of T30 -> a longer sweep or more " + "averages -> EDT; never a fit into the noise", 14, th.secondary) + + +# --------------------------------------------------------------------------- +# EN/ISO 12354-1 Annex E junction catalogue +# --------------------------------------------------------------------------- + +def _d_junction_catalogue(s: SVG, th: Theme) -> None: + """The Annex E junction types, the three path branches and the mass ratio, + with the argument pair each drawing maps onto.""" + dark = bool(th.suffix) + c_through = th.primary # K13, the 'through' branch + c_corner = "#f0a94e" if dark else "#d9820e" # K12 = K23, the 'corner' branch + c_leaf = th.secondary # K24, the double-leaf branch + t_el = 13.0 # drawn element thickness + arm = 58.0 + + def element(x: float, y: float, w: float, h: float, tag: str) -> None: + s.rect(x, y, w, h, th.panel, th.fg, sw=1.8) + s.text(x + w / 2, y + h / 2 + 6, tag, 15, th.fg, bold=True) + + def title(cx: float, cy: float, name: str) -> None: + s.text(cx, cy - arm - 36, name, 17, th.fg, bold=True) + + def branch(x1_: float, y1_: float, x2_: float, y2_: float, colour: str, + label: str, lx: float, ly: float, anchor: str = "middle") -> None: + s.arrow(x1_, y1_, x2_, y2_, colour, 2.6) + s.text(lx, ly, label, 16, colour, bold=True, anchor=anchor) + + col = (152.0, 450.0, 748.0) + row = (182.0, 378.0) + + # (1) Rigid cross, carrying the full annotation set. + cx, cy = col[0], row[0] + title(cx, cy, "rigid cross") + element(cx - arm, cy - t_el / 2, arm - t_el / 2, t_el, "1") + element(cx + t_el / 2, cy - t_el / 2, arm - t_el / 2, t_el, "3") + element(cx - t_el / 2, cy - arm, t_el, arm - t_el / 2, "2") + element(cx - t_el / 2, cy + t_el / 2, t_el, arm - t_el / 2, "4") + branch(cx - 48, cy + 34, cx + 48, cy + 34, c_through, "K13", + cx + 30, cy + 54) + branch(cx - 40, cy - 16, cx - 12, cy - 40, c_corner, "K12", + cx - 46, cy - 38, "end") + s.circle(cx, cy, 5.0, th.accent) + s.text(cx + arm + 8, cy + 5, "ℓf", 16, th.accent, anchor="start") + + # (2) Rigid T. + cx, cy = col[1], row[0] + title(cx, cy, "rigid T") + element(cx - arm, cy - t_el / 2, arm - t_el / 2, t_el, "1") + element(cx + t_el / 2, cy - t_el / 2, arm - t_el / 2, t_el, "3") + element(cx - t_el / 2, cy + t_el / 2, t_el, arm - t_el / 2, "2") + branch(cx - 48, cy - 30, cx + 48, cy - 30, c_through, "K13", cx, cy - 40) + branch(cx - 40, cy + 16, cx - 12, cy + 42, c_corner, "K12", + cx - 46, cy + 42, "end") + + # (3) T with a flexible interlayer. + cx, cy = col[2], row[0] + title(cx, cy, "T with a flexible interlayer") + element(cx - arm, cy - t_el / 2, arm - t_el / 2, t_el, "1") + element(cx + t_el / 2, cy - t_el / 2, arm - t_el / 2, t_el, "3") + element(cx - t_el / 2, cy + t_el / 2 + 8, t_el, arm - t_el / 2 - 8, "2") + s.rect(cx - t_el / 2 - 4, cy + t_el / 2, t_el + 8, 8, th.accent, th.fg, + sw=1.2) + branch(cx - 48, cy - 30, cx + 48, cy - 30, c_through, "K13", cx, cy - 40) + s.text(cx + 22, cy + 30, "elastic layer", 14, th.accent, anchor="start") + + # (4) Corner. + cx, cy = col[0], row[1] + title(cx, cy, "corner") + element(cx - arm, cy - t_el / 2, arm + t_el / 2, t_el, "1") + element(cx - t_el / 2, cy + t_el / 2, t_el, arm - t_el / 2, "2") + branch(cx - 46, cy - 24, cx - 16, cy + 40, c_corner, "K12", + cx - 52, cy - 24, "end") + + # (5) Thickness change: one line, two thicknesses. + cx, cy = col[1], row[1] + title(cx, cy, "thickness change") + element(cx - arm, cy - t_el / 2, arm, t_el, "1") + element(cx, cy - t_el, arm, 2 * t_el, "2") + branch(cx - 48, cy - 34, cx + 48, cy - 34, c_through, "K12", cx, cy - 44) + + # (6) Lightweight double leaf meeting a homogeneous floor: the K24 branch. + cx, cy = col[2], row[1] + title(cx, cy, "lightweight double leaf") + element(cx - arm, cy - t_el / 2, arm - 18, t_el, "1") + element(cx + 18, cy - t_el / 2, arm - 18, t_el, "3") + element(cx - 18, cy - arm, 9, arm - t_el / 2, "2") + element(cx + 9, cy - arm, 9, arm - t_el / 2, "4") + for hy in range(int(cy - arm) + 8, int(cy) - 12, 12): + s.line(cx - 9, hy, cx + 9, hy + 5, th.muted, 0.8) + branch(cx - 48, cy + 30, cx + 48, cy + 30, c_through, "K13", cx, cy + 48) + branch(cx - 14, cy - arm + 14, cx + 14, cy - arm + 14, c_leaf, "K24", + cx + 24, cy - arm + 18, "start") + + # ===== Legend: the argument pair each drawing maps onto ===== + s.rect(48, 442, 804, 116, "none", th.muted, rx=10, dash="6,5") + pairs = ( + (70.0, 468.0, "rigid cross", "'rigid_cross', 'through' / 'corner'"), + (70.0, 492.0, "rigid T", "'rigid_t', 'through' / 'corner'"), + (70.0, 516.0, "flexible T", "'flexible_t', 'through' / 'corner'"), + (532.0, 468.0, "corner", "'corner', 'corner'"), + (532.0, 492.0, "thickness change", "'thickness_change', 'through'"), + ) + for xx, yy, name, args in pairs: + s.text(xx, yy, f"{name}:", 14, th.fg, anchor="start", bold=True) + s.text(xx + 140, yy, args, 13, th.muted, anchor="start", mono=True) + s.text(70.0, 540, "lightweight double leaf:", 14, th.fg, anchor="start", + bold=True) + s.text(70.0 + 190, 540, + "'lightweight_double_homogeneous', 'double_leaf'", 13, th.muted, + anchor="start", mono=True) + + # ===== The mass ratio, worked on the Annex H.3 floor ===== + s.rect(48, 568, 804, 96, "none", th.muted, rx=10, dash="6,5") + s.text(70, 594, + "M = lg(m'perp,i / m'i): m'i is the element carrying the path, so " + "the ratio is per path, not per junction.", 15, th.fg, + anchor="start") + s.text(70, 620, + "The functions take the RATIO, not M. Annex H.3 floor, ratio 1,61: " + "'through' -> K13 = 12,5 dB, 'corner' -> K12 = 8,9 dB", 15, th.fg, + anchor="start") + s.text(70, 646, + "ℓf is the coupling length along the junction line, measured " + "surface to surface. Annex E values are read at 500 Hz, +/- 3 dB.", + 15, th.accent, anchor="start") + + +# --------------------------------------------------------------------------- +# Facade sound insulation setup (ISO 16283-3) +# --------------------------------------------------------------------------- + +def _d_facade_setup(s: SVG, th: Theme) -> None: + """Section through a dwelling facade: the loudspeaker and both methods.""" + gy = 470.0 # ground line + fx = 640.0 # outer face of the facade + ftop = 150.0 + floor_y = 400.0 # receiving-room floor + cx, cy = fx, 300.0 # centre of the test specimen + + s.ground(gy, 50, 880) + + # -- the building ---------------------------------------------------- + s.rect(fx, ftop, 230, gy - ftop, th.panel, th.fg, sw=2.5) + s.rect(fx, ftop, 20, gy - ftop, th.secondary, th.fg, sw=2) # facade leaf + s.line(fx + 20, floor_y, 868, floor_y, th.fg, 2.2) # room floor + s.text(768, ftop + 42, "Receiving room", 20, th.fg, bold=True) + s.text(768, ftop + 68, "L₂ , T , V", 19, th.muted) + s.text(650, ftop - 12, "S = 11.5 m²", 18, th.secondary, bold=True, + anchor="start") + + # -- loudspeaker on the ground, 45 degrees to the specimen centre ---- + lx, ly = 130.0, gy - 34.0 + s.rect(lx - 28, ly - 32, 56, 64, th.panel, th.primary, rx=6, sw=2) + s.circle(lx, ly - 12, 12, th.primary) + s.circle(lx, ly - 12, 4, th.bg) + s.circle(lx, ly + 16, 7, th.primary) + s.text(lx, gy + 34, "Loudspeaker", 19, th.fg, bold=True) + s.text(lx, gy + 56, "(on the ground)", 17, th.muted) + + s.arrow(lx + 26, ly - 22, cx - 6, cy + 4, th.accent, 2.6) + s.line(lx + 26, ly - 22, 560, ly - 22, th.muted, 1.0, dash="4,4") + s.text(300, ly - 34, "45° ± 5°", 21, th.accent, bold=True) + s.text(430, 250, "r ≥ 5 m element / ≥ 7 m global", 19, th.accent, + anchor="middle") + + # D, the perpendicular distance from the facade plane. + s.line(lx, gy, lx, gy + 110, th.muted, 0.9, dash="3,3") + s.line(cx, gy, cx, gy + 110, th.muted, 0.9, dash="3,3") + s.dim(lx, gy + 106, cx, gy + 106, "D > 3.5 m (element) / > 5 m (global)", + offset=0, size=19) + + # -- element method: microphone flush on the test specimen ----------- + s.circle(fx - 8, cy, 8, th.fg) + s.path(f"M {fx - 26:.0f} {cy:.0f} A 18 18 0 0 1 {fx + 10:.0f} {cy:.0f}", + stroke=th.primary, sw=2.2) + s.line(fx - 26, cy, 560, 150, th.muted, 1.0) + s.rect(300, 92, 262, 76, th.panel, th.primary, rx=8, sw=1.6) + s.text(310, 116, "L₁,s element method", 19, th.primary, bold=True, + anchor="start") + s.text(310, 138, "≤ 10 mm parallel / ≤ 3 mm normal", 17, th.muted, + anchor="start") + s.text(310, 158, "3 to 10 positions, never gridded", 17, th.muted, + anchor="start") + + # -- global method: microphone 2 m out, 1.5 m above the room floor --- + gmx = 470.0 + gmy = 322.0 + s.mic(gmx, gmy, gy, scale=1.1) + s.text(gmx - 6, gmy - 16, "L₁,2m global method", 19, th.primary, + bold=True, anchor="end") + s.line(gmx, gmy + 4, gmx, 292, th.muted, 0.9, dash="3,3") + s.line(fx, cy, fx, 292, th.muted, 0.9, dash="3,3") + s.dim(gmx, 288, fx, 288, "(2.0 ± 0.2) m", offset=0, size=19) + s.line(gmx + 12, gmy + 4, 566, gmy + 4, th.muted, 0.9, dash="3,3") + s.line(fx, floor_y, 566, floor_y, th.muted, 0.9, dash="3,3") + s.dim(562, gmy + 4, 562, floor_y, "1.5 m", offset=0, size=19, + label_side="left") + s.text(556, 424, "above the", 16, th.muted, anchor="end") + s.text(556, 444, "receiving-room floor", 16, th.muted, anchor="end") + + for y, txt in ( + (600, ("Element method → R'45° (loudspeaker) or R'tr,s (traffic): " + "one component, comparable with a laboratory R.")), + (626, ("Global method → D2m,nT: the whole facade as built, " + "not comparable with a laboratory R.")), + (652, ("Road traffic replaces the loudspeaker at all angles: " + "simultaneous inside and outside, ≥ 50 pass-bys.")), + (678, ("Clauses 9.4, 9.5.1, 9.6.1 and 10.2. None of it is checked " + "by the functions.")), + ): + s.text(50, y, txt, 18, th.fg, anchor="start") + + +# --------------------------------------------------------------------------- +# Heavy and soft impact sources (ISO 16283-2 Annex A, JIS A 1418-2) +# --------------------------------------------------------------------------- + +def _d_heavy_impact_sources(s: SVG, th: Theme) -> None: + """Three sources over one slab, with the drop heights dimensioned.""" + slab_top, slab_bot = 430.0, 470.0 + s.rect(50, slab_top, 800, slab_bot - slab_top, th.panel, th.fg, sw=2.4) + s.text(450, slab_bot + 26, "Floor under test (source room)", 19, th.muted) + s.rect(50, slab_bot, 800, 4, th.muted) + + panels = (86.0, 350.0, 630.0) + + # (a) ISO tapping machine: five hammers, 40 mm drop. + ax = panels[0] + 110.0 + s.text(ax, 96, "(a) tapping machine", 20, th.primary, bold=True) + s.text(ax, 120, "ISO 10140-5 Annex E", 17, th.muted) + body_y = 356.0 + s.rect(ax - 92, body_y, 184, 44, th.panel, th.primary, rx=5, sw=2) + for i in range(5): + hx = ax - 72 + i * 36 + s.rect(hx - 7, body_y + 44, 14, 18, th.primary, th.fg, sw=1.2) + s.line(hx, body_y + 62, hx, slab_top - 12, th.muted, 1.0, dash="3,3") + s.line(ax - 100, slab_top, ax - 100, body_y + 44, th.muted, 0.9, dash="3,3") + s.dim(ax - 112, body_y + 62, ax - 112, slab_top, "40 mm", offset=0, size=18) + s.text(ax, 300, "5 hammers, 500 g each", 18, th.fg) + s.text(ax, 322, "(100 ± 20) ms apart", 18, th.fg) + + # (b) rubber ball: 180 mm, 30 mm wall, drop measured from the BOTTOM. + bx = panels[1] + 105.0 + s.text(bx, 96, "(b) rubber ball", 20, th.accent, bold=True) + s.text(bx, 120, "ISO 16283-2 Annex A / ISO 10140-5 Annex F", 15, th.muted) + ball_r = 46.0 + ball_cy = 210.0 + s.circle(bx, ball_cy, ball_r, "none", th.accent, sw=3) + s.ellipse(bx, ball_cy, ball_r - 15, ball_r - 15, "none", th.accent, + sw=1.6, dash="5,4") + s.dim(bx - ball_r, ball_cy - 62, bx + ball_r, ball_cy - 62, "180 mm", + offset=0, size=18) + s.line(bx - ball_r, ball_cy, bx - ball_r, ball_cy - 62, th.muted, 0.9, + dash="3,3") + s.line(bx + ball_r, ball_cy, bx + ball_r, ball_cy - 62, th.muted, 0.9, + dash="3,3") + s.text(bx + ball_r + 16, ball_cy - 6, "30 mm wall", 17, th.muted, + anchor="start") + s.text(bx + ball_r + 16, ball_cy + 16, "m_eff = (2.5 ± 0.1) kg", 17, + th.muted, anchor="start") + s.text(bx + ball_r + 16, ball_cy + 38, "e = 0.8 ± 0.1", 17, th.muted, + anchor="start") + s.arrow(bx, ball_cy + ball_r + 8, bx, slab_top - 8, th.accent, 2.2) + s.line(bx - 100, ball_cy + ball_r, bx, ball_cy + ball_r, th.secondary, 2.0) + s.dim(bx - 88, ball_cy + ball_r, bx - 88, slab_top, + "(100 ± 1) cm", offset=0, size=18) + s.text(bx - 100, ball_cy + ball_r + 22, "from the ball's BOTTOM", 16, + th.secondary, bold=True, anchor="middle") + + # (c) bang machine: a car tyre dropped 85 cm. + cx = panels[2] + 110.0 + s.text(cx, 96, "(c) bang machine", 20, th.secondary, bold=True) + s.text(cx, 120, "JIS A 1418-2 only", 17, th.muted) + tyre_cy = 240.0 + s.ellipse(cx, tyre_cy, 62, 34, "none", th.secondary, sw=3.4) + s.ellipse(cx, tyre_cy, 30, 15, "none", th.secondary, sw=2.0) + s.text(cx, tyre_cy - 52, "(2.4 ± 0.2)·10⁵ Pa", 17, th.muted) + s.text(cx, tyre_cy + 62, "m_eff = (7.3 ± 0.2) kg", 17, th.muted) + s.arrow(cx, tyre_cy + 76, cx, slab_top - 8, th.secondary, 2.2) + s.dim(cx + 92, tyre_cy + 34, cx + 92, slab_top, "85 cm", offset=0, size=18, + label_side="right") + s.line(cx + 62, tyre_cy + 34, cx + 92, tyre_cy + 34, th.muted, 0.9, + dash="3,3") + + # -- the calibration chain, where the filter position decides the answer + s.rect(60, 508, 780, 60, th.panel, th.muted, rx=8, sw=1.4) + for i, (label, colour) in enumerate(( + ("source", th.fg), ("rigid floor +\nforce plate", th.fg), + ("octave filter", th.primary), ("analyser → L_FE", th.fg), + )): + px = 150.0 + i * 200.0 + if "\n" in label: + a, b = label.split("\n") + s.text(px, 532, a, 18, colour, bold=(colour == th.primary)) + s.text(px, 552, b, 18, colour) + else: + s.text(px, 543, label, 18, colour, bold=(colour == th.primary)) + if i < 3: + s.arrow(px + 66, 538, px + 132, 538, th.muted, 1.8) + s.text(450, 592, "JIS A 1418-2 Annex C: the filter goes BEFORE the " + "analyser,", 18, th.secondary, bold=True) + s.text(450, 613, "so L_FE is evaluated once per band", 18, th.secondary, + bold=True) + s.text(450, 638, "The dimensions above are the standards' informative " + "construction examples;", 17, th.muted, italic=True) + s.text(450, 658, "the specification is the force spectrum, not the shape.", + 17, th.muted, italic=True) + + +# --------------------------------------------------------------------------- +# ISO 10052 survey sweep +# --------------------------------------------------------------------------- + +def _d_survey_sweep(s: SVG, th: Theme) -> None: + """The survey method is a body posture and a sweep path, in plan.""" + x0, y0, x1, y1 = 60.0, 90.0, 500.0, 430.0 + s.rect(x0, y0, x1 - x0, y1 - y0, th.panel, th.fg, rx=6, sw=2.6) + s.text((x0 + x1) / 2, y0 - 14, "Plan of the room", 19, th.muted) + + # Separating element on the right wall of the plan. + s.rect(x1 - 12, y0, 12, y1 - y0, th.secondary, th.fg, sw=2) + s.text(x1 - 22, y0 + 30, "separating element", 18, th.secondary, + anchor="end", bold=True) + + # Loudspeaker in the far corner, facing into it, >= 0.5 m off the walls. + lx, ly = x0 + 74.0, y0 + 74.0 + s.rect(lx - 26, ly - 26, 52, 52, th.panel, th.primary, rx=6, sw=2) + s.circle(lx, ly, 13, th.primary) + s.circle(lx, ly, 5, th.bg) + s.arrow(lx - 14, ly - 14, x0 + 16, y0 + 16, th.primary, 2.0) + s.dim(x0, ly + 34, lx - 26, ly + 34, "≥ 0.5 m", offset=0, size=17) + s.dim(lx + 34, y0, lx + 34, ly - 26, "≥ 0.5 m", offset=0, size=17, + label_side="right") + s.text(x0 + 14, ly + 96, "corner opposite the element,", 17, th.muted, + anchor="start") + s.text(x0 + 14, ly + 116, "facing into the corner", 17, th.muted, + anchor="start") + + # Operator near the centre, facing away from the loudspeaker. + ox, oy = (x0 + x1) / 2 + 52.0, (y0 + y1) / 2 + 46.0 + s.circle(ox, oy, 15, th.muted) + s.arrow(ox + 12, oy + 12, ox + 52, oy + 52, th.muted, 1.6) + s.text(ox + 58, oy + 70, "facing away", 17, th.muted, anchor="start") + + # The 180-degree arm sweep, four times, at arm's length. + r = 82.0 + s.path(f"M {ox - r:.0f} {oy:.0f} A {r} {r} 0 0 1 {ox + r:.0f} {oy:.0f}", + stroke=th.accent, sw=3.2) + s.arrow(ox + r - 14, oy - 12, ox + r, oy, th.accent, 2.6) + s.line(ox, oy, ox - r, oy, th.fg, 2.0) + s.circle(ox - r, oy, 8, th.fg) + s.circle(ox - r, oy, 3, th.bg) + s.dim(ox, oy + 30, ox - r, oy + 30, "arm's length", offset=0, size=17) + s.text(ox + 16, oy - r - 18, "180° × 4 traverses,", 19, th.accent, + bold=True) + s.text(ox + 16, oy + r + 32, "≈ 30 s in total", 19, th.accent, bold=True) + + # Elevation beside it: the vertical component of the traverse. + ex0, ey_top, ey_bot = 560.0, 120.0, 430.0 + s.rect(ex0, ey_top, 300, ey_bot - ey_top, th.panel, th.fg, rx=6, sw=2.2) + s.text(ex0 + 150, ey_top - 14, "Elevation: the same sweep", 19, th.muted) + s.person(ex0 + 70, ey_bot - 20, h=150) + s.path(f"M {ex0 + 96:.0f} {ey_bot - 112:.0f} " + f"C {ex0 + 160:.0f} {ey_bot - 172:.0f} " + f"{ex0 + 208:.0f} {ey_bot - 74:.0f} " + f"{ex0 + 258:.0f} {ey_bot - 134:.0f}", + stroke=th.accent, sw=3.0) + s.circle(ex0 + 258, ey_bot - 134, 8, th.fg) + s.circle(ex0 + 258, ey_bot - 134, 3, th.bg) + s.text(ex0 + 150, ey_bot - 232, "raise and lower the arm", 18, th.accent) + s.text(ex0 + 150, ey_bot - 210, "during each traverse", 18, th.accent) + + for y, txt in ( + (470, ("Alternative (Clause 6.3.1): a rotating microphone on a stand, " + "≥ 10° to the horizontal, sweep radius ≥ 1 m.")), + (496, ("Without a real-time octave analyser, repeat the whole sweep " + "once per band and read each 30 s Leq.")), + (522, ("Tapping machine (6.2.3): centre of the floor, on the diagonal; " + "three positions at 45° to the ribs.")), + ): + s.text(60, y, txt, 18, th.fg, anchor="start") + + +# --------------------------------------------------------------------------- +# ISO 12354-1 Annex L / ISO 12354-2 Annex G worked building +# --------------------------------------------------------------------------- + +def _d_iso12354_annexl(s: SVG, th: Theme) -> None: + """The worked building both parts share: two stacked dwellings, the + separating floor and its four junctions, and where the thirteen paths run.""" + top = 74.0 + + # ===== Left: a section through the two dwellings ===== + ax0, aw = 40.0, 400.0 + s.text(ax0 + aw / 2, top + 22, "Section: two stacked dwellings", 19, th.fg, + bold=True) + wall_t, floor_t = 24.0, 20.0 + room_h = 92.0 # 2,75 m storey height + y_top = top + 56.0 + y_floor = y_top + room_h + y_bot = y_floor + floor_t + room_h + lx, rx = ax0 + 46.0, ax0 + aw - 46.0 + ix = ax0 + aw * 0.56 # internal wall + + for wx in (lx, rx - wall_t, ix): + s.rect(wx, y_top - 18, wall_t, y_bot - y_top + 36, th.panel, th.fg, + sw=2.0) + s.rect(lx + wall_t, y_floor, rx - lx - 2 * wall_t, floor_t, th.panel, + th.fg, sw=2.2) + s.rect(lx + wall_t, y_floor - 12, rx - lx - 2 * wall_t, 5, th.accent, + th.fg, sw=1.0) + s.rect(lx + wall_t, y_floor - 7, rx - lx - 2 * wall_t, 7, th.panel, th.fg, + sw=1.0) + + s.text(ax0 + aw / 2, y_top + 34, "source dwelling", 17, th.fg) + s.text(ax0 + aw / 2, y_bot - 24, "receiving dwelling", 17, th.fg) + + # The junction nodes, tagged with the letter the key explains. + for nx, tag in ((lx + wall_t / 2, "T"), (rx - wall_t / 2, "T"), + (ix + wall_t / 2, "X")): + ny = y_floor + floor_t / 2 + s.circle(nx, ny, 11.0, th.bg, th.secondary, 2.4) + s.text(nx, ny + 6, tag, 16, th.secondary, bold=True) + + # ===== Key under the section ===== + s.text(ax0 + 6, y_bot + 34, + "T rigid T (floor to external wall): Kij = 6,4 / 11,2 dB", 15, + th.secondary, anchor="start") + s.text(ax0 + 6, y_bot + 56, + "X rigid cross (floor to internal wall): Kij = 8,8 / 11,0 dB", 15, + th.secondary, anchor="start") + s.text(ax0 + 6, y_bot + 84, + "separating floor 220 mm concrete, 484 kg/m², fc = 76,8 Hz", 14, + th.fg, anchor="start") + s.text(ax0 + 6, y_bot + 106, + "on it 35 mm screed, 73,5 kg/m², on s' = 8 MN/m³", 14, th.accent, + anchor="start") + s.text(ax0 + 6, y_bot + 128, + "external walls 365 mm AAC, 219 kg/m², fc = 92,6 Hz", 14, th.muted, + anchor="start") + s.text(ax0 + 6, y_bot + 150, + "internal walls 200 mm calcium silicate, 360 kg/m², fc = 128,4 Hz", + 14, th.muted, anchor="start") + + # ===== Right: the plan of the separating floor ===== + bx0, by0, bw, bh = 546.0, top + 76.0, 268.0, 214.0 # 5,00 m x 4,00 m + s.text(bx0 + bw / 2, top + 22, "Plan: the separating floor", 19, th.fg, + bold=True) + s.rect(bx0, by0, bw, bh, th.panel, th.fg, sw=2.4) + # The four junction lines, each shared with one flanking element. + for x, y, w, h in ((bx0, by0 - 7, bw, 7), (bx0, by0 + bh, bw, 7), + (bx0 - 7, by0, 7, bh), (bx0 + bw, by0, 7, bh)): + s.rect(x, y, w, h, th.secondary, th.fg, sw=1.0) + s.text(bx0 + bw / 2, by0 + bh / 2 - 4, "S = 20 m²", 19, th.fg, bold=True) + s.text(bx0 + bw / 2, by0 + bh / 2 + 22, "5,00 m × 4,00 m", 15, th.muted) + s.dim(bx0, by0 + bh + 26, bx0 + bw, by0 + bh + 26, "5,00 m", offset=0, + size=16) + s.dim(bx0 - 26, by0, bx0 - 26, by0 + bh, "4,00 m", offset=0, size=16) + s.text(bx0 + bw / 2, by0 - 18, "external wall (T)", 14, th.secondary) + s.text(bx0 + bw / 2, by0 + bh + 62, "internal wall (X)", 14, th.secondary) + for i, txt in enumerate(( + "two external and two internal walls meet the floor, with", + "5,00 m of junction along each long edge and 4,00 m along", + "each short one: perimeter sum 9 m external + 9 m internal")): + s.text(bx0 + bw / 2, by0 + bh + 92 + 22 * i, txt, 15, + th.accent if i == 2 else th.fg) + + # ===== Footer: the path count ===== + s.rect(40, 508, 820, 84, "none", th.muted, rx=10, dash="6,5") + s.text(450, 536, + "13 airborne paths = 1 direct (Dd) + 4 flanking elements × 3 " + "branches (Ff, Df, Fd)", 16, th.fg) + s.text(450, 564, + "5 impact paths = 1 direct + 4 Df: only the floor is excited, so " + "there is no Ff or Fd", 16, th.primary) + + +# --------------------------------------------------------------------------- +# The three resilient build-ups a prediction is chosen by +# --------------------------------------------------------------------------- + +def _d_resilient_buildups(s: SVG, th: Theme) -> None: + """Floating floor, discrete mounts and a wall lining in section, each with + the formula its construction detail selects.""" + top = 74.0 + col = (48.0, 330.0, 612.0) + cw = 240.0 + + # ===== (a) Floating floor on a continuous resilient layer ===== + ax = col[0] + s.text(ax + cw / 2, top + 22, "(a) floating floor", 18, th.fg, bold=True) + slab_y = top + 158.0 + s.rect(ax, slab_y, cw, 46, th.panel, th.fg, sw=2.2) + s.text(ax + cw / 2, slab_y + 30, "220 mm structural slab", 14, th.fg) + s.rect(ax, slab_y - 14, cw, 14, th.accent, th.fg, sw=1.4) + s.rect(ax + 10, slab_y - 40, cw - 20, 26, th.panel, th.fg, sw=2.0) + s.text(ax + cw / 2, slab_y - 22, "35 mm screed, 73,5 kg/m²", 14, th.fg) + # The edge strip: the resilient layer turned up at the wall. + for wx in (ax, ax + cw - 12): + s.rect(wx, slab_y - 92, 12, 78, th.panel, th.fg, sw=2.0) + s.rect(wx + (12 if wx == ax else -6), slab_y - 44, 6, 30, th.accent, + th.fg, sw=1.0) + s.text(ax + cw / 2, slab_y - 60, "edge strip, both sides", 14, th.accent) + s.arrow(ax + 24, slab_y - 100, ax + 16, slab_y - 34, th.secondary, 2.0) + s.text(ax + 30, slab_y - 106, "any rigid bridge here", 14, th.secondary, + anchor="start") + s.text(ax + 30, slab_y - 88, "short-circuits the spring", 14, th.secondary, + anchor="start") + s.text(ax + cw / 2, slab_y + 74, "s' = 8 MN/m³ → fo = 52,8 Hz", 15, + th.accent, bold=True) + s.text(ax + cw / 2, slab_y + 98, "ΔL = 30 lg(f/fo) or 40 lg(f/fo)", 15, + th.fg, mono=True) + s.text(ax + cw / 2, slab_y + 120, "(ISO 12354-2 C.1 / C.3)", 14, th.muted) + + # ===== (b) A walking surface on discrete mounts ===== + bx = col[1] + s.text(bx + cw / 2, top + 22, "(b) discrete mounts", 18, th.fg, bold=True) + s.rect(bx, slab_y, cw, 46, th.panel, th.fg, sw=2.2) + s.text(bx + cw / 2, slab_y + 30, "structural slab", 14, th.fg) + s.rect(bx + 10, slab_y - 54, cw - 20, 22, th.panel, th.fg, sw=2.0) + s.text(bx + cw / 2, slab_y - 40, "50 mm surface, 115 kg/m²", 14, th.fg) + for k in range(4): + mx = bx + 34 + k * (cw - 68) / 3.0 + _spring_v(s, mx, slab_y - 32, slab_y, th.accent, coils=2, width=7.0, + sw=1.8) + # The reverberant bending field the surface carries between the mounts. + s.path(f"M {bx + 16} {slab_y - 66} Q {bx + 60} {slab_y - 80} " + f"{bx + 104} {slab_y - 66} T {bx + 192} {slab_y - 66} " + f"T {bx + 224} {slab_y - 66}", stroke=th.primary, sw=1.8) + s.text(bx + cw / 2, slab_y - 86, "reverberant bending field", 14, + th.primary, italic=True) + s.text(bx + cw / 2, slab_y + 74, "4 mounts per m² of 2 MN/m", 15, th.accent, + bold=True) + s.text(bx + cw / 2, slab_y + 98, "30 dB per decade, not 40", 15, th.fg, + mono=True) + s.text(bx + cw / 2, slab_y + 120, "(Vér's two-subsystem SEA model)", 14, + th.muted) + + # ===== (c) A wall lining, twice: bonded and on studs ===== + cx = col[2] + s.text(cx + cw / 2, top + 22, "(c) wall lining: two fixings", 18, th.fg, + bold=True) + for k, (label, formula, f_0, rating) in enumerate(( + ("adhesive dabs", "D.1", "542 Hz", "−9,0 dB"), + ("studs + cavity", "D.2", "70,8 Hz", "+13,8 dB"))): + wx = cx + k * 136.0 + s.rect(wx, slab_y - 96, 26, 150, th.panel, th.fg, sw=2.0) + s.text(wx + 13, slab_y + 70, "masonry", 13, th.muted) + if k == 0: + for j in range(4): + s.rect(wx + 26, slab_y - 84 + j * 36, 12, 14, th.accent, th.fg, + sw=1.0) + else: + s.rect(wx + 26, slab_y - 96, 40, 150, th.panel, th.muted, sw=1.2, + dash="4,3") + for j in range(2): + s.rect(wx + 30, slab_y - 90 + j * 96, 32, 8, th.accent, th.fg, + sw=1.0) + board_x = wx + (38 if k == 0 else 66) + s.rect(board_x, slab_y - 96, 12, 150, th.panel, th.primary, sw=2.0) + s.text(wx + 44, slab_y - 108, label, 13, th.fg, bold=True) + s.text(wx + 44, slab_y + 92, f"({formula}) fo = {f_0}", 14, th.accent) + s.text(wx + 44, slab_y + 114, rating, 15, + th.secondary if k == 0 else th.primary, bold=True) + + # ===== Footer ===== + s.rect(48, 402, 804, 82, "none", th.muted, rx=10, dash="6,5") + s.text(450, 430, + "the same board, two fixings: nearly 23 dB between them, and no " + "formula here can see which one was built", 15, th.fg) + s.text(450, 458, + "s' is the EN 29052-1 value measured WITHOUT pre-load, and the " + "series law (C.6) holds only for an uncut layer", 15, th.accent) diff --git a/scripts/diagrams/i18n.py b/scripts/diagrams/i18n.py index bdec3ba95..44db81a0d 100644 --- a/scripts/diagrams/i18n.py +++ b/scripts/diagrams/i18n.py @@ -13,6 +13,156 @@ # Spanish variants of every user-visible string. Strings not in the table # (numbers, unit-only labels, code identifiers) are shared between languages. _ES: dict[str, str] = { + # Facade sound insulation setup (buildings/insulation/facade-insulation). + "Facade sound insulation setup (ISO 16283-3)": + "Montaje de aislamiento acustico de fachada (ISO 16283-3)", + "Receiving room": "Recinto receptor", + "S = 11.5 m²": "S = 11,5 m²", + "Loudspeaker": "Altavoz", + "(on the ground)": "(sobre el suelo)", + "45° ± 5°": "45° ± 5°", + "r ≥ 5 m element / ≥ 7 m global": "r ≥ 5 m elemento / ≥ 7 m global", + "D > 3.5 m (element) / > 5 m (global)": + "D > 3,5 m (elemento) / > 5 m (global)", + "L₁,s element method": "L₁,s metodo de elemento", + "≤ 10 mm parallel / ≤ 3 mm normal": "≤ 10 mm paralelo / ≤ 3 mm normal", + "3 to 10 positions, never gridded": + "de 3 a 10 posiciones, nunca en rejilla", + "L₁,2m global method": "L₁,2m metodo global", + "(2.0 ± 0.2) m": "(2,0 ± 0,2) m", + "1.5 m": "1,5 m", + "above the": "por encima del", + "receiving-room floor": "suelo del recinto receptor", + "Element method → R'45° (loudspeaker) or R'tr,s (traffic): " + "one component, comparable with a laboratory R.": + "Metodo de elemento → R'45° o R'tr,s: un componente, comparable " + "con una R de laboratorio.", + "Global method → D2m,nT: the whole facade as built, " + "not comparable with a laboratory R.": + "Metodo global → D2m,nT: la fachada tal como esta construida; " + "no comparable con laboratorio.", + "Road traffic replaces the loudspeaker at all angles: " + "simultaneous inside and outside, ≥ 50 pass-bys.": + "El trafico rodado incide desde todos los angulos: medicion " + "simultanea dentro y fuera, ≥ 50 pasos.", + "Clauses 9.4, 9.5.1, 9.6.1 and 10.2. None of it is checked " + "by the functions.": + "Apartados 9.4, 9.5.1, 9.6.1 y 10.2. Nada de esto lo comprueban " + "las funciones.", + # Heavy and soft impact sources (buildings/insulation/heavy-impact-sources). + "Standard heavy and soft impact sources (ISO 16283-2, JIS A 1418-2)": + "Fuentes de impacto normalizadas (ISO 16283-2, JIS A 1418-2)", + "Floor under test (source room)": "Forjado ensayado (recinto emisor)", + "(a) tapping machine": "(a) maquina de impactos", + "ISO 10140-5 Annex E": "ISO 10140-5 Anexo E", + "5 hammers, 500 g each": "5 martillos de 500 g cada uno", + "(100 ± 20) ms apart": "separados (100 ± 20) ms", + "40 mm": "40 mm", + "(b) rubber ball": "(b) pelota de caucho", + "ISO 16283-2 Annex A / ISO 10140-5 Annex F": + "ISO 16283-2 Anexo A / ISO 10140-5 Anexo F", + "180 mm": "180 mm", + "30 mm wall": "pared de 30 mm", + "m_eff = (2.5 ± 0.1) kg": "m_ef = (2,5 ± 0,1) kg", + "e = 0.8 ± 0.1": "e = 0,8 ± 0,1", + "(100 ± 1) cm": "(100 ± 1) cm", + "from the ball's BOTTOM": "desde la BASE de la pelota", + "(c) bang machine": "(c) maquina de golpes", + "JIS A 1418-2 only": "solo en JIS A 1418-2", + "(2.4 ± 0.2)·10⁵ Pa": "(2,4 ± 0,2)·10⁵ Pa", + "m_eff = (7.3 ± 0.2) kg": "m_ef = (7,3 ± 0,2) kg", + "85 cm": "85 cm", + "source": "fuente", + "rigid floor +": "suelo rigido +", + "force plate": "plataforma de fuerza", + "octave filter": "filtro de octava", + "analyser → L_FE": "analizador → L_FE", + "JIS A 1418-2 Annex C: the filter goes BEFORE the analyser,": + "JIS A 1418-2 Anexo C: el filtro va ANTES del analizador,", + "so L_FE is evaluated once per band": + "de modo que L_FE se evalua una vez por banda", + "The dimensions above are the standards' informative construction " + "examples;": + "Las dimensiones anteriores son ejemplos constructivos informativos " + "de las normas;", + "the specification is the force spectrum, not the shape.": + "la especificacion es el espectro de fuerza, no la forma.", + # ISO 10052 survey sweep (buildings/insulation/insulation-survey). + "The ISO 10052 survey sweep (Clauses 6.2 and 6.3)": + "El barrido del metodo de control ISO 10052 (apartados 6.2 y 6.3)", + "Plan of the room": "Planta del recinto", + "separating element": "elemento separador", + "≥ 0.5 m": "≥ 0,5 m", + "corner opposite the element,": "esquina opuesta al elemento,", + "facing into the corner": "orientado hacia la esquina", + "facing away": "de espaldas", + "arm's length": "brazo extendido", + "180° × 4 traverses,": "180° × 4 barridos,", + "≈ 30 s in total": "≈ 30 s en total", + "Elevation: the same sweep": "Alzado: el mismo barrido", + "raise and lower the arm": "subir y bajar el brazo", + "during each traverse": "durante cada barrido", + "Alternative (Clause 6.3.1): a rotating microphone on a stand, ≥ 10° to " + "the horizontal, sweep radius ≥ 1 m.": + "Alternativa (apartado 6.3.1): microfono giratorio sobre soporte, " + "≥ 10° respecto a la horizontal, radio de barrido ≥ 1 m.", + "Without a real-time octave analyser, repeat the whole sweep once per " + "band and read each 30 s Leq.": + "Sin analizador de octavas en tiempo real, repetir todo el barrido " + "una vez por banda y leer cada Leq de 30 s.", + "Tapping machine (6.2.3): centre of the floor, on the diagonal; " + "three positions at 45° to the ribs.": + "Maquina de impactos (6.2.3): centro del forjado, en la diagonal; " + "tres posiciones a 45° respecto a las viguetas.", + # Rooms / prediction: the EN 12354-6 take-off plate and the directivity + # plate (buildings/rooms/enclosed-space-absorption, room-image-sources). + "Room take-off: one room, three input lists (EN 12354-6)": + "Levantamiento del recinto: una sala, tres listas de entrada " + "(EN 12354-6)", + "1000 Hz octave band": "banda de octava de 1000 Hz", + "V = 29.75 m³": "V = 29,75 m³", + "ceiling 12.39 m² αs 0.02": "techo 12,39 m² αs 0,02", + "glass facade 10.90 m² αs 0.04": "fachada de vidrio 10,90 m² αs 0,04", + "floor 12.39 m² αs 0.05": "suelo 12,39 m² αs 0,05", + "short wall 6.55 m² αs 0.04 (x2)": "pared corta 6,55 m² αs 0,04 (x2)", + "long wall (brick) 10.90 m² αs 0.04": + "pared larga (ladrillo) 10,90 m² αs 0,04", + "objects: 0.15, 0.60, 2 × 0.05, 2 × 0.65 m³": + "objetos: 0,15, 0,60, 2 × 0,05, 2 × 0,65 m³", + "A = 2.26 m² (Formula 1)": "A = 2,26 m² (fórmula 1)", + "Aobj = 2.77 m² ψ = 0.072": "Aobj = 2,77 m² ψ = 0,072", + "(Formula 4, then Formula 3)": "(fórmula 4, después fórmula 3)", + "One wall, two rows": "Una pared, dos filas", + "window": "ventana", + "one wall on the drawing": "una pared en el plano", + "areas sum to the wall": "las áreas suman la pared", + "Never average a lining into its wall by hand: the areas are weighted " + "inside the formula.": + "Nunca promedie a mano un revestimiento con su pared: la fórmula ya " + "pondera por área.", + "Directivity factor Q: four mountings, four critical distances": + "Factor de directividad Q: cuatro montajes, cuatro distancias críticas", + "The same compact source, four mountings (workshop with R = 62 m²)": + "La misma fuente compacta, cuatro montajes (taller con R = 62 m²)", + "radiates into 4π sr": "radia en 4π sr", + "radiates into 2π sr": "radia en 2π sr", + "radiates into π sr": "radia en π sr", + "radiates into π/2 sr": "radia en π/2 sr", + "free space": "campo libre", + "hard floor": "suelo rígido", + "floor-wall edge": "arista suelo-pared", + "trihedral corner": "rincón triedro", + "on a stand": "sobre un trípode", + "on the slab": "sobre la solera", + "against a wall on the slab": "contra una pared, sobre la solera", + "in the corner of the workshop": "en el rincón del taller", + "Q multiplies the direct term only: the reverberant plateau does not move.": + "Q solo multiplica el término directo: la meseta reverberante no se " + "mueve.", + "rc = √(Q·R/16π), so two steps of mounting move the crossover by a " + "factor of 2.": + "rc = √(Q·R/16π), así que dos escalones de montaje desplazan el cruce " + "un factor 2.", "Calibration chain — from calibrator to physical units": "Cadena de calibración — del calibrador a unidades físicas", # Speech Intelligibility Index (ANSI S3.5-1997) @@ -40,6 +190,159 @@ "H siseo: una banda ≥ 1000 Hz supera RC en > 3 dB", "N neutral: within both tolerances": "N neutro: dentro de ambas tolerancias", + # Measuring the rated spectrum (ANSI/ASA S12.2-2019, clause 5.2.5) + "Measuring the rated spectrum (ANSI/ASA S12.2-2019, clause 5.2.5)": + "Medida del espectro que se califica (ANSI/ASA S12.2-2019, cláusula 5.2.5)", + "ceiling plenum": "plénum del falso techo", + "supply duct": "conducto de impulsión", + "diffuser": "difusor", + "air handler": "climatizadora", + "design condition": "en su régimen de diseño", + "0.6 m": "0,6 m", + "1.2 m": "1,2 m", + "2.4 m": "2,4 m", + "1.1 m": "1,1 m", + "0.75 m": "0,75 m", + "≥ 0.6 m": "≥ 0,6 m", + "≥ 1.2 m": "≥ 1,2 m", + "≥ 2.4 m": "≥ 2,4 m", + "Microphone height (5.2.5)": "Altura del micrófono (5.2.5)", + "Adult, standing": "Adulto, de pie", + "Adult, seated": "Adulto, sentado", + "Child, standing": "Niño, de pie", + "Child, seated": "Niño, sentado", + "Standoff (5.2.5)": "Separación (5.2.5)", + "One reflecting surface": "Una superficie", + "Two surfaces meeting": "Dos superficies", + "Three surfaces meeting": "Tres superficies", + "Instrument and condition": "Instrumento y condición", + "Integrating-averaging, L_EQ": "Integrador-promediador, L_EQ", + "Class 2 minimum (5.1.1)": "Clase 2 como mínimo (5.1.1)", + "Octave bands 16 Hz – 8 kHz": "Bandas de octava 16 Hz – 8 kHz", + "Room unoccupied, plant running": "Sala vacía, instalación en marcha", + "L_EQ at the named position — or scan the whole space at ≤ 0.5 m/s " + "for ≥ 20 s": + "L_EQ en la posición indicada — o barrer toda la sala a ≤ 0,5 m/s " + "durante ≥ 20 s", + "green dashed: microphone exclusion zones (5.2.5)": + "verde discontinuo: zonas excluidas para el micrófono (5.2.5)", + "Before rating (5.3.2): is the noise steady?": + "Antes de calificar (5.3.2): ¿es estacionario el ruido?", + "screen 16, 31.5 and 63 Hz aurally and on a fast, Z-weighted meter, " + "then check L_MAX − L_EQ and L_10 − L_EQ": + "explorar 16, 31,5 y 63 Hz de oído y con el sonómetro en rápida y " + "ponderación Z; comprobar", + "against Table 3 — a field that fails belongs to RNC (clause 5.3), " + "not to NC or RC": + "L_MAX − L_EQ y L_10 − L_EQ frente a la Tabla 3 — si falla, es RNC " + "(cláusula 5.3), no NC ni RC", + # Where the ISO 3382-3 measurement line goes (clauses 5.1 and 5.2) + "Where the ISO 3382-3 measurement line goes (clauses 5.1 and 5.2)": + "Dónde va la línea de medida de la ISO 3382-3 (cláusulas 5.1 y 5.2)", + "(a) Plan — 30 × 12 m floor, two ceiling zones": + "(a) Planta — superficie de 30 × 12 m, dos zonas de techo", + "absorbent raft ceiling": "techo con islas absorbentes", + "plain plaster ceiling": "techo de yeso liso", + "zones measured and reported separately": + "las zonas se miden y se reportan por separado", + "≥ 2.0 m from walls and other reflecting surfaces": + "≥ 2,0 m de paredes y otras superficies reflectantes", + "1.2 m screens": "mamparas de 1,2 m", + "P1 at the nearest workstation; the path need not be straight": + "P1 en el puesto más cercano; la trayectoria no tiene que ser recta", + "only 2 m to 16 m enter D2,S": "solo de 2 m a 16 m entran en D2,S", + "≥ 0.5 m from tables": "≥ 0,5 m de las mesas", + "(b) Section — both heights are 1.2 m (5.2.2)": + "(b) Sección — ambas alturas son 1,2 m (5.2.2)", + "omnidirectional, pink noise": "omnidireccional, ruido rosa", + "seated head position": "posición de la cabeza sentada", + "Source (5.1.1):": "Fuente (5.1.1):", + "omnidirectional, pink noise, ISO 3382-1": + "omnidireccional, ruido rosa, directividad", + "directivity; a pink-spectrum sweep or": + "según ISO 3382-1; también vale un barrido", + "MLS may be used instead": "o un MLS de espectro rosa", + "Receiver (5.1.2):": "Recepción (5.1.2):", + "class 1 to IEC 61672-1, IEC 61260 octave": + "clase 1 según IEC 61672-1, filtros de octava", + "filters, omnidirectional capsule,": + "IEC 61260, micrófono omnidireccional,", + "≥ 10 s integration": "integración ≥ 10 s", + "Room (5.2.1):": "Sala (5.2.1):", + "furnished, nobody present but the": + "amueblada, sin más personas que los", + "operators, HVAC and any masking system": + "operadores, climatización y enmascaramiento", + "at working-day power": "a la potencia de un día normal", + "Line (5.2.2):": "Línea (5.2.2):", + "6 to 10 positions preferred, 4 the minimum;": + "de 6 a 10 posiciones preferible, 4 el mínimo;", + "≥ 2 source positions, or the line walked": + "≥ 2 posiciones de fuente, o recorrer la línea", + "in both directions": "en los dos sentidos", + # Room-acoustics measurement setup (ISO 3382-1 / ISO 3382-2) + "Room plan (top view) — 10.0 × 6.0 m, 3.5 m high": + "Planta de la sala (vista superior) — 10,0 × 6,0 m, 3,5 m de altura", + "avoid symmetry lines": "evitar las líneas de simetría", + "2.4 m > d_min": "2,4 m > d_min", + "d_min": "d_min", + "• source height 1.5 m": "• fuente a 1,5 m de altura", + "• off the symmetry axes": "• fuera de los ejes de simetría", + "ISO 3382-2 (source clearance):": + "ISO 3382-2 (separación a la fuente):", + "d_min = 2√(V/cT̂) = 2.0 m": "d_min = 2√(V/cT̂) = 2,0 m", + "for V = 210 m³, T̂ = 0.6 s": "para V = 210 m³, T̂ = 0,6 s", + # The measuring chain in section (ISO 3382-1, 4.2 and 4.3) + "The measuring chain in section (ISO 3382-1 clauses 4.2 and 4.3)": + "La cadena de medida en sección (ISO 3382-1, cláusulas 4.2 y 4.3)", + "Section through the same 10.0 × 6.0 × 3.5 m room": + "Sección de la misma sala de 10,0 × 6,0 × 3,5 m", + "dodecahedron": "dodecaedro", + "acoustic centre": "centro acústico", + "d_min = 2.0 m": "d_min = 2,0 m", + "ISO 3382-1 Table 1 — omnidirectionality over gliding 30° arcs": + "ISO 3382-1 Tabla 1 — omnidireccionalidad (arcos de 30°)", + "Hz / dB, measured at ≥ 1.5 m — in practice a dodecahedron, not a monitor": + "Hz / dB, medido a ≥ 1,5 m — en la práctica un dodecaedro, no un monitor", + "Level (4.2.1):": "Nivel (4.2.1):", + "≥ 45 dB over the background": "≥ 45 dB sobre el ruido de fondo", + "per band for T30, ≥ 35 dB for T20": "por banda para T30; 35 dB para T20", + "Receiving chain (4.2.2.2):": "Cadena de recepción (4.2.2.2):", + "class 1 to IEC 61672-1,": "clase 1 según IEC 61672-1,", + "IEC 61260 filters, omnidirectional": "filtros IEC 61260, micrófono", + "capsule, ≤ 13 mm preferred": "omnidireccional, ≤ 13 mm preferible", + # Dimensioning the ISO 18233 excitation (T = 1.2 s) + "Dimensioning the excitation for a room with T = 1.2 s (ISO 18233)": + "Dimensionado de la excitación para una sala con T = 1,2 s (ISO 18233)", + "1 What you play, and how long you keep recording": + "1 Qué se reproduce, y cuánto se sigue grabando", + "sweep, 4.0 s = 3.3 × T": "barrido, 4,0 s = 3,3 × T", + "silence ≈ T": "silencio ≈ T", + "record window 5.2 s": "ventana de grabación 5,2 s", + "B.3.1: sweep 2–4 × T, silent gap ≈ T | B.6: +3 dB effective SNR " + "per doubling": + "B.3.1: barrido 2–4 × T, silencio ≈ T | B.6: +3 dB de S/R " + "efectiva por duplicación", + "2 If the excitation repeats, the period must exceed T (6.2.2.2)": + "2 Si la excitación se repite, el periodo debe superar T (6.2.2.2)", + "period 1, warm-up: discarded": "periodo 1, arranque: se descarta", + "period 2, kept": "periodo 2, se conserva", + "order 17 → 2.73 s ≥ T": "orden 17 → 2,73 s ≥ T", + "0.68 s": "0,68 s", + "order 15 is shorter than T: the tail folds onto the head and T comes " + "out short": + "el orden 15 es más corto que T: la cola se pliega sobre el inicio y " + "T sale corto", + "3 After linear deconvolution (B.5)": + "3 Tras la deconvolución lineal (B.5)", + "kept by default: the linear impulse response and its tail": + "se conserva por defecto: la respuesta al impulso lineal y su cola", + "discarded, or read as distortion": + "se descarta, o se lee como distorsión", + "the linear deconvolution's own decaying noise tail — not the room": + "la cola de ruido decreciente de la propia deconvolución — no la sala", + "Arrival time relative to the linear impulse response [s]": + "Tiempo de llegada respecto a la respuesta al impulso lineal [s]", # Hearing threshold (ISO 7029 / ISO 389-7) "Hearing-threshold model (ISO 7029 age distribution, ISO 389-7 zero)": "Modelo del umbral de audición (ISO 7029 por edad, cero ISO 389-7)", @@ -266,13 +569,10 @@ "Airborne sound insulation setup (ISO 16283-1)": "Montaje de aislamiento acústico aéreo (ISO 16283-1)", "Source room": "Recinto emisor", - "Receiving room": "Recinto receptor", "Test partition": "Partición de ensayo", - "Loudspeaker": "Altavoz", "microphone positions": "posiciones de micrófono", "≥ 1.0 m": "≥ 1,0 m", "≥ 0.7 m": "≥ 0,7 m", - "≥ 0.5 m": "≥ 0,5 m", "7.6 a) ≥ 0.7 m between microphone positions": "7.6 a) ≥ 0,7 m entre posiciones de micrófono", "7.6 b) ≥ 0.5 m to room boundaries": @@ -415,6 +715,77 @@ "piston f = 1–4 Hz": "pistón f = 1–4 Hz", "R from L_p,s − L_p,t (κ′ per Annex A)": "R por L_p,s − L_p,t (κ′ según Anexo A)", + "seal": "sellado", + "grid": "rejilla", + "specimen A, d": "probeta A, d", + "flow source": "fuente de caudal", + "≥ 1 bore": "≥ 1 diámetro", + "cell ≥ 29 mm bore, ≥ 1 bore of free space above": + "celda ≥ 29 mm de diámetro, ≥ 1 diámetro libre por encima", + "q_v and Δp each to ±5 %, Δp readable to 0.1 Pa": + "q_v y Δp con ±5 % cada uno, Δp legible hasta 0,1 Pa", + "grid ≥ 50 % open, R < 1 %; d measured in position": + "rejilla ≥ 50 % abierta, R < 1 %; d medido en posición", + "measurement cell → L_p,s (h_s)": "celda de medida → L_p,s (h_s)", + "airtight termination → L_p,t (h_t)": "terminación estanca → L_p,t (h_t)", + # d24 - ISO 354 reverberation-room sound absorption + "Reverberation-room sound absorption (ISO 354)": + "Absorción acústica en cámara reverberante (ISO 354)", + "Reverberation room · plan": "Cámara reverberante · planta", + "V = 200 m³ (≥ 150 m³)": "V = 200 m³ (≥ 150 m³)", + "diffusers 0.8–3 m² each, ≈ 5 kg/m² (Annex A)": + "difusores 0,8–3 m² cada uno, ≈ 5 kg/m² (Anexo A)", + "Test specimen S = 10.8 m²": "Probeta de ensayo S = 10,8 m²", + "10–12 m², width/length 0.7–1, edges not parallel to the room": + "10–12 m², anchura/longitud 0,7–1, bordes no paralelos a la cámara", + "microphones ≥ 1.5 m apart, ≥ 2 m from a source, ≥ 1 m from any " + "surface and from the specimen": + "micrófonos separados ≥ 1,5 m, a ≥ 2 m de una fuente y a ≥ 1 m de " + "cualquier superficie y de la probeta", + "≥ 0.75 m": "≥ 0,75 m", + "≥ 1.5 m": "≥ 1,5 m", + "The measurement is a difference": "La medida es una diferencia", + "1 · empty room": "1 · cámara vacía", + "2 · specimen installed": "2 · probeta instalada", + "Annex B mounting (part of the result)": + "Montaje del Anexo B (parte del resultado)", + "Type A: directly on the rigid floor": + "Tipo A: directamente sobre el suelo rígido", + "Type E-400: 400 mm face to floor": + "Tipo E-400: 400 mm de la cara al suelo", + "perimeter frame, flush": "marco perimetral, enrasado", + "A = 55.3 V/(c T) − 4 V m · c = 331 + 0.6 t (15–30 °C)": + "A = 55,3 V/(c T) − 4 V m · c = 331 + 0,6 t (15–30 °C)", + "≥ 12 spatially independent decays = ≥ 3 microphones × ≥ 2 sources " + "· T₂₀ read from −5 dB over 20 dB": + "≥ 12 curvas de caída espacialmente independientes = ≥ 3 micrófonos " + "× ≥ 2 fuentes · T₂₀ leído desde −5 dB sobre 20 dB", + "the empty-room A₁ must clear the Table 1 ceiling, and T₁ is " + "measured without the specimen frame": + "A₁ de la cámara vacía debe quedar bajo el techo de la Tabla 1, y T₁ " + "se mide sin el marco de la probeta", + # d25 - ISO 10534-1 standing-wave-ratio apparatus + "Standing-wave-ratio tube: probe traverse and the minima (ISO 10534-1)": + "Tubo de onda estacionaria: recorrido de la sonda y los mínimos " + "(ISO 10534-1)", + "one pure tone at a time": "un tono puro cada vez", + "Test specimen on the rigid backing": + "Probeta sobre la terminación rígida", + "probe microphone on a graduated carriage": + "micrófono de sonda sobre carro graduado", + "|p(x)| envelope": "envolvente |p(x)|", + "minima far from the specimen fill in (wall losses, exaggerated " + "here): read the nearest one": + "los mínimos lejanos a la probeta se rellenan (pérdidas en la pared, " + "exageradas aquí): leer el más cercano", + "one channel: the microphone sensitivity cancels and there is no " + "inter-channel phase mismatch": + "un solo canal: la sensibilidad del micrófono se cancela y no hay " + "desajuste de fase entre canales", + "magnitude from the ratio, phase from the position — which is why " + "Part 1 is the arbitration method": + "magnitud por la razón, fase por la posición — por eso la Parte 1 es " + "el método de arbitraje", # d15 - ISO 17497-1 random-incidence scattering (reverberation room) "Random-incidence scattering in a reverberation room (ISO 17497-1)": "Dispersión a incidencia aleatoria en cámara reverberante (ISO 17497-1)", @@ -616,7 +987,6 @@ "Band metrics widen the reduced axis instead: (…, bands).": "Las métricas por banda ensanchan el eje reducido: (…, bandas).", # open-plan - "source": "fuente", "spatial-decay fit range (2 m to 16 m)": "rango de ajuste de caída espacial (2 m a 16 m)", "spatial decay rate": "tasa de caída espacial", @@ -741,22 +1111,45 @@ "day 1": "día 1", "choose by work pattern (Table B.1) → LEX,8h + Annex C uncertainty": "según el patrón de trabajo (Tabla B.1) → LEX,8h + U del Anexo C", - # Dynamic-stiffness resonance rig (ISO 9052-1) - "Dynamic-stiffness resonance rig (ISO 9052-1)": - "Banco de resonancia de rigidez dinámica (ISO 9052-1)", - "Resonance rig": "Banco de resonancia", - "Rigid foundation": "Base rígida", - "Load plate": "Placa de carga", - "Resilient specimen": "Probeta resiliente", - "Exciter": "Excitador", - "Accelerometer": "Acelerómetro", + # Dynamic-stiffness resonance rig (EN 29052-1) + "Dynamic-stiffness resonance rig (EN 29052-1)": + "Banco de resonancia de rigidez dinámica (EN 29052-1)", + "The three excitation arrangements (Figures 1 to 3)": + "Las tres disposiciones de excitación (Figuras 1 a 3)", + "Rigid base": "Base rígida", + "load plate measured": "se mide la placa de carga", + "Isolated baseplate": "Placa base aislada", + "load plate driven, both measured": + "se excita la placa de carga; se miden ambas", + "baseplate driven, both measured": + "se excita la placa base; se miden ambas", + "Rigid foundation": "Cimentación rígida", + "Baseplate ≥ 100 kg": "Placa base ≥ 100 kg", + "all three are equivalent; sinusoidal excitation is the reference " + "method in case of dispute (7.1)": + "las tres son equivalentes; la excitación sinusoidal es el método " + "de referencia en caso de litigio (7.1)", + "Specimen and load (Clauses 5 and 6)": + "Probeta y carga (capítulos 5 y 6)", + "plaster of Paris ≥ 5 mm on 0.02 mm foil": + "escayola ≥ 5 mm sobre lámina de 0,02 mm", + "Load plate, steel": "Placa de carga, acero", + "(200 ± 3) mm square, flat to 0.5 mm": + "(200 ± 3) mm de lado, planitud 0,5 mm", + "8 kg ± 0.5 kg with every device on it": + "8 kg ± 0,5 kg con todos los equipos encima", + "Resilient specimen, 200 mm × 200 mm": + "Probeta resiliente, 200 mm × 200 mm", + "three of them; irregularities < 3 mm": + "tres probetas; irregularidades < 3 mm", + "petroleum-jelly fillet (closed-cell materials)": + "cordón de vaselina (materiales de celda cerrada)", "Mass-spring model": "Modelo masa-resorte", - "resonance read from the response peak": - "la resonancia se lee del pico de la respuesta", + "read at the peak, extrapolated to zero force": + "se lee en el pico, extrapolado a fuerza nula", "s′t = 4π² m′t fr² (Formula 4)": "s′t = 4π² m′t fr² (Fórmula 4)", - "then f₀ = (1/2π)·√(s′/m′) for the installed floating floor (Formula 2)": - "luego f₀ = (1/2π)·√(s′/m′) para el suelo flotante instalado " - "(Fórmula 2)", + "f₀ = (1/2π)·√(s′/m′) (Formula 2)": + "f₀ = (1/2π)·√(s′/m′) (Fórmula 2)", # Mechanical-mobility rig (ISO 7626) "Mechanical-mobility measurement on a beam (ISO 7626)": "Medición de movilidad mecánica sobre una viga (ISO 7626)", @@ -1000,7 +1393,6 @@ "Refracción atmosférica: multitrayecto y sombra por el viento", "wind u(z)": "viento u(z)", "acoustic shadow": "sombra acústica", - "1.5 m": "1,5 m", "Upwind: rays bend up; beyond ≈ 220 m a ground shadow opens and the level collapses by over 20 dB": "Contra el viento: los rayos suben; desde ≈ 220 m se abre una " "sombra y el nivel cae más de 20 dB", @@ -1728,4 +2120,175 @@ "sigbands=True devuelve además la señal de banda a fs", "the decimated branch is interpolated back with resample_poly(M, 1)": "la rama diezmada se interpola de vuelta con resample_poly(M, 1)", + # --- B9: buildings/design plates (EN 15657, ISO 16251-1, ISO 12354) --- + "EN 15657 low- and high-mobility reception plates": + "Placas receptoras de baja y alta movilidad de la EN 15657", + "Low-mobility plate (7.2.2)": "Placa de baja movilidad (7.2.2)", + "3,15 m x 2,23 m": "3,15 m x 2,23 m", + "100 mm concrete, ρ = 2 300 ± 200 kg/m³": + "hormigón de 100 mm, ρ = 2 300 ± 200 kg/m³", + "S = 7,0 m² (≥ 5 m²), sides ≈ √2 : 1": + "S = 7,0 m² (≥ 5 m²), lados ≈ √2 : 1", + "η ≥ 0,08 over 50 Hz to 100 Hz": "η ≥ 0,08 de 50 Hz a 100 Hz", + "≥ 6 velocity positions, ≈ 0,5 m apart": + "≥ 6 posiciones de velocidad, a ≈ 0,5 m entre sí", + "and ≥ 0,1 m from any contact point": + "y a ≥ 0,1 m de cualquier punto de contacto", + "elastic pads ≤ 100 × 100 mm": "apoyos elásticos ≤ 100 × 100 mm", + "High-mobility plate (7.3.2)": "Placa de alta movilidad (7.3.2)", + "source bolted rigidly": "fuente atornillada rígidamente", + "support frame": "bastidor de sujeción", + "1 mm steel or 1,5 mm aluminium": "acero de 1 mm o aluminio de 1,5 mm", + "≈ 50 % perforated, ⌀ ≈ 6 mm holes,": + "≈ 50 % perforada, agujeros de ⌀ ≈ 6 mm,", + "so the source's own airborne sound": + "para que el ruido aéreo de la propia fuente", + "cannot drive the sheet": "no excite la lámina", + "Ts and Y measured with the": "Ts e Y medidos con la", + "source fitted (7.1)": "fuente instalada (7.1)", + "Three-plate bench (Figure 2)": "Banco de tres placas (figura 2)", + "whirlpool bath": "bañera de hidromasaje", + "> 10 dB between plates": "> 10 dB entre placas", + "up to three isolated plates,": "hasta tres placas aisladas,", + "for a source that touches": "para una fuente que toca", + "several building elements": "varios elementos constructivos", + "the velocity level difference": "la diferencia de nivel de velocidad", + "is measured per EN ISO 10848-1": "se mide según la EN ISO 10848-1", + "in every band, with the": "en cada banda, con el", + "equipment removed": "equipo desmontado", + "low-mobility plate -> blocked force (15) -> characteristic power L_Wsn (17)": + "placa de baja movilidad -> fuerza bloqueada (15) -> potencia característica L_Wsn (17)", + "high-mobility plate -> free velocity (18) -> source mobility |Y_S,eq| (19)": + "placa de alta movilidad -> velocidad libre (18) -> movilidad de fuente |Y_S,eq| (19)", + "ISO 16251-1 small floor mock-up for floor-covering improvement": + "Maqueta de suelo de la ISO 16251-1 para la mejora de un revestimiento", + "Section": "Sección", + "concrete slab, 200 ± 10 mm": "losa de hormigón, 200 ± 10 mm", + "covering specimen": "probeta de revestimiento", + "tapping machine (ISO 10140-5)": "máquina de impactos (ISO 10140-5)", + "5 hammers, 0,5 kg from 40 mm, 10 s⁻¹": + "5 martillos, 0,5 kg desde 40 mm, 10 s⁻¹", + "accelerometer screwed or glued underneath": + "acelerómetro atornillado o pegado por debajo", + "elastic pads": "apoyos elásticos", + "four elastic pads at the corners, each ≤ 100 × 100 mm": + "cuatro apoyos elásticos en las esquinas, cada uno ≤ 100 × 100 mm", + "vertical resonance of the slab on its pads < 20 Hz": + "resonancia vertical de la losa sobre sus apoyos < 20 Hz", + "top flat to ± 1 mm in a line edge to edge": + "cara superior plana a ± 1 mm en línea de borde a borde", + "Plan": "Planta", + "machine positions above, accelerometers below": + "posiciones de la máquina arriba, acelerómetros abajo", + "1 200 × 800 mm (± 50 mm)": "1 200 × 800 mm (± 50 mm)", + "≥ 2 machine positions, skew to the edges,": + "≥ 2 posiciones de la máquina, oblicuas a los bordes,", + "no hammer within 100 mm of an edge, all feet on the specimen": + "ningún martillo a menos de 100 mm de un borde, todas las patas sobre la probeta", + "≥ 4 accelerometer positions, uniform but random,": + "≥ 4 posiciones de acelerómetro, uniformes pero aleatorias,", + "off the symmetry lines and ≥ 100 mm from every edge": + "fuera de las líneas de simetría y a ≥ 100 mm de cada borde", + "three cycles: with specimen | without specimen (hammers repeated within ± 20 mm) | background": + "tres ciclos: con probeta | sin probeta (martillos repetidos dentro de ± 20 mm) | ruido de fondo", + "≥ 20 s per level; background rule: unchanged ≥ 15 dB, energy subtraction 6-15 dB, −1,3 dB below 6 dB": + "≥ 20 s por nivel; regla de fondo: sin cambio ≥ 15 dB, resta energética 6-15 dB, −1,3 dB por debajo de 6 dB", + "L_a = 10 lg(/a₀²), a₀ = 10⁻⁶ m/s² (Formula 1)": + "L_a = 10 lg(/a₀²), a₀ = 10⁻⁶ m/s² (fórmula 1)", + "EN 12354-1 Annex E junction types, path branches and the mass ratio": + "Tipos de unión del anexo E de la EN 12354-1, ramas de vía y cociente de masas", + "rigid cross": "cruz rígida", + "rigid T": "T rígida", + "T with a flexible interlayer": "T con capa elástica intermedia", + "elastic layer": "capa elástica", + "corner": "esquina", + "thickness change": "cambio de espesor", + "lightweight double leaf": "doble hoja ligera", + "rigid cross:": "cruz rígida:", + "rigid T:": "T rígida:", + "flexible T:": "T flexible:", + "corner:": "esquina:", + "thickness change:": "cambio de espesor:", + "lightweight double leaf:": "doble hoja ligera:", + "M = lg(m'perp,i / m'i): m'i is the element carrying the path, so the ratio is per path, not per junction.": + "M = lg(m'perp,i / m'i): m'i es el elemento que lleva la vía, así que el cociente es por vía, no por unión.", + "The functions take the RATIO, not M. Annex H.3 floor, ratio 1,61: 'through' -> K13 = 12,5 dB, 'corner' -> K12 = 8,9 dB": + "Las funciones toman el COCIENTE, no M. Forjado del anexo H.3, cociente 1,61: 'through' -> K13 = 12,5 dB, 'corner' -> K12 = 8,9 dB", + "ℓf is the coupling length along the junction line, measured surface to surface. Annex E values are read at 500 Hz, +/- 3 dB.": + "ℓf es la longitud de acoplamiento a lo largo de la unión, medida de superficie a superficie. Los valores del anexo E se leen a 500 Hz, +/- 3 dB.", + "ISO 12354-1 Annex L worked building: elements, junctions, paths": + "Edificio resuelto del anexo L de la ISO 12354-1: elementos, uniones y vías", + "Section: two stacked dwellings": "Sección: dos viviendas superpuestas", + "source dwelling": "vivienda emisora", + "receiving dwelling": "vivienda receptora", + "T rigid T (floor to external wall): Kij = 6,4 / 11,2 dB": + "T T rígida (forjado a muro exterior): Kij = 6,4 / 11,2 dB", + "X rigid cross (floor to internal wall): Kij = 8,8 / 11,0 dB": + "X cruz rígida (forjado a tabique interior): Kij = 8,8 / 11,0 dB", + "separating floor 220 mm concrete, 484 kg/m², fc = 76,8 Hz": + "forjado separador hormigón de 220 mm, 484 kg/m², fc = 76,8 Hz", + "on it 35 mm screed, 73,5 kg/m², on s' = 8 MN/m³": + "sobre él solera de 35 mm, 73,5 kg/m², sobre s' = 8 MN/m³", + "external walls 365 mm AAC, 219 kg/m², fc = 92,6 Hz": + "muros exteriores hormigón celular de 365 mm, 219 kg/m², fc = 92,6 Hz", + "internal walls 200 mm calcium silicate, 360 kg/m², fc = 128,4 Hz": + "tabiques interiores silicocalcáreo de 200 mm, 360 kg/m², fc = 128,4 Hz", + "Plan: the separating floor": "Planta: el forjado separador", + "external wall (T)": "muro exterior (T)", + "internal wall (X)": "tabique interior (X)", + "two external and two internal walls meet the floor, with": + "dos muros exteriores y dos interiores llegan al forjado, con", + "5,00 m of junction along each long edge and 4,00 m along": + "5,00 m de unión en cada borde largo y 4,00 m en", + "each short one: perimeter sum 9 m external + 9 m internal": + "cada borde corto: suma del perímetro 9 m exterior + 9 m interior", + "13 airborne paths = 1 direct (Dd) + 4 flanking elements × 3 branches (Ff, Df, Fd)": + "13 vías aéreas = 1 directa (Dd) + 4 elementos de flanco × 3 ramas (Ff, Df, Fd)", + "5 impact paths = 1 direct + 4 Df: only the floor is excited, so there is no Ff or Fd": + "5 vías de impacto = 1 directa + 4 Df: solo se excita el forjado, así que no hay Ff ni Fd", + "Resilient layers in section: floating floor, mounts, wall lining": + "Capas elásticas en sección: suelo flotante, apoyos y trasdosado", + "(a) floating floor": "(a) suelo flotante", + "220 mm structural slab": "forjado estructural de 220 mm", + "35 mm screed, 73,5 kg/m²": "solera de 35 mm, 73,5 kg/m²", + "edge strip, both sides": "banda perimetral, en ambos lados", + "any rigid bridge here": "cualquier puente rígido aquí", + "short-circuits the spring": "cortocircuita el muelle", + "s' = 8 MN/m³ → fo = 52,8 Hz": "s' = 8 MN/m³ → fo = 52,8 Hz", + "ΔL = 30 lg(f/fo) or 40 lg(f/fo)": "ΔL = 30 lg(f/fo) o 40 lg(f/fo)", + "(ISO 12354-2 C.1 / C.3)": "(ISO 12354-2 C.1 / C.3)", + "(b) discrete mounts": "(b) apoyos discretos", + "structural slab": "forjado estructural", + "50 mm surface, 115 kg/m²": "capa de paso de 50 mm, 115 kg/m²", + "reverberant bending field": "campo reverberante de flexión", + "4 mounts per m² of 2 MN/m": "4 apoyos por m² de 2 MN/m", + "30 dB per decade, not 40": "30 dB por década, no 40", + "(Vér's two-subsystem SEA model)": "(modelo SEA de dos subsistemas de Vér)", + "(c) wall lining: two fixings": "(c) trasdosado: dos fijaciones", + "masonry": "fábrica", + "adhesive dabs": "pelladas", + "studs + cavity": "montantes + cámara", + "(D.1) fo = 542 Hz": "(D.1) fo = 542 Hz", + "(D.2) fo = 70,8 Hz": "(D.2) fo = 70,8 Hz", + "the same board, two fixings: nearly 23 dB between them, and no formula here can see which one was built": + "la misma placa, dos fijaciones: casi 23 dB entre ellas, y ninguna fórmula de aquí ve cuál se construyó", + "s' is the EN 29052-1 value measured WITHOUT pre-load, and the series law (C.6) holds only for an uncut layer": + "s' es el valor EN 29052-1 medido SIN precarga, y la ley en serie (C.6) solo vale si la capa no está cortada", + # --- B9 reconstruction of B10b's decay-range plate --- + "The decay-range budget of one band: INR, truncation and the evaluation windows (ISO 3382)": + "El presupuesto de rango de caída de una banda: INR, truncamiento y ventanas de evaluación (ISO 3382)", + "Level [dB]": "Nivel [dB]", + "peak": "pico", + "background noise": "ruido de fondo", + "integration truncated here (t₁)": "integración truncada aquí (t₁)", + "tail compensated as": "cola compensada como", + "an exponential decay (C)": "una caída exponencial (C)", + "INR = 55 dB": "INR = 55 dB", + "Evaluation windows": "Ventanas de evaluación", + "hatched: the 15 dB margin ISO 3382-1 asks for beyond each window — EDT needs 25 dB, T20 35 dB, T30 45 dB": + "rayado: el margen de 15 dB que exige la ISO 3382-1 más allá de cada ventana — EDT necesita 25 dB, T20 35 dB y T30 45 dB", + "the library flags at 46 dB and 54 dB instead, where the fit's positive bias crosses 5 %": + "la biblioteca avisa en 46 dB y 54 dB, donde el sesgo positivo del ajuste cruza el 5 %", + "short of range? T20 instead of T30 -> a longer sweep or more averages -> EDT; never a fit into the noise": + "¿falta rango? T20 en vez de T30 -> un barrido más largo o más promedios -> EDT; nunca un ajuste metido en el ruido", } diff --git a/scripts/diagrams/materials.py b/scripts/diagrams/materials.py index 6cb4f96e1..8a8d46d0c 100644 --- a/scripts/diagrams/materials.py +++ b/scripts/diagrams/materials.py @@ -141,67 +141,101 @@ def _d_astm_tube(s: SVG, th: Theme) -> None: def _d_airflow(s: SVG, th: Theme) -> None: """ISO 9053-1 static and ISO 9053-2 alternating airflow-resistance rigs.""" # --- Left panel: static (DC) method ----------------------------------- - s.rect(55, 70, 385, 430, th.panel, th.fg, rx=8, sw=2) - s.text(247, 100, "Static method (ISO 9053-1)", 21, th.fg, bold=True) + s.rect(38, 70, 400, 560, th.panel, th.fg, rx=8, sw=2) + s.text(238, 100, "Static method (ISO 9053-1)", 21, th.fg, bold=True) - cx = 200.0 + cx = 150.0 holder_l, holder_r = cx - 45, cx + 45 - top_y, bot_y = 170.0, 430.0 - # Vertical specimen holder (tube). + top_y, bot_y = 150.0, 440.0 + # Vertical measurement cell (Clause 5.2). s.line(holder_l, top_y, holder_l, bot_y, th.fg, 2.5) s.line(holder_r, top_y, holder_r, bot_y, th.fg, 2.5) - # Specimen (hatched disc) in the middle. - spec_y, spec_h = 285.0, 46.0 + # Specimen (hatched disc) with its edge seal. + spec_y, spec_h = 262.0, 40.0 s.rect(holder_l, spec_y, 90, spec_h, th.bg, th.secondary, sw=2) - for hy in range(int(spec_y) + 8, int(spec_y + spec_h), 10): - s.line(holder_l + 4, hy, holder_r - 4, hy - 8, th.secondary, 1.0) - s.text(cx, spec_y + spec_h + 22, "specimen (A, d)", 17, th.secondary, bold=True) - # Steady laminar flow up through the holder. - s.arrow(cx, bot_y - 6, cx, spec_y + spec_h + 34, th.accent, 2.4) - s.arrow(cx, spec_y - 12, cx, top_y + 8, th.accent, 2.4) - s.text(cx, bot_y + 22, "laminar flow q_v", 18, th.accent, bold=True) + for hy in range(int(spec_y) + 10, int(spec_y + spec_h) + 8, 10): + s.line(holder_l + 4, min(hy, spec_y + spec_h - 2), + holder_r - 4, max(hy - 10, spec_y + 2), th.secondary, 1.0) + s.rect(holder_l - 6, spec_y, 8, spec_h, th.accent) + s.rect(holder_r - 2, spec_y, 8, spec_h, th.accent) + s.text(holder_l - 12, spec_y + 26, "seal", 15, th.accent, bold=True, + anchor="end") + s.text(cx - 6, spec_y - 30, "specimen A, d", 16, th.secondary, bold=True) + # Perforated support under the specimen. + for gx in range(int(holder_l) + 8, int(holder_r) - 2, 12): + s.line(gx, spec_y + spec_h + 22, gx, spec_y + spec_h + 34, th.fg, 2.0) + s.line(holder_l, spec_y + spec_h + 22, holder_r, spec_y + spec_h + 22, + th.fg, 1.6) + s.text(holder_r + 10, spec_y + spec_h + 34, "grid", 15, th.muted, + anchor="start") + # Steady laminar flow up through the holder, from a controlled source. + s.arrow(cx, bot_y - 6, cx, spec_y + spec_h + 46, th.accent, 2.4) + s.arrow(cx, spec_y - 46, cx, top_y + 26, th.accent, 2.4) + s.rect(cx - 44, bot_y + 8, 88, 36, th.bg, th.accent, rx=8, sw=2) + s.text(cx, bot_y + 32, "q_v", 18, th.accent, bold=True, mono=True) + s.rect(cx - 44, bot_y + 56, 88, 34, th.bg, th.muted, rx=8, sw=1.6) + s.text(cx, bot_y + 78, "flow source", 15, th.muted) # Differential manometer across the specimen (pressure taps). - tap_x = holder_r + 8 - s.line(holder_r, spec_y - 4, tap_x + 40, spec_y - 4, th.primary, 1.6) - s.line(holder_r, spec_y + spec_h + 4, tap_x + 40, spec_y + spec_h + 4, th.primary, 1.6) - s.rect(tap_x + 40, spec_y - 26, 74, spec_h + 44, th.bg, th.primary, rx=8, sw=2) - s.text(tap_x + 77, spec_y + 8, "Δp", 22, th.primary, bold=True, mono=True) - s.text(tap_x + 77, spec_y + 34, "manom.", 15, th.muted) - s.text(247, 478, "R = Δp / q_v (through-origin fit at 0.5 mm/s)", + tap_x = holder_r + 34 + s.line(holder_r, spec_y + 2, tap_x, spec_y + 2, th.primary, 1.6) + s.line(holder_r, spec_y + spec_h - 2, tap_x, spec_y + spec_h - 2, + th.primary, 1.6) + s.rect(tap_x, spec_y - 18, 82, spec_h + 34, th.bg, th.primary, rx=8, sw=2) + s.text(tap_x + 41, spec_y + 24, "Δp", 22, th.primary, bold=True, mono=True) + # Thickness gauge resting on the specimen, in position (Clause 7.3). + s.circle(cx + 62, top_y + 42, 14, th.bg, th.muted, 1.8) + s.text(cx + 62, top_y + 48, "d", 16, th.muted, bold=True, italic=True) + s.line(cx + 62, top_y + 56, cx + 62, spec_y - 2, th.muted, 1.6, dash="4,3") + s.line(cx + 30, spec_y - 2, cx + 70, spec_y - 2, th.muted, 1.8) + # The free space Clause 5.2 asks for ahead of the specimen. + s.dim(holder_l - 26, spec_y, holder_l - 26, top_y, "≥ 1 bore", offset=0, + size=14, label_side="left") + + for yy, txt in ( + (546, "cell ≥ 29 mm bore, ≥ 1 bore of free space above"), + (568, "q_v and Δp each to ±5 %, Δp readable to 0.1 Pa"), + (590, "grid ≥ 50 % open, R < 1 %; d measured in position"), + ): + s.text(238, yy, txt, 14, th.muted) + s.text(238, 616, "R = Δp / q_v (through-origin fit at 0.5 mm/s)", 16, th.fg, bold=True) # --- Right panel: alternating (AC) method ----------------------------- - s.rect(460, 70, 385, 430, th.panel, th.fg, rx=8, sw=2) - s.text(652, 100, "Alternating method (ISO 9053-2)", 21, th.fg, bold=True) + s.rect(460, 70, 400, 560, th.panel, th.fg, rx=8, sw=2) + s.text(660, 100, "Alternating method (ISO 9053-2)", 21, th.fg, bold=True) cav_l, cav_r = 590.0, 715.0 - cav_top, cav_bot = 160.0, 360.0 + cav_top, cav_bot = 210.0, 410.0 # Cavity walls. s.rect(cav_l, cav_top, cav_r - cav_l, cav_bot - cav_top, th.bg, th.fg, sw=2.5) s.text((cav_l + cav_r) / 2, (cav_top + cav_bot) / 2 - 6, "cavity", 18, th.fg) s.text((cav_l + cav_r) / 2, (cav_top + cav_bot) / 2 + 18, "V", 20, th.fg, bold=True, italic=True) - # Specimen / airtight termination on top. + # Specimen cell, or the airtight termination that replaces it. s.rect(cav_l, cav_top - 26, cav_r - cav_l, 26, th.bg, th.secondary, sw=2) for hx in range(int(cav_l) + 8, int(cav_r), 11): s.line(hx, cav_top - 4, hx - 14, cav_top - 22, th.secondary, 1.0) - s.text((cav_l + cav_r) / 2, cav_top - 36, "specimen / airtight", 16, - th.secondary, bold=True) + s.text((cav_l + cav_r) / 2, cav_top - 36, "measurement cell → L_p,s (h_s)", + 15, th.secondary, bold=True) + s.text((cav_l + cav_r) / 2, cav_top - 58, + "airtight termination → L_p,t (h_t)", 15, th.muted) # Piston at the bottom, oscillating. s.rect(cav_l, cav_bot, cav_r - cav_l, 26, th.panel, th.primary, sw=2) - s.arrow((cav_l + cav_r) / 2, cav_bot + 58, (cav_l + cav_r) / 2, cav_bot + 30, + s.arrow((cav_l + cav_r) / 2, cav_bot + 62, (cav_l + cav_r) / 2, cav_bot + 34, th.primary, 2.2) - s.arrow((cav_l + cav_r) / 2, cav_bot + 30, (cav_l + cav_r) / 2, cav_bot + 58, + s.arrow((cav_l + cav_r) / 2, cav_bot + 34, (cav_l + cav_r) / 2, cav_bot + 62, th.primary, 2.2) - s.text((cav_l + cav_r) / 2, cav_bot + 80, "piston f = 1–4 Hz", 18, + s.text((cav_l + cav_r) / 2, cav_bot + 84, "piston f = 1–4 Hz", 18, th.primary, bold=True) + s.text((cav_l + cav_r) / 2, cav_bot + 106, "q_v = 2π f h A_P", 15, th.muted, + mono=True) # Microphone in the cavity wall. s.circle(cav_r + 2, (cav_top + cav_bot) / 2, 6, th.fg) s.line(cav_r + 2, (cav_top + cav_bot) / 2, cav_r + 60, (cav_top + cav_bot) / 2, th.muted, 1.4) s.text(cav_r + 66, (cav_top + cav_bot) / 2 + 6, "L_p", 20, th.fg, bold=True, mono=True, anchor="start") - s.text(652, 478, "R from L_p,s − L_p,t (κ′ per Annex A)", + s.text(660, 616, "R from L_p,s − L_p,t (κ′ per Annex A)", 16, th.fg, bold=True) @@ -499,75 +533,149 @@ def _step(y: float, l1: str, l2: str, color: str) -> None: # Dynamic-stiffness resonance rig (ISO 9052-1 / EN 29052-1) # --------------------------------------------------------------------------- -def _d_dynamic_stiffness_rig(s: SVG, th: Theme) -> None: - """ISO 9052-1 rig: exciter and accelerometer on the load plate over the - resilient specimen, read as a mass-spring resonance.""" - # ===== Left: rig cross-section ===== - s.text(240, 74, "Resonance rig", 22, th.fg, bold=True) - gy = 466.0 - s.ground(gy, 50, 430) - s.text(56, gy + 34, "Rigid foundation", 17, th.muted, anchor="start") - - x0, x1 = 150.0, 330.0 - spec_top, plate_h = 400.0, 26.0 +def _dsr_arrangement(s: SVG, th: Theme, cx: float, base_y: float, *, + rigid: bool, drive_plate: bool, both: bool, + title: str, note: str) -> None: + """One EN 29052-1 excitation arrangement, drawn to a common baseline. + + ``rigid`` draws the hatched foundation of the first arrangement; the + other two stand on a baseplate of at least 100 kg carried on soft + mounts. ``drive_plate`` puts the exciter on the load plate rather than + under the baseplate, and ``both`` adds the second accelerometer. + """ + half = 72.0 + x0, x1 = cx - half, cx + half + spec_h, plate_h = 38.0, 20.0 + spec_top = base_y - spec_h plate_top = spec_top - plate_h - # Resilient specimen (soft diagonal hatching). + + s.text(cx, 96, title, 16, th.fg, bold=True) + s.text(cx, 116, note, 14, th.muted) + + if rigid: + s.ground(base_y, x0 - 40, x1 + 40) + s.text(cx, base_y + 34, "Rigid foundation", 14, th.muted) + else: + s.rect(x0 - 40, base_y, 2 * half + 80, 24, th.panel, th.fg, sw=1.8) + s.text(cx, base_y + 17, "Baseplate ≥ 100 kg", 13, th.muted) + for sx in (x0 - 16, x1 + 16): + _spring_v(s, sx, base_y + 24, base_y + 96, th.muted, coils=3, + width=9.0, sw=1.6) + s.line(x0 - 40, base_y + 96, x1 + 40, base_y + 96, th.muted, 1.6) + + # Resilient specimen (soft diagonal hatching) and the load plate on it. + s.rect(x0, spec_top, x1 - x0, spec_h, th.panel, th.accent, sw=1.8) + for hx in range(int(x0) + 12, int(x1) + 1, 20): + s.line(hx, spec_top, hx - 10, base_y, th.accent, 0.9) + s.rect(x0 - 8, plate_top, x1 - x0 + 16, plate_h, th.panel, th.primary, + rx=3, sw=2.0) + + # Excitation: on the load plate, or under the baseplate from below. + if drive_plate: + _exciter(s, cx - 30.0, plate_top, stinger=16.0, w=52.0, h=32.0) + s.arrow(cx - 30.0, plate_top - 13, cx - 30.0, plate_top - 1, + th.secondary, 2.0) + s.text(cx - 30.0, plate_top - 58, "F", 16, th.secondary, mono=True, + bold=True) + else: + _exciter(s, cx, base_y + 24, stinger=18.0, w=52.0, h=32.0, up=True) + s.arrow(cx, base_y + 38, cx, base_y + 26, th.secondary, 2.0) + s.text(cx - 40, base_y + 52, "F", 16, th.secondary, anchor="end", + mono=True, bold=True) + + _accel(s, cx + 38.0, plate_top) + if both: + _accel(s, x1 + 24.0, base_y) + + +def _d_dynamic_stiffness_rig(s: SVG, th: Theme) -> None: + """EN 29052-1 rig: the three excitation arrangements of Figures 1 to 3, + the specimen preparation of Clauses 5 and 6, and the Formula 4 reading.""" + s.text(450, 56, "The three excitation arrangements (Figures 1 to 3)", 21, + th.fg, bold=True) + + base_y = 300.0 + _dsr_arrangement(s, th, 158.0, base_y, rigid=True, drive_plate=True, + both=False, + title="Rigid base", + note="load plate measured") + _dsr_arrangement(s, th, 450.0, base_y, rigid=False, drive_plate=True, + both=True, + title="Isolated baseplate", + note="load plate driven, both measured") + _dsr_arrangement(s, th, 742.0, base_y, rigid=False, drive_plate=False, + both=True, + title="Isolated baseplate", + note="baseplate driven, both measured") + s.text(450, 440, + "all three are equivalent; sinusoidal excitation is the reference " + "method in case of dispute (7.1)", 15, th.muted, italic=True) + + # ===== The specimen under the plate, and what the standard fixes ===== + s.text(215, 502, "Specimen and load (Clauses 5 and 6)", 19, th.fg, + bold=True) + gy = 690.0 + s.ground(gy, 60, 320) + x0, x1 = 110.0, 300.0 + spec_top, plate_h, bed_h = 626.0, 24.0, 9.0 + plate_top = spec_top - bed_h - plate_h s.rect(x0, spec_top, x1 - x0, gy - spec_top, th.panel, th.accent, sw=2) for hx in range(int(x0) + 14, int(x1) + 1, 22): s.line(hx, spec_top, hx - 12, gy, th.accent, 0.9) - # Load plate on top of the specimen. - s.rect(x0 - 12, plate_top, x1 - x0 + 24, plate_h, th.panel, th.primary, + # Plaster bed on its foil, between the specimen and the load plate. + s.rect(x0, spec_top - bed_h, x1 - x0, bed_h, th.panel, th.secondary, + sw=1.4) + s.rect(x0 - 10, plate_top, x1 - x0 + 20, plate_h, th.panel, th.primary, rx=3, sw=2.2) - s.text(x1 + 26, plate_top + 19, "Load plate", 18, th.fg, anchor="start", - bold=True) - s.text(x1 + 26, plate_top + 43, "m′t = 200 kg/m²", 15, th.muted, + s.line(x1, spec_top - bed_h / 2, 312, 566, th.secondary, 1.1, dash="3,3") + s.text(318, 562, "plaster of Paris ≥ 5 mm on 0.02 mm foil", 13, + th.secondary, anchor="start") + s.text(318, 592, "Load plate, steel", 15, th.fg, anchor="start", bold=True) + s.text(318, 611, "(200 ± 3) mm square, flat to 0.5 mm", 13, th.muted, anchor="start") - s.text(x1 + 26, spec_top + 40, "Resilient specimen", 17, th.fg, + s.text(318, 629, "8 kg ± 0.5 kg with every device on it", 13, th.muted, anchor="start") - s.text(x1 + 26, spec_top + 62, "200 mm × 200 mm", 15, th.muted, + s.text(318, 657, "Resilient specimen, 200 mm × 200 mm", 15, th.fg, + anchor="start", bold=True) + s.text(318, 676, "three of them; irregularities < 3 mm", 13, th.muted, anchor="start") - s.dim(x0, spec_top, x0, gy, "d", offset=-30, size=18) - # Exciter, drive force and accelerometer on the plate. - _exciter(s, 205.0, plate_top) - s.text(205, plate_top - 100, "Exciter", 18, th.fg, bold=True) - _motion_arrows(s, 256.0, plate_top - 36, 24.0, th.secondary) - s.text(268, plate_top - 30, "F(t)", 16, th.secondary, anchor="start", + s.dim(x0, spec_top, x0, gy, "d", offset=-30, size=17) + # Petroleum-jelly fillet, closed-cell materials only. + s.path(f"M {x0} {gy} L {x0} {gy - 13} Q {x0 - 15} {gy - 5} {x0 - 17} {gy} Z", + fill=th.secondary, stroke=th.secondary, sw=1.0) + s.line(x0 - 12, gy - 4, 96, 722, th.secondary, 1.1, dash="3,3") + s.text(100, 726, "petroleum-jelly fillet (closed-cell materials)", 13, + th.secondary, anchor="start") + + # Headline relations, under the specimen half. + s.text(258, 776, "s′t = 4π² m′t fr² (Formula 4)", 20, th.primary, + bold=True, mono=True) + s.text(258, 806, "f₀ = (1/2π)·√(s′/m′) (Formula 2)", 16, th.muted, mono=True) - _accel(s, 300.0, plate_top) - s.text(x1 + 26, plate_top - 14, "Accelerometer", 16, th.fg, anchor="start") - s.line(309, plate_top - 8, x1 + 20, plate_top - 18, th.muted, 1.1, - dash="3,3") - - # ===== Right: the mass-spring reading ===== - s.text(680, 74, "Mass-spring model", 22, th.fg, bold=True) - mx = 680.0 - s.rect(mx - 60, 120, 120, 62, th.panel, th.primary, rx=8, sw=2.2) - s.text(mx, 158, "m′t", 22, th.fg, mono=True, bold=True) - _spring_v(s, mx, 182, 288, th.accent, coils=4) - s.text(mx + 26, 240, "s′t", 20, th.accent, anchor="start", mono=True, + + # ===== Right: the mass-spring reading and the response peak ===== + s.text(700, 502, "Mass-spring model", 19, th.fg, bold=True) + mx = 700.0 + s.rect(mx - 52, 534, 104, 46, th.panel, th.primary, rx=8, sw=2.2) + s.text(mx, 563, "m′t", 20, th.fg, mono=True, bold=True) + _spring_v(s, mx, 580, 640, th.accent, coils=4) + s.text(mx + 24, 618, "s′t", 19, th.accent, anchor="start", mono=True, bold=True) - s.ground(288, mx - 70, mx + 70) - _motion_arrows(s, mx - 92, 151, 26, th.secondary) + s.ground(640, mx - 62, mx + 62) + _motion_arrows(s, mx - 78, 557, 20, th.secondary) - # Response curve with the resonance read at its peak. - ax0, ax1, base = 540.0, 850.0, 420.0 + ax0, ax1, base = 590.0, 862.0, 800.0 s.line(ax0, base, ax1, base, th.muted, 1.4) - s.line(ax0, base, ax0, 330.0, th.muted, 1.4) - pk = 660.0 - s.path(f"M {ax0 + 6} {base - 12} C {pk - 60} {base - 16} {pk - 34} 336 " - f"{pk} 334 C {pk + 34} 336 {pk + 70} {base - 8} {ax1 - 6} {base - 4}", + s.line(ax0, base, ax0, 700.0, th.muted, 1.4) + pk = 700.0 + s.path(f"M {ax0 + 6} {base - 10} C {pk - 56} {base - 14} {pk - 30} 712 " + f"{pk} 710 C {pk + 30} 712 {pk + 64} {base - 7} {ax1 - 6} {base - 3}", stroke=th.primary, sw=2.4) - s.line(pk, base, pk, 336, th.muted, 1.2, dash="4,3") - s.text(pk, base + 22, "fr", 18, th.secondary, mono=True, bold=True) - s.text((ax0 + ax1) / 2, base + 48, "resonance read from the response peak", - 15, th.muted, italic=True) - - # Headline relations. - s.text(450, 524, "s′t = 4π² m′t fr² (Formula 4)", 21, th.primary, - bold=True, mono=True) - s.text(450, 550, - "then f₀ = (1/2π)·√(s′/m′) for the installed floating floor (Formula 2)", - 16, th.muted, mono=True) + s.line(pk, base, pk, 712, th.muted, 1.2, dash="4,3") + s.text(pk, base + 20, "fr", 17, th.secondary, mono=True, bold=True) + s.text((ax0 + ax1) / 2, base + 44, + "read at the peak, extrapolated to zero force", 14, th.muted, + italic=True) # --------------------------------------------------------------------------- @@ -658,3 +766,215 @@ def _d_porous_layer(s: SVG, th: Theme) -> None: s.text(80, 556, "viscous friction in the pores and heat exchange with the frame dissipate the sound energy", 17, th.muted, anchor="start") + + +# --------------------------------------------------------------------------- +# d24 - ISO 354 reverberation-room sound absorption +# --------------------------------------------------------------------------- + +def _d_iso354_room(s: SVG, th: Theme) -> None: + """ISO 354 reverberation-room absorption measurement (plan + two states).""" + # --- The room in plan, with non-parallel walls (Clause 6.1.2) ---------- + s.path("M 46 100 L 596 82 L 610 424 L 60 410 Z", fill=th.panel, + stroke=th.fg, sw=3) + s.text(60, 76, "Reverberation room · plan", 20, th.fg, bold=True, + anchor="start") + s.text(596, 76, "V = 200 m³ (≥ 150 m³)", 17, th.muted, anchor="end") + + # Suspended diffusers near the ceiling (Annex A.1). + for dx, dy, tilt in ((132.0, 164.0, 14.0), (232.0, 150.0, -20.0), + (334.0, 166.0, 12.0), (436.0, 152.0, -14.0)): + s.path(f"M {dx - 32} {dy + tilt} Q {dx} {dy - 12} {dx + 32} {dy - tilt}", + stroke=th.muted, sw=3.0) + s.text(284, 120, "diffusers 0.8–3 m² each, ≈ 5 kg/m² (Annex A)", 15, + th.muted) + + # --- Test specimen on the floor, edges deliberately non-parallel ------ + ax_, ay = 122.0, 296.0 # corners, clockwise from top left + bx, by = 316.0, 272.0 + cx_, cy = 330.0, 372.0 + dx_, dy = 136.0, 396.0 + s.path(f"M {ax_} {ay} L {bx} {by} L {cx_} {cy} L {dx_} {dy} Z", + fill=th.bg, stroke=th.secondary, sw=2.4) + for i in range(1, 14): # hatch parallel to the short edges + t = i / 14.0 + s.line(ax_ + t * (bx - ax_), ay + t * (by - ay), + dx_ + t * (cx_ - dx_), dy + t * (cy - dy), th.secondary, 1.0) + s.text(226, 262, "Test specimen S = 10.8 m²", 17, th.secondary, bold=True) + s.text(226, 452, "10–12 m², width/length 0.7–1, edges not parallel to the room", + 15, th.muted) + # Clearance from the nearest room boundary (Clause 6.2.1.2). + s.dim(66.0, 340.0, 122.0, 340.0, "≥ 0.75 m", offset=0, size=15) + + # --- Two source and three microphone positions (Clause 7.1) ----------- + for sx, sy, lab in ((470.0, 200.0, "S1"), (548.0, 344.0, "S2")): + s.rect(sx - 19, sy - 25, 38, 50, th.panel, th.primary, rx=6, sw=2) + s.circle(sx, sy, 10, th.primary) + s.circle(sx, sy, 4, th.bg) + s.text(sx + 26, sy + 5, lab, 16, th.fg, bold=True, anchor="start") + s.line(470, 200, 548, 344, th.muted, 1.1, dash="4,4") + s.text(478, 288, "≥ 3 m", 15, th.muted, anchor="end") + + for mx, my, lab in ((392.0, 186.0, "M1"), (392.0, 296.0, "M2"), + (446.0, 386.0, "M3")): + s.circle(mx, my, 7, th.fg) + s.circle(mx, my, 2.6, th.bg) + s.text(mx - 12, my + 5, lab, 16, th.fg, bold=True, anchor="end") + s.line(392, 186, 392, 296, th.muted, 1.1, dash="4,4") + s.text(400, 246, "≥ 1.5 m", 15, th.muted, anchor="start") + s.text(400, 480, + "microphones ≥ 1.5 m apart, ≥ 2 m from a source, ≥ 1 m from any " + "surface and from the specimen", 15, th.muted) + + # --- Right column: the two states the whole method rests on ----------- + s.rect(628, 82, 244, 342, th.bg, th.muted, rx=8, sw=1.6) + s.text(750, 114, "The measurement is a difference", 16, th.fg, bold=True) + for top, title, note, col in ( + (146.0, "1 · empty room", "T₁ → A₁", th.primary), + (274.0, "2 · specimen installed", "T₂ → A₂", th.secondary), + ): + s.text(750, top, title, 16, col, bold=True) + s.path(f"M 656 {top + 14} L 842 {top + 8} L 848 {top + 78} " + f"L 660 {top + 84} Z", fill=th.panel, stroke=th.fg, sw=1.8) + if top > 200: + s.rect(690, top + 34, 92, 26, th.bg, th.secondary, sw=1.8) + for hx in range(696, 782, 12): + s.line(hx, top + 57, hx + 14, top + 37, th.secondary, 0.9) + s.text(750, top + 106, note, 19, col, bold=True, mono=True) + s.text(750, 412, "α_s = (A₂ − A₁) / S", 19, th.accent, bold=True, mono=True) + + # --- Mounting strip: Type A on the floor, and a Type E air space ------ + s.text(60, 524, "Annex B mounting (part of the result)", 17, th.fg, + bold=True, anchor="start") + for x0, lab, gap in ((80.0, "Type A: directly on the rigid floor", 0.0), + (470.0, "Type E-400: 400 mm face to floor", 30.0)): + base = 590.0 + s.line(x0 - 14, base, x0 + 224, base, th.fg, 3.0) + s.rect(x0 + 30, base - 16 - gap, 150, 16, th.bg, th.secondary, sw=1.8) + for hx in range(int(x0) + 36, int(x0) + 176, 12): + s.line(hx, base - 2 - gap, hx + 10, base - 15 - gap, th.secondary, 0.9) + if gap: + s.dim(x0 + 196, base, x0 + 196, base - 16 - gap, "400 mm", + offset=26, size=14, label_side="right") + else: + s.rect(x0 + 16, base - 16, 14, 16, th.fg) + s.rect(x0 + 180, base - 16, 14, 16, th.fg) + s.text(x0 + 105, base - 28, "perimeter frame, flush", 14, th.muted) + s.text(x0 + 105, base + 24, lab, 15, th.fg) + + # --- Governing relations and acceptance checks ------------------------ + for y, txt, col, bold in ( + (646, "A = 55.3 V/(c T) − 4 V m · c = 331 + 0.6 t (15–30 °C)", + th.fg, True), + (672, ("≥ 12 spatially independent decays = ≥ 3 microphones × ≥ 2 sources " + "· T₂₀ read from −5 dB over 20 dB"), th.muted, False), + (696, ("the empty-room A₁ must clear the Table 1 ceiling, and T₁ is " + "measured without the specimen frame"), th.muted, False), + ): + s.text(450, y, txt, 17 if bold else 15, col, bold=bold) + + +# --------------------------------------------------------------------------- +# d25 - ISO 10534-1 standing-wave-ratio apparatus +# --------------------------------------------------------------------------- + +def _d_standing_wave_tube(s: SVG, th: Theme) -> None: + """ISO 10534-1 standing-wave apparatus: probe carriage and the minima.""" + import math + + tube_top, tube_bot, mid = 216.0, 346.0, 281.0 + tube_l, tube_r = 156.0, 838.0 + back_w, spec_w = 22.0, 46.0 + face = tube_r - back_w - spec_w # the specimen face: x = 0 + + # --- Tube, source and specimen --------------------------------------- + s.rect(tube_l, tube_top, tube_r - tube_l, tube_bot - tube_top, th.bg, + th.fg, sw=3) + s.rect(58, mid - 44, 66, 88, th.panel, th.primary, rx=6, sw=2) + s.path(f"M 124 {mid - 17} L 124 {mid + 17} L {tube_l} {tube_bot} " + f"L {tube_l} {tube_top} Z", fill=th.panel, stroke=th.primary, sw=2) + s.circle(90, mid, 11, th.primary) + s.text(92, 180, "Loudspeaker", 19, th.fg, bold=True) + s.text(92, 202, "one pure tone at a time", 15, th.muted) + + s.rect(tube_r - back_w, tube_top, back_w, tube_bot - tube_top, th.fg) + s.rect(face, tube_top, spec_w, tube_bot - tube_top, th.panel, th.secondary, + sw=2) + for hx in range(int(face) + 8, int(face + spec_w), 11): + s.line(hx, tube_bot - 4, hx - 15, tube_top + 4, th.secondary, 1.0) + s.text(tube_r, 202, "Test specimen on the rigid backing", 17, + th.secondary, bold=True, anchor="end") + s.line(face, 208, face, tube_bot + 14, th.accent, 1.6, dash="5,4") + s.text(face + 6, tube_bot + 26, "x = 0", 16, th.accent, bold=True, + anchor="start") + + # --- Graduated rail and the probe carriage ---------------------------- + rail_y, car_x = 150.0, 430.0 + s.line(tube_l + 24, rail_y, face, rail_y, th.fg, 2.4) + x_tick = face + while x_tick > tube_l + 24: + s.line(x_tick, rail_y, x_tick, rail_y - 8, th.muted, 1.0) + x_tick -= 26.0 + s.rect(car_x - 34, rail_y - 2, 68, 24, th.panel, th.primary, rx=5, sw=2) + s.line(car_x, rail_y + 22, car_x, mid, th.fg, 2.4) + s.circle(car_x, mid, 5.5, th.fg) + s.text(car_x, rail_y - 20, "probe microphone on a graduated carriage", 16, + th.fg, bold=True) + s.arrow(car_x + 42, rail_y + 10, car_x + 116, rail_y + 10, th.accent, 2.0) + s.arrow(car_x - 42, rail_y + 10, car_x - 116, rail_y + 10, th.accent, 2.0) + + # --- The standing-wave envelope inside the tube, filling in leftwards - + span = (tube_bot - tube_top) / 2.0 - 8.0 + wavelength = 214.0 # px per acoustic wavelength + phi = math.radians(-54.1) + + def envelope(x: float) -> float: + d = face - x + r_eff = 0.5 * math.exp(-0.0014 * d) # wall losses, exaggerated + return math.sqrt(1.0 + r_eff**2 + + 2.0 * r_eff * math.cos(2.0 * math.pi * d / wavelength + - phi)) + + def y_of(env: float) -> float: + return mid - (env - 1.0) * span / 0.62 + + pts = [(x, y_of(envelope(x))) + for x in [face - 3.0 * i for i in range(int((face - tube_l - 8) / 3))]] + s.path("M " + " L ".join(f"{px:.1f} {py:.1f}" for px, py in pts), + stroke=th.primary, sw=2.4) + s.text(250, tube_top - 12, "|p(x)| envelope", 16, th.primary) + + # The adjacent maximum and minimum the operator reads. + x_min1 = face - wavelength * (phi + math.pi) / (2 * math.pi) + x_max1 = x_min1 - wavelength / 2.0 + for px, lab in ((x_max1, "L_max"), (x_min1, "L_min")): + py = y_of(envelope(px)) + s.circle(px, py, 5.5, th.secondary) + s.text(px, py - 14, lab, 15, th.secondary, bold=True) + s.dim(x_max1 - 46, y_of(envelope(x_max1)), x_max1 - 46, y_of(envelope(x_min1)), + "ΔL = 9.54 dB", offset=0, size=16, label_side="left") + s.line(x_max1 - 52, y_of(envelope(x_max1)), x_max1, y_of(envelope(x_max1)), + th.muted, 0.9, dash="3,3") + s.line(x_max1 - 52, y_of(envelope(x_min1)), x_min1, y_of(envelope(x_min1)), + th.muted, 0.9, dash="3,3") + s.dim(x_min1, tube_bot + 14, face, tube_bot + 14, "x_min,1 = 12 cm", + offset=46, size=16) + s.text(340, tube_bot + 104, + "minima far from the specimen fill in (wall losses, exaggerated " + "here): read the nearest one", 15, th.muted) + + # --- The reduction chain, verbatim from the guide --------------------- + for i, txt in enumerate(( + "s = 10^(ΔL/20) = 3", + "|r| = (s − 1)/(s + 1) = 0.5", + "α = 1 − |r|² = 0.75", + "Φ = 4π x_min,1/λ − π = −54.1°", + "Z/ρc₀ = (1 + r)/(1 − r) = 1.13 − 1.22j", + )): + s.text(450, 490 + 24 * i, txt, 17, th.fg, mono=True) + s.text(450, 622, + "one channel: the microphone sensitivity cancels and there is no " + "inter-channel phase mismatch", 17, th.accent, bold=True) + s.text(450, 648, + "magnitude from the ratio, phase from the position — which is why " + "Part 1 is the arbitration method", 15, th.muted) diff --git a/scripts/diagrams/registry.py b/scripts/diagrams/registry.py index 705f6d0a4..014cd9026 100644 --- a/scripts/diagrams/registry.py +++ b/scripts/diagrams/registry.py @@ -16,21 +16,36 @@ from .aircraft import _d_aircraft_certification, _d_rotorcraft_certification from .buildings import ( + _d_decay_range, + _d_directivity_factor, + _d_en12354_6_takeoff, _d_enclosed_space_absorption, + _d_facade_setup, _d_flanking, + _d_heavy_impact_sources, _d_impact, _d_installed_paths, _d_insulation_lab, _d_insulation_setup, _d_ir_measurement, + _d_iso12354_annexl, _d_iso12999, + _d_iso16251_mockup, + _d_junction_catalogue, _d_open_plan, + _d_open_plan_setup, _d_panel_insulation, _d_reception_plate, + _d_reception_plate_rigs, + _d_resilient_buildups, _d_reverberation_prediction, _d_room_image_sources, _d_room_measurement, + _d_room_measurement_section, _d_room_noise, + _d_room_noise_setup, + _d_survey_sweep, + _d_sweep_budget, ) from .canvas import _write from .devices import ( @@ -61,10 +76,12 @@ _d_dynamic_stiffness_rig, _d_impedance_tube, _d_insitu_subtraction, + _d_iso354_room, _d_iso11654, _d_porous_layer, _d_scattering_reverb, _d_spot_tube, + _d_standing_wave_tube, ) from .perception import ( _d_dosimeter, @@ -128,6 +145,15 @@ _d_surfaces, "ISO 3744 / 3746 sound power measurement surfaces", 640), "diagram_impact_setup": ( _d_impact, "ISO 16283-2 impact sound insulation setup", 600), + "diagram_facade_setup": ( + _d_facade_setup, "Facade sound insulation setup (ISO 16283-3)", 700), + "diagram_heavy_impact_sources": ( + _d_heavy_impact_sources, + "Standard heavy and soft impact sources (ISO 16283-2, JIS A 1418-2)", + 680), + "diagram_survey_sweep": ( + _d_survey_sweep, "The ISO 10052 survey sweep (Clauses 6.2 and 6.3)", + 560), "sound_power_methods": ( _d_methods, "Sound power methods compared", 620), "diagram_flanking_paths": ( @@ -139,7 +165,13 @@ "diagram_astm_tube": ( _d_astm_tube, "Four-microphone transmission-loss tube (ASTM E2611)", 560), "diagram_airflow_resistance": ( - _d_airflow, "Airflow resistance: static and alternating methods (ISO 9053-1/-2)", 540), + _d_airflow, "Airflow resistance: static and alternating methods (ISO 9053-1/-2)", 660), + "diagram_iso354_room": ( + _d_iso354_room, + "Reverberation-room sound absorption (ISO 354)", 730), + "diagram_standing_wave_tube": ( + _d_standing_wave_tube, + "Standing-wave-ratio tube: probe traverse and the minima (ISO 10534-1)", 680), "diagram_scattering_reverb": ( _d_scattering_reverb, "Random-incidence scattering in a reverberation room (ISO 17497-1)", 560), @@ -167,9 +199,18 @@ "diagram_room_measurement": ( _d_room_measurement, "Room-acoustics measurement setup (ISO 3382-1 / ISO 3382-2)", 620), + "diagram_room_measurement_section": ( + _d_room_measurement_section, + "The measuring chain in section (ISO 3382-1 clauses 4.2 and 4.3)", 600), "diagram_room_noise": ( _d_room_noise, "Room-noise rating methods (ANSI/ASA S12.2-2019): NC and RC Mark II", 580), + "diagram_room_noise_setup": ( + _d_room_noise_setup, + "Measuring the rated spectrum (ANSI/ASA S12.2-2019, clause 5.2.5)", 600), + "diagram_sweep_budget": ( + _d_sweep_budget, + "Dimensioning the excitation for a room with T = 1.2 s (ISO 18233)", 560), "diagram_hearing_threshold": ( _d_hearing_threshold, "Hearing-threshold model (ISO 7029 age distribution, ISO 389-7 zero)", 600), @@ -188,6 +229,15 @@ "diagram_en12354_6": ( _d_enclosed_space_absorption, "Absorption area and reverberation time of a room (EN 12354-6)", 410), + "diagram_en12354_6_takeoff": ( + _d_en12354_6_takeoff, + "Room take-off: one room, three input lists (EN 12354-6)", 580), + "diagram_decay_range": ( + _d_decay_range, + "The decay-range budget of one band (ISO 3382)", 520), + "diagram_directivity_factor": ( + _d_directivity_factor, + "Directivity factor Q: four mountings, four critical distances", 410), "diagram_time_weighting": ( _d_time_weighting, "Exponential-detector chain of the time weightings (IEC 61672-1)", 460), @@ -200,6 +250,10 @@ "diagram_open_plan": ( _d_open_plan, "Open-plan office spatial decay of speech (ISO 3382-3)", 500), + "diagram_open_plan_setup": ( + _d_open_plan_setup, + "Where the ISO 3382-3 measurement line goes (clauses 5.1 and 5.2)", + 780), "diagram_iso12999": ( _d_iso12999, "Measurement uncertainty from tables to expanded U (ISO 12999-1)", 500), @@ -221,7 +275,7 @@ "Occupational noise exposure measurement (ISO 9612)", 640), "diagram_dynamic_stiffness_rig": ( _d_dynamic_stiffness_rig, - "Dynamic-stiffness resonance rig (ISO 9052-1)", 560), + "Dynamic-stiffness resonance rig (EN 29052-1)", 880), "diagram_mobility_rig": ( _d_mobility_rig, "Mechanical-mobility measurement on a beam (ISO 7626)", 560), @@ -231,6 +285,22 @@ "diagram_reception_plate": ( _d_reception_plate, "Reception-plate measurement of structure-borne power (EN 15657)", 560), + "diagram_reception_plate_rigs": ( + _d_reception_plate_rigs, + "EN 15657 low- and high-mobility reception plates", 600), + "diagram_iso16251_mockup": ( + _d_iso16251_mockup, + "ISO 16251-1 small floor mock-up for floor-covering improvement", 600), + "diagram_iso12354_annexl": ( + _d_iso12354_annexl, + "ISO 12354-1 Annex L worked building: elements, junctions, paths", 616), + "diagram_resilient_buildups": ( + _d_resilient_buildups, + "Resilient layers in section: floating floor, mounts, wall lining", 500), + "diagram_junction_catalogue": ( + _d_junction_catalogue, + "EN 12354-1 Annex E junction types, path branches and the mass ratio", + 686), "diagram_installed_paths": ( _d_installed_paths, "Installed structure-borne sound paths (EN 12354-5)", 620), diff --git a/scripts/figures/building.py b/scripts/figures/building.py index c41e6d7b1..b557b51d9 100644 --- a/scripts/figures/building.py +++ b/scripts/figures/building.py @@ -1030,3 +1030,359 @@ def generate_dbhr_global_index(output_dir: str) -> None: ra(r_prime).plot(ax=ax, language=_LANG) save_figure(output_dir, "dbhr_global_index.png") plt.close() + + +def generate_insulation_adaptation_terms(output_dir: str) -> None: + """Two constructions with the same Rw and very different Ctr.""" + print("Generating insulation_adaptation_terms.png...") + from phonometry import ( + double_wall_transmission_loss, + single_panel_transmission_loss, + weighted_rating, + ) + + freqs = np.asarray(_THIRD_OCTAVE_16, dtype=float) + + # Two real constructions, both drawn by the library's own panel models. + # Heavy: 150 mm dense concrete, m' = 2300 x 0.15 = 345 kg/m2, fc = 125 Hz. + heavy = np.round( + single_panel_transmission_loss( + freqs, 345.0, critical_frequency=125.0 + ).transmission_loss, 1) + # Light: metal-stud double leaf, 12 kg/m2 per leaf, 90 mm cavity, whose + # mass-air-mass resonance lands at 81.5 Hz and drags the low bands down. + light_result = double_wall_transmission_loss( + freqs, mass1=12.0, mass2=12.0, gap=0.09 + ) + light = np.round(light_result.transmission_loss, 1) + f0 = light_result.resonance_frequency + + w_heavy = weighted_rating(heavy) + w_light = weighted_rating(light) + + _fig, (ax_spec, ax_bar) = plt.subplots( + 1, 2, figsize=(13.0, 5.8), gridspec_kw={"width_ratios": [1.35, 1.0]} + ) + + x = _band_index_axis(ax_spec, _THIRD_OCTAVE_16, fontsize=8) + assert w_heavy.shifted_reference is not None + ax_spec.plot(x, w_heavy.shifted_reference, "--", color=COLOR_FG, + linewidth=1.5, zorder=3, + label=f"shifted reference (both, Rw = {w_heavy.rating} dB)") + ax_spec.plot(x, heavy, "-o", color=COLOR_PRIMARY, linewidth=2.4, + markersize=5, zorder=5, label="150 mm dense concrete") + ax_spec.plot(x, light, "-s", color=COLOR_SECONDARY, linewidth=2.4, + markersize=5, zorder=5, label="double leaf, 12 kg/m2 + 90 mm") + ax_spec.annotate(f"mass-air-mass resonance at {f0:.0f} Hz, below the\n" + "rated range: the double leaf enters it still climbing", + xy=(0.0, float(light[0])), xytext=(1.4, float(light.min()) + 2.0), + fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0}) + ax_spec.set_ylabel("Sound reduction index R [dB]") + ax_spec.set_title("Same weighted rating, different spectrum", + fontweight="bold", pad=10) + ax_spec.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax_spec.set_axisbelow(True) + ax_spec.legend(loc="lower right", fontsize=9) + + groups = ("Rw", "Rw + C", "Rw + Ctr") + heavy_vals = [w_heavy.rating, w_heavy.rating + w_heavy.c, + w_heavy.rating + w_heavy.ctr] + light_vals = [w_light.rating, w_light.rating + w_light.c, + w_light.rating + w_light.ctr] + xb = np.arange(len(groups)) + ax_bar.bar(xb - 0.19, heavy_vals, width=0.36, color=COLOR_PRIMARY, + edgecolor=COLOR_FG, linewidth=0.7, zorder=3, label="concrete") + ax_bar.bar(xb + 0.19, light_vals, width=0.36, color=COLOR_SECONDARY, + edgecolor=COLOR_FG, linewidth=0.7, zorder=3, label="double leaf") + for i, (hv, lv) in enumerate(zip(heavy_vals, light_vals, strict=True)): + ax_bar.text(i - 0.19, hv + 0.6, f"{hv}", ha="center", fontsize=9, + color=COLOR_FG) + ax_bar.text(i + 0.19, lv + 0.6, f"{lv}", ha="center", fontsize=9, + color=COLOR_FG) + spread = heavy_vals[2] - light_vals[2] + ax_bar.annotate(f"{spread} dB apart\nagainst traffic", + xy=(2.0, (heavy_vals[2] + light_vals[2]) / 2.0), + xytext=(0.55, float(min(light_vals)) - 6.5), fontsize=10, + fontweight="bold", color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.2}) + ax_bar.set_xticks(xb) + ax_bar.set_xticklabels(groups) + ax_bar.set_ylabel("Single number [dB]") + ax_bar.set_ylim(float(min(light_vals)) - 9.0, float(max(heavy_vals)) + 5.0) + ax_bar.set_title("Rw alone is not a specification", + fontweight="bold", pad=10) + ax_bar.grid(axis="y", color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax_bar.set_axisbelow(True) + ax_bar.legend(loc="lower left", fontsize=9) + + plt.tight_layout() + save_figure(output_dir, "insulation_adaptation_terms.png") + plt.close() + + +def generate_background_correction_regimes(output_dir: str) -> None: + """The three-regime background correction, laboratory against field.""" + print("Generating background_correction_regimes.png...") + margin = np.linspace(0.0, 20.0, 401) + # Formula (4) / (14): the energy subtraction, written on the margin alone. + # Only used above 6 dB of margin, where the logarithm is finite. + with np.errstate(divide="ignore"): + formula = margin - 10.0 * np.log10(10.0 ** (margin / 10.0) - 1.0) + cap = 1.3 + + lab = np.where(margin <= 6.0, cap, np.where(margin < 15.0, formula, 0.0)) + field = np.where(margin <= 6.0, cap, np.where(margin < 10.0, formula, 0.0)) + + _fig, ax = plt.subplots(figsize=(10.5, 6.0)) + ax.fill_between(margin, 0.0, cap, where=(margin <= 6.0).tolist(), + color=theme_fill(COLOR_SECONDARY, ax), zorder=1) + ax.plot(margin, lab, "-", color=COLOR_PRIMARY, linewidth=2.6, zorder=5, + label="ISO 10140-4 laboratory (6 / 15 dB)") + ax.plot(margin, field, "--", color=COLOR_TERTIARY, linewidth=2.4, zorder=4, + label="ISO 16283-1 field (6 / 10 dB)") + for edge, style in ((6.0, "-"), (10.0, ":"), (15.0, ":")): + ax.axvline(edge, color=COLOR_FG, linewidth=1.0, linestyle=style, + alpha=0.7, zorder=2) + ax.text(3.0, cap + 0.18, "limit of measurement\n(fixed 1,3 dB, flag the band)", + ha="center", fontsize=9, color=COLOR_FG) + ax.annotate(f"6 - 10 lg(10^0,6 - 1) = {formula[margin.searchsorted(6.0)]:.2f} dB", + xy=(6.0, cap), xytext=(7.4, cap + 0.62), fontsize=9, + color=COLOR_FG, arrowprops={"arrowstyle": "->", "lw": 1.0}) + ax.annotate("the field rule stops here", xy=(10.0, 0.0), + xytext=(10.6, 0.55), fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0}) + ax.annotate("the laboratory rule stops here", xy=(15.0, 0.0), + xytext=(12.4, 0.95), fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0}) + ax.set_xlim(0.0, 20.0) + ax.set_ylim(-0.15, 2.3) + ax.set_xlabel("Signal-to-background margin Lsb - Lb [dB]") + ax.set_ylabel("Correction applied, Lsb - L [dB]") + ax.set_title("Background-noise correction: two standards, two thresholds", + fontweight="bold", pad=12) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="upper right", fontsize=10) + + plt.tight_layout() + save_figure(output_dir, "background_correction_regimes.png") + plt.close() + + +def generate_fast_reverberation_correction(output_dir: str) -> None: + """Why a Fast maximum needs its own reverberation standardization.""" + print("Generating fast_reverberation_correction.png...") + from phonometry import fast_reverberation_correction + + t = np.linspace(0.2, 5.0, 481) + # Both curves are the term *subtracted* in the standardization, so they are + # directly comparable: 10 lg[g(C)/g(C0)] against 10 lg(T/T0). + fast = np.asarray(fast_reverberation_correction(t), dtype=float) + energy = 10.0 * np.log10(t / 0.5) + + _fig, ax = plt.subplots(figsize=(10.5, 6.0)) + diverge = np.abs(fast - energy) > 1.0 + ax.fill_between(t, fast, energy, where=diverge.tolist(), interpolate=True, + color=theme_fill(COLOR_SECONDARY, ax), zorder=1, + label="more than 1 dB apart") + ax.plot(t, fast, "-", color=COLOR_PRIMARY, linewidth=2.6, zorder=5, + label="Fast maximum: 10 lg[g(C)/g(C0)] (ISO 16283-2)") + ax.plot(t, energy, "--", color=COLOR_TERTIARY, linewidth=2.2, zorder=4, + label="energy average: 10 lg(T/T0)") + ax.axhline(0.0, color=COLOR_FG, linewidth=1.0, alpha=0.6, zorder=2) + ax.axvline(0.5, color=COLOR_FG, linewidth=1.0, linestyle=":", alpha=0.7, + zorder=2) + ax.axvline(1.7275, color=COLOR_FG, linewidth=1.0, linestyle=":", alpha=0.7, + zorder=2) + ax.annotate("T = T0 = 0,5 s\nboth terms vanish", xy=(0.5, 0.0), + xytext=(0.62, 4.4), fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0}) + ax.annotate("T = 1,7275 s: C = 1, g = 1/e", xy=(1.7275, float( + np.interp(1.7275, t, fast))), xytext=(1.95, 1.1), fontsize=9, + color=COLOR_FG, arrowprops={"arrowstyle": "->", "lw": 1.0}) + ax.annotate(f"at T = 5 s the energy average has grown to " + f"{energy[-1]:.1f} dB\nwhile the Fast term has saturated at " + f"{fast[-1]:.1f} dB", + xy=(5.0, float(fast[-1])), xytext=(2.55, 8.4), fontsize=9, + color=COLOR_FG, arrowprops={"arrowstyle": "->", "lw": 1.0}) + ax.set_xlim(0.2, 5.0) + ax.set_xlabel("Receiving-room reverberation time T [s]") + ax.set_ylabel("Term subtracted from the measured level [dB]") + ax.set_title("A Fast detector cannot follow a long decay", + fontweight="bold", pad=12) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="upper left", fontsize=9) + + plt.tight_layout() + save_figure(output_dir, "fast_reverberation_correction.png") + plt.close() + + +def generate_lab_versus_field_insulation(output_dir: str) -> None: + """One partition, three spectra: laboratory R and two field R'.""" + print("Generating lab_versus_field_insulation.png...") + from phonometry import ( + flanking_reduction_index, + single_panel_transmission_loss, + weighted_rating, + ) + + freqs = np.asarray(_THIRD_OCTAVE_16, dtype=float) + # Separating wall: 150 mm dense concrete, Ss = 11.5 m2. + lab = np.round(single_panel_transmission_loss( + freqs, 345.0, critical_frequency=125.0).transmission_loss, 1) + # Flanking elements: 140 mm concrete floor/ceiling and a 100 mm facade. + floor = np.round(single_panel_transmission_loss( + freqs, 322.0, critical_frequency=135.0).transmission_loss, 1) + facade = np.round(single_panel_transmission_loss( + freqs, 230.0, critical_frequency=160.0).transmission_loss, 1) + + def apparent(dv_500: float) -> np.ndarray: + """R' with twelve flanking paths of a given junction quality.""" + dv = dv_500 + 6.0 * np.log10(freqs / 100.0) + tau = 10.0 ** (-lab / 10.0) + for r_flank, area, length in ((floor, 13.5, 4.5), (floor, 13.5, 4.5), + (facade, 7.65, 2.55), (facade, 7.65, 2.55)): + for _ in range(3): # the Ff, Fd and Df paths of that element + r_ij = flanking_reduction_index( + index_i=r_flank, index_j=r_flank, + velocity_level_difference=dv, + separating_area=11.5, area_i=area, area_j=area, + ) + tau = tau + 10.0 ** (-np.asarray(r_ij) / 10.0) + return np.round(-10.0 * np.log10(tau), 1) + + good = apparent(14.0) + poor = apparent(4.0) + w_lab, w_good, w_poor = (weighted_rating(s) for s in (lab, good, poor)) + + _fig, ax = plt.subplots(figsize=(11.0, 6.4)) + x = _band_index_axis(ax, _THIRD_OCTAVE_16, fontsize=8) + ax.fill_between(x, poor, lab, color=theme_fill(COLOR_SECONDARY, ax), + zorder=1) + ax.plot(x, lab, "-o", color=COLOR_PRIMARY, linewidth=2.6, markersize=5, + zorder=5, label=f"laboratory R (Rw = {w_lab.rating} dB)") + ax.plot(x, good, "-s", color=COLOR_TERTIARY, linewidth=2.2, markersize=4, + zorder=4, label=f"field R', good junctions (R'w = {w_good.rating} dB)") + ax.plot(x, poor, "-^", color=COLOR_SECONDARY, linewidth=2.2, markersize=4, + zorder=4, label=f"field R', flanking dominant (R'w = {w_poor.rating} dB)") + + mid = len(x) // 2 + ax.annotate("", xy=(mid, float(lab[mid])), xytext=(mid, float(good[mid])), + arrowprops={"arrowstyle": "<->", "lw": 1.4, "color": COLOR_FG}) + ax.text(mid + 0.25, (float(lab[mid]) + float(good[mid])) / 2.0, + f"{w_lab.rating - w_good.rating} dB: normal", fontsize=9, + color=COLOR_FG) + ax.annotate("", xy=(mid + 3, float(lab[mid + 3])), + xytext=(mid + 3, float(poor[mid + 3])), + arrowprops={"arrowstyle": "<->", "lw": 1.4, "color": COLOR_FG}) + ax.text(mid + 3.25, (float(lab[mid + 3]) + float(poor[mid + 3])) / 2.0, + f"{w_lab.rating - w_poor.rating} dB: find the path", fontsize=9, + color=COLOR_FG) + + ax.set_ylabel("Sound reduction index [dB]") + ax.set_title("The same wall, in the laboratory and in two buildings\n" + "(EN 12354-1 flanking over twelve paths)", + fontweight="bold", pad=10) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="upper left", fontsize=9) + + plt.tight_layout() + save_figure(output_dir, "lab_versus_field_insulation.png") + plt.close() + + +def generate_composite_facade_weak_element(output_dir: str) -> None: + """The weak element rules a composite facade, made general.""" + print("Generating composite_facade_weak_element.png...") + from phonometry import composite_transmission_loss + + window = np.linspace(20.0, 55.0, 351) + _fig, ax = plt.subplots(figsize=(10.5, 6.2)) + colours = (COLOR_PRIMARY, COLOR_TERTIARY, COLOR_SECONDARY) + for blind, colour in zip((40.0, 50.0, 60.0), colours, strict=True): + overall = [composite_transmission_loss([6.0, 2.0], [blind, float(w)]) + for w in window] + ax.plot(window, overall, "-", color=colour, linewidth=2.4, zorder=4, + label=f"blind part RA = {blind:g} dBA") + ax.axhline(blind, color=colour, linewidth=1.0, linestyle=":", + alpha=0.6, zorder=2) + + marks = ((26.0, 40.0, -4.6, -2.0), (26.0, 50.0, -4.6, 1.4), + (31.0, 40.0, -3.6, 1.4)) + for w_val, blind, dx, dy in marks: + y = composite_transmission_loss([6.0, 2.0], [blind, w_val]) + ax.plot([w_val], [y], "o", color=COLOR_FG, markersize=7, zorder=6) + ax.annotate(f"{y:.2f}", xy=(w_val, y), xytext=(w_val + dx, y + dy), + fontsize=9, color=COLOR_FG) + + ax.annotate("+10 dBA on the blind part: +0.4 dBA", + xy=(26.0, composite_transmission_loss([6.0, 2.0], [50.0, 26.0])), + xytext=(33.0, 27.0), fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0}) + ax.annotate("+5 dBA on the window: +4.1 dBA", + xy=(31.0, composite_transmission_loss([6.0, 2.0], [40.0, 31.0])), + xytext=(33.0, 31.0), fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0}) + + ax.set_xlim(20.0, 55.0) + ax.set_xlabel("Window RA [dBA] (2 m2 of an 8 m2 facade)") + ax.set_ylabel("Overall facade RA [dBA]") + ax.set_title("The weak element sets the composite\n" + "(Ejemplo 7.5 geometry: 6 m2 blind part + 2 m2 window)", + fontweight="bold", pad=10) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="upper left", fontsize=9) + + plt.tight_layout() + save_figure(output_dir, "composite_facade_weak_element.png") + plt.close() + + +def generate_intensity_field_indicator(output_dir: str) -> None: + """The ISO 15186-1 surface qualification, band by band.""" + print("Generating intensity_field_indicator.png...") + from phonometry import surface_pressure_intensity_indicator + + freqs = _THIRD_OCTAVE_16 + # A scan that qualifies over most of the range and fails at the bottom, + # which is where a receiving room is least absorbent. + l_p = np.array([64.0, 63.0, 61.5, 59.0, 57.5, 56.0, 55.0, 54.0, + 53.0, 52.0, 51.0, 50.5, 50.0, 50.0, 51.0, 55.0]) + l_in = np.array([51.5, 51.5, 51.0, 49.5, 49.0, 48.0, 47.5, 47.0, + 46.5, 45.5, 44.5, 44.0, 43.5, 43.5, 44.5, 48.5]) + f_pi = np.asarray(surface_pressure_intensity_indicator(l_p, l_in)) + + _fig, ax = plt.subplots(figsize=(10.5, 6.0)) + x = _band_index_axis(ax, freqs, fontsize=8) + failing = (f_pi > 10.0).tolist() + ax.fill_between(x, 0.0, f_pi, where=failing, interpolate=False, + color=theme_fill(COLOR_SECONDARY, ax), zorder=1, + label="surface not qualified") + ax.plot(x, f_pi, "-o", color=COLOR_PRIMARY, linewidth=2.4, markersize=5, + zorder=5, label="FpI = Lp - LIn (Formula (10))") + ax.axhline(10.0, color=COLOR_FG, linewidth=1.6, linestyle="--", zorder=3, + label="10 dB: reflecting specimen (6.4.2)") + ax.axhline(6.0, color=COLOR_TERTIARY, linewidth=1.6, linestyle=":", + zorder=3, label="6 dB: absorbing specimen") + ax.text(0.35, float(f_pi.max()) + 0.5, + "remedy in order: +5 to 10 cm of measurement distance first,\n" + "then absorption in the receiving room", + fontsize=9, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.4", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + ax.set_ylim(0.0, float(f_pi.max()) + 3.4) + ax.set_ylabel("Surface pressure-intensity indicator FpI [dB]") + ax.set_title("Qualifying the measurement surface (ISO 15186-1, 6.4.2)", + fontweight="bold", pad=10) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="lower left", fontsize=9) + + plt.tight_layout() + save_figure(output_dir, "intensity_field_indicator.png") + plt.close() diff --git a/scripts/figures/building_design.py b/scripts/figures/building_design.py index a5ce9d5f9..c69d8e94e 100644 --- a/scripts/figures/building_design.py +++ b/scripts/figures/building_design.py @@ -404,13 +404,20 @@ def generate_structure_borne_power(output_dir: str) -> None: from phonometry import reception_plate_power bands = np.array([50.0, 100.0, 200.0, 400.0, 800.0, 1600.0, 3150.0]) - # A pump-like source on a low-mobility (heavy) and a high-mobility (light) - # reception plate; the two determinations should agree within the method. - lv_low = np.array([88.0, 90.0, 87.0, 84.0, 80.0, 76.0, 71.0]) - lv_high = lv_low + 6.0 # lighter plate vibrates more - res_low = reception_plate_power(lv_low, bands, mass_per_area=600.0, area=2.0, - reverberation_time=0.8) - res_high = reception_plate_power(lv_high, bands, mass_per_area=150.0, area=2.0, + # A pump-like source on the two plates EN 15657 specifies. Low-mobility + # (clause 7.2.2): 100 mm concrete of 2 300 kg/m3, so m = 230 kg/m2, over + # 3,15 m x 2,23 m = 7,0 m2 with Ts = 0,25 s, which keeps eta >= 0,08 + # through the 50-100 Hz bands. High-mobility (clause 7.3.2): 1 mm + # perforated steel, m = 7,9 kg/m2, over 2,0 m2 in its support frame. + lv_low = np.array([72.0, 74.0, 71.0, 68.0, 64.0, 60.0, 55.0]) + # Their point mobilities are 4,9e-6 and 1,1e-2 m/(N.s); driven by a source + # of |Y_S| ~ 1e-3 m/(N.s) the light plate's spatial-mean velocity level runs + # 35,1 dB higher, of which 12,0 dB is extra injected power and the rest is + # its far smaller eta*m*S dissipating it. + lv_high = lv_low + 35.1 + res_low = reception_plate_power(lv_low, bands, mass_per_area=230.0, area=7.0, + reverberation_time=0.25) + res_high = reception_plate_power(lv_high, bands, mass_per_area=7.9, area=2.0, reverberation_time=0.5) x = np.arange(bands.size) @@ -580,7 +587,7 @@ def generate_panel_insulation_concept(output_dir: str) -> None: ax.axvline(fc, color=COLOR_SECONDARY, ls=":", lw=1.2, label="$f_c$") ax.set_title("Single panel: mass law and coincidence", fontweight="bold", pad=10) - ax.set_ylabel("Sound reduction index R [dB]") + ax.set_ylabel("Sound reduction index $R$ (transmission loss $TL$) [dB]") ax.set_xlabel("Frequency [Hz]") ax.legend(loc="upper left", fontsize=9) ax.grid(True, which="both", alpha=0.3) @@ -598,7 +605,7 @@ def generate_panel_insulation_concept(output_dir: str) -> None: ax.axvline(f0, color=COLOR_SECONDARY, ls=":", lw=1.2, label="$f_0$") ax.set_title("Double wall: mass-spring-mass resonance", fontweight="bold", pad=10) - ax.set_ylabel("Sound reduction index R [dB]") + ax.set_ylabel("Sound reduction index $R$ (transmission loss $TL$) [dB]") ax.set_xlabel("Frequency [Hz]") ax.legend(loc="upper left", fontsize=9) ax.grid(True, which="both", alpha=0.3) @@ -637,7 +644,7 @@ def generate_panel_insulation_concept(output_dir: str) -> None: alpha=0.5, label="open-area limit") ax.set_title("Composite wall with a small aperture", fontweight="bold", pad=10) - ax.set_ylabel("Sound reduction index R [dB]") + ax.set_ylabel("Sound reduction index $R$ (transmission loss $TL$) [dB]") ax.set_xlabel("Frequency [Hz]") ax.legend(loc="upper left", fontsize=9) ax.grid(True, which="both", alpha=0.3) @@ -827,7 +834,7 @@ def generate_single_panel_rating(output_dir: str) -> None: ax.axvline(idx_fc, color=COLOR_TERTIARY, linestyle=":", linewidth=1.6, zorder=4, label=f"coincidence fc = {fc:.0f} Hz") - ax.set_ylabel("Sound reduction index R [dB]") + ax.set_ylabel("Sound reduction index $R$ (transmission loss $TL$) [dB]") ax.set_title("Predicted Single-Panel Insulation Rated per ISO 717-1", fontweight="bold", pad=12) ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) @@ -885,7 +892,7 @@ def generate_plateau_transmission_loss(output_dir: str) -> None: ax.axvline(idx_fc, color=COLOR_TERTIARY, linestyle=":", linewidth=1.6, zorder=4, label="critical frequency fc") - ax.set_ylabel("Transmission loss TL [dB]") + ax.set_ylabel("Sound reduction index $R$ (transmission loss $TL$) [dB]") ax.set_title("Plateau Estimate Against the Physical Panel Model", fontweight="bold", pad=12) ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) @@ -970,7 +977,7 @@ def generate_orthotropic_transmission_loss(output_dir: str) -> None: ax.plot(x, heckl.transmission_loss, "--", color=COLOR_TERTIARY, linewidth=1.8, zorder=4, label="Heckl's approximation") - ax.set_ylabel("Transmission loss TL [dB]") + ax.set_ylabel("Sound reduction index $R$ (transmission loss $TL$) [dB]") ax.set_title("Corrugating a Sheet Flattens Its Sound Reduction Index", fontweight="bold", pad=12) ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) @@ -999,3 +1006,351 @@ def generate_orthotropic_transmission_loss(output_dir: str) -> None: plt.tight_layout() save_figure(output_dir, "orthotropic_transmission_loss.svg") plt.close() + + +def generate_coupling_term_regimes(output_dir: str) -> None: + """EN 12354-5 coupling term against the source-to-receiver mobility ratio.""" + print("Generating coupling_term_regimes...") + from phonometry import ( + coupling_term, + coupling_term_force_source, + coupling_term_velocity_source, + ) + + # The receiver mobility of the guide's pump example, held fixed while the + # source mobility sweeps six decades around it along the same phase. + y_i = 3e-5 + 1e-5j + ratio = np.logspace(-3.0, 3.0, 400) + y_s = abs(y_i) * ratio * (2 + 1j) / abs(2 + 1j) + + exact = np.array([float(coupling_term(a, y_i)) for a in y_s]) + force = np.array([float(coupling_term_force_source(a, y_i)) for a in y_s]) + velocity = np.array( + [float(coupling_term_velocity_source(a, 1.0 / y_i)) for a in y_s] + ) + + _fig, ax = plt.subplots(figsize=(10, 6.2)) + ax.semilogx(ratio, exact, "-", color=COLOR_PRIMARY, linewidth=2.4, + zorder=5, label="Formula 19b (exact, complex mobilities)") + ax.semilogx(ratio, force, "--", color=COLOR_SECONDARY, linewidth=1.8, + zorder=4, label="force-source limit (19c)") + ax.semilogx(ratio, velocity, ":", color=COLOR_TERTIARY, linewidth=1.8, + zorder=4, label="velocity-source limit (19d)") + for style, y_k in (("-.", 1e-4), ((0, (5, 2, 1, 2)), 1e-3)): + with_mount = np.array( + [float(coupling_term(a, y_i, transfer_mobility=y_k)) for a in y_s] + ) + ax.semilogx(ratio, with_mount, linestyle=style, color=COLOR_MUTED, + linewidth=1.8, zorder=3, + label=f"elastic support Yk = {y_k:g} m/(N s) (19e)") + + # The exact curve's minimum: matched mobilities, best power transfer. + low = int(np.argmin(exact)) + ax.plot(ratio[low], exact[low], "v", color=COLOR_PRIMARY, markersize=9, + zorder=6) + ax.annotate(f"matched mobilities: {exact[low]:.1f} dB", + xy=(ratio[low], exact[low]), xytext=(ratio[low], exact[low] - 7.0), + ha="center", fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0}) + + pump = abs(y_i) * 7.0710678 * (2 + 1j) / abs(2 + 1j) + pump_dc = float(coupling_term(pump, y_i)) + ax.plot(7.0710678, pump_dc, "o", color=COLOR_FG, markersize=8, zorder=7) + ax.annotate(f"pump on a concrete slab: {pump_dc:.1f} dB", + xy=(7.0710678, pump_dc), xytext=(30.0, pump_dc - 12.0), + fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0}) + + ax.set_xlabel("Mobility ratio |Ys| / |Yi|") + ax.set_ylabel("Coupling term D_C [dB]") + ax.set_title("EN 12354-5 Coupling Term and Its Two Limits", + fontweight="bold", pad=12) + ax.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="upper left", fontsize=9) + + info = [ + "D_C = 10 log10(|Ys + Yi + Yk|² / (|Ys| Re{Yi}))", + "left: velocity source (stiff receiver takes more)", + "right: force source (stiff receiver takes less)", + ] + ax.text(0.985, 0.03, "\n".join(info), transform=ax.transAxes, + va="bottom", ha="right", fontsize=9, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.5", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "coupling_term_regimes.svg") + plt.close() + + +def generate_tapping_force_spectrum(output_dir: str) -> None: + """The tapping machine's force spectrum on concrete and on chipboard.""" + print("Generating tapping_force_spectrum...") + from phonometry import ( + hammer_limiting_frequency, + infinite_plate_impedance, + plate_bending_stiffness, + plate_contact_stiffness, + tapping_force_spectrum, + ) + + freqs = np.logspace(np.log10(50.0), np.log10(20000.0), 500) + surfaces = ( + ("140 mm concrete slab", 2200.0, 3800.0, 0.2, 0.14, COLOR_PRIMARY), + ("22 mm chipboard walking surface", 650.0, 2400.0, 0.3, 0.022, + COLOR_SECONDARY), + ) + + _fig, ax = plt.subplots(figsize=(10, 6.2)) + upper = lower = 0.0 + for label, rho, c_l, nu, h, colour in surfaces: + modulus = rho * c_l**2 * (1 - nu**2) + impedance = infinite_plate_impedance( + plate_bending_stiffness(modulus, h, nu), rho * h + ) + stiffness = plate_contact_stiffness(modulus, poisson_ratio=nu) + res = tapping_force_spectrum(freqs, stiffness, impedance) + upper, lower = res.upper_limit, res.lower_limit + regime = "over-critical" if res.over_critical else "under-critical" + ax.loglog(freqs, res.peak_force, "-", color=colour, linewidth=2.4, + zorder=5, + label=f"{label} ({regime}, fco = {res.cut_off_frequency:.0f} Hz)") + ax.axvline(res.cut_off_frequency, color=colour, linestyle=":", + linewidth=1.4, zorder=3) + f_limit = float(hammer_limiting_frequency(impedance)) + if freqs[0] < f_limit < freqs[-1]: + ax.axvline(f_limit, color=colour, linestyle="-.", linewidth=1.2, + zorder=3) + ax.annotate(f"f_limit = {f_limit:.0f} Hz", xy=(f_limit, lower * 0.55), + xytext=(f_limit * 1.25, lower * 0.35), fontsize=9, + color=colour, + arrowprops={"arrowstyle": "->", "lw": 1.0, + "color": colour}) + + ax.axhline(upper, color=COLOR_MUTED, linestyle="--", linewidth=1.6, + zorder=4, label="|Fn|upper = 2 m vh / Ti (rebound)") + ax.axhline(lower, color=COLOR_MUTED, linestyle="-.", linewidth=1.6, + zorder=4, label="|Fn|lower = m vh / Ti (no rebound)") + ax.annotate("", xy=(90.0, upper), xytext=(90.0, lower), + arrowprops={"arrowstyle": "<->", "lw": 1.4}) + ax.text(97.0, (upper * lower) ** 0.5, + f"6.0 dB in mean square\n({lower:.2f} N to {upper:.2f} N)", + fontsize=9, color=COLOR_FG, va="center") + + ax.set_xlabel(LABEL_FREQ_HZ) + ax.set_ylabel("Line force |Fn| [N]") + ax.set_title("Tapping-Machine Force: the Floor Decides the Excitation", + fontweight="bold", pad=12) + ax.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="lower left", fontsize=9) + + info = [ + "0.5 kg hammer dropped 40 mm, 10 impacts per second", + "building acoustics range shaded", + ] + ax.axvspan(100.0, 3150.0, color=theme_fill(COLOR_TERTIARY, ax), zorder=1) + ax.text(0.985, 0.97, "\n".join(info), transform=ax.transAxes, + va="top", ha="right", fontsize=9, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.5", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "tapping_force_spectrum.svg") + plt.close() + + +def generate_detailed_impact_paths(output_dir: str) -> None: + """ISO 12354-2 Annex G: the five impact paths of the worked building.""" + print("Generating detailed_impact_paths...") + import sys + from pathlib import Path + + tests = str(Path(__file__).resolve().parents[2] / "tests") + if tests not in sys.path: + sys.path.insert(0, tests) + import iso12354_building as bld + + from phonometry import ( + detailed_impact_prediction, + direct_impact_level, + floating_floor_improvement, + in_situ_element, + ) + + bands = np.array([50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, + 800, 1000, 1250, 1600, 2000, 2500, 3150], dtype=float) + situ = {k: in_situ_element(e, bands) for k, e in bld.elements().items()} + f_0 = bld.floating_floor_resonance() + delta = floating_floor_improvement(bands, resonance_frequency=f_0) + res = detailed_impact_prediction( + bands, + direct_level=direct_impact_level(situ["floor"].impact_level, + delta_l=delta), + flanking_paths=bld.impact_paths(situ, delta), + ) + assert res.rating is not None + + _fig, ax = plt.subplots(figsize=(10, 6.2)) + x = _band_index_axis(ax, bands) + palette = [COLOR_TERTIARY, COLOR_PRIMARY, COLOR_SECONDARY, "#9467bd", + "#ff9896"] + bottom = np.zeros(x.size) + for colour, k in enumerate_paths(res): + share = 100.0 * res.fractions[k] + ax.bar(x, share, bottom=bottom, width=0.85, + color=palette[colour % len(palette)], edgecolor="none", zorder=2, + label=res.paths[k].label) + bottom = bottom + share + ax.set_ylim(0.0, 100.0) + ax.set_ylabel("Share of transmitted energy [%]") + ax.set_title("ISO 12354-2 Detailed Model: the Direct Path Governs (Annex G)", + fontweight="bold", pad=12) + ax.set_axisbelow(True) + + twin = ax.twinx() + twin.plot(x, res.l_prime_n, "-o", color=COLOR_FG, linewidth=2.0, + markersize=4, zorder=5, label="L'n (apparent)") + twin.set_ylabel("Apparent normalized impact level L'n [dB]") + idx_f0 = float(np.interp(np.log10(f_0), np.log10(bands), x)) + twin.axvline(idx_f0, color=COLOR_MUTED, linestyle=":", linewidth=1.6, + zorder=4, label=f"floating floor fo = {f_0:.1f} Hz") + handles, labels = ax.get_legend_handles_labels() + extra, extra_labels = twin.get_legend_handles_labels() + ax.legend(handles + extra, labels + extra_labels, loc="upper right", + fontsize=9, ncol=3) + + info = [ + "five paths, not thirteen: only the floor is excited", + f"L'n,w (CI) = {res.rating.rating} ({res.rating.ci}) dB", + ] + ax.text(0.015, 0.03, "\n".join(info), transform=ax.transAxes, + va="bottom", ha="left", fontsize=10, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.5", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "detailed_impact_paths.svg") + plt.close() + + +def enumerate_paths(result: object) -> list[tuple[int, int]]: + """``(colour index, path index)`` with the largest contributor first.""" + fractions = result.fractions # type: ignore[attr-defined] + order = list(np.argsort(-fractions.max(axis=1))) + return [(i, int(k)) for i, k in enumerate(order)] + + +def generate_radiation_efficiency_panels(output_dir: str) -> None: + """Plate radiation efficiency for two pane sizes, and the baffled plate.""" + print("Generating radiation_efficiency_panels...") + from phonometry import radiation_efficiency + + bands = np.array([50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, + 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000], + dtype=float) + f_c = 2107.0 # the page's 6 mm float glass pane + big = radiation_efficiency(bands, 1.5, 1.25, f_c) + small = radiation_efficiency(bands, 0.5, 0.4, f_c) + + _fig, (ax_l, ax_r) = plt.subplots(1, 2, figsize=(13.0, 5.6)) + ax_l.loglog(bands, big.radiation_efficiency, "-o", color=COLOR_PRIMARY, + linewidth=2.2, markersize=5, zorder=5, + label="1.5 m x 1.25 m pane") + ax_l.loglog(bands, small.radiation_efficiency, "-s", color=COLOR_SECONDARY, + linewidth=2.2, markersize=5, zorder=5, + label="0.5 m x 0.4 m pane, same glass") + ax_l.axhline(1.0, color=COLOR_MUTED, linestyle="--", linewidth=1.4, + zorder=3, label="sigma = 1 (as efficient as a piston)") + ax_l.axvline(f_c, color=COLOR_TERTIARY, linestyle=":", linewidth=1.6, + zorder=3, label=f"critical frequency fc = {f_c:.0f} Hz") + peak = float(big.radiation_efficiency.max()) + ax_l.annotate(f"coincidence peak: sigma = {peak:.2f}", + xy=(2000.0, peak), xytext=(260.0, peak * 1.05), fontsize=9, + color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0}) + ax_l.set_xlabel(LABEL_FREQ_HZ) + ax_l.set_ylabel("Radiation efficiency sigma") + ax_l.set_title("Edge Radiation, Coincidence and the Slow Return to Unity", + fontweight="bold", pad=12) + ax_l.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5, + zorder=0) + ax_l.set_axisbelow(True) + ax_l.legend(loc="upper left", fontsize=9) + + ratio = float(small.radiation_efficiency[bands == 100][0] + / big.radiation_efficiency[bands == 100][0]) + ax_l.text(0.985, 0.03, + (f"at 100 Hz the small pane radiates {ratio:.1f} times better:\n" + "the uncancelled edge strip is a larger fraction of it"), + transform=ax_l.transAxes, va="bottom", ha="right", fontsize=9, + color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.5", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + + big.plot_geometry(ax=ax_r) + plt.tight_layout() + save_figure(output_dir, "radiation_efficiency_panels.svg") + plt.close() + + +def generate_structure_borne_conversion(output_dir: str) -> None: + """EN 15657 to EN 12354-5: the two quantities one correction produces.""" + print("Generating structure_borne_conversion...") + from phonometry import ( + characteristic_reception_plate_power, + equivalent_blocked_force_level, + installed_power_from_reception_plate, + ) + + # The flushing cistern of EN 12354-5 Annex I.3 at its wall contact, whose + # printed Table I.8 columns the library reproduces to a tenth of a decibel. + bands = np.array([63.0, 125.0, 250.0, 500.0, 1000.0, 2000.0]) + l_ws = np.array([61.7, 59.8, 47.2, 44.9, 38.8, 27.2]) # on the test plate + l_fb = equivalent_blocked_force_level(l_ws, 5.34e-6) # Formula (15) + l_wsn = characteristic_reception_plate_power(l_fb) # Formula (17) + installed = installed_power_from_reception_plate(l_wsn, 24.1e-6) + characteristic = installed_power_from_reception_plate(l_wsn, 1.0e-3) + d_c = 16.2 # Annex I.9 + + x = np.arange(bands.size) + _fig, ax = plt.subplots(figsize=(10, 6.2)) + ax.plot(x, l_ws, "-o", color=COLOR_MUTED, linewidth=2.0, markersize=5, + zorder=4, label="L_Ws measured on the test plate (Y = 5.34e-6)") + ax.plot(x, l_wsn, "-s", color=COLOR_PRIMARY, linewidth=2.4, markersize=6, + zorder=5, + label="L_Wsn on the standard plate (Y = 5e-6): what is declared") + ax.plot(x, installed, "-^", color=COLOR_TERTIARY, linewidth=2.4, + markersize=6, zorder=5, + label="L_Ws,inst on the receiving wall (Y = 24.1e-6)") + ax.plot(x, characteristic, "-D", color=COLOR_SECONDARY, linewidth=2.4, + markersize=6, zorder=5, + label="L_Ws,c with the source mobility (Y = 1e-3): the input to " + "EN 12354-5") + ax.plot(x, characteristic - d_c, "x", color=COLOR_FG, markersize=9, + markeredgewidth=2.0, zorder=6, + label=f"L_Ws,c - D_C, D_C = {d_c:g} dB: back to L_Ws,inst") + + # The step the section exists to teach, marked in the lowest band. + ax.annotate("", xy=(0, installed[0]), xytext=(0, l_wsn[0]), + arrowprops={"arrowstyle": "<->", "lw": 1.6}) + ax.text(0.12, 0.5 * (l_wsn[0] + installed[0]), + f"+{installed[0] - l_wsn[0]:.1f} dB = 10 lg(24.1/5.0):\n" + "a lighter receiver accepts more power", + fontsize=9, color=COLOR_FG, va="center") + + _band_index_axis(ax, bands) + ax.set_ylabel("Structure-borne power level [dB re 1 pW]") + ax.set_title("One Source, Four Levels: the EN 15657 Conversion Chain", + fontweight="bold", pad=12) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="lower left", fontsize=8.5) + ax.text(0.985, 0.97, + "EN 12354-5 Annex I.3 flushing cistern, wall contact\n" + "markers reproduce the printed Table I.8 columns", + transform=ax.transAxes, va="top", ha="right", fontsize=9, + color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.5", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "structure_borne_conversion.svg") + plt.close() diff --git a/scripts/figures/i18n.py b/scripts/figures/i18n.py index 4fb76d74b..e43ad0642 100644 --- a/scripts/figures/i18n.py +++ b/scripts/figures/i18n.py @@ -23,6 +23,203 @@ _LANG_SUFFIX = "" _ES_EXACT = { + # Materials: diffusers, resilient layers and in-situ surfaces (B11b) + "s't, frame (Formula 4)": "s't, esqueleto (Fórmula 4)", + "s'a, enclosed gas (Formula 7, eps = 0.9)": + "s'a, aire encerrado (Fórmula 7, eps = 0,9)", + "s' installed = s't + s'a (clause 8.2)": + "s' instalada = s't + s'a (capítulo 8.2)", + "clause 8.2: r >= 100 kPa.s/m2 -> s' = s't\n" + " 10 <= r < 100 -> s' = s't + s'a\n" + " r < 10 -> s' = s't only if s'a is negligible": + "capítulo 8.2: r >= 100 kPa.s/m2 -> s' = s't\n" + " 10 <= r < 100 -> s' = s't + s'a\n" + " r < 10 -> s' = s't solo si s'a es " + "despreciable", + "the worked determination:\nd = 20 mm, 4.94 + 5.56 = 10.49": + "la determinación del ejemplo:\nd = 20 mm, 4,94 + 5,56 = 10,49", + "f_u = 0.58 c0 / d (Clause 5.4)": "f_u = 0,58 c0 / d (capítulo 5.4)", + "|Hi|, the windowed free-field reference": + "|Hi|, la referencia de campo libre enventanada", + "|Hr|, the windowed surface reflection": + "|Hr|, la reflexión de la superficie enventanada", + "hi: free field, the rig clear of every surface": + "hi: campo libre, el equipo lejos de toda superficie", + "the same window, on the direct sound": + "la misma ventana, sobre el sonido directo", + "measured over the road: the two arrivals overlap": + "medido sobre el pavimento: las dos llegadas se solapan", + "hr = road - free field, the surface alone": + "hr = pavimento - campo libre, solo la superficie", + "ISO 13472-1, subtraction": "ISO 13472-1, sustracción", + "ISO 13472-2, spot tube": "ISO 13472-2, tubo puntual", + "Periodic, 6 x N = 7": "Periódico, 6 x N = 7", + "Modulated, period + inverse": "Modulado, periodo + inverso", + "small excitation: fr = 25.0 Hz": + "excitación pequeña: fr = 25,0 Hz", + "over-driven: peak lower and at 22 Hz": + "sobreexcitado: pico más bajo y en 22 Hz", + "alpha_spec - alpha_s (numerator of Eq. (5))": + "alpha_spec - alpha_s (numerador de la Ec. (5))", + "alpha_spec, rotating turntable (T3, T4)": + "alpha_spec, plataforma giratoria (T3, T4)", + "alpha_s, static turntable (T1, T2)": + "alpha_s, plataforma estática (T1, T2)", + "Absorption coefficient": "Coeficiente de absorcion", + "s = (alpha_spec - alpha_s) / (1 - alpha_s) Eq. (5)": + "s = (alpha_spec - alpha_s) / (1 - alpha_s) Ec. (5)", + "From three impulse responses to one level (ISO 17497-2, Clause 7.4)": + "De tres respuestas al impulso a un nivel (ISO 17497-2, capítulo 7.4)", + "(a) h1: sample present": "(a) h1: con la muestra", + "(b) h2: sample removed": "(b) h2: sin la muestra", + "(c) h1 - h2: the room is gone": "(c) h1 - h2: la sala desaparece", + "(d) h4: deconvolved by h3, Formula (1)": + "(d) h4: deconvolucionada por h3, Fórmula (1)", + "(e) windowed, Clause 7.4.3": "(e) enventanada, capítulo 7.4.3", + "room": "sala", + "The working band of a Schroeder design": + "La banda útil de un difusor de Schroeder", + "N = 7 QRD, f0 = 500 Hz, 5 periods": + "QRD N = 7, f0 = 500 Hz, 5 periodos", + "Flat panel, same footprint": "Panel plano, misma huella", + "Reflected polar response at 1 kHz": + "Respuesta polar reflejada a 1 kHz", + "Band by band, same 4.2 m panel": + "Banda a banda, el mismo panel de 4,2 m", + "Normalised diffusion coefficient": "Coeficiente de difusión normalizado", + "The absorption a metadiffuser pays for its phases": + "La absorción que un metadifusor paga por sus fases", + "face average (what a room model consumes)": + "media en la cara (lo que consume un modelo de sala)", + "At the 2 kHz design frequency": "A la frecuencia de diseño de 2 kHz", + "Across the band: exact only where it was tuned": + "En toda la banda: exacto solo donde se sintonizó", + "QRD target, wells to 27.4 cm": + "Objetivo QRD, pozos de hasta 27,4 cm", + "Reflection phase [deg]": "Fase de reflexión [grados]", + "Phase error against the QRD target [deg]": + "Error de fase frente al objetivo QRD [grados]", + "Slit index n": "Índice de rendija n", + "within 10 deg of the target": "dentro de 10 grados del objetivo", + "The honest bandwidth of the trick": + "El ancho de banda real del truco", + "On the rig: reading fr": "En el banco: leer fr", + "Installed: only well above f0": "Instalado: solo muy por encima de f0", + "Load-plate response [dB re static]": + "Respuesta de la placa de carga [dB re estático]", + "Improvement of impact insulation [dB]": + "Mejora del aislamiento a impactos [dB]", + "ideal mass-spring isolation": "aislamiento masa-resorte ideal", + "The gas spring takes over as the layer gets thinner": + "El resorte de aire domina según adelgaza la capa", + "Loaded thickness d [mm]": "Espesor bajo carga d [mm]", + "Dynamic stiffness per unit area [MN/m³]": + "Rigidez dinámica por unidad de superficie [MN/m³]", + "f0 of a 120 kg/m² screed [Hz]": "f0 de un recrecido de 120 kg/m² [Hz]", + "The one free parameter of ISO 13472-1": + "El único parámetro libre de la ISO 13472-1", + "Free field": "Campo libre", + "Over the road": "Sobre el pavimento", + "Level [dB re max]": "Nivel [dB re max]", + "Two in-situ methods, two reported bands": + "Dos métodos in situ, dos bandas declaradas", + "The bore that seals is the bore that caps the band": + "El diámetro que sella es el que limita la banda", + "Tube diameter d [mm]": "Diámetro del tubo d [mm]", + "Plane-wave ceiling [Hz]": "Techo de onda plana [Hz]", + # Resonance-sweep clip (anim_dynamic_stiffness_sweep) + "Reading fr on the EN 29052-1 rig": + "Lectura de fr en el banco EN 29052-1", + "rigid base": "base rígida", + "load plate, 8 kg": "placa de carga, 8 kg", + "specimen": "probeta", + "plate motion": "movimiento de la placa", + "Response magnitude": "Módulo de la respuesta", + "Phase [deg]": "Fase [grados]", + "-90 deg: resonance": "-90 grados: resonancia", + "below fr: the plate follows the force": + "por debajo de fr: la placa sigue a la fuerza", + "at fr: a quarter cycle behind, amplitude peaks": + "en fr: un cuarto de ciclo por detrás, la amplitud es máxima", + "above fr: the plate moves against the force": + "por encima de fr: la placa se mueve contra la fuerza", + "phase": "fase", + # Building acoustics: sound insulation (B8 figures) + "Same weighted rating, different spectrum": + "El mismo indice ponderado, distinto espectro", + "Rw alone is not a specification": + "Rw por si solo no es una especificacion", + "shifted reference (both, Rw = 49 dB)": + "curva de referencia desplazada (ambas, Rw = 49 dB)", + "150 mm dense concrete": "hormigon denso de 150 mm", + "double leaf, 12 kg/m2 + 90 mm": "doble hoja, 12 kg/m2 + 90 mm", + "mass-air-mass resonance at 82 Hz, below the\n" + "rated range: the double leaf enters it still climbing": + "resonancia masa-aire-masa en 82 Hz, por debajo del\n" + "rango valorado: la doble hoja entra aun subiendo", + "concrete": "hormigon", + "double leaf": "doble hoja", + "Single number [dB]": "Numero global [dB]", + "6 dB apart\nagainst traffic": "6 dB de diferencia\nfrente al trafico", + "Background-noise correction: two standards, two thresholds": + "Correccion por ruido de fondo: dos normas, dos umbrales", + "ISO 10140-4 laboratory (6 / 15 dB)": + "ISO 10140-4 laboratorio (6 / 15 dB)", + "ISO 16283-1 field (6 / 10 dB)": "ISO 16283-1 in situ (6 / 10 dB)", + "limit of measurement\n(fixed 1,3 dB, flag the band)": + "limite de medicion\n(1,3 dB fijos, senalar la banda)", + "the field rule stops here": "la regla in situ termina aqui", + "the laboratory rule stops here": "la regla de laboratorio termina aqui", + "Signal-to-background margin Lsb - Lb [dB]": + "Margen senal-fondo Lsb - Lb [dB]", + "Correction applied, Lsb - L [dB]": "Correccion aplicada, Lsb - L [dB]", + "A Fast detector cannot follow a long decay": + "Un detector Fast no puede seguir una caida larga", + "more than 1 dB apart": "mas de 1 dB de diferencia", + "Fast maximum: 10 lg[g(C)/g(C0)] (ISO 16283-2)": + "maximo Fast: 10 lg[g(C)/g(C0)] (ISO 16283-2)", + "energy average: 10 lg(T/T0)": "promedio energetico: 10 lg(T/T0)", + "T = T0 = 0,5 s\nboth terms vanish": + "T = T0 = 0,5 s\nambos terminos se anulan", + "T = 1,7275 s: C = 1, g = 1/e": "T = 1,7275 s: C = 1, g = 1/e", + "Receiving-room reverberation time T [s]": + "Tiempo de reverberacion del recinto receptor T [s]", + "Term subtracted from the measured level [dB]": + "Termino restado al nivel medido [dB]", + "The same wall, in the laboratory and in two buildings\n" + "(EN 12354-1 flanking over twelve paths)": + "La misma pared, en laboratorio y en dos edificios\n" + "(transmision por flancos EN 12354-1 sobre doce caminos)", + "laboratory R (Rw = 49 dB)": "R de laboratorio (Rw = 49 dB)", + "field R', good junctions (R'w = 47 dB)": + "R' in situ, uniones buenas (R'w = 47 dB)", + "field R', flanking dominant (R'w = 42 dB)": + "R' in situ, flancos dominantes (R'w = 42 dB)", + "2 dB: normal": "2 dB: normal", + "7 dB: find the path": "7 dB: busque el camino", + "The weak element sets the composite\n" + "(Ejemplo 7.5 geometry: 6 m2 blind part + 2 m2 window)": + "El elemento debil fija el conjunto\n" + "(geometria del Ejemplo 7.5: 6 m2 de parte ciega + 2 m2 de ventana)", + "Window RA [dBA] (2 m2 of an 8 m2 facade)": + "RA de la ventana [dBA] (2 m2 de una fachada de 8 m2)", + "Overall facade RA [dBA]": "RA global de la fachada [dBA]", + "+10 dBA on the blind part: +0.4 dBA": + "+10 dBA en la parte ciega: +0,4 dBA", + "+5 dBA on the window: +4.1 dBA": "+5 dBA en la ventana: +4,1 dBA", + "Qualifying the measurement surface (ISO 15186-1, 6.4.2)": + "Calificacion de la superficie de medicion (ISO 15186-1, 6.4.2)", + "surface not qualified": "superficie no calificada", + "FpI = Lp - LIn (Formula (10))": "FpI = Lp - LIn (Formula (10))", + "10 dB: reflecting specimen (6.4.2)": + "10 dB: probeta reflectante (6.4.2)", + "6 dB: absorbing specimen": "6 dB: probeta absorbente", + "remedy in order: +5 to 10 cm of measurement distance first,\n" + "then absorption in the receiving room": + "remedio en orden: primero +5 a 10 cm de distancia de medicion,\n" + "despues absorcion en el recinto receptor", + "Surface pressure-intensity indicator FpI [dB]": + "Indicador superficial presion-intensidad FpI [dB]", # ANP fleet database guide "ANP NPD Curves - Boeing 747-100 / JT9DBD (SEL, departure)": "Curvas NPD ANP - Boeing 747-100 / JT9DBD (SEL, despegue)", @@ -680,6 +877,70 @@ "Nivel de presi\u00f3n ac\u00fastica por banda de octava [dB]", "Rumble tol. (+5 dB)": "Tol. retumbo (+5 dB)", "Hiss tol. (+3 dB)": "Tol. siseo (+3 dB)", + "55 dB floor\n(16 Hz = 31.5 Hz)": "suelo de 55 dB\n(16 Hz = 31,5 Hz)", + # ISO 18233 acquisition: SNR gain, harmonic separation, d_min bias, + # modal count per band and time variance + "Effective signal-to-noise ratio of the recovered impulse response": + "Relación señal-ruido efectiva de la respuesta al impulso recuperada", + "noise floor read here": "el ruido de fondo se lee aquí", + "Harmonic distortion lands before t = 0 (ISO 18233 B.5)": + "La distorsión armónica cae antes de t = 0 (ISO 18233 B.5)", + "Arrival time relative to the linear impulse response [s]": + "Tiempo de llegada respecto a la respuesta al impulso lineal [s]", + "causal part: what impulse_response() returns": + "parte causal: lo que devuelve impulse_response()", + "A microphone inside d_min returns wrong numbers, not noisy ones": + "Un micrófono dentro de d_min da números equivocados, no ruidosos", + "Source–receiver distance [m]": "Distancia fuente–receptor [m]", + "Decay time [s]": "Tiempo de caída [s]", + "Clarity C80 [dB]": "Claridad C80 [dB]", + "T30 (500–1000 Hz)": "T30 (500–1000 Hz)", + "EDT (500–1000 Hz)": "EDT (500–1000 Hz)", + "C80 (500–1000 Hz)": "C80 (500–1000 Hz)", + "What the analysis band averages over (7 × 5 × 3 m room, V = 105 m³)": + "Sobre qué promedia la banda de análisis (sala de 7 × 5 × 3 m, " + "V = 105 m³)", + "Modes inside the octave band": "Modos dentro de la banda de octava", + "Below the Schroeder frequency": "Por debajo de la frecuencia de Schroeder", + "Above it": "Por encima", + "Time variance costs the MLS its dynamic range, not the sweep": + "La variación temporal le cuesta el rango dinámico al MLS, no al barrido", + "the MLS floor rises to the room's own early decay:\nthe tail is gone": + "el suelo del MLS sube hasta la primera caída de la sala:\n" + "la cola ha desaparecido", + "sweep: the two traces lie on top of each other": + "barrido: las dos trazas quedan superpuestas", + # ISO 3382-3 Annex A quality ranges and the absorption-per-table window + "The same two quantities at the two ends of Annex A": + "Las mismas dos magnitudes en los dos extremos del Anexo A", + "Lp,A,S,4m > 50 dB: poor": "Lp,A,S,4m > 50 dB: deficiente", + "Lp,A,S,4m ≤ 48 dB: good target": + "Lp,A,S,4m ≤ 48 dB: objetivo bueno", + "rD ≤ 5 m: good": "rD ≤ 5 m: bueno", + "rD > 10 m: poor": "rD > 10 m: deficiente", + "A-weighted speech level [dB]": "Nivel de habla ponderado A [dB]", + "Speech transmission index": "Índice de transmisión del habla", + "STI = 0.50": "STI = 0,50", + "STI = 0.20": "STI = 0,20", + "The design window, for one layout": + "La ventana de diseño, para una distribución", + "Communication: A_tab > 6.31 r_s² (L_SN > −6 dB)": + "Comunicación: A_tab > 6,31 r_s² (L_SN > −6 dB)", + "Privacy: A_tab < 3.16 r_t² (L_SN < −9 dB)": + "Privacidad: A_tab < 3,16 r_t² (L_SN < −9 dB)", + "Separation [m]": "Separación [m]", + "Absorption per occupied table A_tab [m²]": + "Absorción por mesa ocupada A_tab [m²]", + "Table spacing over cross-table separation, r_t / r_s": + "Separación entre mesas frente a la de la mesa, r_t / r_s", + "Width of the feasible A_tab window [m²]": + "Anchura de la ventana factible de A_tab [m²]", + "Two ratings: the RC Mark II tag reads the character": + "Dos calificaciones: la etiqueta RC Mark II lee el carácter", + "Tag threshold (D.3): +5 / +3 dB": + "Umbral de etiqueta (D.3): +5 / +3 dB", + "Level minus the room's own RC curve [dB]": + "Nivel menos la curva RC propia de la sala [dB]", "ISO 7029 — age-related threshold (male)": "ISO 7029 — umbral por edad (hombres)", "ISO 389-7 — reference threshold of hearing": @@ -1776,9 +2037,101 @@ "Coincidencia: la misma placa de acero, bajo y sobre f_c " "(FDTD elástico 2D)", "10 mm steel plate": "placa de acero de 10 mm", + # coupling_term_regimes (EN 12354-5, buildings/design) + "Formula 19b (exact, complex mobilities)": + "Fórmula 19b (exacta, movilidades complejas)", + "force-source limit (19c)": "límite de fuente de fuerza (19c)", + "velocity-source limit (19d)": "límite de fuente de velocidad (19d)", + "Mobility ratio |Ys| / |Yi|": "Cociente de movilidades |Ys| / |Yi|", + "Coupling term D_C [dB]": "Término de acoplamiento D_C [dB]", + "EN 12354-5 Coupling Term and Its Two Limits": + "Término de acoplamiento de la EN 12354-5 y sus dos límites", + "D_C = 10 log10(|Ys + Yi + Yk|² / (|Ys| Re{Yi}))\n" + "left: velocity source (stiff receiver takes more)\n" + "right: force source (stiff receiver takes less)": + "D_C = 10 log10(|Ys + Yi + Yk|² / (|Ys| Re{Yi}))\n" + "izquierda: fuente de velocidad (un receptor rígido acepta más)\n" + "derecha: fuente de fuerza (un receptor rígido acepta menos)", + # tapping_force_spectrum (buildings/design/resilient-layers) + "|Fn|upper = 2 m vh / Ti (rebound)": + "|Fn|superior = 2 m vh / Ti (con rebote)", + "|Fn|lower = m vh / Ti (no rebound)": + "|Fn|inferior = m vh / Ti (sin rebote)", + "Line force |Fn| [N]": "Fuerza por línea |Fn| [N]", + "Tapping-Machine Force: the Floor Decides the Excitation": + "Fuerza de la máquina de impactos: el forjado decide la excitación", + "0.5 kg hammer dropped 40 mm, 10 impacts per second\n" + "building acoustics range shaded": + "martillo de 0,5 kg desde 40 mm, 10 impactos por segundo\n" + "rango de acústica de la edificación sombreado", + # detailed_impact_paths (buildings/design/detailed-prediction) + "Apparent normalized impact level L'n [dB]": + "Nivel de impactos normalizado aparente L'n [dB]", + "L'n (apparent)": "L'n (aparente)", + "ISO 12354-2 Detailed Model: the Direct Path Governs (Annex G)": + "Modelo detallado de la ISO 12354-2: manda la vía directa (anexo G)", + # radiation_efficiency_panels (buildings/design/panel-sound-insulation) + "0.5 m x 0.4 m pane, same glass": + "vidrio de 0,5 m x 0,4 m, el mismo material", + "sigma = 1 (as efficient as a piston)": + "sigma = 1 (tan eficiente como un pistón)", + "Radiation efficiency sigma": "Eficiencia de radiación sigma", + "Edge Radiation, Coincidence and the Slow Return to Unity": + "Radiación de bordes, coincidencia y el lento retorno a la unidad", + # structure_borne_conversion (buildings/design/structure-borne-power) + "One Source, Four Levels: the EN 15657 Conversion Chain": + "Una fuente, cuatro niveles: la cadena de conversión de la EN 15657", + "Structure-borne power level [dB re 1 pW]": + "Nivel de potencia estructural [dB re 1 pW]", + "L_Ws measured on the test plate (Y = 5.34e-6)": + "L_Ws medido sobre la placa de ensayo (Y = 5,34e-6)", + "L_Wsn on the standard plate (Y = 5e-6): what is declared": + "L_Wsn sobre la placa normalizada (Y = 5e-6): lo que se declara", + "L_Ws,inst on the receiving wall (Y = 24.1e-6)": + "L_Ws,inst sobre el muro receptor (Y = 24,1e-6)", + "L_Ws,c with the source mobility (Y = 1e-3): the input to EN 12354-5": + "L_Ws,c con la movilidad de la fuente (Y = 1e-3): la entrada de la EN 12354-5", + "EN 12354-5 Annex I.3 flushing cistern, wall contact\n" + "markers reproduce the printed Table I.8 columns": + "Cisterna del anexo I.3 de la EN 12354-5, contacto en el muro\n" + "los marcadores reproducen las columnas impresas de la tabla I.8", } _ES_PATTERNS = [ + # coupling_term_regimes annotations (baked-in computed values). + (r"^elastic support Yk = (.+) m/\(N s\) \(19e\)$", + r"apoyo elástico Yk = \1 m/(N s) (19e)"), + (r"^matched mobilities: (.+) dB$", r"movilidades igualadas: \1 dB"), + (r"^pump on a concrete slab: (.+) dB$", + r"bomba sobre un forjado de hormigón: \1 dB"), + # tapping_force_spectrum legend and annotations. + (r"^(\d+) mm concrete slab \(under-critical, fco = (.+) Hz\)$", + r"forjado de hormigón de \1 mm (subcrítico, fco = \2 Hz)"), + (r"^(\d+) mm chipboard walking surface \(over-critical, fco = (.+) Hz\)$", + r"tablero de partículas de \1 mm (supercrítico, fco = \2 Hz)"), + (r"^f_limit = (.+) Hz$", r"f_límite = \1 Hz"), + (r"^(.+) dB in mean square\n\((.+) N to (.+) N\)$", + r"\1 dB en valor cuadrático medio\n(de \2 N a \3 N)"), + # detailed_impact_paths annotations. + (r"^floating floor fo = (.+) Hz$", r"suelo flotante fo = \1 Hz"), + ((r"^five paths, not thirteen: only the floor is excited\n" + r"L'n,w \(CI\) = (.+) \((.+)\) dB$"), + ("cinco vías, no trece: solo se excita el forjado\n" + r"L'n,w (CI) = \1 (\2) dB")), + # structure_borne_conversion annotation (baked-in computed values). + ((r"^\+(.+) dB = 10 lg\(24\.1/5\.0\):\n" + r"a lighter receiver accepts more power$"), + "+\\1 dB = 10 lg(24,1/5,0):\nun receptor más ligero acepta más potencia"), + (r"^L_Ws,c - D_C, D_C = (.+) dB: back to L_Ws,inst$", + r"L_Ws,c - D_C, D_C = \1 dB: de vuelta a L_Ws,inst"), + # radiation_efficiency_panels legend and annotations. + (r"^(.+) m x (.+) m pane$", r"vidrio de \1 m x \2 m"), + (r"^critical frequency fc = (.+) Hz$", r"frecuencia crítica fc = \1 Hz"), + (r"^coincidence peak: sigma = (.+)$", r"pico de coincidencia: sigma = \1"), + ((r"^at (.+) Hz the small pane radiates (.+) times better:\n" + r"the uncancelled edge strip is a larger fraction of it$"), + (r"a \1 Hz el vidrio pequeño radia \2 veces mejor:\n" + r"la franja de borde no cancelada es una fracción mayor de él")), # masonry_wall_ties legend entries (tie name + baked-in Table A4 stiffness). (r"^butterfly \((.+) MN/m\)$", r"mariposa (\1 MN/m)"), (r"^double triangle \((.+) MN/m\)$", r"doble triángulo (\1 MN/m)"), @@ -1977,6 +2330,48 @@ r"Criterios de sala Mark II RC-\1"), (r"^Tangent @ (.+) Hz$", r"Tangente @ \1 Hz"), (r"^Reference RC-(.+)$", r"Referencia RC-\1"), + # The NC blind spot: one rating, two spectral characters + (r"^One rating: NC-(.+) for both rooms$", + r"Una calificación: NC-\1 en las dos salas"), + (r"^Duct rumble — tangent at (.+) Hz$", + r"Retumbo de conducto — tangente en \1 Hz"), + (r"^Diffuser hiss — tangent at (.+) Hz$", + r"Siseo de difusor — tangente en \1 Hz"), + (r"^Duct rumble — RC-(.+)$", r"Retumbo de conducto — RC-\1"), + (r"^Diffuser hiss — RC-(.+)$", r"Siseo de difusor — RC-\1"), + # ISO 18233 acquisition figures + (r"^Pistol shot \(no deconvolution\) — (.+) dB$", + r"Disparo de pistola (sin deconvolución) — \1 dB"), + (r"^(.+) s sweep, deconvolved — (.+) dB$", + r"barrido de \1 s, deconvolucionado — \2 dB"), + (r"^sweep over pistol: \+(.+) dB\ntwo doublings of sweep length: \+(.+) dB$", + r"barrido frente a pistola: +\1 dB\ndos duplicaciones de la duración: +\2 dB"), + (r"^H(\d)\n−(.+) s$", r"H\1\n−\2 s"), + (r"^excluded: r < d_min = (.+) m$", r"excluida: r < d_min = \1 m"), + (r"^critical distance (.+) m$", r"distancia crítica \1 m"), + (r"^Schroeder frequency (.+) Hz$", r"Frecuencia de Schroeder \1 Hz"), + (r"^sweep, stationary$", r"barrido, estacionario"), + (r"^MLS, stationary$", r"MLS, estacionario"), + (r"^sweep, \+0\.3 K during the take$", r"barrido, +0,3 K durante la toma"), + (r"^MLS, \+0\.3 K during the take$", r"MLS, +0,3 K durante la toma"), + # ISO 3382-3 Annex A quality ranges and the absorption-per-table window + (r"^Treated: D2,S = (.+) dB, Lp,A,S,4m = (.+) dB$", + r"Tratada: D2,S = \1 dB, Lp,A,S,4m = \2 dB"), + (r"^Untreated: D2,S = (.+) dB, Lp,A,S,4m = (.+) dB$", + r"Sin tratar: D2,S = \1 dB, Lp,A,S,4m = \2 dB"), + (r"^Treated: rD = (.+) m, rP = (.+) m$", r"Tratada: rD = \1 m, rP = \2 m"), + (r"^Untreated: rD = (.+) m, rP = (.+) m$", + r"Sin tratar: rD = \1 m, rP = \2 m"), + (r"^feasible A_tab: (.+) to (.+) m²$", + r"A_tab factible: de \1 a \2 m²"), + (r"^r_s = (.+) m → A_tab > (.+) m²$", r"r_s = \1 m → A_tab > \2 m²"), + (r"^r_t = (.+) m → A_tab < (.+) m²$", r"r_t = \1 m → A_tab < \2 m²"), + (r"^window closes at r_t / r_s = (.+)$", + r"la ventana se cierra en r_t / r_s = \1"), + (r"^this layout: (.+), (.+) m² wide$", + r"esta distribución: \1, \2 m² de anchura"), + (r"^Packed tables close it \(r_s = (.+) m\)$", + r"Con las mesas juntas se cierra (r_s = \1 m)"), (r"^(\d+) yr$", r"\1 años"), (r"^10-90 % band \((\d+) yr\)$", r"banda 10-90 % (\1 años)"), # Tier-1 animation dynamic labels diff --git a/scripts/figures/materials.py b/scripts/figures/materials.py index 0e05a3d0e..143bf3e8b 100644 --- a/scripts/figures/materials.py +++ b/scripts/figures/materials.py @@ -14,12 +14,17 @@ import numpy as np from scipy import signal as scipy_signal -from phonometry._plot.common import format_frequency_axis, theme_fill_alpha +from phonometry._plot.common import ( + format_frequency_axis, + theme_fill, + theme_fill_alpha, +) from .i18n import _LANG from .theme import ( COLOR_FG, COLOR_GRID, + COLOR_MUTED, COLOR_PANEL, COLOR_PRIMARY, COLOR_SECONDARY, @@ -74,6 +79,153 @@ def generate_dynamic_stiffness(output_dir: str) -> None: plt.close() +def generate_floating_floor_transmissibility(output_dir: str) -> None: + """The rig's peak, and what the installed floor does either side of f0.""" + print("Generating floating_floor_transmissibility...") + from phonometry import floating_floor_improvement_spectrum, materials + + # Left: the response the operator reads off the rig, and what over-driving + # does to it. Right: the ISO 12354-2 improvement law the installed floor + # obeys, against the ideal mass-spring transmissibility that explains the + # amplification the law truncates to zero below f0. + fig, (ax_l, ax_r) = plt.subplots(1, 2, figsize=(11.5, 5.8)) + + def sdof(freqs: np.ndarray, f_n: float, eta: float) -> np.ndarray: + r = freqs / f_n + return np.abs(1.0 / (1.0 - r ** 2 + 1j * eta * r)) + + rig = np.linspace(8.0, 70.0, 600) + ax_l.plot(rig, 20.0 * np.log10(sdof(rig, 25.0, 0.14)), + color=COLOR_PRIMARY, linewidth=2.0, zorder=3, + label="small excitation: fr = 25.0 Hz") + ax_l.plot(rig, 20.0 * np.log10(sdof(rig, 22.0, 0.22)), + color=COLOR_SECONDARY, linewidth=1.8, linestyle="--", zorder=3, + label="over-driven: peak lower and at 22 Hz") + ax_l.axvline(25.0, color=COLOR_MUTED, linestyle=":", linewidth=1.2, + zorder=1) + ax_l.annotate("this peak is the whole measurement\n" + "(Formula 4), extrapolated to F -> 0", + (28.0, 6.0), fontsize=9, color=COLOR_FG, ha="left", + va="top") + ax_l.set_xlim(rig[0], rig[-1]) + ax_l.set_xlabel(LABEL_FREQ_HZ) + ax_l.set_ylabel("Load-plate response [dB re static]") + ax_l.set_title("On the rig: reading fr", fontweight="bold", pad=12) + ax_l.legend(loc="upper right", fontsize=9) + ax_l.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_l.set_axisbelow(True) + + # The installed floor. The worked determination of the guide gives + # s' = 10.49 MN/m3 on a 120 kg/m2 screed; halving s' moves f0 by sqrt(2). + bands = np.array([50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, + 630, 800, 1000, 1250, 1600, 2000, 2500, 3150], float) + f0_hard = float(materials.natural_frequency(10.49e6, 120.0)) + f0_soft = float(materials.natural_frequency(5.0e6, 120.0)) + fine = np.logspace(np.log10(30.0), np.log10(3150.0), 600) + ax_r.axvspan(fine[0], np.sqrt(2.0) * f0_hard, + color=theme_fill(COLOR_SECONDARY, ax_r), zorder=0) + ax_r.semilogx(fine, -20.0 * np.log10(sdof(fine, f0_hard, 0.15)), + color=COLOR_MUTED, linewidth=1.5, linestyle=":", zorder=2, + label="ideal mass-spring isolation") + for f0, color, marker, label in ( + (f0_hard, COLOR_PRIMARY, "o", + f"s' = 10.5 MN/m3, f0 = {f0_hard:.0f} Hz"), + (f0_soft, COLOR_TERTIARY, "s", + f"s' = 5.0 MN/m3, f0 = {f0_soft:.0f} Hz"), + ): + law = floating_floor_improvement_spectrum(bands, resonance_frequency=f0) + ax_r.semilogx(bands, np.asarray(law.improvement), color=color, + marker=marker, markersize=4, linewidth=1.9, zorder=3, + label=label) + ax_r.axhline(0.0, color=COLOR_FG, linewidth=1.0, zorder=1) + ax_r.annotate(f"amplification below\nsqrt(2) f0 = {np.sqrt(2) * f0_hard:.0f} Hz", + (34.0, -14.0), fontsize=9, color=COLOR_FG, ha="left", + va="top") + ax_r.annotate("30 lg(f/f0): 30.8 dB\nagainst 35.6 dB at 500 Hz", + (560.0, 12.0), fontsize=9, color=COLOR_FG, ha="left", + va="top") + ax_r.set_ylim(-22.0, 60.0) + ax_r.set_xlabel(LABEL_FREQ_HZ) + ax_r.set_ylabel("Improvement of impact insulation [dB]") + ax_r.set_title("Installed: only well above f0", fontweight="bold", pad=12) + format_frequency_axis(ax_r, 30.0, 3150.0) + ax_r.legend(loc="upper left", fontsize=9) + ax_r.grid(axis="y", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_r.set_axisbelow(True) + fig.align_ylabels((ax_l, ax_r)) + plt.tight_layout() + save_figure(output_dir, "floating_floor_transmissibility.svg") + plt.close() + + +def generate_enclosed_gas_stiffness(output_dir: str) -> None: + """Below about 20 mm the pore air, not the frame, is the spring.""" + print("Generating enclosed_gas_stiffness...") + from phonometry import materials + + # The clause 8.2 sum against the loaded thickness d, with the frame term + # held at the worked determination's 4.94 MN/m3 and the enclosed-gas term + # from Formula (7). The right-hand axis turns the installed s' into the + # natural frequency of a 120 kg/m2 screed, which is what the reader wants. + d_mm = np.logspace(np.log10(5.0), np.log10(60.0), 300) + s_frame = np.full_like(d_mm, 4.935) + s_gas = np.array([float(materials.enclosed_gas_stiffness( + thickness=d * 1e-3, porosity=0.9)) / 1e6 for d in d_mm]) + s_total = s_frame + s_gas + + _fig, ax = plt.subplots(figsize=(10, 6.4)) + ax.loglog(d_mm, s_frame, color=COLOR_PRIMARY, linewidth=1.9, + linestyle="--", zorder=3, label="s't, frame (Formula 4)") + ax.loglog(d_mm, s_gas, color=COLOR_TERTIARY, linewidth=1.9, + linestyle="-.", zorder=3, + label="s'a, enclosed gas (Formula 7, eps = 0.9)") + ax.loglog(d_mm, s_total, color=COLOR_SECONDARY, linewidth=2.4, zorder=4, + label="s' installed = s't + s'a (clause 8.2)") + ax.scatter([20.0], [10.49], color=COLOR_FG, s=70, zorder=6) + ax.annotate("the worked determination:\nd = 20 mm, 4.94 + 5.56 = 10.49", + (21.0, 10.49), fontsize=9, color=COLOR_FG, ha="left", + va="center") + ax.set_xlabel("Loaded thickness d [mm]") + ax.set_ylabel("Dynamic stiffness per unit area [MN/m³]") + ax.set_title("The gas spring takes over as the layer gets thinner", + fontweight="bold", pad=12) + ax.set_xlim(d_mm[0], d_mm[-1]) + ax.set_ylim(1.0, 40.0) + from matplotlib.ticker import NullFormatter, ScalarFormatter + for axis in (ax.xaxis, ax.yaxis): + axis.set_major_formatter(ScalarFormatter()) + axis.set_minor_formatter(NullFormatter()) + ax.set_xticks([5, 10, 20, 40, 60]) + ax.set_yticks([1, 2, 5, 10, 20, 40]) + ax.legend(loc="upper right", fontsize=9) + ax.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + + # Right-hand axis: the same s' read as the natural frequency of a + # 120 kg/m2 floating screed, which is the number the design turns on. + ax_f = ax.twinx() + ax_f.set_yscale("log") + ax_f.set_ylim(float(materials.natural_frequency(1.0e6, 120.0)), + float(materials.natural_frequency(40.0e6, 120.0))) + ax_f.set_ylabel("f0 of a 120 kg/m² screed [Hz]") + ax_f.yaxis.set_major_formatter(ScalarFormatter()) + ax_f.yaxis.set_minor_formatter(NullFormatter()) + ax_f.set_yticks([15, 20, 30, 40, 60, 90]) + + ax.text(0.015, 0.05, + "clause 8.2: r >= 100 kPa.s/m2 -> s' = s't\n" + " 10 <= r < 100 -> s' = s't + s'a\n" + " r < 10 -> s' = s't only if s'a is " + "negligible", + transform=ax.transAxes, va="bottom", ha="left", fontsize=9, + color=COLOR_FG, family="monospace", + bbox={"boxstyle": "round,pad=0.5", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "enclosed_gas_stiffness.svg") + plt.close() + + def generate_absorption_uncertainty(output_dir: str) -> None: """ISO 12999-2 absorption-coefficient uncertainty: alpha_s with a +/-U ribbon.""" print("Generating absorption_uncertainty...") @@ -766,6 +918,180 @@ def generate_metadiffuser_geometry(output_dir: str) -> None: plt.close() +def generate_metadiffuser_absorption(output_dir: str) -> None: + """What a metadiffuser costs in absorption: per-well and face-averaged.""" + print("Generating metadiffuser_absorption...") + from phonometry import metadiffuser_reflection + + # The published five-slit panel over the band its resonators live in. Two + # of the five slits pass through critical coupling above the 2 kHz design + # frequency, so the panel is a near-lossless phase grating where it is + # tuned and a quarter-absorbing surface 300 Hz higher up. + wells, depth, period = _qr_metadiffuser_wells() + freqs = np.arange(1800.0, 2601.0, 5.0) + panel = metadiffuser_reflection(freqs, wells, depth=depth, period=period) + per_well = np.asarray(panel.well_absorption) + face = np.asarray(panel.absorption) + i_design = int(np.argmin(np.abs(freqs - 2000.0))) + + _fig, ax = plt.subplots(figsize=(10, 6.3)) + palette = (COLOR_PRIMARY, "#9467bd", "#8c564b", COLOR_TERTIARY, + "#e8a838") + for index, alpha in enumerate(per_well): + ax.plot(freqs, alpha, color=palette[index % len(palette)], + linewidth=1.5, zorder=3, label=f"slit {index + 1}") + ax.plot(freqs, face, color=COLOR_SECONDARY, linewidth=2.6, zorder=4, + label="face average (what a room model consumes)") + ax.axvline(2000.0, color=COLOR_FG, linestyle=":", linewidth=1.3, zorder=2) + ax.annotate( + f"design frequency:\nface average {face[i_design]:.3f}", + (2010.0, 0.45), fontsize=9, color=COLOR_FG, ha="left", va="top", + ) + ax.set_xlim(freqs[0], freqs[-1]) + ax.set_ylim(0.0, 1.05) + ax.set_xlabel(LABEL_FREQ_HZ) + ax.set_ylabel("Absorption coefficient") + ax.set_title("The absorption a metadiffuser pays for its phases", + fontweight="bold", pad=12) + ax.legend(loc="upper left", fontsize=9, ncol=2) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + plt.tight_layout() + save_figure(output_dir, "metadiffuser_absorption.svg") + plt.close() + + +def generate_metadiffuser_phase_match(output_dir: str) -> None: + """The whole trick, and its limit: matched phases, only at one frequency.""" + print("Generating metadiffuser_phase_match...") + from phonometry import metadiffuser_reflection, quadratic_residue_sequence + + # Left: the five reflection phases at the 2 kHz design frequency against + # the targets of the 27.4 cm deep N = 5 QRD, with |R_n| beside each point. + # Right: the same five phases swept across the band, where the rigid + # well's linear phase and the resonator-loaded slit's dispersive one part + # company either side of the crossing. + wells, depth, period = _qr_metadiffuser_wells() + sequence = np.roll(quadratic_residue_sequence(5), -1) + qrd_depths = np.asarray(sequence) * (343.0 / 500.0) / (2 * 5) + index = np.arange(1, 6) + + at_design = metadiffuser_reflection(np.array([2000.0]), wells, + depth=depth, period=period) + r_design = np.asarray(at_design.reflection)[:, 0] + k_design = 2.0 * np.pi * 2000.0 / 343.0 + target_design = np.degrees(np.angle(np.exp(-2j * k_design * qrd_depths))) + + freqs = np.linspace(1600.0, 2600.0, 201) + swept = metadiffuser_reflection(freqs, wells, depth=depth, period=period) + phases = np.degrees(np.angle(np.asarray(swept.reflection))) + k = 2.0 * np.pi * freqs / 343.0 + targets = np.degrees(np.angle(np.exp(-2j * np.outer(qrd_depths, k)))) + + fig, (ax_l, ax_r) = plt.subplots(1, 2, figsize=(11.5, 5.6)) + ax_l.plot(index, target_design, "o", markersize=11, color=COLOR_PRIMARY, + markerfacecolor="none", markeredgewidth=2.0, zorder=3, + label="QRD target, wells to 27.4 cm") + ax_l.plot(index, np.degrees(np.angle(r_design)), "s", markersize=7, + color=COLOR_SECONDARY, zorder=4, + label="Metadiffuser, panel 2 cm") + for i, r in zip(index, r_design): + ax_l.annotate(f"|R| = {abs(r):.2f}", + (i, np.degrees(np.angle(r)) - 12.0), fontsize=8.5, + color=COLOR_FG, ha="center", va="top") + ax_l.set_xticks(index) + ax_l.set_xlabel("Slit index n") + ax_l.set_ylabel("Reflection phase [deg]") + ax_l.set_ylim(-115.0, 115.0) + ax_l.set_title("At the 2 kHz design frequency", fontweight="bold", pad=12) + ax_l.legend(loc="lower right", fontsize=9) + ax_l.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_l.set_axisbelow(True) + + # Plotted as the wrapped phase *error* per slit rather than as ten + # curves: the rigid well's phase is linear in frequency and the loaded + # slit's is not, so what matters is how fast the difference between them + # grows away from the one frequency where it was driven to zero. + error = np.degrees(np.angle(np.exp(1j * np.radians(phases - targets)))) + ax_r.axhspan(-10.0, 10.0, color=theme_fill(COLOR_TERTIARY, ax_r), zorder=0) + palette = (COLOR_PRIMARY, "#9467bd", "#8c564b", COLOR_TERTIARY, "#e8a838") + for slit in range(error.shape[0]): + ax_r.plot(freqs, error[slit], color=palette[slit % len(palette)], + linewidth=1.5, zorder=3, label=f"slit {slit + 1}") + ax_r.axvline(2000.0, color=COLOR_FG, linestyle=":", linewidth=1.3, + zorder=1) + ax_r.annotate("within 10 deg of the target", (1615.0, 12.0), fontsize=8.5, + color=COLOR_FG, ha="left", va="bottom") + ax_r.set_xlim(freqs[0], freqs[-1]) + ax_r.set_ylim(-100.0, 100.0) + ax_r.set_xlabel(LABEL_FREQ_HZ) + ax_r.set_ylabel("Phase error against the QRD target [deg]") + ax_r.set_title("Across the band: exact only where it was tuned", + fontweight="bold", pad=12) + ax_r.legend(loc="lower left", fontsize=9, ncol=3) + ax_r.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_r.set_axisbelow(True) + fig.align_ylabels((ax_l, ax_r)) + plt.tight_layout() + save_figure(output_dir, "metadiffuser_phase_match.svg") + plt.close() + + +def generate_metadiffuser_spectrum(output_dir: str) -> None: + """Band by band: where the 2 cm panel and the 27 cm grating agree.""" + print("Generating metadiffuser_spectrum...") + from phonometry import ( + metadiffuser_diffusion_spectrum, + predicted_diffusion_spectrum, + quadratic_residue_sequence, + ) + + # Both panels are six periods of five 7 cm wells, a 2.1 m array, so the + # comparison is of the wells alone. Below c / L = 980 Hz the period is + # shorter than a wavelength, no grating lobe exists and neither panel can + # do better than the flat reference: the normalised coefficient of both + # collapses there for a reason that has nothing to do with the wells. + wells, depth, period = _qr_metadiffuser_wells() + sequence = np.roll(quadratic_residue_sequence(5), -1) + qrd_depths = np.asarray(sequence) * (343.0 / 500.0) / (2 * 5) + freqs = np.array([500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, + 4000, 5000], dtype=float) + meta = metadiffuser_diffusion_spectrum(freqs, wells, depth=depth, + period=period, periods=6) + qrd = predicted_diffusion_spectrum(period, freqs, depths=qrd_depths, + periods=6, include_obliquity=False) + f_lobe = 343.0 / (5 * period) + + _fig, ax = plt.subplots(figsize=(10, 6.3)) + ax.axvspan(freqs[0] * 0.92, f_lobe, color=theme_fill(COLOR_MUTED, ax), + zorder=0) + ax.semilogx(freqs, np.asarray(qrd.normalized), color=COLOR_PRIMARY, + marker="o", markersize=5, linewidth=1.8, linestyle="--", + zorder=3, label="QRD, wells up to 27.4 cm") + ax.semilogx(freqs, np.asarray(meta.normalized), color=COLOR_SECONDARY, + marker="s", markersize=5, linewidth=1.8, zorder=4, + label="Metadiffuser, panel 2 cm") + ax.axvline(2000.0, color=COLOR_FG, linestyle=":", linewidth=1.3, zorder=2) + ax.annotate("tuned here:\n0.32 against 0.32", (2080.0, 0.36), fontsize=9, + color=COLOR_FG, ha="left", va="top") + ax.annotate(f"below c/L = {f_lobe:.0f} Hz no grating\n" + f"lobe exists: neither panel can\nbeat the flat reference", + (freqs[0] * 0.97, 0.36), fontsize=9, color=COLOR_FG, + ha="left", va="top") + ax.set_ylim(0.0, 0.45) + ax.set_xlabel(LABEL_FREQ_HZ) + ax.set_ylabel("Normalised diffusion coefficient") + ax.set_title("The honest bandwidth of the trick", fontweight="bold", + pad=12) + format_frequency_axis(ax, freqs[0], freqs[-1]) + ax.legend(loc="upper right", fontsize=9) + ax.grid(axis="y", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + plt.tight_layout() + save_figure(output_dir, "metadiffuser_spectrum.svg") + plt.close() + + def generate_impedance_tube_geometry(output_dir: str) -> None: """To-scale side view of a 100 mm ISO 10534-2 impedance tube. @@ -881,16 +1207,18 @@ def generate_diffusion_goniometer_geometry(output_dir: str) -> None: def generate_scattering_coefficient(output_dir: str) -> None: - """ISO 17497-1: scattering coefficient s(f) from a per-band measurement.""" + """ISO 17497-1 Eq. (5): the alpha pair on top, the s(f) it produces below.""" print("Generating scattering_coefficient.png...") from phonometry import scattering_coefficient_spectrum # A realistic reverberation-room measurement reduced to two absorption # spectra over the 13 one-third-octave bands 250-4000 Hz: the random- - # incidence absorption alpha_s (stationary sample) and the specular + # incidence absorption alpha_s (static turntable) and the specular # absorption alpha_spec (rotating turntable). A diffuser scatters more with # frequency, so alpha_spec climbs above alpha_s and s(f) = (alpha_spec - - # alpha_s)/(1 - alpha_s) rises smoothly from near 0 towards 0.8. + # alpha_s)/(1 - alpha_s) rises smoothly from near 0 towards 0.8. The upper + # panel is Eq. (5) drawn as it is computed: the filled gap is the + # numerator, and the fixed alpha_s sets the 1 - alpha_s denominator. freqs = np.array( [250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000], dtype=float, @@ -899,12 +1227,30 @@ def generate_scattering_coefficient(output_dir: str) -> None: alpha_spec = 0.11 + 0.75 * (np.log10(freqs / 250.0) / np.log10(4000.0 / 250.0)) result = scattering_coefficient_spectrum(freqs, alpha_spec, alpha_s) - _fig, ax = plt.subplots(figsize=(10, 6.3)) - ax.semilogx(result.frequencies, result.scattering, color=COLOR_PRIMARY, + fig, (ax_a, ax) = plt.subplots( + 2, 1, figsize=(10, 8.2), sharex=True, + gridspec_kw={"height_ratios": [1.0, 1.15]}, + ) + ax_a.fill_between(freqs, alpha_s, alpha_spec, color=COLOR_TERTIARY, + alpha=theme_fill_alpha(COLOR_TERTIARY, ax_a), zorder=1, + label="alpha_spec - alpha_s (numerator of Eq. (5))") + ax_a.semilogx(freqs, alpha_spec, color=COLOR_SECONDARY, linewidth=1.9, + marker="s", markersize=5, zorder=3, + label="alpha_spec, rotating turntable (T3, T4)") + ax_a.semilogx(freqs, alpha_s, color=COLOR_PRIMARY, linewidth=1.9, + marker="o", markersize=5, zorder=3, + label="alpha_s, static turntable (T1, T2)") + ax_a.set_ylabel("Absorption coefficient") + ax_a.set_ylim(0.0, 1.0) + ax_a.set_title("Random-incidence scattering coefficient (ISO 17497-1)", + fontweight="bold", pad=12) + ax_a.legend(loc="upper left", fontsize=9) + ax_a.grid(which="major", color=COLOR_GRID, linestyle="-", alpha=0.5) + ax_a.set_axisbelow(True) + + ax.semilogx(result.frequencies, result.scattering, color=COLOR_FG, linewidth=1.9, marker="o", markersize=6, markerfacecolor="white", markeredgewidth=1.4, zorder=3) - ax.set_title("Random-incidence scattering coefficient (ISO 17497-1)", - fontweight="bold", pad=12) ax.set_xlabel(LABEL_FREQ_HZ) ax.set_ylabel("Scattering coefficient s") ax.set_xlim(freqs.min() * 0.9, freqs.max() * 1.1) @@ -915,11 +1261,301 @@ def generate_scattering_coefficient(output_dir: str) -> None: ax.set_xticks([250, 500, 1000, 2000, 4000]) ax.grid(which="major", color=COLOR_GRID, linestyle="-", alpha=0.5) ax.set_axisbelow(True) + ax.text(0.985, 0.06, "s = (alpha_spec - alpha_s) / (1 - alpha_s) Eq. (5)", + transform=ax.transAxes, va="bottom", ha="right", fontsize=11, + color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.5", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + fig.align_ylabels((ax_a, ax)) plt.tight_layout() save_figure(output_dir, "scattering_coefficient.png") plt.close() +def _goniometer_path_times( + half_width: float, receiver_angle: float, + source_distance: float = 10.0, receiver_distance: float = 5.0, + speed_of_sound: float = 343.0, +) -> tuple[float, float, float]: + """Direct, shortest and longest reflected arrival times of a goniometer. + + The window of ISO 17497-2 Clause 7.4.3 is sized from the shortest and the + longest sample-to-receiver path, and both follow from the geometry the + standard fixes: a source on the reference normal at ``source_distance``, + a receiver on an arc of ``receiver_distance``, and a flat sample of + half-width ``half_width`` at the origin. Returned in seconds. + """ + theta = np.radians(receiver_angle) + sx, sy = 0.0, source_distance + rx, ry = receiver_distance * np.sin(theta), receiver_distance * np.cos(theta) + x = np.linspace(-half_width, half_width, 2001) + paths = np.hypot(x - sx, sy) + np.hypot(x - rx, ry) + direct = float(np.hypot(rx - sx, ry - sy)) + return (direct / speed_of_sound, + float(paths.min()) / speed_of_sound, + float(paths.max()) / speed_of_sound) + + +def generate_diffusion_measurement_chain(output_dir: str) -> None: + """ISO 17497-2 Clause 7.4: h1, h2, their difference, h4 and the window.""" + print("Generating diffusion_measurement_chain...") + from phonometry import qrd_well_depths + + # The page's own published geometry read on the standard rig: the N = 7 + # QRD, 6 periods, 3.6 m wide, source at 10 m on the reference normal and + # the receiver on the 5 m arc at 60 deg, well outside the specular zone. + # Every arrival time below is that geometry divided by c (Clause 7.4.3 + # sizes the window from the shortest and the longest path), so the figure + # is the standard's own data-reduction chain and not a sketch of it. + c, fs, n = 343.0, 96000.0, 8192 + t = np.arange(n) / fs + t_direct, t_first, t_last = _goniometer_path_times(1.8, 60.0, + speed_of_sound=c) + t_room = t_last + 6.0e-3 # a wall reflection, in h1 and in h2 + + def _speaker(delay: float) -> np.ndarray: + """The loudspeaker-microphone response h3: a short 3 kHz burst.""" + env = np.exp(-(((t - delay) * 3000.0 / 2.2) ** 2)) + return env * np.cos(2.0 * np.pi * 3000.0 * (t - delay)) + + def _spike(delay: float, amp: float) -> np.ndarray: + out = np.zeros(n) + out[min(round(delay * fs), n - 1)] = amp + return out + + # The sample reflection is one arrival per well of the illuminated array, + # spread between the shortest and the longest path and delayed further by + # the round trip down each well of the quadratic-residue sequence, so the + # whole return still lands inside [t_first, t_last]. + depths = qrd_well_depths(7, 490.0, speed_of_sound=c) + seq = np.tile(depths, 6) + t_well = 2.0 * float(depths.max()) / c + delays = np.linspace(t_first, t_last - t_well, seq.size) + 2.0 * seq / c + ideal_sample = sum(_spike(d, 0.16 / (1.0 + 6.0 * s)) + for d, s in zip(delays, seq)) + ideal_room = _spike(t_room, 0.30) + ideal_direct = _spike(t_direct, 1.0) + + t_h3 = 2.0e-3 + h3 = _speaker(t_h3) + def _through(ideal: np.ndarray) -> np.ndarray: + return np.fft.irfft(np.fft.rfft(ideal) * np.fft.rfft(h3), n) + + h1 = _through(ideal_direct + ideal_sample + ideal_room) + h2 = _through(ideal_direct + ideal_room) + diff = h1 - h2 + # Formula (1): deconvolve the subtracted response by h3. Regularised, as + # any implementation must be. Dividing h3 out removes its own delay too, + # so every arrival of h4 sits t_h3 earlier than the same arrival of h1 -- + # the Clause 7.4.3 note, and the reason the window cannot be placed by + # reading panel (a). + spec3 = np.fft.rfft(h3) + h4 = np.fft.irfft(np.fft.rfft(diff) * np.conj(spec3) + / (np.abs(spec3) ** 2 + 1e-6 * np.max(np.abs(spec3) ** 2)), + n) + guard = 0.4e-3 + lo, hi = t_first - guard, t_last + guard + window = ((t >= lo) & (t <= hi)).astype(float) + + ms = t * 1e3 + # (a)-(c) share the measured scale; (d)-(e) share the deconvolved one, + # which is a different quantity in different units. + s_meas, s_dec = float(np.abs(h1).max()), float(np.abs(h4).max()) + panels = ( + (h1, "(a) h1: sample present", s_meas), + (h2, "(b) h2: sample removed", s_meas), + (diff, "(c) h1 - h2: the room is gone", s_meas), + (h4, "(d) h4: deconvolved by h3, Formula (1)", s_dec), + (h4 * window, "(e) windowed, Clause 7.4.3", s_dec), + ) + fig, axes = plt.subplots(5, 1, sharex=True, figsize=(10, 9.6)) + for ax, (y, label, scale) in zip(axes, panels): + ax.plot(ms, y, color=COLOR_PRIMARY, linewidth=1.1, zorder=3) + ax.set_ylabel(label, fontsize=9, rotation=0, ha="right", va="center", + labelpad=8) + ax.set_ylim(-1.15 * scale, 1.15 * scale) + ax.set_yticks([]) + ax.grid(axis="x", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + for ax in (axes[0], axes[1]): + ax.annotate("direct", ((t_direct + t_h3) * 1e3 - 1.4, 0.45 * s_meas), + fontsize=8, color=COLOR_FG, ha="right", va="bottom") + ax.annotate("room", ((t_room + t_h3) * 1e3 + 1.4, 0.34 * s_meas), + fontsize=8, color=COLOR_FG, ha="left", va="bottom") + axes[0].annotate("sample", ((0.5 * (t_first + t_last) + t_h3) * 1e3, + 0.34 * s_meas), + fontsize=8, color=COLOR_FG, ha="center", va="bottom") + axes[3].annotate( + f"h4 arrives {t_h3 * 1e3:.0f} ms earlier than h1:\n" + f"dividing by h3 removes its delay too", + (0.985, 0.10), xycoords="axes fraction", fontsize=8.5, + color=COLOR_FG, ha="right", va="bottom", + ) + win = axes[-1] + win.axvspan(lo * 1e3, hi * 1e3, color=COLOR_TERTIARY, + alpha=theme_fill_alpha(COLOR_TERTIARY, win), zorder=0) + for edge, text, ha in ((lo, f"shortest path\n{t_first * 1e3:.1f} ms", "right"), + (hi, f"longest path\n{t_last * 1e3:.1f} ms", "left")): + win.axvline(edge * 1e3, color=COLOR_SECONDARY, linewidth=1.4, + linestyle="--", zorder=4) + offset = -0.3 if ha == "right" else 0.3 + win.annotate(text, (edge * 1e3 + offset, -1.05 * s_dec), fontsize=8, + color=COLOR_FG, ha=ha, va="bottom") + win.set_xlabel("Time [ms]") + win.set_xlim(20.0, (t_room + t_h3 + 4.0e-3) * 1e3) + axes[0].set_title( + "From three impulse responses to one level (ISO 17497-2, Clause 7.4)", + fontweight="bold", pad=12, + ) + axes[1].text( + 0.30, 0.10, + f"source 10 m, arc 5 m, receiver 60 deg\n" + f"window {(hi - lo) * 1e3:.1f} ms -> analysis from about " + f"{1.0 / (hi - lo):.0f} Hz\nS/N >= 40 dB inside it on the flat reference", + transform=axes[1].transAxes, va="bottom", ha="center", fontsize=9, + color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.5", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}, + ) + fig.align_ylabels(axes) + plt.tight_layout() + save_figure(output_dir, "diffusion_measurement_chain.svg") + plt.close() + + +def generate_qrd_working_band(output_dir: str) -> None: + """The band a Schroeder design actually works over: f0, N f0 and c/(2w).""" + print("Generating qrd_working_band...") + from phonometry import predicted_diffusion_spectrum, qrd_well_depths + + # The N = 7, f0 = 500 Hz, 10 cm well, five-period design of the guide, + # evaluated on a fine linear grid instead of band centres so that the two + # design rules stated in prose are resolved: the panel collapses onto the + # flat reference at multiples of N f0 (3500 Hz), where every well reflects + # in phase again, and the single-plane-wave picture inside a well fails + # above f_max = c / (2 w) = 1715 Hz. + c, n_seq, f0, width, periods = 343.0, 7, 500.0, 0.10, 5 + freqs = np.linspace(200.0, 6000.0, 601) + depths = qrd_well_depths(n_seq, f0, speed_of_sound=c) + qrd = predicted_diffusion_spectrum(width, freqs, depths=depths, + periods=periods, speed_of_sound=c, + normalize=False) + flat = predicted_diffusion_spectrum(width, freqs, + depths=np.zeros_like(depths), + periods=periods, speed_of_sound=c, + normalize=False) + f_max = c / (2.0 * width) + + _fig, ax = plt.subplots(figsize=(10, 6.3)) + ax.axvspan(f_max, freqs[-1], color=theme_fill(COLOR_MUTED, ax), zorder=0) + ax.axvline(f0, color=COLOR_MUTED, linestyle=":", linewidth=1.3, zorder=1) + ax.axvline(f_max, color=COLOR_MUTED, linestyle="-", linewidth=1.3, + zorder=1) + ax.axvline(n_seq * f0, color=COLOR_SECONDARY, linestyle="--", + linewidth=1.6, zorder=2) + ax.plot(freqs, np.asarray(qrd.diffusion), color=COLOR_PRIMARY, + linewidth=1.7, zorder=4, label="N = 7 QRD, f0 = 500 Hz, 5 periods") + ax.plot(freqs, np.asarray(flat.diffusion), color=COLOR_MUTED, + linewidth=1.4, linestyle="--", zorder=3, + label="Flat panel, same footprint") + ax.annotate("N f0 = 3500 Hz: every well\nback in phase, flat again", + (n_seq * f0, 0.05), xytext=(n_seq * f0 - 500.0, 0.30), + fontsize=9, color=COLOR_FG, ha="right", + arrowprops={"arrowstyle": "->", "color": COLOR_SECONDARY}) + ax.annotate(f"f_max = c/(2w) = {f_max:.0f} Hz:\nthe well stops being\n" + f"a single-mode waveguide", + (f_max + 130.0, 0.40), fontsize=9, color=COLOR_FG, ha="left", + va="top") + ax.annotate("f0 = 500 Hz", (f0 + 90.0, 0.50), fontsize=9, color=COLOR_FG, + ha="left", va="top") + ax.set_xlim(freqs[0], freqs[-1]) + ax.set_ylim(0.0, 0.55) + ax.set_xlabel(LABEL_FREQ_HZ) + ax.set_ylabel("Predicted diffusion coefficient d") + ax.set_title("The working band of a Schroeder design", + fontweight="bold", pad=12) + ax.legend(loc="upper right", fontsize=9) + ax.grid(axis="y", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + plt.tight_layout() + save_figure(output_dir, "qrd_working_band.svg") + plt.close() + + +def generate_diffuser_modulation(output_dir: str) -> None: + """Periodicity concentrates, modulation spreads: same wells, same width.""" + print("Generating diffuser_modulation...") + from phonometry import ( + predict_diffuser_polar_response, + predicted_diffusion_spectrum, + qrd_well_depths, + ) + + # Two arrangements of the same 42 wells over the same 4.2 m footprint: + # six repeats of one N = 7 quadratic-residue period, and the same period + # alternated with its inverse (depth d_max - d_n), which is the cheapest + # modulation Cox & D'Antonio recommend. Nothing else differs, so every + # difference below is periodicity. + c, f0, width = 343.0, 500.0, 0.10 + base = qrd_well_depths(7, f0, speed_of_sound=c) + inverse = base.max() - base + periodic = np.tile(base, 6) + modulated = np.concatenate([base if k % 2 == 0 else inverse + for k in range(6)]) + angles = np.arange(-90.0, 90.5, 5.0) + freqs = np.array([250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000], + dtype=float) + + fig = plt.figure(figsize=(11.5, 5.8)) + polar: Any = fig.add_subplot(1, 2, 1, projection="polar") + theta = np.radians(angles) + for depths, color, style, label in ( + (periodic, COLOR_PRIMARY, "-", "Periodic, 6 x N = 7"), + (modulated, COLOR_SECONDARY, "--", "Modulated, period + inverse"), + ): + response = predict_diffuser_polar_response( + width, 1000.0, depths=depths, periods=1, angles=angles, + speed_of_sound=c, + ) + polar.plot(theta, np.asarray(response.levels), color=color, + linestyle=style, linewidth=1.8, zorder=3, + label=f"{label} (d = {response.coefficient:.2f})") + polar.set_theta_zero_location("N") + polar.set_theta_direction(-1) + polar.set_thetamin(-90) + polar.set_thetamax(90) + polar.set_title("Reflected polar response at 1 kHz", fontweight="bold", + pad=18) + polar.legend(loc="lower center", bbox_to_anchor=(0.5, -0.17), fontsize=9) + + ax = fig.add_subplot(1, 2, 2) + for depths, color, marker, label in ( + (periodic, COLOR_PRIMARY, "o", "Periodic, 6 x N = 7"), + (modulated, COLOR_SECONDARY, "s", "Modulated, period + inverse"), + ): + spectrum = predicted_diffusion_spectrum( + width, freqs, depths=depths, periods=1, angles=angles, + speed_of_sound=c, + ) + ax.semilogx(freqs, np.asarray(spectrum.normalized), color=color, + marker=marker, markersize=5, linewidth=1.8, zorder=3, + label=label) + ax.axvline(f0, color=COLOR_MUTED, linestyle=":", linewidth=1.2, zorder=1) + ax.annotate("f0: the one band the\nperiodic array wins", + (f0 * 1.06, 0.34), fontsize=9, color=COLOR_FG, ha="left") + ax.set_ylim(0.0, 0.45) + ax.set_xlabel(LABEL_FREQ_HZ) + ax.set_ylabel("Normalised diffusion coefficient") + ax.set_title("Band by band, same 4.2 m panel", fontweight="bold", pad=12) + format_frequency_axis(ax, freqs[0], freqs[-1]) + ax.legend(loc="upper left", fontsize=9) + ax.grid(axis="y", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + plt.tight_layout() + save_figure(output_dir, "diffuser_modulation.svg") + plt.close() + + def generate_diffusion_polar(output_dir: str) -> None: """ISO 17497-2: polar reflected response and its diffusion coefficient d.""" print("Generating diffusion_polar.png...") @@ -1054,6 +1690,213 @@ def generate_insitu_absorption(output_dir: str) -> None: plt.close() +def generate_adrienne_window(output_dir: str) -> None: + """ISO 13472-1: the two arrivals, the Adrienne gate and what it costs.""" + print("Generating adrienne_window...") + from phonometry import materials + + # The mandatory geometry: source at ds = 1.25 m, microphone at + # dm = 0.25 m on the same vertical, so the direct path is ds - dm = 1.0 m + # and the reflected one ds + dm = 1.5 m. The reflection therefore trails + # the direct sound by 2 dm / c = 1.47 ms, which is why the two overlap in + # any real impulse response and why the method is called subtraction. + c, fs, n = 340.0, 48000.0, 4096 + t = np.arange(n) / fs + t_direct, t_reflected = 1.0 / c, 1.5 / c + t_parasite = 15.8e-3 # mast, vehicle, operator: outside the gate + + # A band-limited click as the loudspeaker response, its FIR group delay + # removed so that every arrival lands at its own geometric time. + band = scipy_signal.firwin(129, [200.0, 6000.0], fs=fs, pass_zero=False) + lag = (band.size - 1) // 2 + + def arrival(delay: float, amp: float, + extra: np.ndarray | None = None) -> np.ndarray: + spike = np.zeros(n) + spike[round(delay * fs) - lag] = amp + out = scipy_signal.lfilter(band, 1.0, spike) + if extra is not None: + out = scipy_signal.lfilter(extra, 1.0, out) + out = np.roll(out, -(extra.size - 1) // 2) + return np.asarray(out) + + # A porous road reflects less as frequency rises, so the reflection is the + # incident pulse through a gentle low-pass as well as the band filter. + porous = scipy_signal.firwin(21, 2500.0, fs=fs) + porous = porous / porous.sum() + kr = float(materials.geometric_spreading_factor()) + h_free = arrival(t_direct, 1.0) + reflection = arrival(t_reflected, kr * 0.85, porous) + h_road = h_free + reflection + arrival(t_parasite, 0.18) + h_reflected = h_road - h_free # the subtraction technique + scale = float(np.abs(h_road).max()) + h_free, h_road, h_reflected = (h_free / scale, h_road / scale, + h_reflected / scale) + + window = np.asarray(materials.adrienne_window(fs)) + lead = 0.5e-3 + + def place(w: np.ndarray, start: float) -> np.ndarray: + out = np.zeros(n) + i = round(start * fs) + out[i:i + w.size] = w[: max(0, n - i)] + return out + + gate = place(window, t_reflected - lead) + gate_incident = place(window, t_direct - lead) + duration = window.size / fs + + fig, axes = plt.subplots(3, 1, figsize=(10, 9.6)) + ms = t * 1e3 + top, mid, bot = axes + + top.plot(ms, h_free, color=COLOR_PRIMARY, linewidth=1.3, zorder=3, + label="hi: free field, the rig clear of every surface") + top.plot(ms, gate_incident, color=COLOR_TERTIARY, linewidth=1.5, + linestyle="--", zorder=2, + label="the same window, on the direct sound") + top.set_ylabel("Free field") + top.legend(loc="upper right", fontsize=9) + + mid.plot(ms, h_road, color=COLOR_MUTED, linewidth=1.2, zorder=2, + label="measured over the road: the two arrivals overlap") + mid.plot(ms, h_reflected, color=COLOR_SECONDARY, linewidth=1.5, zorder=4, + label="hr = road - free field, the surface alone") + mid.plot(ms, gate, color=COLOR_TERTIARY, linewidth=1.6, zorder=3, + label=f"Adrienne window: 0.5 + 5 + 5 ms = {duration * 1e3:.1f} ms") + mid.annotate("", xy=(t_direct * 1e3, -0.60), + xytext=(t_reflected * 1e3, -0.60), + arrowprops={"arrowstyle": "<->", "color": COLOR_FG}) + mid.annotate(f"2 dm / c = {(t_reflected - t_direct) * 1e3:.2f} ms", + (0.5 * (t_direct + t_reflected) * 1e3, -0.66), fontsize=9, + color=COLOR_FG, ha="center", va="top") + mid.annotate("parasitic arrival, just outside\nthe gate: lengthen the window\n" + "and it comes in with the road", + (t_parasite * 1e3 - 0.5, -0.95), fontsize=9, color=COLOR_FG, + ha="right", va="bottom") + mid.set_ylabel("Over the road") + mid.set_xlabel("Time [ms]") + mid.legend(loc="upper right", fontsize=9) + + for ax in (top, mid): + ax.set_xlim(0.0, 18.0) + ax.set_ylim(-1.05, 1.05) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + + def spectrum(x: np.ndarray) -> tuple[np.ndarray, np.ndarray]: + freqs = np.fft.rfftfreq(n, 1.0 / fs) + return freqs, 20.0 * np.log10(np.abs(np.fft.rfft(x)) + 1e-12) + + f_i, mag_i = spectrum(h_free * gate_incident) + _, mag_r = spectrum(h_reflected * gate) + peak = float(mag_i.max()) + mag_i, mag_r = mag_i - peak, mag_r - peak + keep = (f_i >= 100.0) & (f_i <= 5000.0) + bot.semilogx(f_i[keep], mag_i[keep], color=COLOR_PRIMARY, linewidth=1.6, + zorder=3, label="|Hi|, the windowed free-field reference") + bot.semilogx(f_i[keep], mag_r[keep], color=COLOR_SECONDARY, linewidth=1.6, + zorder=3, label="|Hr|, the windowed surface reflection") + bot.axvspan(100.0, 250.0, color=theme_fill(COLOR_MUTED, bot), zorder=0) + bot.axvline(1.0 / duration, color=COLOR_FG, linestyle=":", linewidth=1.3, + zorder=2) + bot.annotate(f"1/T = {1.0 / duration:.0f} Hz:\nthe window's own\n" + f"low-frequency limit", + (1.0 / duration + 6.0, -26.0), fontsize=9, color=COLOR_FG, + ha="left", va="bottom") + bot.annotate("below the reported 250 Hz", (104.0, -43.0), fontsize=9, + color=COLOR_FG, ha="left", va="bottom") + bot.set_ylim(-46.0, 4.0) + bot.set_ylabel("Level [dB re max]") + bot.set_xlabel(LABEL_FREQ_HZ) + format_frequency_axis(bot, 100.0, 5000.0) + bot.legend(loc="lower right", fontsize=9) + bot.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + bot.set_axisbelow(True) + + top.set_title("The one free parameter of ISO 13472-1", fontweight="bold", + pad=12) + fig.align_ylabels(axes) + plt.tight_layout() + save_figure(output_dir, "adrienne_window.svg") + plt.close() + + +def generate_insitu_method_windows(output_dir: str) -> None: + """Subtraction or spot: the two reported bands, and what sets the ceiling.""" + print("Generating insitu_method_windows...") + from phonometry import materials + + c0 = 343.0 + _fig, (ax_b, ax_d) = plt.subplots( + 2, 1, figsize=(10, 7.2), gridspec_kw={"height_ratios": [1.0, 1.5]}, + ) + + # Top: the two reported one-third-octave ranges on a common log axis, with + # the interval where Part 2's introduction expects the two to agree. + bars = ( + ("ISO 13472-1, subtraction", 250.0, 4000.0, COLOR_PRIMARY, 1.0), + ("ISO 13472-2, spot tube", 250.0, 1600.0, COLOR_SECONDARY, 0.0), + ) + for label, lo, hi, color, y in bars: + ax_b.barh(y, hi - lo, left=lo, height=0.52, color=color, + edgecolor=COLOR_FG, linewidth=0.8, zorder=3) + ax_b.text(np.sqrt(lo * hi), y, label, ha="center", va="center", + color="white", fontsize=10, zorder=4) + ax_b.axvspan(315.0, 1600.0, color=theme_fill(COLOR_TERTIARY, ax_b), + zorder=0) + ax_b.annotate("315-1600 Hz: the interval in which\n" + "Part 2 expects the two to agree", + (330.0, 1.55), fontsize=9, color=COLOR_FG, ha="left", + va="top") + ax_b.set_xscale("log") + ax_b.set_xlim(200.0, 5000.0) + ax_b.set_ylim(-0.6, 1.8) + ax_b.set_yticks([]) + ax_b.set_title("Two in-situ methods, two reported bands", + fontweight="bold", pad=12) + format_frequency_axis(ax_b, 200.0, 5000.0) + ax_b.grid(axis="x", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_b.set_axisbelow(True) + + # Bottom: why the spot tube stops where it does. The plane-wave ceiling + # f_u = 0.58 c0 / d falls as the bore grows, and the bore has to be big + # enough to seal on a textured pavement. + diameters = np.linspace(0.055, 0.155, 300) + ceiling = np.array([float(materials.spot_tube_upper_frequency(d, c0)) + for d in diameters]) + ax_d.plot(diameters * 1e3, ceiling, color=COLOR_SECONDARY, linewidth=2.2, + zorder=4, label="f_u = 0.58 c0 / d (Clause 5.4)") + ax_d.axhline(1800.0, color=COLOR_FG, linestyle="--", linewidth=1.3, + zorder=3) + ax_d.axhspan(ceiling.min(), 1800.0, color=theme_fill(COLOR_MUTED, ax_d), + zorder=0) + d_max = 0.58 * c0 / 1800.0 + ax_d.axvline(d_max * 1e3, color=COLOR_TERTIARY, linestyle=":", + linewidth=1.6, zorder=3) + ax_d.scatter([100.0], [float(materials.spot_tube_upper_frequency(0.1, c0))], + color=COLOR_FG, s=70, zorder=6) + ax_d.annotate("the 100 mm bore of the worked\nexample: 1989 Hz", + (102.0, 1989.4), fontsize=9, color=COLOR_FG, ha="left", + va="bottom") + ax_d.annotate(f"1800 Hz, the top edge of the 1600 Hz band:\n" + f"a bore above {d_max * 1e3:.0f} mm no longer covers it", + (56.0, 1740.0), fontsize=9, color=COLOR_FG, ha="left", + va="top") + ax_d.set_xlim(55.0, 155.0) + ax_d.set_ylim(1100.0, 3600.0) + ax_d.set_xlabel("Tube diameter d [mm]") + ax_d.set_ylabel("Plane-wave ceiling [Hz]") + ax_d.set_title("The bore that seals is the bore that caps the band", + fontweight="bold", pad=12) + ax_d.legend(loc="upper right", fontsize=9) + ax_d.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_d.set_axisbelow(True) + plt.tight_layout() + save_figure(output_dir, "insitu_method_windows.svg") + plt.close() + + def generate_sound_absorption_measurement(output_dir: str) -> None: """ISO 354: reverberation-room alpha_s spectrum from the two decay times.""" print("Generating sound_absorption_measurement...") @@ -1189,3 +2032,776 @@ def generate_diffuse_field_absorption(output_dir: str) -> None: plt.tight_layout() save_figure(output_dir, "diffuse_field_absorption.svg") plt.close() + + +def generate_sound_absorption_inversion(output_dir: str) -> None: + """ISO 354 inversion: the two decay times and the two Sabine areas behind alpha_s.""" + print("Generating sound_absorption_inversion...") + from phonometry import materials + + # The absorption-measurement guide's own example: a 10.8 m^2 specimen in a + # 200 m^3 room at 20 degC. Everything drawn is a field of the result. + freqs = np.array([100, 125, 160, 200, 250, 315, 400, 500, 630, 800, + 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000], float) + t_empty = np.array([9.0, 9.0, 8.8, 8.6, 8.4, 8.2, 8.0, 7.8, 7.5, 7.2, + 6.9, 6.6, 6.2, 5.8, 5.4, 5.0, 4.6, 4.2]) + t_specimen = np.array([8.4, 8.2, 7.7, 7.2, 6.5, 5.7, 4.9, 4.2, 3.6, 3.15, + 2.85, 2.65, 2.55, 2.5, 2.55, 2.6, 2.7, 2.85]) + area = 10.8 + meas = materials.measure_sound_absorption( + freqs, t_empty, t_specimen, volume=200.0, area=area, temperature=20.0 + ) + + band = np.arange(freqs.size) + _fig, (ax_t, ax_a) = plt.subplots(2, 1, sharex=True, figsize=(10, 7.6)) + + ax_t.plot(band, meas.t_empty, "o-", color=COLOR_PRIMARY, linewidth=2.0, + markersize=5, label=r"$T_1$ empty room") + ax_t.plot(band, meas.t_specimen, "s-", color=COLOR_SECONDARY, linewidth=2.0, + markersize=5, label=r"$T_2$ specimen installed") + ax_t.fill_between(band, meas.t_specimen, meas.t_empty, + color=theme_fill(COLOR_SECONDARY, ax_t), zorder=0) + ax_t.set_ylabel("Reverberation time [s]") + ax_t.set_title("ISO 354: What the Sabine Inversion Consumes", + fontweight="bold", pad=12) + ax_t.set_ylim(bottom=0.0) + ax_t.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_t.set_axisbelow(True) + ax_t.legend(loc="lower left", fontsize=10) + ax_t.annotate("the two decays nearly coincide:\n0.6 s out of 9 s", + xy=(0.0, 8.7), xytext=(1.2, 5.4), fontsize=9.5, + color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0, "color": COLOR_FG}) + + a_1 = meas.absorption_area_empty + a_2 = meas.absorption_area_with_specimen + ax_a.plot(band, a_1, "o-", color=COLOR_PRIMARY, linewidth=2.0, markersize=5, + label=r"$A_1$ empty room") + ax_a.plot(band, a_2, "s-", color=COLOR_SECONDARY, linewidth=2.0, markersize=5, + label=r"$A_2$ with specimen") + ax_a.fill_between(band, a_1, a_2, color=theme_fill(COLOR_TERTIARY, ax_a), + zorder=0, label=r"$A_2 - A_1$ the specimen") + ax_a.set_ylabel(r"Equivalent absorption area [m$^2$]") + ax_a.set_xlabel(LABEL_FREQ_HZ) + ax_a.set_ylim(bottom=0.0) + ax_a.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_a.set_axisbelow(True) + ax_a.legend(loc="upper left", fontsize=10) + + # One band read explicitly, so the right-hand axis has a worked example: + # the HEIGHT of the filled band, not the level of a curve, is alpha_s. + peak = int(np.argmax(meas.alpha_s)) + ax_a.annotate("", xy=(band[peak], a_2[peak]), xytext=(band[peak], a_1[peak]), + arrowprops={"arrowstyle": "<->", "lw": 1.4, "color": COLOR_FG}) + ax_a.annotate( + f"{a_2[peak] - a_1[peak]:.1f} m$^2$ / 10.8 m$^2$ = {meas.alpha_s[peak]:.2f}", + xy=(band[peak], 0.5 * (a_1[peak] + a_2[peak])), + xytext=(band[peak] - 6.4, 10.6), fontsize=9.5, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0, "color": COLOR_FG}) + + # Right-hand axis: the same filled difference read as alpha_s = (A2-A1)/S. + ax_alpha = ax_a.twinx() + ax_alpha.set_ylim(ax_a.get_ylim()[0] / area, ax_a.get_ylim()[1] / area) + ax_alpha.set_ylabel(r"Band height as $\alpha_s = (A_2 - A_1)/S$", + color=COLOR_TERTIARY) + ax_alpha.tick_params(axis="y", colors=COLOR_TERTIARY) + + ax_a.set_xticks(band) + ax_a.set_xticklabels([f"{f:g}" if f < 1000 else f"{f / 1000:g}k" + for f in freqs], rotation=45) + plt.tight_layout() + save_figure(output_dir, "sound_absorption_inversion.svg") + plt.close() + + +def generate_effective_kappa(output_dir: str) -> None: + """ISO 9053-2 Annex A: kappa' over the 1-4 Hz piston band for three cavities.""" + print("Generating effective_kappa...") + from phonometry import materials + + # The Annex A.3 cavity is a closed 100 mm x 100 mm cylinder: + # V = 7.854e-4 m^3, S = 0.0471 m^2, so S/V = 60 1/m exactly. The two other + # curves scale that ratio by a factor of two either way at the same volume. + volume = 7.854e-4 + kappa_adiabatic = 1.4008 + freq = np.linspace(1.0, 4.0, 160) + + _fig, ax = plt.subplots(figsize=(10, 6.2)) + for s_over_v, color in ((30.0, COLOR_TERTIARY), (60.0, COLOR_PRIMARY), + (120.0, COLOR_SECONDARY)): + kappa = np.array([ + materials.effective_kappa(cavity_surface=s_over_v * volume, + cavity_volume=volume, frequency=float(f)) + for f in freq + ]) + ax.plot(freq, kappa, color=color, linewidth=2.2, + label=f"S/V = {s_over_v:g} 1/m") + ax.axhline(kappa_adiabatic, color=COLOR_FG, linestyle="--", linewidth=1.4, + alpha=0.7) + ax.text(3.92, kappa_adiabatic - 0.0035, r"adiabatic $\kappa$ = 1.4008", + fontsize=10, color=COLOR_FG, ha="right", va="top") + + kappa_a3 = materials.effective_kappa(cavity_surface=0.0471, + cavity_volume=volume, frequency=2.0) + ax.scatter([2.0], [kappa_a3], color=COLOR_FG, s=80, zorder=6, + label=f"Annex A.3 example (2 Hz, {kappa_a3:.3f})") + + ax.set_xlabel("Piston frequency f [Hz] (ISO 9053-2 Clause 6.2: 1 Hz to 4 Hz)") + ax.set_ylabel(r"Effective ratio of specific heats $\kappa'$") + ax.set_title("ISO 9053-2 Annex A Heat-Conduction Correction", + fontweight="bold", pad=12) + ax.set_xlim(1.0, 4.0) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + ax.legend(loc="lower right", fontsize=10) + + # Right axis: R is proportional to kappa' in Formula (2), so the shortfall + # against the adiabatic value is the bias skipping the correction causes. + # 1 - kappa'/kappa is linear in kappa', so it maps onto a twin axis exactly. + ax_err = ax.twinx() + lo, hi = ax.get_ylim() + ax_err.set_ylim(100.0 * (1.0 - lo / kappa_adiabatic), + 100.0 * (1.0 - hi / kappa_adiabatic)) + ax_err.set_ylabel("Bias in R if the adiabatic value is used [%]") + plt.tight_layout() + save_figure(output_dir, "effective_kappa.svg") + plt.close() + + +def generate_flow_resistivity_window(output_dir: str) -> None: + """The sigma*d design window: five 50 mm layers, and alpha against sigma d / rho0 c0.""" + print("Generating flow_resistivity_window...") + from phonometry import materials + + thickness = 0.05 + rho_c = 1.205 * 343.0 + _fig, (ax_f, ax_w) = plt.subplots(1, 2, figsize=(12.4, 5.8)) + + # Left: five resistivities spanning the window and both sides of it. + freq = np.geomspace(100.0, 5000.0, 240) + # The two out-of-window extremes are drawn broken, the three inside solid. + family = ((2e3, COLOR_MUTED, (0, (6, 3)), "too transparent"), + (8e3, COLOR_TERTIARY, "-", "window"), + (20e3, COLOR_PRIMARY, "-", "window"), + (33e3, COLOR_SECONDARY, "-", "window"), + (100e3, COLOR_FG, (0, (1, 2)), "too reflecting")) + for sigma, color, style, tag in family: + layer = materials.layered_absorber( + freq, [materials.PorousLayer(thickness, materials.miki(freq, sigma))] + ) + ax_f.semilogx(freq, layer.absorption, color=color, linewidth=2.0, + linestyle=style, + label=f"{sigma / 1e3:g} kPa s/m$^2$ ({tag})") + format_frequency_axis(ax_f, 100.0, 5000.0) + ax_f.set_xlabel(LABEL_FREQ_HZ) + ax_f.set_ylabel(r"Normal-incidence absorption $\alpha$") + ax_f.set_title("50 mm hard-backed layer", fontweight="bold", pad=10) + ax_f.set_ylim(0.0, 1.0) + ax_f.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_f.set_axisbelow(True) + ax_f.legend(loc="upper left", fontsize=9) + + # Right: the same family against the dimensionless total flow resistance. + sigmas = np.geomspace(1e3, 3e5, 90) + ratio = sigmas * thickness / rho_c + for band, color, marker in ((500.0, COLOR_SECONDARY, "o"), + (1000.0, COLOR_PRIMARY, "s")): + alpha = np.array([ + float(materials.layered_absorber( + np.array([band]), + [materials.PorousLayer(thickness, materials.miki(np.array([band]), s))], + ).absorption[0]) for s in sigmas + ]) + ax_w.semilogx(ratio, alpha, color=color, linewidth=2.0, marker=marker, + markevery=12, markersize=5, + label=rf"$\alpha(0°)$ at {band:.0f} Hz") + alpha_dif = np.array([ + float(materials.diffuse_field_absorption( + np.array([1000.0]), + [materials.PorousLayer(thickness, materials.miki(np.array([1000.0]), s))], + ).absorption[0]) for s in sigmas + ]) + ax_w.semilogx(ratio, alpha_dif, color=COLOR_TERTIARY, linewidth=2.0, + linestyle="--", label=r"$\alpha_{dif}$ at 1 kHz") + ax_w.axvspan(1.0, 4.0, color=theme_fill(COLOR_PRIMARY, ax_w), linewidth=0, + zorder=0) + ax_w.text(2.0, 0.06, r"$\rho_0 c_0 \leq \sigma d \leq 4\rho_0 c_0$", + fontsize=10, ha="center", color=COLOR_FG) + ax_w.set_xlabel(r"$\sigma\,d\,/\,(\rho_0 c_0)$") + ax_w.set_ylabel(r"Absorption coefficient") + ax_w.set_title("The design window", fontweight="bold", pad=10) + ax_w.set_ylim(0.0, 1.0) + ax_w.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_w.set_axisbelow(True) + ax_w.legend(loc="lower right", fontsize=9) + plt.tight_layout() + save_figure(output_dir, "flow_resistivity_window.svg") + plt.close() + + +def generate_tube_working_ranges(output_dir: str) -> None: + """Which impedance-tube geometry covers which one-third-octave bands.""" + print("Generating tube_working_ranges...") + from phonometry import materials + + c0 = 343.2 + # Four geometries: the two spacings of a 100 mm bore, a 29 mm small tube, + # and the same 100 mm bore read under the ASTM E2611 constants. + rows = ( + ("100 mm bore, s = 100 mm", 0.100, 0.100, False, COLOR_PRIMARY), + ("100 mm bore, s = 50 mm", 0.050, 0.100, False, COLOR_SECONDARY), + ("29 mm bore, s = 20 mm", 0.020, 0.029, False, COLOR_TERTIARY), + ("100 mm bore, s = 100 mm (ASTM E2611)", 0.100, 0.100, True, COLOR_MUTED), + ) + + _fig, ax = plt.subplots(figsize=(11, 5.6)) + for i, (label, spacing, diameter, astm, color) in enumerate(rows): + band = (materials.plane_wave_frequency_range_astm if astm + else materials.plane_wave_frequency_range) + f_l, f_u = band(spacing, c0, diameter=diameter) + y = len(rows) - 1 - i + ax.plot([f_l, f_u], [y, y], color=color, linewidth=13, solid_capstyle="butt", + alpha=0.85) + ax.text(f_l * 0.94, y, f"{f_l:.0f}", ha="right", va="center", fontsize=9, + color=COLOR_FG) + ax.text(f_u * 1.06, y, f"{f_u:.0f} Hz", ha="left", va="center", fontsize=9, + color=COLOR_FG) + # Which constraint binds the top end: cut-on or the spacing singularity. + cut_on = (0.586 if astm else 0.58) * c0 / diameter + binding = "cut-on 0.58 c/d" if abs(f_u - cut_on) < 1.0 else \ + ("spacing 0.40 c/s" if astm else "spacing 0.45 c/s") + ax.text(np.sqrt(f_l * f_u), y + 0.30, f"{label} · top end: {binding}", + ha="center", va="bottom", fontsize=10, color=COLOR_FG) + + # The splice band the large and the small tube share. + big = materials.plane_wave_frequency_range(0.100, c0, diameter=0.100) + small = materials.plane_wave_frequency_range(0.020, c0, diameter=0.029) + ax.axvspan(small[0], big[1], color=theme_fill(COLOR_TERTIARY, ax), zorder=0) + ax.text(np.sqrt(small[0] * big[1]), -0.75, "splice band\n(the two tubes must agree)", + ha="center", va="center", fontsize=9.5, color=COLOR_FG) + + ax.set_xscale("log") + ax.set_xlim(25.0, 11000.0) + ax.set_ylim(-1.2, len(rows) - 0.35) + ax.set_yticks([]) + format_frequency_axis(ax, 25.0, 11000.0) + ax.set_xlabel(LABEL_FREQ_HZ) + ax.set_title("Plane-Wave Working Range of an Impedance Tube", + fontweight="bold", pad=12) + ax.grid(which="both", axis="x", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + plt.tight_layout() + save_figure(output_dir, "tube_working_ranges.svg") + plt.close() + + +def generate_standing_wave_envelope(output_dir: str) -> None: + """ISO 10534-1: the interior level the probe carriage traverses.""" + print("Generating standing_wave_envelope...") + from phonometry import materials + + c0, freq, diameter = 343.2, 500.0, 0.10 + k = 2.0 * np.pi * freq / c0 + x = np.linspace(0.0, 1.0, 2400) + + def level(magnitude: Any, phi: float) -> Any: + """Envelope in decibels, which is what the analyser shows.""" + env2 = 1.0 + magnitude**2 + 2.0 * magnitude * np.cos(2 * k * x - phi) + return 10.0 * np.log10(np.maximum(env2, 1e-6)) + + _fig, ax = plt.subplots(figsize=(10.5, 6.2)) + for magnitude, phi, color, label in ( + (1.0, -np.pi, COLOR_FG, r"rigid wall |r| = 1 ($\Delta L \to \infty$)"), + (0.5, np.radians(-54.1), COLOR_PRIMARY, + r"the worked sample |r| = 0.5 ($\Delta L$ = 9.54 dB)"), + (0.1, 0.0, COLOR_TERTIARY, r"near-anechoic |r| = 0.1 ($\Delta L$ = 1.74 dB)"), + ): + ax.plot(x, level(magnitude, phi), color=color, linewidth=2.0, label=label) + + # The same |r| = 0.5 sample with the Eq. (A.18) tube attenuation: the + # reflected wave has travelled 2x further, so the far notches fill in. + atten = float(materials.tube_attenuation_constant(freq, c0, diameter)) + r_eff = 0.5 * np.exp(-2.0 * atten * x) + lossy = 10.0 * np.log10( + 1.0 + r_eff**2 + 2.0 * r_eff * np.cos(2 * k * x + np.radians(54.1)) + ) + ax.plot(x, lossy, color=COLOR_SECONDARY, linewidth=1.8, linestyle=":", + label=f"the same, with tube loss (k\u2080'' = {atten:.3f} Np/m)") + + # How far the far minima have filled in, in decibels. + minima = [float(lossy[np.argmin(np.abs(x - xm))]) + for xm in (0.12, 0.463, 0.806)] + ax.annotate( + f"minima at 12, 46 and 81 cm: {minima[0]:.2f}, {minima[1]:.2f}, " + f"{minima[2]:.2f} dB\n(read the nearest one, and extrapolate to x = 0)", + xy=(0.806, minima[2]), xytext=(0.27, -14.6), fontsize=9.5, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0, "color": COLOR_FG}) + + # x_min,1 of the worked sample, and the quarter-wavelength ruler. + x_min1 = 0.12 + ax.axvline(x_min1, color=COLOR_GRID, linestyle="--", linewidth=1.2) + ax.annotate(r"$x_{\min,1}$ = 12 cm", xy=(x_min1, -6.0), xytext=(0.16, -11.0), + fontsize=10, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0, "color": COLOR_FG}) + quarter = 0.25 * c0 / freq + ax.annotate("", xy=(0.0, 7.2), xytext=(quarter, 7.2), + arrowprops={"arrowstyle": "<->", "lw": 1.2, "color": COLOR_FG}) + ax.text(quarter / 2, 7.6, r"$\lambda/4$ = 17.2 cm", ha="center", fontsize=9.5, + color=COLOR_FG) + ax.text(0.005, -19.4, "specimen face x = 0", ha="left", fontsize=9.5, + color=COLOR_FG) + + ax.set_xlabel("Distance from the specimen face x [m] (towards the source)") + ax.set_ylabel(r"Envelope level $20\log_{10}(|p(x)|/A)$ [dB]") + ax.set_title("What the Probe Carriage Traverses (500 Hz, 100 mm tube)", + fontweight="bold", pad=12) + ax.set_xlim(0.0, 1.0) + ax.set_ylim(-20.0, 15.0) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + ax.legend(loc="upper center", fontsize=9.5, ncol=2) + plt.tight_layout() + save_figure(output_dir, "standing_wave_envelope.svg") + plt.close() + + +def generate_porous_model_comparison(output_dir: str) -> None: + """Delany-Bazley, Miki and JCA: agreement inside the fit window, and outside.""" + print("Generating porous_model_comparison...") + from phonometry import materials + + sigma = 20000.0 + freq = np.geomspace(20.0, 20000.0, 400) + media = ( + ("Delany-Bazley", materials.delany_bazley(freq, sigma), COLOR_SECONDARY, "-"), + ("Miki", materials.miki(freq, sigma), COLOR_PRIMARY, "--"), + ("JCA", materials.johnson_champoux_allard( + freq, sigma, porosity=0.98, tortuosity=1.0, + viscous_length=8.7e-5, thermal_length=8.7e-5), COLOR_TERTIARY, ":"), + ) + + _fig, (ax_z, ax_s) = plt.subplots(1, 2, figsize=(12.4, 5.8)) + for label, medium, color, style in media: + z = medium.normalized_impedance + ax_z.loglog(freq, z.real, color=color, linestyle=style, linewidth=2.0, + label=f"{label}, Re") + ax_z.loglog(freq, -z.imag, color=color, linestyle=style, linewidth=1.2, + alpha=0.55, label=f"{label}, -Im") + # The Delany-Bazley fit window in its own variable, X = rho0 f / sigma. + x_lo, x_hi = 0.01 * sigma / 1.205, 1.0 * sigma / 1.205 + ax_z.axvspan(x_lo, x_hi, color=theme_fill(COLOR_PRIMARY, ax_z), zorder=0) + ax_z.text(np.sqrt(x_lo * x_hi), 0.6, "0.01 < X < 1", ha="center", fontsize=10, + color=COLOR_FG) + format_frequency_axis(ax_z, 20.0, 20000.0) + ax_z.set_xlabel(LABEL_FREQ_HZ) + ax_z.set_ylabel(r"$Z_c/(\rho_0 c_0)$") + ax_z.set_title(r"Characteristic impedance, $\sigma$ = 20 kPa s/m$^2$", + fontweight="bold", pad=10) + ax_z.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_z.set_axisbelow(True) + ax_z.legend(loc="upper right", fontsize=8.5, ncol=2) + + # Right: the input impedance of a 50 mm hard-backed layer, where the + # extrapolation failure the guide warns about actually shows. + for label, medium, color, style in media: + zs = materials.layered_absorber( + freq, [materials.PorousLayer(0.05, medium)]).normalized_impedance + ax_s.semilogx(freq, zs.real, color=color, linestyle=style, linewidth=2.0, + label=label) + ax_s.axhline(0.0, color=COLOR_FG, linewidth=1.2) + ax_s.axvspan(20.0, 74.6, color=theme_fill(COLOR_SECONDARY, ax_s), zorder=0) + ax_s.annotate("Delany-Bazley returns a NEGATIVE resistance\n" + "below 74.6 Hz: a passive layer generating energy", + xy=(40.0, -3.0), xytext=(150.0, -5.4), fontsize=9.5, + color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0, "color": COLOR_FG}) + format_frequency_axis(ax_s, 20.0, 20000.0) + ax_s.set_xlabel(LABEL_FREQ_HZ) + ax_s.set_ylabel(r"Re$(Z_s)/(\rho_0 c_0)$, 50 mm hard-backed layer") + ax_s.set_title("Where the extrapolation fails", fontweight="bold", pad=10) + ax_s.set_ylim(-8.0, 8.0) + ax_s.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_s.set_axisbelow(True) + ax_s.legend(loc="upper right", fontsize=9) + plt.tight_layout() + save_figure(output_dir, "porous_model_comparison.svg") + plt.close() + + +def generate_biot_waves(output_dir: str) -> None: + """The three Biot wavenumbers, and the ratios that name two of them.""" + print("Generating biot_waves...") + from phonometry import materials + + # Allard & Atalla Table 6.1 glass wool, the same input set as the + # frame-resonance figure on the same page. + freq = np.linspace(50.0, 1500.0, 1451) + shear = 2.2e6 * (1 + 0.1j) + medium = materials.johnson_champoux_allard( + freq, 40e3, porosity=0.94, tortuosity=1.06, + viscous_length=0.56e-4, thermal_length=1.1e-4, + ) + waves = materials.biot_waves(medium, porosity=0.94, tortuosity=1.06, + frame_density=130.0, shear_modulus=shear) + + fig, (ax_k, ax_mu) = plt.subplots( + 2, 1, figsize=(10, 7.6), sharex=True, + gridspec_kw={"height_ratios": [2.0, 1.0]}) + waves.plot(ax=ax_k, language=_LANG) + + # Where the solver's root ordering swaps: the airborne branch changes + # eigenvalue, which is bookkeeping and not physics. + swap = freq[np.flatnonzero(np.diff(waves.airborne_is_second.astype(int)))] + if swap.size: + ax_k.axvline(float(swap[0]), color=COLOR_FG, linestyle=":", linewidth=1.4) + ax_k.text(float(swap[0]) * 1.04, ax_k.get_ylim()[1] * 0.94, + f"root swap, {swap[0]:.0f} Hz", fontsize=9.5, color=COLOR_FG, + va="top") + ax_k.set_xlabel("") + + mu_a = np.abs(waves.airborne_velocity_ratio) + mu_b = np.abs(waves.frame_borne_velocity_ratio) + ax_mu.semilogy(freq, mu_a, color=COLOR_PRIMARY, linewidth=2.0, + label=r"airborne $|\mu_a|$") + ax_mu.semilogy(freq, mu_b, color=COLOR_SECONDARY, linewidth=2.0, + label=r"frame-borne $|\mu_b|$") + ax_mu.axhline(1.0, color=COLOR_FG, linestyle="--", linewidth=1.0) + ax_mu.text(1460.0, 1.12, "fluid and frame move together", fontsize=9, + color=COLOR_FG, ha="right") + ax_mu.annotate(f"$|\\mu_a| \\geq$ {mu_a.min():.0f} everywhere: the fluid moves " + "and the frame barely does", + xy=(700.0, float(np.interp(700.0, freq, mu_a))), + xytext=(300.0, 6.0), fontsize=9.5, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0, "color": COLOR_FG}) + ax_mu.set_xscale("log") + format_frequency_axis(ax_mu, 50.0, 1500.0) + ax_mu.set_xlabel(LABEL_FREQ_HZ) + ax_mu.set_ylabel(r"$|\mu|$ = fluid / frame displacement") + ax_mu.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_mu.set_axisbelow(True) + ax_mu.legend(loc="lower left", fontsize=9.5) + fig.tight_layout() + save_figure(output_dir, "biot_waves.svg") + plt.close() + + +def generate_oblique_absorption(output_dir: str) -> None: + """alpha(theta) of a hard-backed layer, bulk against locally reacting.""" + print("Generating oblique_absorption...") + from phonometry import materials + + theta = np.radians(np.linspace(0.0, 88.0, 90)) + _fig, (ax_t, ax_f) = plt.subplots(1, 2, figsize=(12.4, 5.8)) + + for band, color in ((250.0, COLOR_TERTIARY), (500.0, COLOR_SECONDARY), + (1000.0, COLOR_PRIMARY), (2000.0, COLOR_FG)): + one = np.array([band]) + layers = (materials.PorousLayer(0.05, materials.miki(one, 20000.0)),) + bulk = np.array([ + float(materials.layered_absorber(one, layers, angle=float(t)).absorption[0]) + for t in theta]) + z_normal = complex( + materials.layered_absorber(one, layers).normalized_impedance[0]) + # Locally reacting: the same surface impedance at every angle. + refl = ((z_normal * np.cos(theta) - 1.0) / (z_normal * np.cos(theta) + 1.0)) + local = 1.0 - np.abs(refl) ** 2 + ax_t.plot(np.degrees(theta), bulk, color=color, linewidth=2.0, + label=f"{band:.0f} Hz, bulk") + ax_t.plot(np.degrees(theta), local, color=color, linewidth=1.4, + linestyle="--", alpha=0.75) + ax_t.axvline(78.0, color=COLOR_GRID, linestyle=":", linewidth=1.6) + ax_t.text(77.0, 0.06, "78° truncation", rotation=90, fontsize=9.5, + color=COLOR_FG, ha="right") + ax_t.set_xlabel("Incidence angle θ [°]") + ax_t.set_ylabel(r"$\alpha(\theta)$") + ax_t.set_title("The integrand: solid bulk-reacting, dashed locally reacting", + fontweight="bold", pad=10) + ax_t.set_xlim(0.0, 90.0) + ax_t.set_ylim(0.0, 1.0) + ax_t.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_t.set_axisbelow(True) + ax_t.legend(loc="lower left", fontsize=9) + + freq = np.geomspace(125.0, 4000.0, 90) + layers_f = (materials.PorousLayer(0.05, materials.miki(freq, 20000.0)),) + diffuse = materials.diffuse_field_absorption(freq, layers_f).absorption + normal = materials.layered_absorber(freq, layers_f) + statistical = np.asarray( + materials.statistical_absorption(normal.normalized_impedance)) + ax_f.semilogx(freq, diffuse, color=COLOR_PRIMARY, linewidth=2.2, + label=r"$\alpha_{dif}$ bulk (Paris integral)") + ax_f.semilogx(freq, statistical, color=COLOR_SECONDARY, linewidth=2.0, + linestyle="--", label=r"$\alpha_{st}$ locally reacting (closed form)") + ax_f.semilogx(freq, normal.absorption, color=COLOR_MUTED, linewidth=1.6, + linestyle=":", label=r"$\alpha(0°)$ what the tube reads") + ax_f.axhline(0.951, color=COLOR_FG, linestyle=":", linewidth=1.2) + ax_f.text(3900.0, 0.975, "0.951 ceiling of the closed form", fontsize=9, + color=COLOR_FG, ha="right") + format_frequency_axis(ax_f, 125.0, 4000.0) + ax_f.set_xlabel(LABEL_FREQ_HZ) + ax_f.set_ylabel("Absorption coefficient") + ax_f.set_title("The two averages, and the tube", fontweight="bold", pad=10) + ax_f.set_ylim(0.0, 1.05) + ax_f.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_f.set_axisbelow(True) + ax_f.legend(loc="upper left", fontsize=9) + plt.tight_layout() + save_figure(output_dir, "oblique_absorption.svg") + plt.close() + + +def generate_sheet_transfer_impedance(output_dir: str) -> None: + """Maa's MPP: where its reactance meets the cavity, and what r is there.""" + print("Generating sheet_transfer_impedance...") + from phonometry import materials + + # Maa (1998) Fig. 5: 0.2 mm holes on a 2.5 mm pitch in a 0.2 mm plate, + # over a 60 mm cavity -- the geometry the guide already evaluates. + open_area = (np.pi / 4.0) * (0.2 / 2.5) ** 2 + cavity, c0, rho_c = 0.06, 343.0, 1.205 * 343.0 + freq = np.geomspace(100.0, 2500.0, 900) + + z = materials.microperforated_plate_impedance( + freq, thickness=0.2e-3, hole_radius=0.1e-3, open_area=open_area) / rho_c + # Resonance is where the panel reactance cancels the cavity's, which Maa + # writes as omega_0 m = cot(omega_0 D / c0). + cavity_curve = 1.0 / np.tan(2.0 * np.pi * freq * cavity / c0) + stack = materials.layered_absorber( + freq, [materials.MicroperforatedPlateLayer(0.2e-3, 0.1e-3, open_area), + materials.AirLayer(cavity)]) + peak = int(np.argmax(stack.absorption)) + + _fig, ax = plt.subplots(figsize=(10.5, 6.2)) + ax_a = ax.twinx() + ax_a.plot(freq, stack.absorption, color=COLOR_TERTIARY, linewidth=1.6, + alpha=0.8, zorder=1) + ax_a.set_ylabel(r"Absorption $\alpha$ of the stack", color=COLOR_TERTIARY) + ax_a.tick_params(axis="y", colors=COLOR_TERTIARY) + ax_a.set_ylim(0.0, 1.05) + + ax.set_zorder(ax_a.get_zorder() + 1) + ax.patch.set_visible(False) + ax.plot(freq, z.real, color=COLOR_SECONDARY, linewidth=2.2, + label=r"panel resistance $r$") + ax.plot(freq, z.imag, color=COLOR_PRIMARY, linewidth=2.2, + label=r"panel reactance $x$") + ax.plot(freq, cavity_curve, color=COLOR_FG, linewidth=1.8, linestyle="--", + label=r"cavity $\cot(\omega D/c_0)$, D = 60 mm") + ax.axhline(0.0, color=COLOR_GRID, linewidth=1.0) + ax.scatter([freq[peak]], [z.real[peak]], color=COLOR_SECONDARY, s=80, zorder=6) + ax.scatter([freq[peak]], [z.imag[peak]], color=COLOR_PRIMARY, s=60, zorder=6) + ax.annotate(f"the reactances meet at {freq[peak]:.0f} Hz\n" + f"there r = {z.real[peak]:.2f}, so " + f"4r/(1+r)² = {4 * z.real[peak] / (1 + z.real[peak]) ** 2:.2f}", + xy=(freq[peak], z.imag[peak]), xytext=(freq[peak] * 1.5, 3.2), + fontsize=10, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0, "color": COLOR_FG}) + ax.axvline(freq[peak], color=COLOR_GRID, linestyle=":", linewidth=1.4) + ax.set_xlabel(LABEL_FREQ_HZ) + ax.set_ylabel(r"Normalised transfer impedance $z/\rho_0 c_0$") + ax.set_title("Where a Resonant Sheet Resonates, and How Well It Absorbs", + fontweight="bold", pad=12) + ax.set_ylim(-2.0, 5.0) + ax.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + ax.legend(loc="upper left", fontsize=9.5) + format_frequency_axis(ax, 100.0, 2500.0) + plt.tight_layout() + save_figure(output_dir, "sheet_transfer_impedance.svg") + plt.close() + + +def _slit_design(target: float = 300.0) -> Any: + """The guide's 300 Hz critical-coupling design, solved once.""" + from phonometry import HelmholtzResonator, critical_coupling_design + + base = HelmholtzResonator(neck_length=1.0e-3, neck_side=3.0e-3, + cavity_length=30.0e-3, cavity_side=27.0e-3) + return critical_coupling_design(target, base, lattice_step=3.0e-2, + period=5.0e-2) + + +def generate_critical_coupling_impedance(output_dir: str) -> None: + """Critical coupling seen as an impedance: the sweep and the locus.""" + print("Generating critical_coupling_impedance...") + from phonometry import slit_helmholtz_absorber + + design = _slit_design() + h0 = design.slit_height + _fig, (ax_h, ax_l) = plt.subplots(1, 2, figsize=(12.4, 5.8)) + + # Left: both matching conditions against the slit height, at 300 Hz. + heights = np.linspace(0.5 * h0, 2.5 * h0, 70) + one = np.array([300.0]) + z = np.array([ + complex(slit_helmholtz_absorber( + one, design.resonator, slit_height=float(h), + lattice_step=3.0e-2, period=5.0e-2).normalized_impedance[0]) + for h in heights]) + alpha = 1.0 - np.abs((z - 1.0) / (z + 1.0)) ** 2 + ax_h.plot(heights * 1e3, z.real, color=COLOR_SECONDARY, linewidth=2.2, + label=r"Re$(z)$") + ax_h.plot(heights * 1e3, z.imag, color=COLOR_PRIMARY, linewidth=2.2, + label=r"Im$(z)$") + ax_h.axhline(1.0, color=COLOR_FG, linestyle="--", linewidth=1.0) + ax_h.axhline(0.0, color=COLOR_FG, linestyle=":", linewidth=1.0) + ax_h.axvline(h0 * 1e3, color=COLOR_GRID, linestyle=":", linewidth=1.6) + ax_h.scatter([h0 * 1e3, h0 * 1e3], [1.0, 0.0], color=COLOR_FG, s=55, zorder=6) + ax_h.annotate(f"solved h = {h0 * 1e3:.3f} mm:\nRe(z) = 1 and Im(z) = 0 together", + xy=(h0 * 1e3, 1.0), xytext=(1.35 * h0 * 1e3, 3.0), fontsize=9.5, + color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0, "color": COLOR_FG}) + ax_h.set_xlabel("Slit height h [mm]") + ax_h.set_ylabel(r"Normalised surface impedance $z$ at 300 Hz") + ax_h.set_title("What the design solver solves", fontweight="bold", pad=10) + ax_h.set_ylim(-4.0, 6.0) + ax_h.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_h.set_axisbelow(True) + ax_h.legend(loc="upper right", fontsize=9.5) + + ax_al = ax_h.twinx() + ax_al.plot(heights * 1e3, alpha, color=COLOR_TERTIARY, linewidth=1.8, + alpha=0.85) + ax_al.set_ylabel(r"$\alpha$ at 300 Hz", color=COLOR_TERTIARY) + ax_al.tick_params(axis="y", colors=COLOR_TERTIARY) + ax_al.set_ylim(0.0, 1.05) + + # Right: the locus of z over frequency, for the three slit heights. + freq = np.linspace(150.0, 500.0, 260) + for factor, color, label in ((0.6, COLOR_SECONDARY, "0.6 h over-damped"), + (1.0, COLOR_PRIMARY, "h critically coupled"), + (1.7, COLOR_TERTIARY, "1.7 h under-damped")): + loc = slit_helmholtz_absorber( + freq, design.resonator, slit_height=factor * h0, + lattice_step=3.0e-2, period=5.0e-2).normalized_impedance + ax_l.plot(loc.real, loc.imag, color=color, linewidth=2.0, label=label) + at300 = complex(loc[int(np.argmin(np.abs(freq - 300.0)))]) + ax_l.scatter([at300.real], [at300.imag], color=color, s=70, zorder=6) + ax_l.text(at300.real + 0.08, at300.imag, "300 Hz", fontsize=8.5, + color=color, va="center") + ax_l.scatter([1.0], [0.0], color=COLOR_FG, s=90, zorder=6, marker="x") + ax_l.text(1.12, 0.18, "matched 1 + 0j", fontsize=10, color=COLOR_FG) + ax_l.axhline(0.0, color=COLOR_GRID, linewidth=1.0) + ax_l.axvline(1.0, color=COLOR_GRID, linewidth=1.0) + ax_l.set_xlabel(r"Re$(z)$") + ax_l.set_ylabel(r"Im$(z)$") + ax_l.set_title("The locus over 150-500 Hz", fontweight="bold", pad=10) + ax_l.set_xlim(0.0, 4.0) + ax_l.set_ylim(-3.0, 3.0) + ax_l.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_l.set_axisbelow(True) + ax_l.legend(loc="upper right", fontsize=9) + plt.tight_layout() + save_figure(output_dir, "critical_coupling_impedance.svg") + plt.close() + + +def generate_slow_sound_dispersion(output_dir: str) -> None: + """The phase speed inside the loaded slit, and the depth it buys.""" + print("Generating slow_sound_dispersion...") + from phonometry import materials, slit_helmholtz_absorber + + design = _slit_design() + depth, c0 = 3.0e-2, 343.0 + freq = np.geomspace(50.0, 3000.0, 500) + res = slit_helmholtz_absorber( + freq, design.resonator, slit_height=design.slit_height, + lattice_step=3.0e-2, period=5.0e-2) + ratio = 2.0 * np.pi * freq / res.effective_wavenumber.real / c0 + + # The resonator's own resonance: where its shunt reactance changes sign. + z_hr = materials.helmholtz_resonator_impedance( + freq, design.resonator, slit_height=design.slit_height, + lattice_step=3.0e-2) + crossing = freq[np.flatnonzero(np.diff(np.sign(z_hr.imag)))] + f_res = float(crossing[0]) if crossing.size else float("nan") + + _fig, ax = plt.subplots(figsize=(10.5, 6.2)) + ax.semilogx(freq, ratio, color=COLOR_PRIMARY, linewidth=2.4, + label="loaded slit") + ax.axhline(1.0, color=COLOR_FG, linestyle="--", linewidth=1.4, + label="empty slit") + ax.axvspan(f_res, freq[-1], color=theme_fill(COLOR_MUTED, ax), zorder=0) + ax.text(np.sqrt(f_res * freq[-1]), 0.9, "branch closed above the\n" + f"resonator resonance ({f_res:.0f} Hz)", ha="center", fontsize=9.5, + color=COLOR_FG) + lowest = int(np.argmin(ratio)) + ax.scatter([freq[lowest]], [ratio[lowest]], color=COLOR_SECONDARY, s=70, + zorder=6) + ax.annotate(f"{ratio[lowest]:.2f} $c_0$ at {freq[lowest]:.0f} Hz", + xy=(freq[lowest], ratio[lowest]), xytext=(90.0, 0.42), + fontsize=10, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0, "color": COLOR_FG}) + design_ratio = float(np.interp(300.0, freq, ratio)) + ax.scatter([300.0], [design_ratio], color=COLOR_FG, s=70, zorder=6) + ax.annotate( + f"design point: {design_ratio:.2f} $c_0$ = {design_ratio * c0:.0f} m/s,\n" + f"so the 30 mm depth is a quarter wave at " + f"{design_ratio * c0 / (4 * depth):.0f} Hz", + xy=(300.0, design_ratio), xytext=(330.0, 0.62), fontsize=10, + color=COLOR_FG, + arrowprops={"arrowstyle": "->", "lw": 1.0, "color": COLOR_FG}) + ax.text(60.0, 1.06, "an empty 30 mm slit is a quarter wave at 2858 Hz", + fontsize=9.5, color=COLOR_FG, ha="left") + ax.set_xlabel(LABEL_FREQ_HZ) + ax.set_ylabel(r"Phase speed in the slit $c_\mathrm{eff}/c_0$") + ax.set_title("Slow Sound: the Phase Speed Inside a Loaded Slit", + fontweight="bold", pad=12) + ax.set_ylim(0.0, 1.25) + ax.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + ax.legend(loc="lower left", fontsize=9.5) + format_frequency_axis(ax, 50.0, 3000.0) + plt.tight_layout() + save_figure(output_dir, "slow_sound_dispersion.svg") + plt.close() + + +def generate_graded_slit_absorber(output_dir: str) -> None: + """One cell against a four-resonator chain, graded and uniform.""" + print("Generating graded_slit_absorber...") + from phonometry import slit_helmholtz_absorber + + freq = np.linspace(120.0, 700.0, 700) + single = _slit_design(320.0) + graded = [_slit_design(t).resonator for t in (250.0, 320.0, 410.0, 520.0)] + uniform = [single.resonator] * 4 + + _fig, ax = plt.subplots(figsize=(10.5, 6.2)) + curves = ( + ("one cell, L = 30 mm", single.resonator, single.slit_height, + COLOR_PRIMARY, "-"), + ("four graded, L = 120 mm", graded, 1.20e-3, COLOR_SECONDARY, "-"), + ("four identical, L = 120 mm", uniform, 1.20e-3, COLOR_TERTIARY, "--"), + ) + step = float(freq[1] - freq[0]) + for i, (label, resonators, height, color, style) in enumerate(curves): + alpha = slit_helmholtz_absorber( + freq, resonators, slit_height=height, + lattice_step=3.0e-2, period=5.0e-2).absorption + ax.plot(freq, alpha, color=color, linewidth=2.2, linestyle=style, + label=label) + # The band above 0.8 is not one interval for a chain, so shade where + # it actually is and report the total, not the span. + good = alpha >= 0.8 + base_y = 0.055 + 0.045 * i + ax.fill_between(freq, base_y, base_y + 0.030, where=good, color=color, + linewidth=0) + ax.text(freq[-1] - 6.0, base_y + 0.015, + f"{float(np.sum(good)) * step:.0f} Hz above 0.8", fontsize=9.5, + color=color, va="center", ha="right") + ax.axhline(0.8, color=COLOR_GRID, linestyle=":", linewidth=1.4) + ax.text(640.0, 0.815, r"$\alpha$ = 0.8", fontsize=9.5, color=COLOR_FG, + ha="right") + ax.set_xlabel(LABEL_FREQ_HZ) + ax.set_ylabel("Absorption coefficient") + ax.set_title("What a Chain of Resonators Buys, and What It Costs", + fontweight="bold", pad=12) + ax.set_xlim(120.0, 700.0) + ax.set_ylim(0.0, 1.05) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + ax.legend(loc="upper right", fontsize=9.5) + plt.tight_layout() + save_figure(output_dir, "graded_slit_absorber.svg") + plt.close() diff --git a/scripts/figures/registry.py b/scripts/figures/registry.py index 9aabf833e..8b889cddd 100644 --- a/scripts/figures/registry.py +++ b/scripts/figures/registry.py @@ -31,28 +31,36 @@ generate_rotorcraft_terrain_screening, ) from .building import ( + generate_background_correction_regimes, generate_ceiling_plenum_flanking, + generate_composite_facade_weak_element, generate_dbhr_global_index, generate_extended_insulation_rating, generate_facade_elevation_geometry, generate_facade_field_insulation, generate_facade_prediction, + generate_fast_reverberation_correction, generate_field_airborne_insulation, generate_flanking_level_difference, generate_flanking_transmission, generate_heavy_impact_sources, generate_impact_rating, + generate_insulation_adaptation_terms, generate_insulation_rating, generate_insulation_uncertainty_demo, generate_intensity_element_insulation, + generate_intensity_field_indicator, generate_intensity_insulation, generate_lab_insulation_result, + generate_lab_versus_field_insulation, generate_radiated_power_outdoor, generate_survey_impact_insulation, generate_survey_insulation, ) from .building_design import ( generate_aperture_slit_geometry, + generate_coupling_term_regimes, + generate_detailed_impact_paths, generate_detailed_prediction_paths, generate_double_wall_geometry, generate_floating_floor_prediction, @@ -64,9 +72,12 @@ generate_panel_insulation_concept, generate_plateau_transmission_loss, generate_prediction_flanking_demo, + generate_radiation_efficiency_panels, generate_single_panel_rating, generate_soft_covering_prediction, + generate_structure_borne_conversion, generate_structure_borne_power, + generate_tapping_force_spectrum, ) from .correlation_analysis import ( generate_cepstrum_echo, @@ -187,33 +198,55 @@ generate_absorber_stack_geometry, generate_absorption_rating, generate_absorption_uncertainty, + generate_adrienne_window, generate_airflow_resistance, generate_biot_frame_resonance, + generate_biot_waves, + generate_critical_coupling_impedance, generate_diffuse_field_absorption, + generate_diffuser_modulation, generate_diffuser_prediction, generate_diffusion_goniometer_geometry, + generate_diffusion_measurement_chain, generate_diffusion_polar, generate_dynamic_stiffness, generate_dynamic_stiffness_rig_geometry, + generate_effective_kappa, + generate_enclosed_gas_stiffness, + generate_floating_floor_transmissibility, + generate_flow_resistivity_window, + generate_graded_slit_absorber, generate_helmholtz_resonator_geometry, generate_impedance_tube, generate_impedance_tube_geometry, generate_impedance_tube_result, generate_insitu_absorption, + generate_insitu_method_windows, generate_insitu_setup_geometry, generate_limp_frame_effective_density, + generate_metadiffuser_absorption, generate_metadiffuser_geometry, + generate_metadiffuser_phase_match, generate_metadiffuser_polar, + generate_metadiffuser_spectrum, generate_mpp_absorption_peak, + generate_oblique_absorption, generate_porous_absorber_designs, generate_porous_medium_model, + generate_porous_model_comparison, generate_qrd_geometry, + generate_qrd_working_band, generate_scattering_coefficient, + generate_sheet_transfer_impedance, generate_slit_absorber_geometry, generate_slow_sound_absorber, + generate_slow_sound_dispersion, + generate_sound_absorption_inversion, generate_sound_absorption_measurement, + generate_standing_wave_envelope, generate_transfer_matrix_tl, generate_transmission_tube_geometry, + generate_tube_working_ranges, ) from .media import _extract_poster from .metrology import ( @@ -260,23 +293,42 @@ generate_tone_prominence_assessment, ) from .room import ( + generate_absorption_per_table, + generate_decay_range_bias, + generate_decay_signatures, + generate_deconvolution_snr_gain, generate_enclosed_space_absorption, + generate_enclosed_space_air_term, + generate_enclosed_space_objects, + generate_excitation_robustness, generate_excitation_signals, + generate_image_source_anisotropy, + generate_image_source_bands, + generate_image_source_order_convergence, generate_image_source_plan, generate_image_source_reflectogram, generate_impulse_response, + generate_modal_count_per_band, + generate_nc_blind_spot, generate_open_plan_decay, generate_open_plan_line_geometry, + generate_open_plan_quality, generate_rectangular_room_modes, generate_restaurant_crowd_noise, + generate_reverberation_model_absorption, generate_reverberation_models, generate_room_noise_criteria, generate_room_parameters_bands, + generate_room_proportion_modes, generate_schroeder_decay, + generate_source_distance_bias, + generate_steady_state_directivity, generate_steady_state_field, + generate_sweep_distortion_separation, ) from .schematics import ( animate_comb_filtering, + animate_dynamic_stiffness_sweep, animate_flanking_paths, animate_instantaneous_intensity, animate_intensity_scan_power, @@ -407,6 +459,15 @@ generate_excitation_signals, generate_impulse_response, generate_schroeder_decay, + # What the ISO 18233 acquisition buys and what it costs: the effective + # SNR of a deconvolved sweep, the harmonic packets at negative arrival + # times, the bias of a microphone inside d_min, the modal count an octave + # band averages over, and the sweep's tolerance of time variance. + generate_deconvolution_snr_gain, + generate_sweep_distortion_separation, + generate_source_distance_bias, + generate_modal_count_per_band, + generate_excitation_robustness, generate_insulation_rating, generate_impact_rating, # Building-acoustics prediction / uncertainty (EN 12354-1, ISO 12999-1) @@ -417,12 +478,34 @@ generate_floor_covering_improvement, generate_heavy_impact_sources, generate_ceiling_plenum_flanking, + generate_insulation_adaptation_terms, + generate_background_correction_regimes, + generate_fast_reverberation_correction, + generate_lab_versus_field_insulation, + generate_composite_facade_weak_element, + generate_intensity_field_indicator, generate_masonry_wall_ties, generate_floating_floor_prediction, generate_soft_covering_prediction, generate_flanking_transmission, generate_reverberation_models, + # Rooms/prediction: model behaviour against the mean absorption, + # the EN 12354-6 air and object terms, the image-source order + # horizon, anisotropy and bands, room proportion, the steady-state + # directivity pair, the decay signatures and the decay-range bias. + generate_reverberation_model_absorption, + generate_enclosed_space_air_term, + generate_enclosed_space_objects, + generate_image_source_order_convergence, + generate_image_source_anisotropy, + generate_image_source_bands, + generate_room_proportion_modes, + generate_steady_state_directivity, + generate_decay_signatures, + generate_decay_range_bias, generate_dynamic_stiffness, + generate_floating_floor_transmissibility, + generate_enclosed_gas_stiffness, generate_mechanical_mobility, generate_junction_transmission, generate_bearing_fault_envelope, @@ -434,6 +517,11 @@ generate_vibration_sound_power, generate_structure_borne_power, generate_installed_structure_borne, + generate_structure_borne_conversion, + generate_coupling_term_regimes, + generate_tapping_force_spectrum, + generate_detailed_impact_paths, + generate_radiation_efficiency_panels, generate_tone_audibility, generate_absorption_uncertainty, generate_insulation_uncertainty_demo, @@ -462,19 +550,32 @@ # Slow-sound slit + Helmholtz-resonator perfect absorbers (Jimenez et al.) generate_metadiffuser_geometry, generate_metadiffuser_polar, + generate_metadiffuser_absorption, + generate_metadiffuser_phase_match, + generate_metadiffuser_spectrum, generate_metadiffuser_ntff_polar, generate_slow_sound_absorber, + generate_slow_sound_dispersion, + generate_critical_coupling_impedance, + generate_graded_slit_absorber, generate_slit_absorber_geometry, generate_helmholtz_resonator_geometry, # Scattering/diffusion, in-situ road absorption, precision sound power # (ISO 17497-1/-2, ISO 13472-1, ISO 3745 / ISO 9614-3) generate_scattering_coefficient, + generate_diffusion_measurement_chain, generate_diffusion_polar, generate_diffuser_prediction, + generate_diffuser_modulation, + generate_qrd_working_band, generate_qrd_geometry, generate_impedance_tube_geometry, + generate_tube_working_ranges, + generate_standing_wave_envelope, generate_transmission_tube_geometry, generate_insitu_absorption, + generate_adrienne_window, + generate_insitu_method_windows, generate_precision_anechoic_power, generate_intensity_scan_power, # Sound power result spectra for the three most-used routes @@ -494,8 +595,10 @@ generate_standard_speech_spectrum, generate_sii_band_procedures, generate_impulse_prominence, - # Room-noise criteria (ANSI S12.2-2019): NC tangency and RC Mark II. + # Room-noise criteria (ANSI S12.2-2019): NC tangency and RC Mark II, + # and the pair of rooms the NC number cannot tell apart. generate_room_noise_criteria, + generate_nc_blind_spot, # Hearing threshold (ISO 7029 age-related, ISO 389-7 reference). generate_hearing_threshold, # Noise-induced hearing loss (ISO 1999 NIPTS and HTLAN). @@ -510,6 +613,10 @@ # Psychoacoustics / open-plan plots (sharpness weighting, spatial decay) generate_sharpness_weighting, generate_open_plan_decay, + # The same four quantities read against the two ends of ISO 3382-3 + # Annex A, and the Long Eq. (17.53)-(17.54) absorption-per-table window. + generate_open_plan_quality, + generate_absorption_per_table, # Rectangular room modes (Long Ch. 8), restaurant crowd self-noise # (Long Ch. 17) and the ERB_N / Cam auditory-filter scale. generate_rectangular_room_modes, @@ -647,11 +754,18 @@ # integral, Bies steady-state field, ISO 3382 per-band parameters and the # rigid-box FDTD mode oracle. generate_sound_absorption_measurement, + generate_sound_absorption_inversion, generate_impedance_tube_result, generate_transfer_matrix_tl, generate_porous_medium_model, + generate_porous_model_comparison, generate_mpp_absorption_peak, + generate_sheet_transfer_impedance, generate_diffuse_field_absorption, + generate_oblique_absorption, + generate_biot_waves, + generate_effective_kappa, + generate_flow_resistivity_window, generate_steady_state_field, generate_room_parameters_bands, generate_fdtd_room_modes, @@ -787,6 +901,7 @@ def generate_posters(output_dir: str) -> None: "anim_specific_loudness": animate_specific_loudness, "anim_power_two_rooms": animate_power_two_rooms, "anim_comb_filtering": animate_comb_filtering, + "anim_dynamic_stiffness_sweep": animate_dynamic_stiffness_sweep, "anim_fdtd_slit_absorber": animate_fdtd_slit_absorber, "anim_fdtd_expansion_chamber": animate_fdtd_expansion_chamber, "anim_fdtd_aperture_slit": animate_fdtd_aperture_slit, @@ -959,6 +1074,7 @@ def generate_animations(output_dir: str, names: list[str] | None = None, "special_weighting_responses": 2.6, "sti_curve": 1.7, "schroeder_decay": 1.3, + "source_distance_bias": 9.0, "excitation_signals": 1.2, "crossover_plot": 1.1, "fdtd_room_modes": 2.0, @@ -1093,6 +1209,7 @@ def _generate_figures_parallel( "anim_power_two_rooms": 80.0, "anim_specific_loudness": 80.0, "anim_comb_filtering": 70.0, + "anim_dynamic_stiffness_sweep": 70.0, "anim_flanking_paths": 70.0, "anim_instantaneous_intensity": 65.0, "anim_intensity_scan_power": 60.0, diff --git a/scripts/figures/room.py b/scripts/figures/room.py index af2d8b040..4110fc69c 100644 --- a/scripts/figures/room.py +++ b/scripts/figures/room.py @@ -19,6 +19,7 @@ from .theme import ( COLOR_FG, COLOR_GRID, + COLOR_MUTED, COLOR_PANEL, COLOR_PRIMARY, COLOR_SECONDARY, @@ -237,6 +238,506 @@ def generate_impulse_response(output_dir: str) -> None: plt.close() +def _synthetic_room_system(fs: int, seconds: float = 1.0, + reverberation: float = 0.7) -> np.ndarray: + """Direct sound, two early reflections and an exponential diffuse tail.""" + rng = np.random.default_rng(2026) + n = int(seconds * fs) + t = np.arange(n) / fs + system = rng.standard_normal(n) * np.exp(-6.9077 * t / reverberation) * 0.02 + system[80] += 1.0 # direct sound + system[1500] += 0.45 # early reflection + system[3200] += 0.28 # second reflection + return system + + +def generate_deconvolution_snr_gain(output_dir: str) -> None: + """ISO 18233 6.2.3: what deconvolution buys over an impulsive source.""" + print("Generating deconvolution_snr_gain...") + from scipy.signal import fftconvolve + + from phonometry import impulse_response, sweep_signal + + fs = 48000 + seconds = 2.0 + n = int(seconds * fs) + system = _synthetic_room_system(fs, seconds) + # One background-noise level in the recording, the same for every + # excitation: it belongs to the room, not to the signal being played. + noise_rms = 10.0 ** (-46.0 / 20.0) + # The effective SNR is read as peak-to-floor, with the floor measured in a + # window that the room's own decay (T ~ 0.7 s) has long left behind. + win = slice(int(1.0 * fs), int(1.6 * fs)) + + def envelope(h: np.ndarray) -> tuple[np.ndarray, float]: + mag = np.abs(np.asarray(h, dtype=np.float64)) + floor = float(np.sqrt(np.mean(mag[win] ** 2))) + peak = float(mag.max()) + # 2 ms running RMS, so the trace reads as a level rather than as a + # sample-by-sample scatter. + span = int(0.002 * fs) + smooth = np.sqrt(np.convolve(mag ** 2, np.ones(span) / span, mode="same")) + tiny = np.finfo(np.float64).tiny + return 20.0 * np.log10(np.maximum(smooth, tiny) / peak), 20.0 * np.log10(peak / floor) + + rng = np.random.default_rng(4242) + cases = [] + # (a) an impulsive source of the same peak amplitude, recorded raw. + recorded = system + rng.standard_normal(n) * noise_rms + cases.append(("Pistol shot (no deconvolution)", COLOR_TERTIARY, recorded)) + # (b), (c) the same room through a 1 s and a 4 s sweep, deconvolved. + for secs, color in ((1.0, COLOR_SECONDARY), (4.0, COLOR_PRIMARY)): + sweep = sweep_signal(fs, 20.0, 20000.0, secs) + played = fftconvolve(sweep, system) + played = played + rng.standard_normal(played.size) * noise_rms + cases.append((f"{secs:g} s sweep, deconvolved", + color, np.asarray(impulse_response(played, sweep, fs, length=n)))) + + time = np.arange(n) / fs + _fig, ax = plt.subplots(figsize=(10.5, 6.2)) + snrs = [] + for label, color, h in cases: + trace, snr = envelope(h) + snrs.append(snr) + ax.plot(time, trace, color=color, linewidth=1.1, + label=f"{label} — {snr:.0f} dB") + # A hairline bracket rather than a filled band: a light wash over 30 % of + # the canvas cannot clear the contrast gate against either background. + ax.axvline(time[win.start], color=COLOR_FG, linestyle=":", linewidth=1.2) + ax.axvline(time[win.stop - 1], color=COLOR_FG, linestyle=":", linewidth=1.2) + ax.annotate("noise floor read here", xy=(1.3, -12.0), fontsize=9, + color=COLOR_FG, ha="center") + ax.set_title("Effective signal-to-noise ratio of the recovered impulse " + "response", fontweight="bold", pad=10) + ax.set_xlabel("Time [s]") + ax.set_ylabel("Level re peak [dB]") + ax.set_xlim(0.0, seconds) + ax.set_ylim(-105.0, 6.0) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.legend(loc="upper right", fontsize=9) + ax.text(0.03, 0.06, + f"sweep over pistol: +{snrs[1] - snrs[0]:.0f} dB\n" + f"two doublings of sweep length: +{snrs[2] - snrs[1]:.0f} dB", + transform=ax.transAxes, fontsize=10, va="bottom", ha="left", + bbox={"boxstyle": "round", "facecolor": plt.rcParams["axes.facecolor"], + "edgecolor": COLOR_FG, "alpha": 0.85}) + plt.tight_layout() + save_figure(output_dir, "deconvolution_snr_gain.svg") + plt.close() + + +def generate_sweep_distortion_separation(output_dir: str) -> None: + """ISO 18233 B.5: harmonic packets at negative arrival times.""" + print("Generating sweep_distortion_separation...") + from scipy.signal import fftconvolve + + from phonometry import impulse_response, sweep_signal + + fs = 48000 + f1, f2, seconds = 20.0, 20000.0, 3.0 + sweep = sweep_signal(fs, f1, f2, seconds) + system = np.zeros(int(0.4 * fs)) + system[80], system[1400], system[3100] = 1.0, 0.5, 0.32 + + played = fftconvolve(sweep, system) + # A mild memoryless nonlinearity: the loudspeaker driven near its limit. + played = (played + 0.08 * played ** 2 + 0.04 * played ** 3 + + 0.02 * played ** 4) + full = np.asarray(impulse_response(played, sweep, fs, return_full=True), + dtype=np.float64) + + # Wrap the sequence so t = 0 sits in the middle: what the default return + # keeps is the causal half, and the harmonic packets are the negative half. + size = full.size + half = size // 2 + wrapped = np.roll(np.abs(full), half) + time = (np.arange(size) - half) / fs + tiny = np.finfo(np.float64).tiny + level = 20.0 * np.log10(np.maximum(wrapped, tiny) / wrapped.max()) + + _fig, ax = plt.subplots(figsize=(10.5, 5.8)) + ax.axvspan(0.0, time[-1], color=theme_fill(COLOR_PRIMARY, ax), zorder=0) + ax.plot(time, level, color=COLOR_PRIMARY, linewidth=0.7) + # The predicted advance of the N-th harmonic, ISO 18233 B.5. + span = np.log(f2 / f1) + for order, color in ((2, COLOR_SECONDARY), (3, COLOR_TERTIARY), (4, "#9467bd")): + advance = seconds * np.log(order) / span + ax.axvline(-advance, color=color, linestyle="--", linewidth=1.3) + ax.annotate(f"H{order:d}\n−{advance:.2f} s", xy=(-advance, 2.0), + xytext=(-advance, 6.0), fontsize=9, color=color, + ha="center", va="bottom") + ax.annotate("causal part: what impulse_response() returns", xy=(0.35, -6.0), + fontsize=10, color=COLOR_FG, ha="left") + ax.set_title("Harmonic distortion lands before t = 0 (ISO 18233 B.5)", + fontweight="bold", pad=18) + ax.set_xlabel("Arrival time relative to the linear impulse response [s]") + ax.set_ylabel("Level re peak [dB]") + ax.set_xlim(-0.78, 0.42) + ax.set_ylim(-95.0, 18.0) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + plt.tight_layout() + save_figure(output_dir, "sweep_distortion_separation.svg") + plt.close() + + +def generate_source_distance_bias(output_dir: str) -> None: + """ISO 3382-2 Eq. (1): what a microphone inside d_min gets wrong.""" + print("Generating source_distance_bias...") + from phonometry import room + + # The same 10 x 6 x 3.5 m room the two setup plates draw, V = 210 m3, + # with the absorption tuned so the fitted T30 lands near the 0.6 s those + # plates assume -- which is what makes d_min exactly 2.0 m there too. + dims = (10.0, 6.0, 3.5) + volume = float(np.prod(dims)) + alpha = 0.32 + source = (2.0, 3.0, 1.5) # acoustic centre at 1.5 m + distances = np.array([0.6, 0.8, 1.0, 1.3, 1.6, 2.0, 2.5, 3.0, 3.5, 4.0, + 5.0, 6.0, 7.0]) + edt, t30, c80 = [], [], [] + for dist in distances: + band = [] + # Four lateral offsets per distance: one specular receiver scatters, + # and the spread is not what this figure is about. + for offset in (-0.7, -0.25, 0.25, 0.7): + res = room.image_source_rir( + dims, source, (2.0 + dist, 3.0 + offset, 1.2), alpha, + fs=48000, max_order=40, # c*0.58*T/L_min, not the default + ) + par = room.room_parameters(res.ir, res.fs, limits=(125.0, 4000.0)) + centres = np.asarray(par.frequency, dtype=np.float64) + mid = (centres > 400.0) & (centres < 1200.0) + band.append((float(np.mean(par.edt[mid])), + float(np.mean(par.t30[mid])), + float(np.mean(par.c80[mid])))) + edt.append(np.mean([b[0] for b in band])) + t30.append(np.mean([b[1] for b in band])) + c80.append(np.mean([b[2] for b in band])) + + d_min = 2.0 * np.sqrt(volume / (343.0 * 0.6)) + surface = 2.0 * (10.0 * 6.0 + 10.0 * 3.5 + 6.0 * 3.5) + r_c = float(room.critical_distance(surface * alpha / (1.0 - alpha))) + + _fig, (ax_t, ax_c) = plt.subplots(2, 1, figsize=(10, 7.4), sharex=True) + ax_t.plot(distances, t30, "s-", color=COLOR_PRIMARY, label="T30 (500–1000 Hz)") + ax_t.plot(distances, edt, "o-", color=COLOR_SECONDARY, label="EDT (500–1000 Hz)") + ax_t.set_ylabel("Decay time [s]") + ax_t.set_ylim(0.0, 0.80) + ax_c.plot(distances, c80, "D-", color=COLOR_TERTIARY, label="C80 (500–1000 Hz)") + ax_c.set_ylabel("Clarity C80 [dB]") + ax_c.set_xlabel("Source–receiver distance [m]") + ax_c.set_ylim(8.0, 20.0) + + for axis in (ax_t, ax_c): + axis.axvspan(0.0, d_min, color=theme_fill(COLOR_SECONDARY, axis), zorder=0) + axis.axvline(r_c, color=COLOR_FG, linestyle=":", linewidth=1.3, zorder=1) + axis.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + axis.set_xlim(0.0, 7.4) + axis.legend(loc="lower right", fontsize=9) + ax_t.annotate(f"excluded: r < d_min = {d_min:.1f} m", xy=(d_min / 2, 0.73), + fontsize=10, color=COLOR_SECONDARY, ha="center") + ax_t.annotate(f"critical distance {r_c:.1f} m", xy=(r_c, 0.08), + xytext=(r_c + 0.4, 0.08), fontsize=9, color=COLOR_FG, + va="center", ha="left") + ax_t.set_title("A microphone inside d_min returns wrong numbers, not noisy " + "ones", fontweight="bold", pad=10) + plt.tight_layout() + save_figure(output_dir, "source_distance_bias.svg") + plt.close() + + +def generate_modal_count_per_band(output_dir: str) -> None: + """How many modes an octave band holds, and why the low ones scatter.""" + print("Generating modal_count_per_band...") + from phonometry import room + + # The same 7 x 5 x 3 m room as the image-source guide, T ~ 0.9 s. + dims = (7.0, 5.0, 3.0) + volume = float(np.prod(dims)) + reverberation = 0.9 + bands = np.array([63.0, 125.0, 250.0, 500.0, 1000.0, 2000.0, 4000.0]) + edges = np.sqrt(2.0) + counts = np.array([ + float(room.room_mode_count(f * edges, dims) + - room.room_mode_count(f / edges, dims)) + for f in bands + ]) + f_schroeder = float(room.schroeder_frequency(reverberation, volume)) + + _fig, ax = plt.subplots(figsize=(10, 6.0)) + below = bands < f_schroeder + ax.bar(bands[below], counts[below], width=bands[below] * 0.62, + color=COLOR_SECONDARY, label="Below the Schroeder frequency") + ax.bar(bands[~below], counts[~below], width=bands[~below] * 0.62, + color=COLOR_PRIMARY, label="Above it") + for centre, count in zip(bands, counts): + ax.annotate(f"{count:,.0f}", xy=(centre, count * 1.25), fontsize=9, + color=COLOR_FG, ha="center") + ax.axvline(f_schroeder, color=COLOR_FG, linestyle="--", linewidth=1.4) + ax.annotate(f"Schroeder frequency {f_schroeder:.0f} Hz", + xy=(f_schroeder * 1.06, counts.max() * 0.28), fontsize=10, + color=COLOR_FG, ha="left", rotation=90, va="center") + ax.set_xscale("log") + ax.set_yscale("log") + format_frequency_axis(ax, 45.0, 5600.0) + ax.set_xlabel(LABEL_FREQ_HZ) + ax.set_ylabel("Modes inside the octave band") + ax.set_ylim(5.0, counts.max() * 6.0) + ax.set_title("What the analysis band averages over (7 × 5 × 3 m room, " + "V = 105 m³)", fontweight="bold", pad=10) + ax.grid(which="both", axis="y", color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.set_axisbelow(True) + ax.legend(loc="upper left", fontsize=9) + plt.tight_layout() + save_figure(output_dir, "modal_count_per_band.svg") + plt.close() + + +def generate_excitation_robustness(output_dir: str) -> None: + """ISO 18233 B.7 / A.4: sweep and MLS under a slow temperature drift.""" + print("Generating excitation_robustness...") + from scipy.signal import fftconvolve + + from phonometry import ( + impulse_response, + mls_impulse_response, + mls_signal, + sweep_signal, + ) + + fs = 48000 + seconds = 1.4 + n = int(0.5 * fs) + system = _synthetic_room_system(fs, 0.5, reverberation=0.4) + noise_rms = 10.0 ** (-80.0 / 20.0) + + def drift(signal: np.ndarray, parts_per_million: float) -> np.ndarray: + """Resample by a slowly growing factor: the room warming during a take. + + A stretch of ``parts_per_million`` by the end of the record is a speed + of sound falling by the same fraction; since c ~ sqrt(T), 500 ppm is a + rise of about 2 x 5e-4 x 293 K = 0.3 K across the take. + """ + idx = np.arange(signal.size, dtype=np.float64) + stretched = idx * (1.0 + parts_per_million * 1e-6 * idx / signal.size) + resampled = np.interp(idx, stretched, signal, left=0.0, right=0.0) + return np.asarray(resampled, dtype=np.float64) + + def envelope(h: np.ndarray) -> np.ndarray: + mag = np.abs(np.asarray(h, dtype=np.float64))[:n] + span = int(0.002 * fs) + smooth = np.sqrt(np.convolve(mag ** 2, np.ones(span) / span, mode="same")) + tiny = np.finfo(np.float64).tiny + level = 20.0 * np.log10(np.maximum(smooth, tiny) / smooth.max()) + return np.asarray(level, dtype=np.float64) + + sweep = sweep_signal(fs, 20.0, 20000.0, seconds) + mls = mls_signal(16) # (2^16 - 1)/fs = 1.37 s period + period = mls.size + # The drifted MLS trips the library's own circular-aliasing warning. That + # warning is the result this figure draws, not a defect in the run. + import warnings + + from phonometry import ImpulseResponseWarning + traces = {} + for name, ppm in (("stationary", 0.0), ("+0.3 K during the take", 500.0)): + rng = np.random.default_rng(97) + played = fftconvolve(sweep, system) + played = drift(played, ppm) + rng.standard_normal(played.size) * noise_rms + traces[("sweep", name)] = envelope( + np.asarray(impulse_response(played, sweep, fs, length=n))) + # Four periods played, the first discarded as warm-up: with the first + # period kept the recovered floor sits 23 dB higher even with no drift. + rec = fftconvolve(np.tile(mls, 4), system)[period: 4 * period] + rec = drift(rec, ppm) + rng.standard_normal(rec.size) * noise_rms + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImpulseResponseWarning) + recovered = np.asarray(mls_impulse_response(rec, mls, length=n)) + traces[("MLS", name)] = envelope(recovered) + + time = np.arange(n) / fs + _fig, ax = plt.subplots(figsize=(10.5, 6.2)) + for (kind, name), trace in traces.items(): + color = COLOR_PRIMARY if kind == "sweep" else COLOR_SECONDARY + style = "-" if name == "stationary" else "--" + ax.plot(time, trace, color=color, linestyle=style, + linewidth=1.0 if style == "-" else 1.5, + label=f"{kind}, {name}") + ax.set_title("Time variance costs the MLS its dynamic range, not the sweep", + fontweight="bold", pad=10) + ax.set_xlabel("Time [s]") + ax.set_ylabel("Level re peak [dB]") + ax.set_xlim(0.0, n / fs) + ax.set_ylim(-98.0, 5.0) + ax.annotate("the MLS floor rises to the room's own early decay:\n" + "the tail is gone", xy=(0.30, -15.0), xytext=(0.20, -40.0), + fontsize=10, color=COLOR_SECONDARY, ha="left", + arrowprops={"arrowstyle": "->", "color": COLOR_SECONDARY}) + ax.annotate("sweep: the two traces lie on top of each other", + xy=(0.18, -34.0), xytext=(0.02, -76.0), fontsize=10, + color=COLOR_PRIMARY, ha="left", + arrowprops={"arrowstyle": "->", "color": COLOR_PRIMARY}) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax.legend(loc="upper right", fontsize=9) + plt.tight_layout() + save_figure(output_dir, "excitation_robustness.svg") + plt.close() + + +def generate_open_plan_quality(output_dir: str) -> None: + """Two ISO 3382-3 offices read against the Annex A ends of the scale.""" + print("Generating open_plan_quality...") + from phonometry import open_plan_metrics + + positions = np.array([2.0, 3.0, 4.0, 6.0, 8.0, 11.0, 16.0]) + cases = ( + # (label, D2,S, Lp,A,S,4m, STI intercept, STI slope, colour) + ("Treated", 8.0, 47.0, 0.62, 0.0267, COLOR_PRIMARY), + ("Untreated", 4.0, 52.0, 0.75, 0.0227, COLOR_SECONDARY), + ) + + _fig, (ax_l, ax_s) = plt.subplots(2, 1, figsize=(10, 7.6), sharex=True) + # Annex A: the two ends of the informative scale, shaded on each axis. + ax_l.axhspan(50.0, 62.0, color=theme_fill(COLOR_SECONDARY, ax_l), zorder=0) + ax_l.axhspan(30.0, 48.0, color=theme_fill(COLOR_PRIMARY, ax_l), zorder=0) + ax_l.annotate("Lp,A,S,4m > 50 dB: poor", xy=(2.1, 59.0), fontsize=9, + color=COLOR_FG) + ax_l.annotate("Lp,A,S,4m ≤ 48 dB: good target", xy=(2.1, 32.0), fontsize=9, + color=COLOR_FG) + ax_s.axvspan(1.8, 5.0, color=theme_fill(COLOR_PRIMARY, ax_s), zorder=0) + ax_s.axvspan(10.0, 20.0, color=theme_fill(COLOR_SECONDARY, ax_s), zorder=0) + ax_s.annotate("rD ≤ 5 m: good", xy=(2.1, 0.10), fontsize=9, color=COLOR_FG) + ax_s.annotate("rD > 10 m: poor", xy=(10.4, 0.10), fontsize=9, color=COLOR_FG) + + for label, d2s, lp_4m, sti_0, sti_slope, color in cases: + slope = -d2s / np.log10(2.0) + levels = (lp_4m - slope * np.log10(4.0)) + slope * np.log10(positions) + sti = sti_0 - sti_slope * positions + res = open_plan_metrics(positions, levels, sti) + span = np.logspace(np.log10(1.8), np.log10(20.0), 200) + ax_l.plot(span, (res.lp_as_4m - slope * np.log10(4.0)) + + slope * np.log10(span), "--", color=color, linewidth=1.6) + ax_l.plot(positions, levels, "o", color=color, markersize=7, + markerfacecolor="white", markeredgewidth=1.6, + label=f"{label}: D2,S = {res.d2s:.0f} dB, " + f"Lp,A,S,4m = {res.lp_as_4m:.0f} dB") + ax_l.plot(4.0, res.lp_as_4m, "D", color=color, markersize=9, zorder=6) + ax_s.plot(span, sti_0 - sti_slope * span, "--", color=color, + linewidth=1.6) + ax_s.plot(positions, sti, "o", color=color, markersize=7, + markerfacecolor="white", markeredgewidth=1.6, + label=f"{label}: rD = {res.rd:.1f} m, rP = {res.rp:.0f} m") + ax_s.plot(res.rd, 0.50, "D", color=color, markersize=9, zorder=6) + + ax_l.axvline(4.0, color=COLOR_FG, linestyle=":", alpha=0.35, linewidth=1) + ax_l.set_ylabel("A-weighted speech level [dB]") + ax_l.set_ylim(30.0, 62.0) + ax_l.set_title("The same two quantities at the two ends of Annex A", + fontweight="bold", pad=10) + ax_s.axhline(0.50, color=COLOR_FG, linestyle="-", linewidth=1.1) + ax_s.annotate("STI = 0.50", xy=(16.5, 0.52), fontsize=9, color=COLOR_FG) + ax_s.axhline(0.20, color=COLOR_FG, linestyle="--", linewidth=1.0) + ax_s.annotate("STI = 0.20", xy=(16.5, 0.22), fontsize=9, color=COLOR_FG) + ax_s.set_ylabel("Speech transmission index") + ax_s.set_ylim(0.0, 0.85) + ax_s.set_xlabel("Distance from the talker r [m]") + + from matplotlib.ticker import NullFormatter, ScalarFormatter + for axis in (ax_l, ax_s): + axis.set_xscale("log") + axis.set_xlim(1.8, 20.0) + axis.xaxis.set_major_formatter(ScalarFormatter()) + axis.xaxis.set_minor_formatter(NullFormatter()) + axis.set_xticks([2, 3, 4, 6, 8, 11, 16]) + axis.set_xticklabels(["2", "3", "4", "6", "8", "11", "16"]) + axis.grid(which="major", color=COLOR_GRID, linestyle="-", alpha=0.4) + axis.set_axisbelow(True) + axis.legend(loc="upper right", fontsize=9) + + plt.tight_layout() + save_figure(output_dir, "open_plan_quality.svg") + plt.close() + + +def generate_absorption_per_table(output_dir: str) -> None: + """Long Eqs. (17.53)-(17.54): the absorption window a layout leaves open.""" + print("Generating absorption_per_table...") + from phonometry import room + + span = np.linspace(0.6, 3.2, 200) + communication = np.asarray(room.absorption_per_table(span, -6.0)) + privacy = np.asarray(room.absorption_per_table(span, -9.0)) + # A realistic restaurant layout: 1.2 m across the table, 2.0 m between. + 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)) + closure = float(np.sqrt(6.31 / 3.16)) + + _fig, (ax_a, ax_w) = plt.subplots(1, 2, figsize=(12.5, 5.8)) + + ax_a.plot(span, communication, color=COLOR_PRIMARY, linewidth=2.0, + label="Communication: A_tab > 6.31 r_s² (L_SN > −6 dB)") + ax_a.plot(span, privacy, color=COLOR_SECONDARY, linewidth=2.0, + label="Privacy: A_tab < 3.16 r_t² (L_SN < −9 dB)") + ax_a.axhspan(lower, upper, color=theme_fill(COLOR_TERTIARY, ax_a), zorder=0) + ax_a.annotate(f"feasible A_tab: {lower:.1f} to {upper:.1f} m²", + xy=(2.55, (lower + upper) / 2 + 1.4), fontsize=9, + color=COLOR_FG, ha="center") + ax_a.plot([r_s], [lower], "o", color=COLOR_PRIMARY, markersize=9) + ax_a.plot([r_t], [upper], "o", color=COLOR_SECONDARY, markersize=9) + ax_a.annotate(f"r_s = {r_s:g} m → A_tab > {lower:.1f} m²", + xy=(r_s, lower), xytext=(0.66, 22.0), fontsize=9, + color=COLOR_PRIMARY, + arrowprops={"arrowstyle": "->", "color": COLOR_PRIMARY}) + ax_a.annotate(f"r_t = {r_t:g} m → A_tab < {upper:.1f} m²", + xy=(r_t, upper), xytext=(2.05, 6.0), fontsize=9, + color=COLOR_SECONDARY, + arrowprops={"arrowstyle": "->", "color": COLOR_SECONDARY}) + ax_a.plot([1.0], [float(room.absorption_per_table(1.0, -6.0))], "s", + color=COLOR_PRIMARY, markersize=7, markerfacecolor="none") + ax_a.plot([2.5], [float(room.absorption_per_table(2.5, -9.0))], "s", + color=COLOR_SECONDARY, markersize=7, markerfacecolor="none") + ax_a.set_xlabel("Separation [m]") + ax_a.set_ylabel("Absorption per occupied table A_tab [m²]") + ax_a.set_ylim(0.0, 60.0) + ax_a.set_xlim(0.6, 3.2) + ax_a.set_title("The design window, for one layout", fontweight="bold", + pad=10) + ax_a.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_a.set_axisbelow(True) + ax_a.legend(loc="upper left", fontsize=9) + + # Right: the window width against how far apart the tables stand. + ratios = np.linspace(1.0, 2.2, 200) + width = (np.asarray(room.absorption_per_table(ratios * r_s, -9.0)) + - float(room.absorption_per_table(r_s, -6.0))) + ax_w.axhline(0.0, color=COLOR_FG, linewidth=1.2) + ax_w.plot(ratios, width, color=COLOR_TERTIARY, linewidth=2.2) + ax_w.fill_between(ratios, 0.0, width, where=width > 0.0, zorder=0, + color=theme_fill(COLOR_TERTIARY, ax_w)) + ax_w.axvline(closure, color=COLOR_SECONDARY, linestyle="--", linewidth=1.6) + ax_w.annotate(f"window closes at r_t / r_s = {closure:.2f}", + xy=(closure, -4.0), xytext=(closure + 0.05, -4.0), + fontsize=10, color=COLOR_SECONDARY) + ax_w.plot([r_t / r_s], [upper - lower], "o", color=COLOR_TERTIARY, + markersize=9) + ax_w.annotate(f"this layout: {r_t / r_s:.2f}, {upper - lower:.1f} m² wide", + xy=(r_t / r_s, upper - lower), xytext=(1.02, 9.6), + fontsize=9, color=COLOR_TERTIARY, + arrowprops={"arrowstyle": "->", "color": COLOR_TERTIARY}) + ax_w.set_xlabel("Table spacing over cross-table separation, r_t / r_s") + ax_w.set_ylabel("Width of the feasible A_tab window [m²]") + ax_w.set_xlim(1.0, 2.2) + ax_w.set_title(f"Packed tables close it (r_s = {r_s:g} m)", + fontweight="bold", pad=10) + ax_w.grid(color=COLOR_GRID, linestyle="--", alpha=0.5) + ax_w.set_axisbelow(True) + + plt.tight_layout() + save_figure(output_dir, "absorption_per_table.svg") + plt.close() + + def generate_open_plan_decay(output_dir: str) -> None: """ISO 3382-3 spatial decay: speech SPL and STI vs source distance.""" print("Generating open_plan_decay.png...") @@ -553,7 +1054,7 @@ def generate_enclosed_space_absorption(output_dir: str) -> None: def generate_room_noise_criteria(output_dir: str) -> None: """ANSI S12.2-2019: NC tangency rating and RC Mark II classification.""" print("Generating room_noise_criteria.png...") - from phonometry import noise_criterion, room_criterion + from phonometry import noise_criterion, rc_curve, room_criterion from phonometry.room.noise_criteria import NC_CURVES, NC_INDICES, OCTAVE_BANDS # A ventilation-dominated room spectrum: the low-frequency bands rise well @@ -586,11 +1087,22 @@ def generate_room_noise_criteria(output_dir: str) -> None: ax_nc.set_axisbelow(True) ax_nc.legend(loc="upper right") - # --- Right: RC Mark II reference + rumble/hiss tolerances. --- + # --- Right: RC Mark II family, reference + rumble/hiss tolerances. --- ref = rc.reference_curve low = OCTAVE_BANDS <= 500.0 high = OCTAVE_BANDS >= 1000.0 - ax_rc.plot(OCTAVE_BANDS, ref, "s--", color="#7f7f7f", + # The Table D.1 family, mirroring the NC family on the left: constant + # -5 dB/octave keyed to the 1 kHz value, with the 55 dB low-frequency + # floor flattening the 16/31.5 Hz end of RC-25 to RC-30. + for index in range(25, 51, 5): + family = rc_curve(float(index)) + ax_rc.plot(OCTAVE_BANDS, family, color=COLOR_GRID, lw=0.8, zorder=1) + ax_rc.annotate(f"{index:d}", (OCTAVE_BANDS[-1], family[-1]), + fontsize=7, color="#999999", va="center") + ax_rc.annotate("55 dB floor\n(16 Hz = 31.5 Hz)", xy=(22.0, 55.0), + xytext=(70.0, 66.0), fontsize=8, color=COLOR_FG, ha="left", + arrowprops={"arrowstyle": "->", "color": COLOR_FG, "lw": 0.9}) + ax_rc.plot(OCTAVE_BANDS, ref, "s--", color="#7f7f7f", zorder=2, label=f"Reference RC-{rc.rating}") ax_rc.fill_between(OCTAVE_BANDS[low], ref[low], ref[low] + 5.0, zorder=0, color=theme_fill("#ff7f0e", ax_rc), @@ -616,6 +1128,77 @@ def generate_room_noise_criteria(output_dir: str) -> None: plt.close() +def generate_nc_blind_spot(output_dir: str) -> None: + """Two rooms with the same NC rating and opposite spectral character.""" + print("Generating nc_blind_spot...") + from phonometry import noise_criterion, room_criterion + from phonometry.room.noise_criteria import NC_CURVES, NC_INDICES, OCTAVE_BANDS + + # Two ANSI/ASA S12.2 spectra built to touch the NC-40 curve at one band + # each: a duct-rumble room tangent at 125 Hz, and a diffuser-hiss room + # tangent at 4 kHz. Both rate NC-40; nothing in the NC number separates + # them, and the RC Mark II tag does it in one letter. + rumbly = np.array([66.0, 64.0, 62.0, 56.0, 48.0, 40.0, 34.0, 28.0, 24.0, 19.0]) + hissy = np.array([52.0, 52.0, 50.0, 46.0, 43.0, 39.0, 35.0, 34.0, 38.0, 34.0]) + cases = ( + ("Duct rumble", rumbly, COLOR_PRIMARY, "o-"), + ("Diffuser hiss", hissy, COLOR_SECONDARY, "s-"), + ) + nc_left = noise_criterion(rumbly) + + _fig, (ax_nc, ax_rc) = plt.subplots(1, 2, figsize=(12.5, 5.6)) + + # --- Left: one NC label for two spectra. --- + for row, idx in zip(NC_CURVES, NC_INDICES): + ax_nc.plot(OCTAVE_BANDS, row, color=COLOR_GRID, lw=0.8, zorder=1) + ax_nc.annotate(f"{idx:.0f}", (OCTAVE_BANDS[-1], row[-1]), + fontsize=7, color="#999999", va="center") + for label, spectrum, color, style in cases: + nc = noise_criterion(spectrum) + ax_nc.plot(OCTAVE_BANDS, spectrum, style, color=color, zorder=3, + label=f"{label} — tangent at {nc.governing_frequency:g} Hz") + gov = spectrum[OCTAVE_BANDS == nc.governing_frequency][0] + ax_nc.plot([nc.governing_frequency], [gov], "D", color=color, ms=10, + mec=COLOR_FG, mew=0.8, zorder=4) + ax_nc.set_title(f"One rating: NC-{nc_left.rating:g} for both rooms", + fontweight="bold", pad=10) + + # --- Right: the deviation from each room's own RC reference curve. --- + # The tag rule read directly: +5 dB at and below 500 Hz, +3 dB at and + # above 1 kHz (clause D.3), drawn as one step threshold. + threshold = np.where(OCTAVE_BANDS <= 500.0, 5.0, 3.0) + ax_rc.step(OCTAVE_BANDS, threshold, where="mid", color=COLOR_FG, lw=1.4, + ls="--", zorder=2, label="Tag threshold (D.3): +5 / +3 dB") + ax_rc.fill_between(OCTAVE_BANDS, threshold, 17.0, step="mid", zorder=0, + color=theme_fill(COLOR_TERTIARY, ax_rc)) + ax_rc.axhline(0.0, color=COLOR_GRID, lw=1.0, zorder=1) + for label, spectrum, color, style in cases: + rc = room_criterion(spectrum) + ax_rc.plot(OCTAVE_BANDS, spectrum - rc.reference_curve, style, + color=color, zorder=3, label=f"{label} — {rc.label}") + ax_rc.set_ylim(-17.0, 17.0) + ax_rc.set_title("Two ratings: the RC Mark II tag reads the character", + fontweight="bold", pad=10) + + for axis in (ax_nc, ax_rc): + axis.set_xscale("log") + axis.set_xticks(list(OCTAVE_BANDS)) + axis.set_xticklabels([f"{f:g}" for f in OCTAVE_BANDS], rotation=45, + ha="right") + axis.set_xlabel("Octave-band center frequency [Hz]") + axis.grid(which="both", axis="y", color=COLOR_GRID, linestyle="-", + alpha=0.4) + axis.set_axisbelow(True) + axis.legend(loc="upper right", fontsize=9) + ax_nc.set_ylabel("Octave-band sound pressure level [dB]") + ax_rc.set_ylabel("Level minus the room's own RC curve [dB]") + ax_rc.legend(loc="lower left", fontsize=9) + + plt.tight_layout() + save_figure(output_dir, "nc_blind_spot.svg") + plt.close() + + def generate_steady_state_field(output_dir: str) -> None: """Bies steady-state room field: direct, reverberant, total and rc.""" print("Generating steady_state_field...") @@ -661,3 +1244,711 @@ def generate_room_parameters_bands(output_dir: str) -> None: plt.tight_layout() save_figure(output_dir, "room_parameters_bands.svg") plt.close() + + +def generate_reverberation_model_absorption(output_dir: str) -> None: + """Sabine, Eyring and Millington-Sette against the mean absorption. + + The single axis along which the first three models differ. One concept: + why Sabine survives at low absorption and breaks at high. + """ + print("Generating reverberation_model_absorption...") + from phonometry import ( + eyring_reverberation_time, + millington_sette_reverberation_time, + sabine_reverberation_time, + ) + + # The 8 x 5 x 3 m shoebox of the guide's section 1 (V = 120 m3, S = 158 m2). + volume, area = 120.0, 158.0 + alpha = np.linspace(0.02, 0.99, 240) + sabine = np.array([float(sabine_reverberation_time(volume, [(area, a)])) + for a in alpha]) + eyring = np.array([float(eyring_reverberation_time(volume, [(area, a)])) + for a in alpha]) + millington = np.array( + [float(millington_sette_reverberation_time(volume, [(area, a)])) + for a in alpha]) + + _fig, (top, bottom) = plt.subplots( + 2, 1, figsize=(10, 7.4), sharex=True, + gridspec_kw={"height_ratios": [2.0, 1.0]}) + + # Sabine's stated domain is a mean absorption up to about 0.2. + for ax in (top, bottom): + ax.axvspan(0.2, 1.0, color=theme_fill(COLOR_SECONDARY, ax), zorder=0) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + + top.semilogy(alpha, sabine, color=COLOR_SECONDARY, linewidth=2.2, + label="Sabine", zorder=5) + top.semilogy(alpha, eyring, color=COLOR_TERTIARY, linewidth=2.2, + linestyle="--", label="Eyring", zorder=5) + top.semilogy(alpha, millington, color="#9467bd", linewidth=1.4, + linestyle=":", label="Millington-Sette", zorder=6) + top.set_ylabel(r"Reverberation time $T$ [s]") + top.set_ylim(0.02, 4.0) + top.set_title("Model behaviour against the mean absorption", + fontweight="bold", pad=12) + top.legend(loc="upper right", fontsize=9) + top.annotate( + "Sabine stays finite:\n0.12 s at " + r"$\alpha = 1$", + xy=(0.99, float(sabine[-1])), xytext=(0.66, 0.55), + textcoords="axes fraction", fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "color": COLOR_FG, "lw": 1.0}) + top.annotate( + "Eyring falls to zero", xy=(0.99, float(eyring[-1])), + xytext=(0.60, 0.10), textcoords="axes fraction", fontsize=9, + color=COLOR_FG, + arrowprops={"arrowstyle": "->", "color": COLOR_FG, "lw": 1.0}) + + departure = 100.0 * (eyring / sabine - 1.0) + bottom.plot(alpha, departure, color=COLOR_TERTIARY, linewidth=2.2, zorder=5) + for mark in (0.2, 0.5, 0.9): + value = float(np.interp(mark, alpha, departure)) + bottom.plot([mark], [value], "o", color=COLOR_FG, ms=5, zorder=6) + bottom.annotate(f"{value:.0f} %", xy=(mark, value), + xytext=(mark + 0.02, value + 9.0), fontsize=9, + color=COLOR_FG) + bottom.set_xlabel(r"Mean absorption coefficient $\bar\alpha$") + bottom.set_ylabel("Departure from\nSabine [%]") + bottom.set_xlim(0.0, 1.0) + bottom.set_ylim(-85.0, 12.0) + + info = [ + "room 8 x 5 x 3 m", + "V = 120 m^3, S = 158 m^2", + "uniform absorption, no air term", + "shaded: outside Sabine's domain", + ] + bottom.text(0.015, 0.06, "\n".join(info), transform=bottom.transAxes, + va="bottom", ha="left", fontsize=9, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.4", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "reverberation_model_absorption.svg") + plt.close() + + +def generate_enclosed_space_air_term(output_dir: str) -> None: + """EN 12354-6 air term: six climate profiles and two room volumes. + + One concept: the air absorption is a volume effect, so the frequency + threshold and the volume threshold of clause 4.3 are one rule. + """ + print("Generating enclosed_space_air_term...") + from phonometry import enclosed_space_reverberation + from phonometry.room.enclosed_space_absorption import ( + AIR_ATTENUATION, + OCTAVE_BANDS, + ) + + freq = np.asarray(OCTAVE_BANDS) + soft = [0.15] * freq.size # a plausible ordinary room, per band + hall_area, hall_volume = 1000.0, 2000.0 + + _fig, (left, right) = plt.subplots(1, 2, figsize=(12.6, 5.4)) + + still = enclosed_space_reverberation([(hall_area, soft)], hall_volume) + colours = plt.get_cmap("viridis")(np.linspace(0.05, 0.9, len(AIR_ATTENUATION))) + for colour, name in zip(colours, AIR_ATTENUATION): + humid = enclosed_space_reverberation( + [(hall_area, soft)], hall_volume, air_condition=name) + left.loglog(freq, humid.absorption_area - still.absorption_area, + color=colour, marker="o", markersize=4, linewidth=1.8, + label=name.replace("C_", " °C, ") + " % RH") + left.set_ylabel(r"Air term $A_{air} = 4mV(1-\psi)$ [m$^2$]") + left.set_title(r"Six climate profiles, $V$ = 2000 m$^3$", + fontweight="bold", pad=10) + left.legend(loc="upper left", fontsize=8) + + styles = ((60.0, 94.0, COLOR_PRIMARY, r"60 m$^3$ office"), + (2000.0, 1000.0, COLOR_SECONDARY, r"2000 m$^3$ hall")) + for volume, area, colour, label in styles: + for condition, dash in ((None, "-"), ("20C_50-70", "--")): + res = enclosed_space_reverberation([(area, soft)], volume, + air_condition=condition) + suffix = " (no air)" if condition is None else " (20 °C, 50-70 %)" + right.semilogx(freq, res.reverberation_time, dash, color=colour, + marker="o", markersize=4, linewidth=1.8, + label=label + suffix) + right.set_ylabel(r"Reverberation time $T$ [s]") + right.set_ylim(bottom=0.0) + right.set_title("The same absorption in two volumes", + fontweight="bold", pad=10) + right.legend(loc="lower left", fontsize=8) + right.annotate("-42 % at 8 kHz", xy=(8000.0, 1.24), xytext=(0.42, 0.30), + textcoords="axes fraction", fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "color": COLOR_FG, "lw": 1.0}) + right.annotate("-1.7 % at 1 kHz", xy=(1000.0, 0.67), xytext=(0.05, 0.62), + textcoords="axes fraction", fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "color": COLOR_FG, "lw": 1.0}) + + for ax in (left, right): + format_frequency_axis(ax, float(freq[0]), float(freq[-1]), minor=None) + ax.set_xlabel(LABEL_FREQ_HZ) + ax.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.45) + ax.set_axisbelow(True) + plt.tight_layout() + save_figure(output_dir, "enclosed_space_air_term.svg") + plt.close() + + +def generate_enclosed_space_objects(output_dir: str) -> None: + """EN 12354-6 Annex E: the object term and the volume-displacement psi. + + One concept: the objects' own absorption dominates, and the object + fraction contributes a separate, constant few per cent. + """ + print("Generating enclosed_space_objects...") + from phonometry import ( + enclosed_space_reverberation, + hard_object_absorption, + object_fraction, + ) + from phonometry.room.enclosed_space_absorption import OCTAVE_BANDS + + freq = np.asarray(OCTAVE_BANDS) + n = freq.size + # EN 12354-6 Annex E: a 4.54 x 2.73 x 2.40 m room, V = 29.75 m3, with the + # annex's 1 kHz coefficients held across the band set. + surfaces = [(12.39, [0.05] * n), (12.39, [0.02] * n), + (10.90, [0.04] * n), (10.90, [0.04] * n), + (6.55, [0.04] * n), (6.55, [0.04] * n)] + volumes = [0.15, 0.60, 0.05, 0.05, 0.65, 0.65] # Annex E case 2 + objects = hard_object_absorption(volumes) + psi = float(object_fraction(volumes, 29.75)) + + bare = enclosed_space_reverberation(surfaces, 29.75, + air_condition="20C_50-70") + absorbing = enclosed_space_reverberation( + surfaces, 29.75, objects=objects, air_condition="20C_50-70") + furnished = enclosed_space_reverberation( + surfaces, 29.75, objects=objects, object_fraction=psi, + air_condition="20C_50-70") + + dry = enclosed_space_reverberation(surfaces, 29.75) + air = bare.absorption_area - dry.absorption_area + surface_area = dry.absorption_area + objects_area = absorbing.absorption_area - bare.absorption_area + + _fig, (left, right) = plt.subplots(1, 2, figsize=(12.6, 5.4)) + x = np.arange(n) + width = 0.38 + left.bar(x - width / 2, surface_area, width, color=COLOR_PRIMARY, + label="surfaces", zorder=3) + left.bar(x - width / 2, air, width, bottom=surface_area, + color=COLOR_MUTED, label="air", zorder=3) + left.bar(x + width / 2, surface_area, width, color=COLOR_PRIMARY, zorder=3) + left.bar(x + width / 2, air, width, bottom=surface_area, + color=COLOR_MUTED, zorder=3) + left.bar(x + width / 2, objects_area, width, bottom=surface_area + air, + color=COLOR_TERTIARY, label="objects (Formula 4)", zorder=3) + for centre, text in ((x - width / 2, "bare"), (x + width / 2, "furnished")): + left.text(float(centre[0]), 0.12, text, rotation=90, fontsize=8, + ha="center", va="bottom", color=COLOR_FG, zorder=5) + left.set_xticks(x) + left.set_xticklabels([f"{f:g}" if f < 1000 else f"{f / 1000:g}k" + for f in freq]) + left.set_xlabel("Octave-band centre frequency [Hz]") + left.set_ylabel(r"Equivalent absorption area $A$ [m$^2$]") + left.set_title("Where the absorption comes from", fontweight="bold", pad=10) + left.legend(loc="upper left", fontsize=9) + + right.semilogx(freq, bare.reverberation_time, color=COLOR_SECONDARY, + marker="o", markersize=4, linewidth=2.0, label="bare") + right.semilogx(freq, absorbing.reverberation_time, color=COLOR_TERTIARY, + marker="s", markersize=4, linewidth=2.0, + label=r"furnished, $\psi$ = 0 (absorption only)") + right.semilogx(freq, furnished.reverberation_time, color=COLOR_PRIMARY, + marker="^", markersize=4, linewidth=2.0, + label=rf"furnished, $\psi$ = {psi:.3f}") + right.set_xlabel(LABEL_FREQ_HZ) + right.set_ylabel(r"Reverberation time $T$ [s]") + right.set_ylim(bottom=0.0) + right.set_title("The volume the objects displace", fontweight="bold", pad=10) + right.legend(loc="lower left", fontsize=9) + format_frequency_axis(right, float(freq[0]), float(freq[-1]), minor=None) + right.annotate( + rf"the gap is $\psi$ alone: {100.0 * psi:.1f} %", + xy=(1000.0, float(furnished.reverberation_time[3])), + xytext=(0.30, 0.72), textcoords="axes fraction", fontsize=9, + color=COLOR_FG, + arrowprops={"arrowstyle": "->", "color": COLOR_FG, "lw": 1.0}) + + for ax in (left, right): + ax.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.45, + zorder=0) + ax.set_axisbelow(True) + plt.tight_layout() + save_figure(output_dir, "enclosed_space_objects.svg") + plt.close() + + +def _specular_decay_time(res: object, window: float = 0.004) -> float: + """Initial slope of the reverberant energy density of an image-source run. + + The estimator the conformance suite uses for the Eyring check: histogram + the exact reflection table into ``window``-second bins and fit the -1 to + -20 dB part of the resulting energy decay. Unlike a T30 read from the + sampled RIR it does not depend on ``max_order``, because it only uses the + first tenth of a second of arrivals. + """ + times = np.asarray(res.times) # type: ignore[attr-defined] + amp = np.atleast_1d(np.asarray(res.amplitudes)) # type: ignore[attr-defined] + if amp.ndim == 2: + amp = amp[0] + edges = np.arange(0.0, float(times.max()), window) + energy, _ = np.histogram(times, bins=edges, weights=amp**2) + centres = 0.5 * (edges[:-1] + edges[1:]) + good = energy > 0.0 + level = 10.0 * np.log10(np.where(good, energy, 1.0) / energy[good][0]) + band = good & (level <= -1.0) & (level >= -20.0) + return float(-60.0 / np.polyfit(centres[band], level[band], 1)[0]) + + +def generate_image_source_order_convergence(output_dir: str) -> None: + """T30 of the synthetic RIR against the reflection-order cut-off. + + One concept: ``max_order`` is a time horizon, and the completeness rule + is a floor rather than a convergence criterion. + """ + print("Generating image_source_order_convergence...") + from phonometry import ( + audible_image_count, + eyring_reverberation_time, + image_source_rir, + room_parameters, + ) + + # The guide's own room: 7 x 5 x 3 m, V = 105 m3, S = 142 m2, alpha = 0.12. + orders = np.arange(8, 62, 2) + t30_acc = [] + images = [] + for order in orders: + res = 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=int(order)) + params = room_parameters(res.ir, res.fs, limits=None) + t30_acc.append(float(params.t30[0])) + images.append(float(audible_image_count(int(order)))) + t30 = np.asarray(t30_acc) + eyring = float(eyring_reverberation_time(105.0, [(142.0, 0.12)])) + + _fig, ax = plt.subplots(figsize=(10, 6.2)) + ax.axhspan(0.9 * eyring, 1.1 * eyring, color=theme_fill(COLOR_TERTIARY, ax), + zorder=0) + ax.axhline(eyring, color=COLOR_TERTIARY, linestyle="--", linewidth=1.8, + label=f"Eyring, {eyring:.2f} s", zorder=4) + ax.plot(orders, t30, color=COLOR_PRIMARY, marker="o", markersize=5, + linewidth=2.0, label="T30 from the synthetic RIR", zorder=5) + crossing = float(np.interp(eyring, t30, orders)) + ax.plot([crossing], [eyring], "o", color=COLOR_SECONDARY, ms=8, zorder=6) + ax.annotate(f"crosses Eyring at order {crossing:.0f}\nand keeps rising", + xy=(crossing, eyring), xytext=(0.08, 0.74), + textcoords="axes fraction", fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "color": COLOR_FG, "lw": 1.0}) + ax.set_xlabel("Reflection-order cut-off max_order") + ax.set_ylabel(r"Fitted $T_{30}$ [s]") + ax.set_title("The image lattice is a time horizon", fontweight="bold", + pad=12) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="upper left", fontsize=9) + + count = ax.twinx() + count.plot(orders, images, color=COLOR_MUTED, linestyle=":", linewidth=1.6, + zorder=3) + count.set_yscale("log") + count.set_ylabel("Audible images", color=COLOR_MUTED) + count.tick_params(axis="y", colors=COLOR_MUTED) + + info = [ + "room 7 x 5 x 3 m, alpha = 0.12", + "V = 105 m^3, S = 142 m^2, fs = 48 kHz", + "shaded: +/- 10 % around Eyring", + ] + ax.text(0.985, 0.04, "\n".join(info), transform=ax.transAxes, + va="bottom", ha="right", fontsize=9, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.4", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "image_source_order_convergence.svg") + plt.close() + + +def generate_image_source_anisotropy(output_dir: str) -> None: + """Specular decay against room elongation, at constant volume. + + One concept: where the image-source model leaves the diffuse-field + estimate it is validated against. + """ + print("Generating image_source_anisotropy...") + from phonometry import eyring_reverberation_time, image_source_rir + + volume, alpha = 105.0, 0.12 + side = volume ** (1.0 / 3.0) + # Four source/receiver pairs per room, as fractions of each dimension, so + # one unlucky pair cannot set the curve. + pairs = (((0.28, 0.32, 0.50), (0.74, 0.68, 0.57)), + ((0.20, 0.55, 0.42), (0.80, 0.30, 0.62)), + ((0.35, 0.20, 0.55), (0.62, 0.80, 0.40)), + ((0.15, 0.70, 0.35), (0.85, 0.45, 0.65))) + ratios = np.array([1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 6.0]) + specular_acc, eyring_acc = [], [] + for ratio in ratios: + lx = side * ratio ** (2.0 / 3.0) + ly = side * ratio ** (-1.0 / 3.0) + area = 2.0 * (2.0 * lx * ly + ly * ly) + eyring_acc.append(float(eyring_reverberation_time(volume, [(area, alpha)]))) + runs = [] + for source, receiver in pairs: + res = image_source_rir( + (lx, ly, ly), + (lx * source[0], ly * source[1], ly * source[2]), + (lx * receiver[0], ly * receiver[1], ly * receiver[2]), + alpha, fs=48000, max_order=60) + runs.append(_specular_decay_time(res)) + specular_acc.append(float(np.mean(runs))) + specular = np.asarray(specular_acc) + eyring = np.asarray(eyring_acc) + + _fig, ax = plt.subplots(figsize=(10, 6.2)) + ax.fill_between(ratios, 0.9 * eyring, 1.1 * eyring, + color=theme_fill(COLOR_TERTIARY, ax), zorder=0, + label=r"$\pm$ 10 % around Eyring") + ax.plot(ratios, eyring, color=COLOR_TERTIARY, linestyle="--", linewidth=2.0, + marker="s", markersize=5, label="Eyring (diffuse field)", zorder=5) + ax.plot(ratios, specular, color=COLOR_PRIMARY, linewidth=2.2, marker="o", + markersize=6, label="specular (image source)", zorder=6) + for ratio, value, reference in zip(ratios, specular, eyring): + if ratio in (1.0, 3.0, 6.0): + offset = -0.16 if ratio >= 5.0 else 0.11 + ax.annotate(f"x{value / reference:.2f}", xy=(ratio, value), + xytext=(ratio - 0.32, value + offset), fontsize=9, + color=COLOR_FG) + ax.set_xlabel(r"Room elongation $L_x : L_y = L_z$") + ax.set_ylabel(r"Reverberation time [s]") + ax.set_title("Where the specular decay leaves the diffuse-field estimate", + fontweight="bold", pad=12) + ax.set_ylim(bottom=0.0) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="upper left", fontsize=9) + + info = [ + "V = 105 m^3 and mean alpha = 0.12 held fixed", + "cube (1:1) through a 6:1 corridor", + "mean of 4 source-receiver pairs, max_order = 60", + ] + ax.text(0.985, 0.04, "\n".join(info), transform=ax.transAxes, + va="bottom", ha="right", fontsize=9, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.4", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "image_source_anisotropy.svg") + plt.close() + + +def generate_image_source_bands(output_dir: str) -> None: + """Per-band image-source decay, with and without the air term. + + One concept: what the banded branch of ``image_source_rir`` produces, + and how small the air loss is in a small room. + """ + print("Generating image_source_bands...") + from phonometry import air_attenuation_m, decay_curve, image_source_rir + + freqs = [250.0, 500.0, 1000.0, 2000.0, 4000.0] + alpha = np.array([[0.10, 0.15, 0.25, 0.40, 0.50]] * 6) + m = air_attenuation_m(freqs, 20.0, 50.0) + + _fig, ax = plt.subplots(figsize=(10, 6.2)) + colours = plt.get_cmap("viridis")(np.linspace(0.05, 0.85, len(freqs))) + for attenuation, dash, tag in ((0.0, "-", ""), (m, "--", " (with air)")): + banded = 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=60, frequencies=freqs, + air_attenuation=attenuation) + for row, freq, colour in zip(banded.ir, freqs, colours): + time, level = decay_curve(row, banded.fs) + label = f"{freq:g} Hz{tag}" if not tag else None + ax.plot(time, level, dash, color=colour, linewidth=1.8, + label=label, zorder=5) + ax.set_xlim(0.0, 1.6) + ax.set_ylim(-60.0, 3.0) + ax.set_xlabel("Time [s]") + ax.set_ylabel("Level re steady state [dB]") + ax.set_title("Per-band decay: solid without air, dashed with air", + fontweight="bold", pad=12) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="upper right", fontsize=9) + + info = [ + "room 7 x 5 x 3 m, max_order = 60", + "wall alpha 0.10 -> 0.50 with frequency", + "air at 20 C / 50 % RH: -0.4 % of T30 at 250 Hz,", + "-4.4 % at 4 kHz", + ] + ax.text(0.015, 0.04, "\n".join(info), transform=ax.transAxes, + va="bottom", ha="left", fontsize=9, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.4", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "image_source_bands.svg") + plt.close() + + +def generate_room_proportion_modes(output_dir: str) -> None: + """Mode ladders of three rooms of the same volume: degeneracy, counted. + + One concept: proportion decides how many *distinct* frequencies a room + has, which is why a cube is the worst listening room. + """ + print("Generating room_proportion_modes...") + from phonometry import room_modes + + volume = 105.0 + half = (volume / 2.0) ** (1.0 / 3.0) + bolt = (volume / (1.0 * 1.4 * 1.9)) ** (1.0 / 3.0) + shapes = ( + ("cube", (volume ** (1.0 / 3.0),) * 3), + ("2 : 1 : 1", (2.0 * half, half, half)), + ("Bolt 1 : 1.4 : 1.9", (bolt, 1.4 * bolt, 1.9 * bolt)), + ) + family = {"axial": COLOR_SECONDARY, "tangential": COLOR_TERTIARY, + "oblique": COLOR_PRIMARY} + + _fig, axes = plt.subplots(4, 1, figsize=(10.5, 7.6), sharex=True, + gridspec_kw={"height_ratios": [1, 1, 1, 1.5]}) + for ax, (name, dims) in zip(axes[:3], shapes): + modes = room_modes(dims, max_frequency=200.0) + freqs = np.asarray(modes.frequencies) + kinds = np.asarray(modes.kinds) + for kind, colour in family.items(): + sel = kinds == kind + ax.vlines(freqs[sel], 0.0, 1.0, color=colour, linewidth=1.4) + distinct = int(np.unique(np.round(freqs, 1)).size) + gap = float(np.max(np.diff(np.unique(np.round(freqs, 1))))) + ax.set_ylim(0.0, 1.0) + ax.set_yticks([]) + ax.set_ylabel(f"{name}\n{dims[0]:.2f} x {dims[1]:.2f} x {dims[2]:.2f} m", + fontsize=9, rotation=0, ha="right", va="center") + ax.text(0.99, 0.82, f"{freqs.size} modes, {distinct} distinct " + f"frequencies; largest gap {gap:.1f} Hz", + transform=ax.transAxes, ha="right", va="top", fontsize=9, + color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.3", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + + spacing = axes[3] + for (name, dims), style in zip(shapes, ("-", "--", ":")): + modes = room_modes(dims, max_frequency=200.0) + unique = np.unique(np.round(np.asarray(modes.frequencies), 1)) + spacing.step(unique[1:], np.diff(unique), style, where="post", + linewidth=1.8, label=name) + spacing.set_xlabel(LABEL_FREQ_HZ) + spacing.set_ylabel("Spacing to the next\ndistinct mode [Hz]") + spacing.set_xlim(0.0, 200.0) + spacing.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + spacing.set_axisbelow(True) + spacing.legend(loc="upper right", fontsize=9) + + from matplotlib.lines import Line2D + + handles = [Line2D([], [], color=colour, linewidth=2.0, label=kind) + for kind, colour in family.items()] + axes[0].legend(handles=handles, loc="upper left", fontsize=8, ncol=3) + axes[0].set_title(r"Three rooms of 105 m$^3$, modes up to 200 Hz", + fontweight="bold", pad=10) + plt.tight_layout() + save_figure(output_dir, "room_proportion_modes.svg") + plt.close() + + +def generate_steady_state_directivity(output_dir: str) -> None: + """The steady-state field against Q and against absorption. + + One concept: Q moves the crossover, absorption moves the plateau, and + neither does the other's job. + """ + print("Generating steady_state_directivity...") + from phonometry import steady_state_field + + grid = np.logspace(-1.0, 1.3, 240) + _fig, (left, right) = plt.subplots(1, 2, figsize=(12.6, 5.6), sharey=True) + + colours = plt.get_cmap("viridis")(np.linspace(0.05, 0.85, 4)) + for colour, q in zip(colours, (1.0, 2.0, 4.0, 8.0)): + field = steady_state_field(sound_power_level=90.0, surface_area=352.0, + mean_absorption=0.15, distances=grid, + directivity=q) + left.semilogx(field.distances, field.total, color=colour, linewidth=2.0, + label=f"Q = {q:g} ($r_c$ = {field.critical_distance:.2f} m)", + zorder=5) + left.axvline(field.critical_distance, color=colour, linestyle=":", + linewidth=1.2, zorder=3) + left.set_title(r"$Q$ moves $r_c$, not the plateau", fontweight="bold", + pad=10) + left.legend(loc="upper right", fontsize=9) + + for colour, absorption in zip(colours[::2].tolist() + [colours[3]], + (0.05, 0.15, 0.35)): + field = steady_state_field(sound_power_level=90.0, surface_area=352.0, + mean_absorption=absorption, distances=grid, + directivity=2.0) + right.semilogx( + field.distances, field.total, color=colour, linewidth=2.0, + label=rf"$\bar\alpha$ = {absorption:g} ($R$ = " + rf"{field.room_constant:.0f} m$^2$)", zorder=5) + right.set_title(r"Absorption moves the plateau, not the direct field", + fontweight="bold", pad=10) + right.legend(loc="upper right", fontsize=9) + right.annotate("10.1 dB = 10 lg(R2/R1)", xy=(8.0, 73.2), xytext=(0.06, 0.22), + textcoords="axes fraction", fontsize=9, color=COLOR_FG, + arrowprops={"arrowstyle": "->", "color": COLOR_FG, "lw": 1.0}) + + for ax in (left, right): + ax.set_xlabel("Distance from source [m]") + ax.grid(which="both", color=COLOR_GRID, linestyle="--", alpha=0.45, + zorder=0) + ax.set_axisbelow(True) + left.set_ylabel("Sound pressure level [dB]") + + info = "12 x 8 x 4 m workshop, S = 352 m^2, Lw = 90 dB re 1 pW" + left.text(0.015, 0.04, info, transform=left.transAxes, va="bottom", + ha="left", fontsize=9, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.4", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "steady_state_directivity.svg") + plt.close() + + +def generate_decay_signatures(output_dir: str) -> None: + """Three decay shapes and the three diagnoses read off them. + + One concept: what a curvature above 10 % and a collapsed EDT look like. + """ + print("Generating decay_signatures...") + from phonometry import decay_curve, room_parameters + + fs = 48000 + rng = np.random.default_rng(3382) + span = np.arange(int(4.0 * fs)) / fs + + def envelope(t60: float) -> np.ndarray: + return np.asarray(np.exp(-6.0 * np.log(10.0) / t60 * span)) + + noise = rng.standard_normal(span.size) + tail = noise * np.sqrt(envelope(1.0)) + early = tail.copy() + amplitude = np.sqrt(6.0 * float(np.sum(tail**2)) / 8.0) + for k, index in enumerate(np.linspace(0, int(0.025 * fs), 8).astype(int)): + early[index] += amplitude * 0.85**k * (1.0 if k % 2 == 0 else -1.0) + + cases = ( + ("single slope", tail, "T20 = T30, curvature ~ 0"), + ("coupled volume", noise * np.sqrt(0.98 * envelope(0.6) + + 0.02 * envelope(2.5)), + "T30 > T20: report both"), + ("strong early energy", early, "EDT << T30: a dry seat"), + ) + + _fig, axes = plt.subplots(1, 3, figsize=(13.2, 4.8), sharey=True) + for ax, (name, signal, verdict) in zip(axes, cases): + res = room_parameters(signal, fs, limits=None) + time, level = decay_curve(signal, fs) + ax.plot(time, level, color=COLOR_PRIMARY, linewidth=1.8, zorder=5) + for edge, colour in ((-5.0, COLOR_TERTIARY), (-25.0, COLOR_TERTIARY), + (-35.0, COLOR_SECONDARY)): + ax.axhline(edge, color=colour, linestyle=":", linewidth=1.0, + zorder=3) + ax.set_xlim(0.0, 3.0) + ax.set_ylim(-60.0, 3.0) + ax.set_xlabel("Time [s]") + ax.set_title(name, fontweight="bold", pad=10) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + summary = (f"EDT {float(res.edt[0]):.2f} s\n" + f"T20 {float(res.t20[0]):.2f} s\n" + f"T30 {float(res.t30[0]):.2f} s\n" + f"C = {float(res.curvature[0]):.0f} %\n{verdict}") + ax.text(0.97, 0.95, summary, transform=ax.transAxes, ha="right", + va="top", fontsize=9, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.4", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + axes[0].set_ylabel("Level re steady state [dB]") + plt.tight_layout() + save_figure(output_dir, "decay_signatures.svg") + plt.close() + + +def generate_decay_range_bias(output_dir: str) -> None: + """The truncation-and-compensation bias against the usable decay range. + + One concept: why ISO 3382's 35/45 dB minima are tightened to 46/54 dB. + """ + print("Generating decay_range_bias...") + from phonometry import room_parameters + + fs = 48000 + true_t = 1.0 + rng = np.random.default_rng(3382) + span = np.arange(int(3.0 * fs)) / fs + clean = rng.standard_normal(span.size) * np.exp( + -3.0 * np.log(10.0) / true_t * span) + noise = rng.standard_normal(span.size) + peak = float(np.max(np.abs(clean))) + + ranges_acc, bias20_acc, bias30_acc = [], [], [] + for inr in range(25, 81, 3): + res = room_parameters(clean + noise * peak * 10.0 ** (-inr / 20.0), + fs, limits=None) + ranges_acc.append(float(res.dynamic_range[0])) + bias20_acc.append(100.0 * (float(res.t20[0]) / true_t - 1.0)) + bias30_acc.append(100.0 * (float(res.t30[0]) / true_t - 1.0)) + ranges = np.asarray(ranges_acc) + bias20 = np.asarray(bias20_acc) + bias30 = np.asarray(bias30_acc) + + _fig, ax = plt.subplots(figsize=(10, 6.2)) + ax.axhspan(-5.0, 5.0, color=theme_fill(COLOR_TERTIARY, ax), zorder=0) + ax.axvspan(float(ranges.min()) - 1.0, 46.0, + color=theme_fill(COLOR_SECONDARY, ax), zorder=0) + ax.plot(ranges, bias20, color=COLOR_PRIMARY, marker="o", markersize=5, + linewidth=2.0, label="T20", zorder=5) + ax.plot(ranges, bias30, color=COLOR_SECONDARY, marker="s", markersize=5, + linewidth=2.0, label="T30", zorder=5) + for limit, label, colour in ((35.0, "ISO min. T20", COLOR_MUTED), + (45.0, "ISO min. T30", COLOR_MUTED), + (46.0, "flag T20", COLOR_PRIMARY), + (54.0, "flag T30", COLOR_SECONDARY)): + ax.axvline(limit, color=colour, linestyle="--", linewidth=1.3, zorder=4) + ax.text(limit, 9.4, label, rotation=90, fontsize=8, ha="right", + va="top", color=COLOR_FG) + ax.set_xlim(30.0, 80.0) + ax.set_ylim(-1.0, 10.0) + ax.set_xlabel("Usable decay range dynamic_range (INR) [dB]") + ax.set_ylabel(r"Error of the fitted decay time [%]") + ax.set_title("The bias an undersized decay range leaves behind", + fontweight="bold", pad=12) + ax.grid(color=COLOR_GRID, linestyle="--", alpha=0.5, zorder=0) + ax.set_axisbelow(True) + ax.legend(loc="center right", fontsize=9) + + info = [ + "synthetic single-slope decay, T = 1.0 s", + "white noise floor swept, fs = 48 kHz", + "green band: the 5 % JND", + "red band: flagged invalid for T20", + "below ~34 dB the fit returns NaN", + ] + ax.text(0.40, 0.96, "\n".join(info), transform=ax.transAxes, + va="top", ha="left", fontsize=9, color=COLOR_FG, + bbox={"boxstyle": "round,pad=0.4", "facecolor": COLOR_PANEL, + "edgecolor": COLOR_GRID}) + plt.tight_layout() + save_figure(output_dir, "decay_range_bias.svg") + plt.close() diff --git a/scripts/figures/schematics.py b/scripts/figures/schematics.py index 3d24ef687..407add07b 100644 --- a/scripts/figures/schematics.py +++ b/scripts/figures/schematics.py @@ -1755,3 +1755,142 @@ def update(kf: int) -> tuple[Any, ...]: notch_txt, stage_txt) _render_clip(fig, update, output_dir, "anim_comb_filtering") + + +def animate_dynamic_stiffness_sweep(output_dir: str) -> None: + """EN 29052-1 resonance sweep: the load plate on its resilient specimen + driven through fr, with the amplitude peaking and the response flipping + from in phase with the force to a quarter cycle behind it and on to + antiphase, which is what the measurement actually reads.""" + from matplotlib.patches import Rectangle + + T = _translate_str + + # The worked determination of the guide: an 8 kg plate (m't = 200 kg/m2) + # on a 200 mm specimen resonating at fr = 25 Hz. eta is the loss factor a + # mineral-wool layer of this class shows on the rig. + f_r, eta = 25.0, 0.14 + f_lo, f_hi = 8.0, 60.0 + freqs = np.linspace(f_lo, f_hi, 800) + + def response(f: np.ndarray | float) -> Any: + ratio = np.asarray(f, dtype=float) / f_r + return 1.0 / (1.0 - ratio ** 2 + 1j * eta * ratio) + + mag = np.abs(response(freqs)) + phase = np.degrees(np.angle(response(freqs))) + + fig = _anim_figure() + fig.suptitle(T("Reading fr on the EN 29052-1 rig"), fontweight="bold") + gs = fig.add_gridspec(2, 2, width_ratios=[1.0, 1.35], + height_ratios=[1.0, 1.0]) + + # --- left: the rig, stroboscopic at the drive frequency --------------- + ax_r = fig.add_subplot(gs[:, 0]) + _schematic_axes(ax_r, (0.0, 4.0), (0.0, 5.4)) + ax_r.add_patch(Rectangle((0.35, 0.35), 3.3, 0.34, facecolor="none", + edgecolor=COLOR_FG, lw=1.6)) + for hx in np.linspace(0.45, 3.55, 14): + ax_r.plot([hx, hx - 0.12], [0.35, 0.20], color=COLOR_FG, lw=0.8) + ax_r.text(2.0, 0.51, T("rigid base"), ha="center", va="center", + color=COLOR_FG, fontsize=8.5) + spec = Rectangle((0.9, 0.69), 2.2, 0.62, facecolor=COLOR_TERTIARY, + alpha=0.28, edgecolor=COLOR_TERTIARY, lw=1.6) + ax_r.add_patch(spec) + plate = Rectangle((0.75, 1.31), 2.5, 0.42, facecolor="none", + edgecolor=COLOR_PRIMARY, lw=2.4) + ax_r.add_patch(plate) + plate_lbl = ax_r.text(2.0, 1.52, T("load plate, 8 kg"), ha="center", + va="center", color=COLOR_FG, fontsize=9) + spec_lbl = ax_r.text(3.25, 1.00, T("specimen"), ha="left", va="center", + color=COLOR_FG, fontsize=8.5) + y_arrow = 2.75 + force = ax_r.annotate("", xy=(1.2, y_arrow), xytext=(1.2, y_arrow), + arrowprops={"arrowstyle": "-|>", "lw": 2.6, + "color": COLOR_SECONDARY}) + ax_r.text(0.95, 3.58, T("F(t)"), ha="center", va="bottom", + color=COLOR_SECONDARY, fontsize=10, family="monospace") + ax_r.plot([1.2, 1.2], [y_arrow - 0.03, y_arrow + 0.03], + color=COLOR_SECONDARY, lw=1.0) + motion = ax_r.annotate("", xy=(2.9, y_arrow), xytext=(2.9, y_arrow), + arrowprops={"arrowstyle": "-|>", "lw": 2.6, + "color": COLOR_PRIMARY}) + ax_r.text(3.0, 3.58, T("plate motion"), ha="center", va="bottom", + color=COLOR_PRIMARY, fontsize=9) + state_txt = ax_r.text(2.0, 4.9, "", ha="center", va="top", color=COLOR_FG, + fontsize=10) + drive_txt = ax_r.text(2.0, 4.35, "", ha="center", va="top", color=COLOR_FG, + fontsize=11, family="monospace") + + # --- right: magnitude and phase, with the sweep marker ---------------- + ax_m = fig.add_subplot(gs[0, 1]) + _grid_axes(ax_m) + ax_m.plot(freqs, mag, color=COLOR_PRIMARY, lw=2.0) + ax_m.axvline(f_r, color=COLOR_FG, lw=0.9, ls=":", alpha=0.7) + ax_m.set_xlim(f_lo, f_hi) + ax_m.set_ylim(0.0, float(mag.max()) * 1.18) + ax_m.set_ylabel(T("Response magnitude"), fontsize=9) + ax_m.text(f_r + 0.8, float(mag.max()) * 1.05, T("fr = 25 Hz"), ha="left", + va="top", color=COLOR_FG, fontsize=9) + (dot_m,) = ax_m.plot([], [], "o", color=COLOR_SECONDARY, ms=8, zorder=5) + + ax_p = fig.add_subplot(gs[1, 1], sharex=ax_m) + _grid_axes(ax_p) + ax_p.plot(freqs, phase, color=COLOR_PRIMARY, lw=2.0) + ax_p.axvline(f_r, color=COLOR_FG, lw=0.9, ls=":", alpha=0.7) + ax_p.axhline(-90.0, color=COLOR_SECONDARY, lw=1.0, ls="--", alpha=0.8) + ax_p.set_xlim(f_lo, f_hi) + ax_p.set_ylim(-190.0, 10.0) + ax_p.set_yticks([0, -90, -180]) + ax_p.set_xlabel(T("Excitation frequency [Hz]")) + ax_p.set_ylabel(T("Phase [deg]"), fontsize=9) + ax_p.text(f_lo + 1.0, -83.0, T("-90 deg: resonance"), ha="left", + va="bottom", color=COLOR_SECONDARY, fontsize=8.5) + (dot_p,) = ax_p.plot([], [], "o", color=COLOR_SECONDARY, ms=8, zorder=5) + + sweep_s = (_ANIM_FRAMES - _ANIM_HOLD) / _ANIM_FPS + # The plate is watched stroboscopically, one slow cycle per second of + # clip, so what moves on screen is the phase of the response relative to + # the force, not the 25 Hz oscillation itself. + strobe_hz = 1.0 + + def update(kf: int) -> tuple[Any, ...]: + tc = min(kf / _ANIM_FPS, sweep_s) + f = f_lo + (f_hi - f_lo) * tc / sweep_s + h = complex(response(f)) + ang = 2.0 * np.pi * strobe_hz * tc + drive = float(np.cos(ang)) + norm = float(mag.max()) + # Amplitude compressed for the drawing so that the phase stays + # readable far from resonance; the magnitude panel carries the true + # amplitude. Positive displacement is drawn downward, like the force. + amp = (abs(h) / norm) ** 0.35 + disp = amp * float(np.cos(ang + np.angle(h))) + + # The plate rides its displacement; the specimen compresses with it. + y_plate = 1.31 - 0.26 * disp + plate.set_y(y_plate) + plate_lbl.set_position((2.0, y_plate + 0.21)) + spec.set_height(max(0.12, y_plate - 0.69)) + spec_lbl.set_position((3.25, 0.69 + 0.5 * (y_plate - 0.69))) + force.set_position((1.2, y_arrow)) + force.xy = (1.2, y_arrow - 0.75 * drive) + motion.set_position((2.9, y_arrow)) + motion.xy = (2.9, y_arrow - 0.75 * disp) + + dot_m.set_data([f], [abs(h)]) + dot_p.set_data([f], [np.degrees(np.angle(h))]) + deg = np.degrees(np.angle(h)) + if f < f_r - 3.0: + state = T("below fr: the plate follows the force") + elif f <= f_r + 3.0: + state = T("at fr: a quarter cycle behind, amplitude peaks") + else: + state = T("above fr: the plate moves against the force") + state_txt.set_text(state) + drive_txt.set_text(f"f = {f:4.1f} Hz " + + T("phase") + f" = {deg:6.1f}\u00b0") + return (plate, plate_lbl, spec, spec_lbl, force, motion, dot_m, dot_p, + state_txt, drive_txt) + + _render_clip(fig, update, output_dir, "anim_dynamic_stiffness_sweep") diff --git a/scripts/generate_graphs.py b/scripts/generate_graphs.py index 9aec2b465..6fc34d1e0 100644 --- a/scripts/generate_graphs.py +++ b/scripts/generate_graphs.py @@ -269,6 +269,7 @@ ) from figures.schematics import ( animate_comb_filtering, + animate_dynamic_stiffness_sweep, animate_flanking_paths, animate_instantaneous_intensity, animate_intensity_scan_power, @@ -400,6 +401,7 @@ "_RASTER_FIGURES", "_VARIANTS", "animate_comb_filtering", + "animate_dynamic_stiffness_sweep", "animate_elastic_coincidence", "animate_elastic_plate_junction", "animate_fdtd_aperture_slit", diff --git a/scripts/reports/building_design.py b/scripts/reports/building_design.py index aa3ebab73..4a32b32f8 100644 --- a/scripts/reports/building_design.py +++ b/scripts/reports/building_design.py @@ -170,11 +170,14 @@ def _facade_prediction_example() -> tuple[object, ReportMetadata, str]: def _structure_borne_power_example() -> tuple[object, ReportMetadata, str]: """Structure-borne source power fiche: an EN 15657 reception-plate test. - A pump fixed to a reception plate of mass per area m = 25 kg/m2 and area - S = 1,2 m2 whose structural reverberation time Ts = 0,3 s gives the plate - loss factor eta = 2,2/(f*Ts) (Formula 13). The spatial-average plate - velocity level (Formula 12) per octave band (125 Hz to 4 kHz) is - Lv = [88, 90, 86, 82, 78, 73] dB re 1e-9 m/s, and the structure-borne sound + A pump fixed to the low-mobility reception plate EN 15657 clause 7.2.2 + specifies: 100 mm concrete of 2 300 kg/m3, so a mass per area + m = 230 kg/m2, over 3,15 m x 2,23 m = 7,0 m2 (above the 5 m2 minimum, sides + near sqrt(2):1) with a structural reverberation time Ts = 0,25 s, which + gives the plate loss factor eta = 2,2/(f*Ts) (Formula 13) and keeps it at + or above the required 0,08 through the 50-100 Hz bands. The spatial-average + plate velocity level (Formula 12) per octave band (125 Hz to 4 kHz) is + Lv = [70, 72, 68, 64, 60, 55] dB re 1e-9 m/s, and the structure-borne sound power injected into the plate is L_Ws = 10*lg(2*pi*f*eta*m*S) + Lv - 60 dB re 1 pW (Formula 14). The band levels are dominated by the 250 Hz band and sum to a total L_Ws near 65 dB @@ -183,9 +186,9 @@ def _structure_borne_power_example() -> tuple[object, ReportMetadata, str]: EN 12354-5 use, as the basis strip states. """ freqs = np.array([125, 250, 500, 1000, 2000, 4000], dtype=float) - lv = np.array([88.0, 90.0, 86.0, 82.0, 78.0, 73.0]) + lv = np.array([70.0, 72.0, 68.0, 64.0, 60.0, 55.0]) result = ph.reception_plate_power( - lv, freqs, mass_per_area=25.0, area=1.2, reverberation_time=0.3 + lv, freqs, mass_per_area=230.0, area=7.0, reverberation_time=0.25 ) metadata = ReportMetadata( client="Example building services contractor", diff --git a/site/public/llms/llms-buildings-design.txt b/site/public/llms/llms-buildings-design.txt index 51d7dc3ad..8c1ef8075 100644 --- a/site/public/llms/llms-buildings-design.txt +++ b/site/public/llms/llms-buildings-design.txt @@ -45,10 +45,12 @@ detailed model buys is the spectrum behind the single number. [Predicting Panel Sound Insulation](https://jmrplens.github.io/phonometry/buildings/design/panel-sound-insulation/) goes one level deeper, to where the element $R$ itself comes from: the mass law -and the coincidence dip of a single panel, the mass-spring-mass behaviour of a -double wall, transmission through slits and apertures, plate radiation -efficiency and point mobilities. It is the physics a catalogue value expresses -in one number. +and the coincidence dip of a single panel, the plateau shortcut that estimates +the whole curve by hand, the coincidence *range* of a corrugated or ribbed sheet, +the mass-spring-mass behaviour of a double wall and the wall-tie bridge that +limits a masonry cavity one, transmission through slits and apertures, plate +radiation efficiency and point mobilities. It is the physics a catalogue value +expresses in one number. Two pages here carry the floor half of any design, one measuring and one predicting. @@ -77,15 +79,29 @@ takes that source description, loses part of it to the coupling term the source and receiver mobilities set, and carries the rest to a room that may be several junctions away. -One bookkeeping note runs through the whole section: the family exists as -EN 12354:2000 and as ISO 12354:2017, and the two are not interchangeable in -every clause. The simplified models on -[Predicting Sound Insulation](https://jmrplens.github.io/phonometry/buildings/design/insulation-prediction/) -follow the 2000 text — including the tabulated flanking correction $K$ that the -2017 impact part replaced with explicit per-path formulae — while -[Detailed Per-Band Prediction](https://jmrplens.github.io/phonometry/buildings/design/detailed-prediction/) -follows the 2017 text. Check which edition your regulation calls up before -quoting a correction from either. +**EN 12354 or ISO 12354?** One bookkeeping note runs through the whole section. +The prediction family was published by CEN as EN 12354-1 to -6 and later +reissued by ISO as a second edition, ISO 12354-1:2017 and ISO 12354-2:2017, +which is not word for word the earlier text: where a formula changed between the +prints, the [errata registry](https://jmrplens.github.io/phonometry/reference/errata/) records both. Parts +3 to 6 keep their EN designation in the editions used here. Every guide names +the edition it was read from — EN 12354-1:2000 and EN 12354-2:2000 for the +simplified models on +[Predicting Sound Insulation](https://jmrplens.github.io/phonometry/buildings/design/insulation-prediction/), +including the tabulated flanking correction $K$ that the 2017 impact part +replaced with explicit per-path formulae; ISO 12354-1:2017 and ISO 12354-2:2017 +for the per-band models and the Annex L/G worked examples of +[Detailed Per-Band Prediction](https://jmrplens.github.io/phonometry/buildings/design/detailed-prediction/); +and EN 12354-3:2000 to EN 12354-6:2003 for façades, service equipment and +enclosed spaces. Check which edition your regulation calls up before quoting a +clause or a correction from either. + +And one caveat both parts print, in Clause 5: the models predict the *measured* +performance of buildings **assuming good workmanship and high measurement +accuracy**. A prediction is therefore a statement about a correctly built +construction, not about the one that will be built; the standard's own advice is +to vary the uncertain inputs and read the spread in the answer, which +ISO 12354-1:2017 Annex K systematises into an uncertainty on the result. Every prediction here starts from measured data that came from somewhere else, and the design report has to say where. The element $R$ and $L_n$ come from @@ -110,9 +126,11 @@ measurement in [Sound insulation](https://jmrplens.github.io/phonometry/building junction conversion, the flanking indices per band and the per-path contributions behind the rating. - [Predicting Panel Sound Insulation](https://jmrplens.github.io/phonometry/buildings/design/panel-sound-insulation/): - the mass law and coincidence dip (Sharp), double walls (Bies), slits and - apertures (Gomperts, Wilson-Soroka), radiation efficiency - (Leppington/Maidanik) and point mobilities (Cremer). + the mass law, the plateau shortcut and the coincidence dip of a single panel + (Sharp, Norton), the coincidence range of a corrugated or ribbed sheet + (Vigran/Heckl), double walls and the wall-tie bridge of a masonry cavity wall + (Bies, Hopkins), slits and apertures (Gomperts, Wilson-Soroka), radiation + efficiency (Leppington/Maidanik) and point mobilities (Cremer). - [Floor-Covering Impact Improvement (ISO 16251-1)](https://jmrplens.github.io/phonometry/buildings/design/impact-improvement/): the weighted improvement of a soft floor covering measured on a small heavyweight mock-up. diff --git a/site/public/llms/llms-buildings-insulation.txt b/site/public/llms/llms-buildings-insulation.txt index 3598cddbd..ef547f209 100644 --- a/site/public/llms/llms-buildings-insulation.txt +++ b/site/public/llms/llms-buildings-insulation.txt @@ -83,8 +83,9 @@ related EN 12354-5, lives in the octave-band control method, its reverberation index and its survey quantities. - [Laboratory Flanking Transmission (ISO 10848)](https://jmrplens.github.io/phonometry/buildings/insulation/flanking-lab/): - the measured vibration reduction index Kij and the flanking descriptors - Dn,f and Ln,f. + the measured vibration reduction index Kij, the flanking descriptors Dn,f + and Ln,f, and the suspended-ceiling plenum path with its normalized ceiling + attenuation Dn,c and ceiling attenuation class. - [Heavy and Soft Impact Sources (ISO 16283-2)](https://jmrplens.github.io/phonometry/buildings/insulation/heavy-impact-sources/): the rubber ball and the bang machine, the impact force exposure levels that specify them, the Fast-weighted maximum level and the ISO 717-2 Annex D diff --git a/site/public/llms/llms-buildings-rooms.txt b/site/public/llms/llms-buildings-rooms.txt index 3f19c22b7..3be6f845c 100644 --- a/site/public/llms/llms-buildings-rooms.txt +++ b/site/public/llms/llms-buildings-rooms.txt @@ -1397,6 +1397,26 @@ plt.show() +### `image_source_rir()` parameters + +| Parameter | Type | Units | Range / default | Notes | +| :--- | :--- | :--- | :--- | :--- | +| `dimensions` | (float, float, float) | m | all > 0 | Room lengths `(Lx, Ly, Lz)` | +| `source` / `receiver` | (float, float, float) | m | strictly inside the room | Positions `(x, y, z)` | +| `absorption` | scalar / (6,) / (n,) / (6, n) | -- | `[0, 1]` | Uniform, per-wall, per-band, or per-wall per-band | +| `fs` | int | Hz | > 0 | Sample rate | +| `max_order` | int | -- | >= 0, default 20 | Reflection-order cut-off | +| `speed_of_sound` | float | m/s | > 0, default 343 | Speed of sound `c` | +| `air_attenuation` | float or (n,) | Np/m | >= 0, default 0 | Air power (intensity) attenuation coefficient `m` | +| `duration` | float, optional | s | > 0 | RIR length (default: last image arrival) | +| `frequencies` | (n,), optional | Hz | -- | Band centres labelling a per-band result | + +Returns an `ImageSourceResult` (`ir`, `fs`, `frequencies`, and the exact +`times`/`distances`/`orders`/`amplitudes`/`image_positions` reflection table) +with `.plot()`, `.plot_geometry()` and a `direct_time` property. +`audible_image_count(order)` gives the shoebox image count and +`reflection_density(t, volume)` the density $4\pi c^3 t^2 / V$. + **Reproducing the statistical decay.** The fitted initial decay slope of the reverberant energy density of the synthetic RIR recovers the **Eyring** reverberation time $T = -24 V \ln 10 / (c S \ln(1 - \bar\alpha))$ (Kuttruff @@ -1507,6 +1527,26 @@ plt.show() +### `steady_state_field()` parameters + +| Parameter | Type | Units | Range / default | Notes | +| :--- | :--- | :--- | :--- | :--- | +| `sound_power_level` | float | dB re 1 pW | -- | Source power level `Lw` | +| `surface_area` | float | m2 | > 0 | Total boundary area `S` | +| `mean_absorption` | float | -- | `(0, 1)` | Mean Sabine absorption `alpha_bar` | +| `distances` | 1D array, optional | m | > 0 | Distance grid (default: `0.1 rc` to `10 rc`) | +| `directivity` | float | -- | > 0, default 1 | Source directivity factor `Q` | +| `characteristic_impedance` | float, optional | Pa*s/m | > 0 | Adds the `10 lg(rho c / 400)` term | + +Returns a `SteadyFieldResult` (`distances`, `direct`, `reverberant`, `total`, +`critical_distance`, `room_constant`) with `.plot()`. The pieces +`room_constant`, `critical_distance`, `schroeder_frequency` and +`steady_state_spl` are also callable directly, and each accepts per-band arrays. +`steady_state_spl` additionally takes `source_model`, one of `constant_power` +(the default), `constant_volume` or `constant_pressure`: whether the mounting +that raises `Q` also raises the radiated power is a modelling choice worth up to +18 dB for a corner source, and it should be stated in any report. + The **Schroeder frequency** $$ diff --git a/site/public/llms/llms-buildings.txt b/site/public/llms/llms-buildings.txt index aa52fc411..fd350baba 100644 --- a/site/public/llms/llms-buildings.txt +++ b/site/public/llms/llms-buildings.txt @@ -78,7 +78,8 @@ laboratory, and predicted from element data. the rubber ball and the bang machine, the impact force exposure level that specifies them and the ISO 717-2 Annex D single number. - [Laboratory Flanking Transmission (ISO 10848)](https://jmrplens.github.io/phonometry/buildings/insulation/flanking-lab/): - the measured junction vibration reduction index and the flanking descriptors. + the measured junction vibration reduction index, the flanking descriptors, + and the suspended-ceiling plenum path with its ceiling attenuation class. - [Insulation Ratings (ISO 717)](https://jmrplens.github.io/phonometry/buildings/insulation/insulation-ratings/): the reference-curve engines behind Rw, DnT,w, Ln,w and their adaptation terms. - [Façade Sound Insulation](https://jmrplens.github.io/phonometry/buildings/insulation/facade-insulation/): the diff --git a/site/public/llms/llms-materials-resilient.txt b/site/public/llms/llms-materials-resilient.txt index 2ab6c4825..8b9a6c55b 100644 --- a/site/public/llms/llms-materials-resilient.txt +++ b/site/public/llms/llms-materials-resilient.txt @@ -139,7 +139,7 @@ $$ s'_t = 4\pi^2\,m'_t\,f_r^2 . $$ -ISO 9052-1 resonance rig: a vertical exciter and an accelerometer on the load plate over the 200 mm by 200 mm resilient specimen, read as a mass-spring system whose response peak gives the resonant frequency and the apparent dynamic stiffness +EN 29052-1 resonance rig in three panels: the three excitation arrangements of Figures 1 to 3, one on a rigid foundation with the load plate driven and measured, two on an isolated baseplate of at least 100 kg where both plates are measured and the exciter drives either the load plate or the baseplate; below, the specimen and load requirements with the plaster bed, the steel load plate and the petroleum-jelly fillet, and the mass-spring model whose response peak gives the resonant frequency In the test arrangement the specimen lies between the rigid foundation and a load plate whose total mass per unit area, plate plus added load, is diff --git a/site/public/llms/llms-reference.txt b/site/public/llms/llms-reference.txt index b0e5a51ec..3df4b5f5c 100644 --- a/site/public/llms/llms-reference.txt +++ b/site/public/llms/llms-reference.txt @@ -1459,14 +1459,14 @@ check that pins each quantity to its standard's own expected value. | Symbol | Definition | Unit | Defined in | Computed in | | :--- | :--- | :--- | :--- | :--- | -| $T_{20}$ | Reverberation time extrapolated to a 60 dB decay from a least-squares fit over −5 dB to −25 dB of the Schroeder curve. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $T_{30}$ | The same extrapolation from a fit over −5 dB to −35 dB, the usual choice when the decay range allows it. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $T_{60}$, RT | Reverberation time as such: the time for the sound energy to fall by 60 dB. Measured in practice as $T_{20}$ or $T_{30}$. | s | ISO 3382-1:2009 | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| EDT | Early decay time: the same slope taken over the first 10 dB of decay, which tracks perceived reverberance rather than the tail. | s | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $C_{50}$ | Clarity for speech: the energy ratio between the first 50 ms of the impulse response and everything after it. | dB | ISO 3382-1:2009 | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $C_{80}$ | Clarity for music: the same ratio with the boundary at 80 ms. | dB | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $D_{50}$ | Definition, or Deutlichkeit: the fraction of the total energy arriving in the first 50 ms. | dimensionless | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | -| $T_s$ (centre time) | Centre time: the centre of gravity of the squared impulse response in time, a boundary-free alternative to the clarity indices. It runs to tens of milliseconds in a room; the building-prediction guides write $T_s$ for something else entirely, the structural reverberation time of a plate, which is seconds. | s | ISO 3382-1:2009, Equation (A.13) | [Room Acoustics](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $T_{20}$ | Reverberation time extrapolated to a 60 dB decay from a least-squares fit over −5 dB to −25 dB of the Schroeder curve. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $T_{30}$ | The same extrapolation from a fit over −5 dB to −35 dB, the usual choice when the decay range allows it. | s | ISO 3382-2:2008, Clause 6 and Annex C | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $T_{60}$, RT | Reverberation time as such: the time for the sound energy to fall by 60 dB. Measured in practice as $T_{20}$ or $T_{30}$. | s | ISO 3382-1:2009 | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| EDT | Early decay time: the same slope taken over the first 10 dB of decay, which tracks perceived reverberance rather than the tail. | s | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $C_{50}$ | Clarity for speech: the energy ratio between the first 50 ms of the impulse response and everything after it. | dB | ISO 3382-1:2009 | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $C_{80}$ | Clarity for music: the same ratio with the boundary at 80 ms. | dB | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $D_{50}$ | Definition, or Deutlichkeit: the fraction of the total energy arriving in the first 50 ms. | dimensionless | ISO 3382-1:2009 (just-noticeable difference in Table A.1) | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | +| $T_s$ (centre time) | Centre time: the centre of gravity of the squared impulse response in time, a boundary-free alternative to the clarity indices. It runs to tens of milliseconds in a room; the building-prediction guides write $T_s$ for something else entirely, the structural reverberation time of a plate, which is seconds. | s | ISO 3382-1:2009, Equation (A.13) | [Room acoustic parameters (ISO 3382-1/2)](https://jmrplens.github.io/phonometry/buildings/rooms/room-acoustics/) | | $A$ | Equivalent sound absorption area of a room: the area of a perfectly absorbing surface that would give the same reverberation time. | m² | ISO 354:2003, Equations (5) and (7) | [Sound Absorption Measurement and Rating](https://jmrplens.github.io/phonometry/materials/absorbers/absorption-measurement/) | | NC | Noise criteria rating of a background spectrum: the speech interference level selects the curve, and the tangency method rates the spectrum when a band exceeds it. | dB (index) | ANSI/ASA S12.2-2019, 5.2.2 and 5.2.3 (curves in Table 1) | [Room-noise criteria (NC / RC Mark II)](https://jmrplens.github.io/phonometry/buildings/rooms/room-noise/) | | SIL | Speech interference level: the average of the 500, 1000, 2000 and 4000 Hz octave-band levels. | dB | ANSI/ASA S12.2-2019, clause 3.2 | [Room-noise criteria (NC / RC Mark II)](https://jmrplens.github.io/phonometry/buildings/rooms/room-noise/) | diff --git a/site/src/content/docs/buildings/design/detailed-prediction.mdx b/site/src/content/docs/buildings/design/detailed-prediction.mdx index c3f70ebbb..e5e9f279d 100644 --- a/site/src/content/docs/buildings/design/detailed-prediction.mdx +++ b/site/src/content/docs/buildings/design/detailed-prediction.mdx @@ -51,6 +51,33 @@ numbers. ## The chain, band by band +Before any of it: the standard splits every element in two, and the whole chain +below is one of the two branches. A **Type A element** (clause 3.3.5) is one +whose structural reverberation time is primarily determined by the elements it is +connected to, up to at least the 1 kHz one-third-octave band, and across which +the vibration level falls by less than 6 dB in the direction perpendicular to the +junction line. Cast in-situ concrete, solid wood including cross-laminated +timber, glass, plastic, metal and blockwork with a finish that mechanically +connects it are the standard's own examples. A **Type B element** (3.3.6) is +anything else, typically plasterboard or timber cladding on a timber or metal +frame. The distinction is not academic: it is exactly why the Type A chain +assembles the loss factor from the junction perimeter, because for a Type A +element the junctions *are* the damping. For a Type B element the standard takes +$T_{s,\text{situ}} = T_{s,\text{lab}}$, so the in-situ correction is 0 dB and +$R_\text{situ} = R$. + +The Annex L building, and steps 1 to 5 below, are the Type A branch. Two +consequences are worth carrying. The classification is **per frequency band** — +Notes 2 to both definitions say a masonry wall can be Type A low and mid and +Type B at the top of the range — so the binary heading of the lightweight section +further down is a simplification of a boundary that actually moves with +frequency. And at a mixed junction (clause 4.2.2.3, "for example Type B wall on +Type A floor") Formula (10) may still be used as an approximation, with the Type +B element's equivalent absorption length taken as its area over the reference +length, $a_{i,\text{situ}} = S_{i,\text{situ}}/l_0$ (Formula 13). Running +`in_situ_element` on a framed partition instead assembles a total loss factor +from junctions that do not control its damping, and nothing will warn you. + Both parts share the same machinery, so a building is described once and the airborne and impact chains read the same in-situ element data. @@ -115,6 +142,88 @@ $L_n = 155 - 30\log_{10} m' + 10\log_{10} T_s + 10\log_{10}\sigma + 10\log_{10}( four-flanking-element room, and $L'_n = 10\log_{10}\sum 10^{L_n/10}$ over the five impact paths, then ISO 717. +## Starting from measured element data + +Clause 4.1 is explicit about where the numbers should come from: acoustic data on +the elements involved *should be taken primarily from standardized laboratory +measurements*, and the sources of data used shall be stated. The Annex B +calculation the page opens with is the fallback for when no measurement exists. +A real project usually starts from a catalogue sheet or an ISO 10140 test report, +and that route has its own three steps. + +**The transfer to the building is a loss-factor transfer.** The laboratory +measured the element in a test frame whose damping is not the building's, so +Formula (9) rescales the index by the ratio of the two structural reverberation +times, $R_\text{situ} = R - 10\lg(T_{s,\text{situ}}/T_{s,\text{lab}})$, and Part 2 +Formula (5) does the same for the impact level **with the sign reversed**. Read +the sign: an element more heavily damped in the building than in the test frame +has a shorter $T_s$ in situ, which *raises* its index and *lowers* its impact +level; an element more lightly damped loses index. The standard's own note adds +that $R_\text{situ} = R$ is a usable first approximation, and for a Type B +element it is exact. + +**$T_{s,\text{lab}}$ comes from the test report, or from Annex C.** If the +laboratory printed it, use it. If not, Formula (C.3) estimates the laboratory +total loss factor as +$\eta_\text{tot,lab} \approx \eta_\text{int} + m'/(485\sqrt{f}) \approx 0{,}01 + +m'/(485\sqrt{f})$, valid for elements below $m'$ = 800 kg/m², with +$\eta_\text{int}$ normally taken as 0,01 (Annex B Table B.1 lists it per +material). `laboratory_total_loss_factor` is that formula and +`structural_reverberation_time` turns it into $T_s = 2{,}2/(f\eta_\text{tot})$; +$T_{s,\text{situ}}$ comes from the same Formula (C.1) chain the page already runs. + +**Flanking paths need one more correction than the direct path.** Below its +critical frequency a laboratory $R$ contains forced transmission, which a +flanking path does not carry: only free bending waves cross a junction. Annex B.1 +therefore corrects a measured $R$ to resonant transmission only before it enters +a flanking path — the 8 dB estimate for a single frame element without a cavity — +while the **direct** path keeps the forced transmission the laboratory measured. +That is `resonant_sound_reduction_index`, and `in_situ_element(..., +resonant_only=True)` does the same on a calculated element. + +The four names below (`laboratory_total_loss_factor`, +`structural_reverberation_time`, `in_situ_reduction_index` and +`in_situ_impact_level`) are top-level `phonometry` names; add them to the import +block of the previous section to run this. + +```python +# A measured laboratory R and Ln for the 220 mm separating floor, transferred to +# the building. `el` is the in-situ element of the section above, whose +# `reverberation_time` is Ts,situ. +eta_lab = laboratory_total_loss_factor(bands, mass_per_area=484.0, + internal_loss_factor=0.005) # (C.3) +ts_lab = structural_reverberation_time(bands, eta_lab) # (C.1) +print(np.round(ts_lab[[0, 10]], 3)) # [0.301 0.089] s +print(np.round(el.reverberation_time[[0, 10]], 3)) # [0.53 0.152] s, in situ + +r_situ = in_situ_reduction_index(r_measured, el.reverberation_time, ts_lab) +ln_situ = in_situ_impact_level(ln_measured, el.reverberation_time, ts_lab) +# This floor is *less* damped in the building than in the test frame (Ts,situ is +# the longer of the two), so Formula (9) takes 2.0 to 2.5 dB off its index across +# the range and Part 2 Formula (5) adds the same to its impact level. + +# A flanking path takes the resonant-only form of the same measured index; +# the direct path does not. +r_flanking = resonant_sound_reduction_index(r_situ, bands, critical_frequency=76.8) +``` + +### What you need before you start + +| Quantity | Where it comes from | +| :--- | :--- | +| $R$, $L_n$ per band | ISO 10140-2 / ISO 10140-3 test report — **with the laboratory structural reverberation time from the same report** | +| $\Delta R$ of a lining | ISO 10140-1 Annex G, or ISO 12354-1 Annex D | +| $\Delta L$ of a covering | [ISO 16251-1](/phonometry/buildings/design/impact-improvement/) or ISO 10140-3 | +| $K_{ij}$ per junction | ISO 10848-1/-4, or the [Annex E catalogue](/phonometry/buildings/design/insulation-prediction/) | +| $m'$, $f_c$, $\eta_\text{int}$, $c_L$ | the material data sheet, or Annex B Table B.1 | +| Areas and coupling lengths | the drawings, measured **surface to surface** | + +That last row changes an answer: a coupling length measured surface to surface +rather than centre to centre differs by a leaf thickness on a lined or +double-leaf element, and $l_{ij}$ enters Formula (10) directly. Clause 4.1 also +requires the source of every input to be stated, which on a fiche is what the +`notes` field of `ReportMetadata` is for. + ## The worked building of Annex L / Annex G ISO 12354-1:2017 Annex L and ISO 12354-2:2017 Annex G describe the **same** @@ -128,6 +237,18 @@ model. Eight defects of those printed tables are recorded in [Errata](/phonometry/reference/errata/), and the fixture below takes the corrected readings. + + +The drawing is what ties the element list to the numbers the snippet multiplies. +The separating floor's perimeter sum is 9 m of external edge plus 9 m of internal +edge because the 5,00 m × 4,00 m floor meets an external wall along each 4,00 m +edge and an internal wall along each 5,00 m edge, and each of those junctions +carries the floor above and below it. An external wall's own perimeter takes +8,0 m of horizontal junction (its top and bottom edges, 4,00 m each) and 2,75 m +of vertical. The floor-to-external-wall junctions are rigid T, the +floor-to-internal-wall junctions rigid cross. And the thirteen paths are one +direct path plus three per flanking element, $1 + 4\times3$. + ```python import numpy as np from phonometry import ( @@ -309,6 +430,37 @@ print(np.round(imp.l_prime_n[[3, 10]], 1)) # [54. 35.9] Table G.1 total print(imp.rating.rating, imp.rating.ci) # 41 2 printed 41,0 (2) ``` + + +*The impact half of the same building, and it is a different picture from the +airborne one. There are five paths, not thirteen, because only the floor is +excited: the tapping machine stands on it, so there is one direct path and one +Df path into each of the four walls, and no Ff or Fd. The direct path through the +excited floor governs in every band. That is the practical lesson — an impact +problem is fixed at the source floor, not at the junctions.* + +
+Show the code for this figure + +```python +# One line — the per-band path contributions with L'n overlaid: +imp.plot() +plt.show() +``` + +
+ +Read the rating the same way. $L'_{n,w} = 41$ dB with $C_I = +2$ dB means the +unweighted, walking-relevant level sits above the weighted rating, which is the +signature of a floor whose improvement is concentrated high up — exactly what a +floating floor with $f_0 = 52{,}8$ Hz and a 30 lg law does. Three levers move it, +in the order the model responds to them: a *softer* resilient layer lowers $f_0$ +and lifts the whole improvement curve; a *heavier* base slab lowers the bare +level directly through Part 2's Formula (B.2); and a better junction does almost +nothing until the direct path has been dealt with. Note too that the floating +floor's $\Delta L$ is subtracted from the direct path and from every flanking +path alike, because all five start at the same excited floor. + ## Simplified against detailed The standard applies its simplified model to the same building (Tables L.10 / @@ -333,6 +485,21 @@ cavity). The impact side offers the same two routes: Part 2 Formula (14) from $\overline{D}_{v,ij,n}$ and Part 2 Formula (13) from a measured normalized flanking impact level $L_{n,f}$. +Unlike the Type A chain, this branch consumes **measured** junction data, so its +four inputs are per-band arrays over `bands` that come from somewhere specific. +`r_wall_leaf` is the leaf's laboratory sound reduction index per band +(ISO 10140-2), corrected below its critical frequency to resonant transmission +only because a flanking path carries free bending waves alone. `dv_n` is the +**normalized** direction-averaged velocity level difference of the junction in +dB, measured per +[ISO 10848-2](/phonometry/buildings/insulation/flanking-lab/) and referred to a +reference length of 1 m. `dnf_13` is the normalized flanking level difference +$D_{n,f}$ of a junction measured in a laboratory, in dB, which the call re-scales +by the ratio of the site and laboratory coupling lengths. And `lnf_13` is its +impact counterpart, the normalized flanking impact level $L_{n,f}$ in dB, which +re-scales by both area and coupling length. The block below is an excerpt: it +starts from those four arrays. + ```python from phonometry import (flanking_impact_level_from_flanking_level, flanking_reduction_index_from_flanking_level, @@ -340,6 +507,11 @@ from phonometry import (flanking_impact_level_from_flanking_level, resonant_sound_reduction_index) # ISO 12354-1 L.2.1: a wood frame building, floor 20 m2, junction 4 m. +r_wall_leaf = ... # measured R of the inner leaf per band, dB (ISO 10140-2) +dv_n = ... # normalized junction velocity level difference, dB (ISO 10848-2) +dnf_13 = ... # laboratory normalized flanking level difference Dn,f, dB +lnf_13 = ... # laboratory normalized flanking impact level Ln,f, dB + r_star = resonant_sound_reduction_index(r_wall_leaf, bands, critical_frequency=2200.0) # +8 dB below fc r_ff = flanking_reduction_index_from_normalized_difference( @@ -426,6 +598,39 @@ built from. caption="Detailed impact prediction fiche (DetailedImpactResult.report), the same building excited by the tapping machine." /> +## What this guide covers + +**Covered.** The Clause 4.2 per-band chain for **Type A** elements: the Annex B +homogeneous-element sound reduction index and impact level and the Annex C +in-situ conversion through `HomogeneousElement`, `in_situ_element` and +`perimeter_absorption_coefficient`; the transfer of *measured* laboratory data +through `laboratory_total_loss_factor`, `structural_reverberation_time`, +`in_situ_reduction_index` and `in_situ_impact_level` (Formula 9 and Part 2 +Formula 5); the Formula (10) in-situ junction drop; the Formula (14)/(15) direct +and flanking airborne paths through `direct_reduction_index` and +`airborne_flanking_path` and their impact twins `direct_impact_level` and +`impact_flanking_path`; the Formula (16)/(17) **Type B** routes and the Annex +B.1/B.2 resonant correction through `resonant_sound_reduction_index`; the +assembly and ISO 717 rating through `detailed_airborne_prediction` and +`detailed_impact_prediction`; the Part 2 B.3/B.4 reciprocity identity through +`reciprocity_impact_level`; and the two fiches through `.report()`. The airborne +model is stated by Clause 5 to carry no bias error and a standard deviation of +1,5 dB to 2,5 dB for buildings of homogeneous elements, assuming good workmanship +— the lower figure when every aspect is taken into account, the higher for +complex situations or when the structural reverberation time is neglected. + +**Not covered.** Only homogeneous Annex B elements are calculated here; the +spectrum of a lightweight, double or composite element is an input, from +[Predicting Panel Sound Insulation](/phonometry/buildings/design/panel-sound-insulation/) +or from a test report. The Annex E junction catalogue itself lives on +[Predicting Sound Insulation](/phonometry/buildings/design/insulation-prediction/), +as do the Annex D and F default tables of the other parts. The Type B branch is +shown from its standard inputs rather than worked end to end. Airborne +transmission through cavities and suspended ceilings is not carried at all, and +clause 3.3.4 Note 1 warns it "can contribute to or even dominate" there. And the +ISO 717 rating needs the whole spectrum: 100 Hz to 3150 Hz in one-third octaves, +or 125 Hz to 2000 Hz in octaves. + ## See also - [Predicting Sound Insulation (EN 12354)](/phonometry/buildings/design/insulation-prediction/): the diff --git a/site/src/content/docs/buildings/design/impact-improvement.mdx b/site/src/content/docs/buildings/design/impact-improvement.mdx index fd7a08bce..2c24f2e67 100644 --- a/site/src/content/docs/buildings/design/impact-improvement.mdx +++ b/site/src/content/docs/buildings/design/impact-improvement.mdx @@ -66,6 +66,76 @@ concrete plate; a standard tapping machine excites it and the structure-borne covering. For locally-reacting coverings that acceleration-level difference equals the ISO 10140 impact sound reduction. +### "Locally reacting" is the condition the whole method rests on + +Clause 3.3 defines it: a covering is **locally reacting** when the impact is +transmitted into the bearing floor *predominantly through the area the hammers +directly excite*. The energy does not spread sideways through the covering +itself, so — as the standard's own note says — the improvement does not depend on +the size of the specimen. That single property is what lets a +120 cm × 80 cm plate stand in for a full transmission suite: if a 1 m² sample and +a 20 m² floor give the same $\Delta L$, the small rig is not an approximation of +the large one, it is the same measurement. + +The qualifying family is named in the scope: soft, flexible coverings — carpets, +PVC and linoleum — which map onto ISO 10140-1:2010 Annex H, **category I**. The +disqualifying family is anything with a stiff wearing layer that distributes the +hammer load over an area the specimen's own size then bounds: laminates, click +systems, and any floating floor, whose screed is precisely a load-spreading +plate. The standard states the consequences plainly. For non-soft, non-flexible +floorings "increased deviations from the results of the ISO 10140 series method +may occur due to the dependency on the specimen size"; and **in the case of +difference with ISO 10140, the result of the ISO 10140 measurement shall be +used**. The mock-up never overrules the full-size suite. + +One rating rule follows from the same clause. Where more than one sample of the +same product is tested, the per-band $\Delta L$ of the samples are **arithmetically +averaged first, and ISO 717-2 is applied to the average** (Clause 6.5). Rating +each sample and averaging the ratings is a different number and is not what the +standard asks for. + +### The rig, and why every dimension of it is in the standard + +Annex A is normative and consists of two setup drawings. The slab is +(120 ± 5) cm × (80 ± 5) cm × (20 ± 1) cm, homogeneous and of uniform thickness, +flat to ± 1 mm along a horizontal line from edge to edge and hard enough to +endure the hammers — a screed may be added to provide the flatness. It rests on +four elastic supports at the corners, none exceeding 10 cm × 10 cm, and the +vertical resonance of the slab on those bearings shall lie **below 20 Hz**. At +least four accelerometer positions are screwed or glued to the lower surface, +uniformly but randomly distributed, avoiding symmetric lines and at least 10 cm +from the edges. The tapping machine takes at least two positions, at least 30 cm +apart, skew to the edges, with no hammer closer than 10 cm to an edge and all +four feet standing on the specimen. + +Each of those numbers is doing something. The 20 cm thickness reproduces the +ISO 10140 standard heavyweight floor, which is what makes the improvement +transferable to a real building. The sub-20 Hz support resonance puts the whole +measurement range above the rigid-body modes, so the plate behaves as a free +body and its acceleration reflects only the force the hammers inject. The +flatness matters because $\Delta L$ is the ratio of two force inputs and an +uneven surface changes how the hammers strike. The edge clearances and the +randomised, asymmetric positions keep the four-position average from landing on a +nodal line of the plate's own modes. And the four accelerometer levels and two +machine positions are not decoration: Formula (4) averages $\Delta L$ over the +$t \times a$ pairs, which is exactly what `impact_improvement` consumes. + + + +The instrument chain is specified too (Clause 5.2): the measurement system shall +be declared to meet IEC 61672-1 class 1 with the microphone replaced by the +accelerometer, the one-third-octave filters IEC 61260 class 1, the tapping +machine ISO 10140-5, and the vibration calibration ISO 16063. The standard warns +that the bare plate's acceleration signal is a train of extremely short pulses +which some otherwise-compliant chains handle badly, and asks for a first-use +check against an ISO 10140 measurement. Three cycles are recorded — with the +specimen, without it (hammer positions repeating within ± 2 cm) and background — +each averaged for **not less than 20 s**, with temperature and humidity noted +before and after and the chain calibrated before and rechecked after. + +None of this is checked by the library, which starts from the measured +acceleration levels: conformity of the facility is the operator's to demonstrate. + **Acceleration level (Formula (1)).** $L_a = 10\log_{10}(\langle a^2\rangle / a_0^2)$ dB, reference $a_0 = 10^{-6}\ \text{m/s}^2$. **Background correction (Formula (2))** follows the ISO 10140 three-branch rule (unchanged ≥ 15 dB; energy subtraction @@ -86,6 +156,22 @@ $C_{I,\Delta} = C_{I,r,0} - C_{I,r}$ (ISO 717-2:2020 Formula (A.4)), exposed as `ci_delta` on the result and standalone as `impact_improvement_adaptation_term()`. +**And $C_{I,\Delta}$ is half the answer, so read it.** The weighted rating slides +a reference curve until the excess fits, which rewards improvement wherever in +the spectrum it happens; real footfall noise is dominated by the low and mid +bands, where a thin resilient covering does least. $C_I$ is the adaptation term +that compares the *unweighted* energetic sum with the weighted rating, and +$C_{I,\Delta} = C_{I,r,0} - C_{I,r}$ contrasts the reference floor as it is +against the reference floor with the covering on it, with $C_{I,r,0}$ fixed at +$-11$ dB (A.2.2; $-10{,}3$ dB when one decimal is required). Formula (A.5) then +says what the pair means: +$\Delta L_\text{lin} = \Delta L_w + C_{I,\Delta}$. This page's carpet is rated +29 ($-13$) dB, so on the flat-response scale it buys **16 dB**, not 29. A +strongly negative $C_{I,\Delta}$ is the signature of a covering that works only +high up — typical of thin resilient layers, and exactly where the tapping machine +flatters them; a covering with $C_{I,\Delta}$ near zero improves the whole range. +A fiche that prints only $\Delta L_w$ has told you the better half of the story. +
@@ -117,6 +203,14 @@ from phonometry import building delta_l = [5, 8, 10, 14, 18, 23, 30, 31, 39, 49, 53, 57, 60, 67, 68, 71] print(building.weighted_impact_improvement(delta_l)) # 29 dB (carpet) +# Two samples of the same product: average the per-band improvements FIRST, +# then rate the average (Clause 6.5). Rating each sample and averaging the +# ratings is a different number. +import numpy as np +sample_a = np.array(delta_l, dtype=float) +sample_b = sample_a + np.array([1, 0, -1, 1, 0, -1, 1, 0, -1, 1, 0, -1, 1, 0, -1, 1]) +print(building.weighted_impact_improvement(0.5 * (sample_a + sample_b))) # 29 dB + # From the measured bare/covered acceleration levels, with a background trace: freqs = [100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150] @@ -134,6 +228,23 @@ res.plot() # the delta-L(f) improvement spectrum above (needs matplot ## ISO 16251-1 impact-improvement report (`.report()`) +Clauses 8 and 9 decide what a result has to carry to be reportable, and most of +it is yours to supply rather than the library's to compute. Beside the improvement +itself the table must show the **bare-plate acceleration level $L_{a,0}$** with +its reference $a_0$, the per-band $\Delta L$ of *every* sample tested, their +average where there is more than one, the weighted improvement(s) and the +adaptation term(s) — all rounded to **one decimal place**, with any band whose +background correction hit the 1,3 dB limit written as "> $\Delta L$". The report +then adds: the manufacturer and product identification, a detailed description of +the covering with the number and size of the specimens, the **method of mounting, +in particular the adhesive with its mass per area and curing time**, the +temperature and humidity during the test, the **positions of the tapping machine +and the accelerometers**, and a statement of whether the specimen suffered +visible damage such as compaction. Those map onto the `manufacturer`, `specimen`, +`mounting`, `mass_per_area`, `temperature`, `pressure`, `test_date` and `notes` +fields of `ReportMetadata` below; the damage statement and the mounting detail +have no field of their own and belong in `notes`. + `FloorCoveringImprovementResult.report(path)` writes a one-page accredited impact-improvement fiche: the standard-basis line, a metadata header, the per-band table (frequency and $\Delta L$, bands at the 1.3 dB limit prefixed diff --git a/site/src/content/docs/buildings/design/index.md b/site/src/content/docs/buildings/design/index.md index 781f0c43a..60a34c3ab 100644 --- a/site/src/content/docs/buildings/design/index.md +++ b/site/src/content/docs/buildings/design/index.md @@ -39,10 +39,12 @@ detailed model buys is the spectrum behind the single number. [Predicting Panel Sound Insulation](/phonometry/buildings/design/panel-sound-insulation/) goes one level deeper, to where the element $R$ itself comes from: the mass law -and the coincidence dip of a single panel, the mass-spring-mass behaviour of a -double wall, transmission through slits and apertures, plate radiation -efficiency and point mobilities. It is the physics a catalogue value expresses -in one number. +and the coincidence dip of a single panel, the plateau shortcut that estimates +the whole curve by hand, the coincidence *range* of a corrugated or ribbed sheet, +the mass-spring-mass behaviour of a double wall and the wall-tie bridge that +limits a masonry cavity one, transmission through slits and apertures, plate +radiation efficiency and point mobilities. It is the physics a catalogue value +expresses in one number. Two pages here carry the floor half of any design, one measuring and one predicting. @@ -71,15 +73,29 @@ takes that source description, loses part of it to the coupling term the source and receiver mobilities set, and carries the rest to a room that may be several junctions away. -One bookkeeping note runs through the whole section: the family exists as -EN 12354:2000 and as ISO 12354:2017, and the two are not interchangeable in -every clause. The simplified models on -[Predicting Sound Insulation](/phonometry/buildings/design/insulation-prediction/) -follow the 2000 text — including the tabulated flanking correction $K$ that the -2017 impact part replaced with explicit per-path formulae — while -[Detailed Per-Band Prediction](/phonometry/buildings/design/detailed-prediction/) -follows the 2017 text. Check which edition your regulation calls up before -quoting a correction from either. +**EN 12354 or ISO 12354?** One bookkeeping note runs through the whole section. +The prediction family was published by CEN as EN 12354-1 to -6 and later +reissued by ISO as a second edition, ISO 12354-1:2017 and ISO 12354-2:2017, +which is not word for word the earlier text: where a formula changed between the +prints, the [errata registry](/phonometry/reference/errata/) records both. Parts +3 to 6 keep their EN designation in the editions used here. Every guide names +the edition it was read from — EN 12354-1:2000 and EN 12354-2:2000 for the +simplified models on +[Predicting Sound Insulation](/phonometry/buildings/design/insulation-prediction/), +including the tabulated flanking correction $K$ that the 2017 impact part +replaced with explicit per-path formulae; ISO 12354-1:2017 and ISO 12354-2:2017 +for the per-band models and the Annex L/G worked examples of +[Detailed Per-Band Prediction](/phonometry/buildings/design/detailed-prediction/); +and EN 12354-3:2000 to EN 12354-6:2003 for façades, service equipment and +enclosed spaces. Check which edition your regulation calls up before quoting a +clause or a correction from either. + +And one caveat both parts print, in Clause 5: the models predict the *measured* +performance of buildings **assuming good workmanship and high measurement +accuracy**. A prediction is therefore a statement about a correctly built +construction, not about the one that will be built; the standard's own advice is +to vary the uncertain inputs and read the spread in the answer, which +ISO 12354-1:2017 Annex K systematises into an uncertainty on the result. Every prediction here starts from measured data that came from somewhere else, and the design report has to say where. The element $R$ and $L_n$ come from @@ -104,9 +120,11 @@ measurement in [Sound insulation](/phonometry/buildings/insulation/). junction conversion, the flanking indices per band and the per-path contributions behind the rating. - [Predicting Panel Sound Insulation](/phonometry/buildings/design/panel-sound-insulation/): - the mass law and coincidence dip (Sharp), double walls (Bies), slits and - apertures (Gomperts, Wilson-Soroka), radiation efficiency - (Leppington/Maidanik) and point mobilities (Cremer). + the mass law, the plateau shortcut and the coincidence dip of a single panel + (Sharp, Norton), the coincidence range of a corrugated or ribbed sheet + (Vigran/Heckl), double walls and the wall-tie bridge of a masonry cavity wall + (Bies, Hopkins), slits and apertures (Gomperts, Wilson-Soroka), radiation + efficiency (Leppington/Maidanik) and point mobilities (Cremer). - [Floor-Covering Impact Improvement (ISO 16251-1)](/phonometry/buildings/design/impact-improvement/): the weighted improvement of a soft floor covering measured on a small heavyweight mock-up. diff --git a/site/src/content/docs/buildings/design/installed-structure-borne.mdx b/site/src/content/docs/buildings/design/installed-structure-borne.mdx index 5c3d37b70..bb82f06fd 100644 --- a/site/src/content/docs/buildings/design/installed-structure-borne.mdx +++ b/site/src/content/docs/buildings/design/installed-structure-borne.mdx @@ -82,9 +82,8 @@ plt.show() ## 1. Coupling and installed power Only part of the characteristic power is injected into the supporting element; -the loss is the **coupling term** $D_C$ (always positive), set for a point -excitation by the source mobility $Y_s$ and the receiver mobility $Y_i$ -(Formula 19b): +the loss is the **coupling term** $D_C$, set for a point excitation by the +source mobility $Y_s$ and the receiver mobility $Y_i$ (Formula 19b): $$ D_{C,i} = 10\log_{10}\frac{|Y_s + Y_i|^2}{|Y_s|\,\mathrm{Re}\{Y_i\}}, @@ -96,6 +95,23 @@ mobility, Formula 19c) and to $-10\log_{10}(|Y_s|\,\mathrm{Re}\{Z_i\})$ for a ** mobility $Y_k$ inside the modulus (Formula 19e). The **installed** power level is then (Formula 18b) $L_{Ws,\mathrm{inst}} = L_{Ws,c} - D_C$. +The two limits are usable once the mobilities differ by about an order of +magnitude: at $|Y_s|/|Y_i| = 10$ the force-source form is 0.8 dB below the exact +Formula 19b value and at 100 it is 0.1 dB below, while between those extremes the +phase relationship decides the answer and Formula 19b must be evaluated with +complex mobilities rather than magnitudes. Read the two idealisations +physically: a **force source** imposes its force whatever the receiver does, so a +stiffer receiver simply vibrates less and accepts less power, and $D_C$ stops +depending on the receiver's magnitude at all; a **velocity source** imposes its +motion, so a stiffer receiver now takes *more* power out of it and the dependence +inverts. A pump on a concrete slab is the textbook force source; a heavy machine +bolted rigidly to a light timber floor is the case where the intuition flips, and +the mid range — a mounted machine near its support resonance — is where $D_C$ is +smallest and can even go negative, because the $|Y_s + Y_i|^2$ numerator collapses +when the two mobilities are comparable and in antiphase. The exact curve bottoms +out at matched mobilities, which is best power transfer and therefore worst +isolation. + This is the same $L_{Ws,\mathrm{inst}}$ as the Annex I mobility correction of the introduction, reached by a different route: use Formula (18b) when $D_C$ is known from the two mobilities, and the direct correction @@ -123,10 +139,121 @@ from phonometry import building # A near-force source (Y_s >> Y_i) on a concrete floor: dc = building.coupling_term(2e-4 + 1e-4j, 3e-5 + 1e-5j) -print(round(float(dc), 2)) # ~8.5 dB -print(round(float(building.installed_structure_borne_power_level(82.0, dc)), 1)) # installed L_Ws +print(round(float(dc), 2)) # 9.86 dB +print(round(float(building.installed_structure_borne_power_level(82.0, dc)), 1)) # 72.1 dB + +# The two limits, for comparison: |Y_s|/|Y_i| is only 7 here, so the +# force-source form is already 1.1 dB away from the exact Formula 19b value. +print(round(float(building.coupling_term_force_source(2e-4 + 1e-4j, 3e-5 + 1e-5j)), 2)) # 8.72 +print(round(float(building.coupling_term_velocity_source(2e-4 + 1e-4j, 1 / (3e-5 + 1e-5j))), 2)) # -8.27 +``` + + + +*The whole of Formula 19b on one axis. Far to the right the source is a force +source and $D_C$ follows $10\lg(|Y_s|/\mathrm{Re}\{Y_i\})$; far to the left it is +a velocity source and follows $-10\lg(|Y_s|\,\mathrm{Re}\{Z_i\})$; the exact curve +leaves both asymptotes within about a decade of matched mobilities, where it +reaches its minimum of 6.2 dB — maximum power transfer, minimum isolation. The +pump of the snippet sits at a ratio of only 7.1, which is why its exact 9.9 dB is +1.1 dB above the force-source limit. Adding an elastic support (Formula 19e) +shifts the whole curve up: a transfer mobility of $10^{-4}$ m/(N·s) buys 2.7 dB +at the pump's ratio and one of $10^{-3}$ buys 13.7 dB, which is the isolation +budget of a mount read straight off the coupling term.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np +# `building` is the module imported by the snippet above. + +yi = 3e-5 + 1e-5j # receiver mobility, fixed +ratio = np.logspace(-3.0, 3.0, 400) # |Y_s| / |Y_i| +ys = abs(yi) * ratio * (2 + 1j) / abs(2 + 1j) + +exact = np.array([float(building.coupling_term(a, yi)) for a in ys]) +force = np.array([float(building.coupling_term_force_source(a, yi)) for a in ys]) +velocity = np.array([float(building.coupling_term_velocity_source(a, 1 / yi)) + for a in ys]) + +fig, ax = plt.subplots() +ax.semilogx(ratio, exact, label="Formula 19b (exact)") +ax.semilogx(ratio, force, "--", label="force source (19c)") +ax.semilogx(ratio, velocity, ":", label="velocity source (19d)") +for yk in (1e-4, 1e-3): # elastic support, Formula 19e + ax.semilogx(ratio, [float(building.coupling_term(a, yi, transfer_mobility=yk)) + for a in ys], label=f"with $Y_k$ = {yk:g} m/(N·s)") +ax.plot(7.07, 9.86, "o") # the pump of the snippet +ax.set(xlabel="Mobility ratio $|Y_s| / |Y_i|$", ylabel="Coupling term $D_C$ [dB]") +ax.legend() +plt.show() +``` + +
+ +### Where the machine is fixed is part of $Y_i$ + +The receiver mobility is not a material constant of the element; it is a +property of the *point* the machine is bolted to. EN 12354-5 Annex F.3 gives +three routes to it, in decreasing order of authority. + +**Measured.** Point mobilities at the actual contact points, normal to the +surface, per ISO 7626-1 with single-point translational excitation per +ISO 7626-2 (impact excitation per ISO 7626-5 is allowed), narrowband and then +reduced to one-third octaves. The receiver must **not** be dynamically loaded +while its mobility is measured — an important asymmetry with the source, which +is isolated or freely suspended instead. + +**Calculated, mid-panel.** For excitation in the centre area of a large +homogeneous element, Formula (F.4) gives the real, frequency-independent +infinite-plate value $Y_{i,\infty} = 1/(8\sqrt{m'B'}) = (2{,}3\,c_L\rho t^2)^{-1}$, +which is `vibration.infinite_plate_mobility(B, m)` in the library. +It is valid only *above* the element's lowest resonance +$f_{11} = (c_0^2/4f_c)(1/l_1^2 + 1/l_2^2)$ (Formula F.5); below $f_{11}$ the +mobility turns complex and is set by the stiffness of the element's supports, not +by its own mass and bending stiffness. For the 5,00 m × 4,00 m, 220 mm concrete +floor of the worked building $f_{11}$ is 39 Hz, comfortably below the range, but +for a 1,20 m × 0,80 m concrete plinth of the same thickness it is 781 Hz, right in +the middle of it — so on small stiff elements the closed form is the wrong tool. +Elements with beams split again (Formula F.3.2): below $f_{11}$ use the effective +bending stiffness $\sqrt{B'_xB'_y}$; above it, excitation between the beams uses +the plate field and excitation on a beam uses the beam's own mobility. + +**Corrected for the fixing position.** Near a rigid edge the real part collapses +as $\mathrm{Re}\{Y_i\} = \mathrm{Re}\{Y_{i,\infty}\}\,[1 - J_0(2k_Ba)]$ (Formula +F.6a, with a corner form F.6b), $a$ being the distance to the edge. This makes +the fixing distance a design variable rather than a detail: on that same concrete +floor at 63 Hz, bolting the machine 0,20 m from a wall leaves 6,5 % of the +mid-panel real mobility — 11,9 dB less injected power — and 0,50 m leaves 37 %, +worth 4,3 dB. Move a pump towards a junction and it feeds the building less. + +```python +import numpy as np +from scipy.special import j0 + +rho, c_l, t = 2200.0, 3800.0, 0.220 # concrete, 220 mm +m, b = rho * t, c_l**2 * rho * t**3 / 12.0 # mass per area, bending stiffness +y_inf = 1.0 / (8.0 * np.sqrt(m * b)) # Formula (F.4), mid-panel +print(f"{y_inf:.3g}") # 1.07e-06 m/(N.s) + +f_c = 343.0**2 / (1.8 * c_l * t) # critical frequency +f_11 = 343.0**2 / (4 * f_c) * (1 / 5.0**2 + 1 / 4.0**2) +print(round(f_c, 1), round(f_11, 1)) # 78.2 Hz, 38.6 Hz -> F.4 valid here + +f, a = 63.0, 0.20 # 0.20 m from a rigid edge +k_b = np.sqrt(2 * np.pi * f) * (m / b) ** 0.25 +print(round(float(1 - j0(2 * k_b * a)), 3)) # 0.065 +print(round(float(-10 * np.log10(1 - j0(2 * k_b * a))), 1)) # 11.9 dB less ``` +The transfer mobility $Y_k$ of Formula (19e) is not a plate quantity at all: it +is the dynamic transfer stiffness of the mount, measured on the +[ISO 10846 rig](/phonometry/vibration/structural/transfer-stiffness/). The fixing +position and the mount's data sheet both belong in the report's `notes`, because +they are the two things that make a repeat prediction reproducible. + ## 2. Transmission to the receiving room EN 12354 parts 1 and 2 handle rooms excited through the air and by the @@ -140,6 +267,27 @@ its own adjustment term and flanking index: +The diagram draws the simple case, one junction between the excited element and +the radiator. In parts 1 and 2 the two rooms always share the separating element, +and clause 4.2.4 of ISO 12354-1 says in so many words that the model describes +transmission between *adjacent* rooms. Service equipment breaks that assumption +routinely: the standard's own flushing-cistern example puts the receiving room +diagonally below the bathroom, and a riser or a lift shaft can be three junctions +away from whoever complains. Annex F.1 says what to do. $K_{ij}$ then stops being +the invariant of one junction and has to be read as covering the whole chain: the +junction indices add along the path (Formula F.1), the intermediate elements' +equivalent absorption lengths may be taken numerically equal to their areas as a +first estimate for large or well-damped elements, and an adjustment $\Delta K$ +covers the longitudinal and in-plane waves that bending-wave theory misses — +about 4 dB for two junctions and 6 dB for three or more, with the chained +$K_{ij}$ floored near $-5$ dB, which corresponds to total structure-borne +transmission. Two consequences for the input you supply here: an +$R_{ij,\mathrm{ref}}$ computed for a single junction over-predicts the insulation +of a multi-junction route, and several distinct routes usually join the same +element pair, each of which must be counted as its own path or folded into one +effective $R_{ij,\mathrm{ref}}$ first. Where the paths become many, Annex F.1 +points at a full SEA model instead. + Each transmission path $i \to j$ gives a normalised sound pressure level from the installed power, the structure-to-airborne adjustment term $D_{sa}$, the flanking sound reduction index $R_{ij,\mathrm{ref}}$ (EN 12354-1) and the element area @@ -150,7 +298,33 @@ L_{n,s,ij} = L_{Ws,\mathrm{inst},i} - D_{sa,i} - R_{ij,\mathrm{ref}} - 10\log_{10}\frac{S_i}{S_0} - 10\log_{10}\frac{A_0}{4}, $$ -with $S_0 = A_0 = 10\ \text{m}^2$, and the paths combine energetically (Formula 17). +with $S_0 = A_0 = 10\ \text{m}^2$. Read the five terms in order, because each one +undoes a different normalisation. $L_{Ws,\mathrm{inst},i}$ is the power that +actually entered element $i$. $D_{sa,i}$ converts that structural excitation into +the equivalent *airborne* excitation, so that the next term may be an airborne +quantity at all. $R_{ij,\mathrm{ref}}$ is that airborne flanking index, defined +for a reference element of $S_0 = 10\ \text{m}^2$. $10\lg(S_i/S_0)$ therefore +puts the real element back: the same injected power spread over a larger element +gives a smaller vibration amplitude per unit area, so a bigger $S_i$ lowers the +radiated level. And $10\lg(A_0/4)$ turns radiated power into a reverberant sound +pressure level, through the diffuse-field relation +$p^2 = 4\rho_0c_0W/A$ evaluated at the reference absorption area $A_0$. That last +term is what "normalised" means on this page: the result is the level the room +*would* have if its equivalent absorption area were 10 m². A real room with more +absorption than that measures lower; ISO 16032 field measurements of service +equipment are usually *standardised* instead, referred to a reverberation time of +0,5 s, and the two are not interchangeable. + +The paths then combine energetically, band by band (Formula 17): + +$$ +L_{n,s} = 10\log_{10}\sum_{ij} 10^{L_{n,s,ij}/10}. +$$ + +`res.total_level` is that per-band combination and `res.overall_level` the sum +over the spectrum of it. For the flushing cistern of Annex I.3 the four paths +total 41,4 dB at 63 Hz and the whole spectrum closes at 29 dB(A) — see the +weighting note below the snippet. ### The adjustment term $D_{sa}$ @@ -228,6 +402,35 @@ The `InstalledSourceResult` carries the per-path levels, the total per band, the installed power level and `.overall_level`, and its `.plot()` draws the whole cascade. +### `overall_level` is not the number a regulation limits + +`overall_level` is the plain energetic sum of the per-band $L_{n,s}$ over the +bands you supplied. It is **not** A-weighted, and the quantity every national +requirement for service-equipment noise is written in — and the quantity the +ISO 16032 field measurement produces — is the A-weighted single number +$L_{n,s}(A)$. Both of EN 12354-5's worked examples close on one: 26 dB(A) for the +Annex I.2 whirlpool bath and 29 dB(A) for the Annex I.3 cistern. The gap is not +small. Service-equipment spectra are weighted to the low bands, exactly where the +A-weighting is steepest, so for the Annex I.3 cistern the unweighted sum is +44,0 dB against the standard's 29 dB(A) — fifteen decibels of headroom that does +not exist. Weight the band levels before summing them: + +```python +import numpy as np + +# Annex I.3 total per octave band, and the A-weighting corrections for those +# nominal centres (ISO 3744 Annex E Table E.2 / IEC 61672-1). +l_ns = np.array([41.4, 39.6, 30.5, 28.9, 18.5, 4.4]) # 63 Hz to 2 kHz +a_corr = np.array([-26.2, -16.1, -8.6, -3.2, 0.0, 1.2]) +print(round(float(10 * np.log10(np.sum(10 ** (0.1 * l_ns)))), 1)) # 44.0 dB +print(round(float(10 * np.log10(np.sum(10 ** (0.1 * (l_ns + a_corr))))), 1)) # 29.3 dB(A) +``` + +Read a result against that scale, not against the unweighted total: 29 dB(A) for a +cistern and 26 dB(A) for a whirlpool bath are what the standard's own conforming +examples produce, and dwelling limits for service equipment usually sit in the +low thirties. + ## 3. The prediction report (`.report()`) A prediction ends as a *document*. The `InstalledSourceResult` exposes a @@ -251,6 +454,15 @@ otherwise only the installed power and the combined total are shown. `language="es"` renders the Spanish fiche with comma decimals. The basis strip states Formulae 18a/17 and the prediction disclaimer. +Two numbers in the snippet below are the standard's, not invented: `16.2` is the +coupling term of the Annex I.3 cistern at its wall contact, and the `lwc` array is +that cistern's characteristic power level, the 84,4 dB the +[EN 15657 page](/phonometry/buildings/design/structure-borne-power/) derives at +63 Hz. `requirement` is compared against `overall_level`, so the 45 dB below is an +*unweighted* band-sum limit; a regulation stated in dB(A) has to be checked +against the A-weighted sum of the previous section instead, and against this +example's spectrum the two differ by about 15 dB. + ```python import numpy as np from phonometry import ReportMetadata, installed_source_prediction diff --git a/site/src/content/docs/buildings/design/insulation-prediction.mdx b/site/src/content/docs/buildings/design/insulation-prediction.mdx index c771c44fb..881019ca0 100644 --- a/site/src/content/docs/buildings/design/insulation-prediction.mdx +++ b/site/src/content/docs/buildings/design/insulation-prediction.mdx @@ -92,11 +92,58 @@ R_{ij,w} = \tfrac{R_{i,w} + R_{j,w}}{2} + \Delta R_{ij,w} + K_{ij} $$ where $l_0 = 1$ m is the reference coupling length, $l_f$ the junction coupling -length and $K_{ij}$ the junction's **vibration reduction index** (Annex E, -empirical in the mass ratio $M = \log_{10}(m'_{\perp,i}/m'_i)$). +length and $K_{ij}$ the junction's **vibration reduction index**. + +### Reading $K_{ij}$ + +$K_{ij}$ is a property of the junction alone, and that is the whole point of it. +It is the average of the two velocity level differences measured across the +junction, corrected for the coupling length and for the equivalent absorption +lengths of the two elements, so the same junction carries the same $K_{ij}$ +whatever building it is built into — which is what lets a catalogue of junction +types exist. Bigger is better: $K_{ij}$ enters Formula (28a) with a plus sign, so +a high value is a junction that does not pass vibration on. The ranges are worth +carrying in your head. A rigid cross junction of similar masses sits around +8–13 dB and a rigid T junction about 3 dB lower (Annex E.3.2/E.3.3 give +$K_{13} = 8{,}7 + 17{,}1M + 5{,}7M^2$ and $5{,}7 + 14{,}1M + 5{,}7M^2$); the +corner and thickness-change junctions of Annex E.3.6 fall to $15M - 3$ dB +(floored at $-2$ dB) and $5M^2 - 5$ dB, so at the worked example's mass ratio +they return 0,1 dB and $-4{,}8$ dB — a junction that hides nothing; and a +resilient interlayer or a lightweight double-leaf junction can exceed 20 dB +(the same mass ratio through a `flexible_t` gives 20,9 dB). That upper range is +what makes the internal wall of the worked example below almost invisible: it is +the weakest element on the list at $R_w$ = 33 dB, yet the 33,5 dB tabulated for +its $K_{Ff}$ takes its Ff path out of the sum entirely. On this model a bad +element behind a good junction beats a good element behind a bad one. For the +simplified model the Annex E values are read once, at 500 Hz, and stand in for a +quantity that is only approximately frequency-independent. + +The mass argument is the place readers come unstuck. The Annex E fits are +quadratic in $M = \lg(m'_{\perp,i}/m'_i)$ — the base-ten **logarithm** of the +mass ratio, with $m'_i$ the element carrying the path and $m'_{\perp,i}$ the +perpendicular element of the junction (Formula E.3). The library takes the +**mass ratio itself** and forms $M$ internally, so `mass_ratio=1.61` means the +perpendicular element is 1,61 times as heavy per unit area. Any positive number +is accepted, so passing an already-logged value returns a plausible but wrong +answer: `junction_vibration_reduction("rigid_cross", "through", 0.2068)` returns +$-0{,}3$ dB where the answer is 12,5 dB. And because $m'_i$ is the element *in +the transmission path*, the same junction has a different mass ratio for +$K_{13}$ and for $K_{12}$ — the ratio is per path, not per junction. + + + +Each drawing above maps onto one `(junction_type, path)` argument pair, and the +path branch matters as much as the junction type: on the same rigid cross of the +worked example, `path='through'` gives 12,5 dB and `path='corner'` 8,9 dB. +*Per-path indices above, share of transmitted energy below. The direct path is +the strongest single contributor at 33 %, yet two thirds of what arrives in the +receiving room has gone around the wall — which is the 5 dB between +$R_{s,w} = 57$ dB and $R'_w = 52$ dB. The dashed line is the assembled $R'_w$, +which necessarily sits below every individual path.* + ```python import numpy as np from phonometry import building @@ -174,7 +221,23 @@ plt.show() Every added flanking path strictly lowers $R'_w$ below the direct $R_{Dd,w} = 57$; `res.paths` exposes each path's share of the transmitted energy so the dominant -path is visible. `flanking_element` is a convenience that builds one junction's +path is visible. + +**Read the split as a budget, because that is the practical yield of the whole +model.** The direct path is the largest single contributor here and it still +carries only 33 % of the transmitted energy: two thirds of what arrives has gone +*around* the wall. So perfecting the separating wall — making it infinitely good, +not merely better — removes at most a third of the total, which is +$-10\lg(1 - 0.33) = 1.8$ dB. Specifying a heavier partition on this construction +would be wasted money; the floor, the ceiling and the façade carry the rest, and +a junction detail or a lining on *them* is what moves the answer. The rule +generalises: the best achievable improvement from fixing one path is +$-10\lg(1 - \text{its energy fraction})$ dB, so a path below about 10 % of the +total is worth at most 0,5 dB and is not worth touching, while a path at 50 % is +worth 3 dB and one at 80 % is worth 7 dB. Rank the paths, spend on the top of the +list, and stop when the next one is under a decibel. + +`flanking_element` is a convenience that builds one junction's three paths at once; the single-path constructor behind it, `flanking_path`, builds one `Ff`, `Df` or `Fd` path at a time (Formula 28a). Clause 4.4.2 also enforces a floor $K_{ij} \ge K_{ij,\min}$ from the junction geometry @@ -183,7 +246,16 @@ enforces a floor $K_{ij} \ge K_{ij,\min}$ from the junction geometry automatically per path; or compute the floor yourself with `junction_min_vibration_reduction` and pass it to `flanking_path(..., kij_min=...)`, which raises a below-floor $K_{ij}$ to the -minimum: +minimum. + +Why a floor at all? $K_{ij}$ is defined relative to the equivalent absorption +lengths of the two elements, so on small elements the normalisation itself limits +how much junction isolation may be claimed: energy arriving at a small, lightly +damped element has nowhere to be dissipated except back across the junction it +came through. The floor therefore rises as the elements shrink or the coupling +length grows. On dwelling-scale elements it is normally negative and inactive; a +prediction in which the clamp *is* active is a signal that an Annex E tabulated +value is being applied outside the geometry it was fitted on. ```python from phonometry import building @@ -195,6 +267,36 @@ print(round(building.junction_min_vibration_reduction(coupling_length=4.5, s_i=11.5, s_j=11.5), 1)) # -1.1 ``` +### Two linings on one path do not add + +`delta_r_ff`, `delta_r_fd`, `delta_r_df` and `flanking_path`'s `delta_r` are each +the **combined** improvement of one whole path, not one lining's rating. A path +usually has two ends, and both may be lined: a wall lining on the source side and +a suspended ceiling on the receiving side both sit on the same $Ff$ path. They do +not add. ISO 12354-1:2017 Formula (22) for the direct path and Formula (23) for +each flanking path both give + +$$ +\Delta R_{ij,w} = \Delta R_{i,w} + \frac{\Delta R_{j,w}}{2} +\quad\text{or}\quad +\Delta R_{j,w} + \frac{\Delta R_{i,w}}{2}\ \text{dB}, +$$ + +with the rule that decides which of the two: **half the value is taken for the +lining with the lower value; however, if both linings have a negative value, half +the value is taken for the lining with the higher value.** So two linings of ++12 dB and +6 dB give 12 + 3 = 15 dB, not 18; and two of $-4$ dB and $-9$ dB give +$-9 - 2 = -11$ dB, because with both negative it is the *less* negative one that +is halved. The sign rule inverts which lining is halved, and it is the part a +careful reader still gets wrong. + +The physics behind the halving is that two linings in series on the same +vibrational path are not independent: the second one operates on a field the +first has already reduced, so its full rating — measured on a bare element — is +not available a second time. ISO 12354-2 Clause 4.3.3 carries the same rule where +a floor covering and a receiving-side lining coexist. The direct path takes its +own combined $\Delta R_{Dd,w}$ through `delta_r_direct`. + The impact counterpart (EN 12354-2, Formula 21) is a direct subtraction: $L'_{n,w} = L_{n,w,eq} - \Delta L_w + K$, with the bare-floor equivalent level $L_{n,w,eq} = 164 - 35 \log_{10}(m'/m'_0)$ (Annex B), the covering improvement @@ -217,6 +319,30 @@ The frequency-band route of [Detailed Sound Insulation Prediction](/phonometry/buildings/design/detailed-prediction/) is anchored on the 2017 editions throughout. +**What the two mass inputs are, and where the closed form stops.** Annex B's +$164 - 35\lg(m'/m'_0)$ is not a theory: it is a regression fitted to measured +**homogeneous heavyweight** floors between **100 and 600 kg/m²**, and +`equivalent_impact_level` raises a `UserWarning` when it is called outside that +band. It works inside it because a bare massive slab's impact level is set by its +mass and by the roughly constant loss factor of masonry construction. It fails +outside it because a light or ribbed floor radiates through its own resonances +rather than as a damped homogeneous plate — so the closed form is meaningless for +a hollow-core, beam-and-block or joisted deck at any mass, and an extrapolation +for a 900 kg/m² vault. The $m'$ it wants is the mass of the **bare structural +floor**, without covering and without ceiling; the covering's effect is +$\Delta L_w$ and is subtracted separately. + +The flanking mass is a different quantity again: the arithmetic **mean over the +homogeneous flanking elements of the receiving room that carry no additional +layer**. A lined or dry-lined flanking wall is left out of the mean, not averaged +in at its bare mass. Table 1 itself applies to the rooms-one-above-the-other case +of the Annex E.3 example, and it is a *discrete nearest-neighbour lookup*, not an +interpolation: 145 kg/m² and 150 kg/m² both return $K$ = 2 dB, and masses outside +100–900 kg/m² (separating) or 100–500 kg/m² (flanking) clamp to the nearest edge +rather than extrapolating. Taken together, a lightweight building is outside this +whole simplified impact route and needs the measured normalised flanking impact +level path the 2017 edition prescribes. + ```python from phonometry import building @@ -227,6 +353,9 @@ k = building.impact_flanking_correction(322.0, 145.0) # Table 1 (sep imp = building.predicted_impact_insulation(ln_w_eq=ln_eq, delta_l_w=33.0, k_correction=k) print(round(ln_eq, 1), k, round(imp.l_prime_n_w, 1)) # 76.2 2 45.2 -> L'n,w = 45 dB +# The lookup is discrete: the next tabulated flanking mass gives the same K. +print(building.impact_flanking_correction(322.0, 150.0)) # 2, unchanged + # Exact Formula (3): L'nT,w = L'n,w - 10 lg(0.032 V). Annex E.3's own rounding # of the factor to 10 lg(V/30) sits 0.18 dB below; both give L'nT,w = 43 dB. print(round(building.standardized_impact_level(imp.l_prime_n_w, 50.0), 1)) # 43.2 L'nT,w @@ -301,7 +430,7 @@ element. | `k_ff` / `k_fd` / `k_df` | float | dB | — | Junction $K_{ij}$ for the three paths | | `separating_area` | float | m² | > 0 | Separating-element area $S_s$ | | `coupling_length` | float | m | > 0 | Junction coupling length $l_f$ | -| `delta_r_ff` / `delta_r_fd` / `delta_r_df` | float | dB | default `0` | Lining improvements per path | +| `delta_r_ff` / `delta_r_fd` / `delta_r_df` | float | dB | default `0` | **Combined** lining improvement of the whole path, both ends together (Formula 23) | | `flanking_area` | float | m² | default `None` | Flanking-element area $S_F$; enables the automatic $K_{ij,\min}$ clamp (Clause 4.4.2 / Formula 29) | ### `flanking_path()` parameters @@ -314,7 +443,7 @@ element. | `k_ij` | float | dB | — | Junction vibration-reduction index for this path | | `separating_area` | float | m² | > 0 | Separating-element area $S_s$ | | `coupling_length` | float | m | > 0 | Junction coupling length $l_f$ | -| `delta_r` | float | dB | default `0` | Lining improvement on this path | +| `delta_r` | float | dB | default `0` | **Combined** lining improvement of this path, both ends together (Formula 23) | | `kij_min` | float | dB | default `None` | When given, `k_ij` is floored at this Formula (29) minimum | `predicted_airborne_insulation()` returns an `AirbornePredictionResult` @@ -323,6 +452,52 @@ element. `ln_w_eq`, `delta_l_w`, `k_correction`). The simplified model carries a reported standard deviation of about 2 dB (Clause 5). +### When the simplified model applies + +Clause 4.4.4 of ISO 12354-1:2017 sets three conditions, and none of them is +about arithmetic. + +- **Similar frequency dependence.** The model assumes elements whose sound + reduction index has a broadly similar shape against frequency, since it works + on single numbers and a single number cannot carry two different shapes. A + masonry wall flanked by masonry is the model's home ground; a lightweight + double-leaf partition beside a concrete floor is explicitly named as the case + where the accuracy may be less. +- **Dwelling-scale geometry.** It applies mainly to dwellings whose element + dimensions are similar to those of a test facility. Move far from that — a + hall, a plant room, a very long junction — and the deviation grows. +- **Adjacent rooms only.** Clause 4.2.4 restricts the whole family to + transmission between rooms that share the separating element, and secondary + paths crossing more than one junction are neglected. Where the source is + several junctions away, the + [EN 12354-5 route](/phonometry/buildings/design/installed-structure-borne/) + chains the junction indices instead. + +And the ~2 dB standard deviation is not a tolerance on your answer. Clause 5 +prints it *assuming good workmanship and high measurement accuracy*, and adds the +advice that makes it usable: vary the input data, especially in complicated +situations and with atypical elements, and read the spread in the result; +Annex K systematises that into an uncertainty derived from the accuracy of every +acoustic input. + +The junction data deserve their own warning, because their spread is larger than +the model's. Annex E.3.1 states four things the page's lookup does not show. +Data exist only for junctions where the elements on either side **in the same +plane have the same mass**. The measured points scatter by a typical **±3 dB** +about the printed lines, and "in some cases the deviation can be much larger due +to variations in junction details and in workmanship" — which is larger than the +~2 dB of the whole model, so on most real predictions the junction input, not the +summation, dominates the error. The $K_{ij}$ values were deduced so that the +estimated junction velocity level difference is right *on average*, which puts +them generally **5 dB below** the direction-averaged junction velocity level +difference, so a measured $D_{v,ij}$ cannot be substituted for a $K_{ij}$ without +that step. And the frequency independence holds "at least in the frequency range +from 125 Hz to 2 000 Hz"; outside it the frequency effect can be larger. The way +out is measured data: ISO 10848-4 for heavy junctions — which Annex E.3.1 itself +recommends gathering at national level — and the +[flanking laboratory](/phonometry/buildings/insulation/flanking-lab/) where the +junction is lightweight, non-homogeneous or simply not in the catalogue. + ### EN 12354 prediction report (`.report()`) Both prediction results write a one-page **prediction** report through a @@ -425,8 +600,13 @@ subtraction $L'_{n,w} = L_{n,w,eq} - \Delta L_w + K$ through `building.standardized_impact_level`. Both results write a prediction fiche with `.report()`. -**Not covered.** The *detailed* per-band models of both parts; the -predictions here stop at the weighted single-number ratings. The element +**Not covered.** The *detailed* per-band models of both parts are the subject of +[Detailed Per-Band Prediction (ISO 12354)](/phonometry/buildings/design/detailed-prediction/): +the same standard run band by band, with the laboratory element and junction data +converted to their in-situ values before the paths are formed. Use the simplified +model here when only the weighted element ratings are known and the question is +whether the room passes; use the detailed one when the element spectra exist and +the question is which path sets which band. The element inputs themselves ($R_w$, $\Delta R_w$, $\Delta L_w$, mass per unit area) are taken as given, from laboratory data or from the mass-law estimates of [Predicting Panel Sound Insulation](/phonometry/buildings/design/panel-sound-insulation/). @@ -443,6 +623,12 @@ and EN 12354-6's absorption model in - [Façade Sound Insulation](/phonometry/buildings/insulation/facade-insulation/): the EN 12354-3 and EN 12354-4 predictions across the building envelope, with the ISO 16283-3 measurement they are compared against. +- [Detailed Per-Band Prediction (ISO 12354)](/phonometry/buildings/design/detailed-prediction/): + the same two parts run band by band, with the in-situ conversion of the + element and junction data the single-number model here takes as given. +- [Bending-wave transmission at plate junctions](/phonometry/vibration/structural/junction-transmission/): + the wave approach behind $K_{ij}$, with the index plotted against the plate + thickness ratio for the X, T and L junctions of the catalogue above. - [Field Insulation Measurement (ISO 16283)](/phonometry/buildings/insulation/insulation-field/): the measured in-situ quantities the prediction is checked against. - [Insulation Ratings (ISO 717)](/phonometry/buildings/insulation/insulation-ratings/): the diff --git a/site/src/content/docs/buildings/design/panel-sound-insulation.mdx b/site/src/content/docs/buildings/design/panel-sound-insulation.mdx index 98b6ecd1e..bc2928262 100644 --- a/site/src/content/docs/buildings/design/panel-sound-insulation.mdx +++ b/site/src/content/docs/buildings/design/panel-sound-insulation.mdx @@ -1,6 +1,6 @@ --- title: "Predicting Panel Sound Insulation" -description: "Theoretical airborne sound insulation of panels from physical properties: the mass law and coincidence dip (Sharp), double-wall mass-spring-mass behaviour, transmission through slits and apertures (Gomperts), plate radiation efficiency (Leppington/Maidanik) and the point mobilities of infinite plates and beams (Cremer)." +description: "Theoretical airborne sound insulation of panels from physical properties: the mass law, the plateau shortcut and the coincidence dip of a single panel (Sharp, Norton), the coincidence range of an orthotropic or corrugated sheet (Vigran/Heckl), double-wall mass-spring-mass behaviour and the wall-tie bridge of a masonry cavity wall (Hopkins), transmission through slits and apertures (Gomperts), plate radiation efficiency (Leppington/Maidanik) and the point mobilities of infinite plates and beams (Cremer)." references: - type: book authors: ["Bies, D. A.", "Hansen, C. H.", "Howard, C. Q."] @@ -32,6 +32,14 @@ references: publisher: "Taylor & Francis" doi: "10.1201/9781482266016" note: "Sections 3.7.3.3 (orthotropic plate eigenfrequencies, Eqs 3.113-3.115 after Timoshenko & Woinowsky-Krieger) and 6.5.3 (orthotropic panel transmission, Eqs 6.107-6.113 after Heckl 1960 and Hansen 1993). ISBN 978-0-415-42853-8." + - type: book + authors: ["Norton, M. P.", "Karczub, D. G."] + year: 2003 + title: "Fundamentals of noise and vibration analysis for engineers" + edition: "2nd ed." + publisher: "Cambridge University Press" + doi: "10.1017/CBO9781139163927" + note: "Section 3.9.1: the plateau method after Watters, with Table 3.1 (surface density per millimetre, plateau height and the B/A frequency ratio) behind PLATEAU_MATERIALS; Eqs. 3.104/3.106 (field-incidence mass law), Eq. 3.110 (the above-coincidence branch of the coincidence_model='cremer' variant) and problem 3.11, the worked brick wall reproduced here. ISBN 978-0-521-49913-2." - type: article authors: ["Hopkins, C.", "Wilson, R.", "Craik, R. J. M."] year: 1999 @@ -39,6 +47,19 @@ references: journal: "Applied Acoustics 58, 51-68" doi: "10.1016/S0003-682X(98)00068-1" note: "The measurement behind the 50 mm rows of Hopkins' Table A4: butterfly 1,7 MN/m, double-triangle 16,1 MN/m and vertical-twist 94,0 MN/m." + - type: article + authors: ["Hall, R.", "Hopkins, C."] + year: 2001 + title: "The measurement of dynamic stiffness of wall ties used in masonry cavity walls" + journal: "Proceedings of the Institute of Acoustics 23(8), 259-266" + note: "The 100 mm cavity row of Hopkins' Table A4: the proprietary vertical-twist tie at 43,4 MN/m." + - type: article + authors: ["Craik, R. J. M.", "Wilson, R."] + year: 1995 + title: "Sound transmission through masonry cavity walls" + journal: "Journal of Sound and Vibration 179(1), 79-96" + doi: "10.1006/jsvi.1995.0006" + note: "Table 1: the same tie types measured at an 85 mm cavity (butterfly 1,1 MN/m, double-triangle 4,3 MN/m), which corroborate the ordering of Table A4 but not its values, since the dynamic stiffness is defined at a given cavity width." --- import ThemeImage from '../../../../components/ThemeImage.astro'; @@ -51,10 +72,26 @@ airborne insulation of a single panel (the mass law and the coincidence dip), the double wall (its mass-spring-mass resonance), the transmission through slits and apertures that caps any real construction, the radiation efficiency of a bending plate, and the point mobilities that set the vibrational power a -structure absorbs. The measured counterparts these predictions feed live in +structure absorbs. Beside those it carries three shortcuts and special cases the +same sources give: the **plateau method**, a hand estimate of a single panel's +whole curve from a table of materials (Norton 3.9.1); the **orthotropic panel**, +where a corrugated or ribbed sheet has two critical frequencies and therefore a +coincidence *range* instead of a dip (Vigran 6.5.3); and the **wall-tie bridge** +that limits a masonry cavity wall whatever its leaves are worth (Hopkins +4.3.5.4). The measured counterparts these predictions feed live in [Predicting Sound Insulation (EN 12354)](/phonometry/buildings/design/insulation-prediction/) and [Field Insulation Measurement (ISO 16283)](/phonometry/buildings/insulation/insulation-field/). +**A note on two symbols before the formulae start.** The sound reduction index +$R$ of the European standards and the transmission loss $TL$ of the North +American literature this page follows are the *same quantity*, +$TL \equiv R = -10\lg\tau$; the page keeps each source's own symbol so its +formulae can be checked against the printed text, which is why the results expose +`transmission_loss` and rate it as $R_w$. Likewise, this page writes the mass per +unit area $m''$, which is Bies's and Hopkins's notation for the $m'$ used +throughout the ISO 12354 guides; $m$ alone is reserved elsewhere on the site for +the air power-attenuation coefficient of the reverberation formulae, in 1/m. + ## Single panel: the mass law and coincidence (Bies 7.2) @@ -122,6 +159,22 @@ The predicted spectrum plugs straight into the ISO 717-1 rating through `res.rating()`, and into EN 12354 as the "predicted" element $R$ where the standard would otherwise demand a laboratory measurement. +**Which loss factor is $\eta$?** The **total** loss factor of the element *as +mounted*, not the material's internal loss factor. In a mounted element the total +is internal plus radiation plus the losses at the edges, and for a heavy element +in a test opening the edge term dominates: ISO 12354-1 Annex C gives +$\eta_\text{tot,lab} \approx \eta_\text{int} + m'/(485\sqrt{f}) \approx 0{,}01 + +m'/(485\sqrt{f})$ for elements below 800 kg/m², reachable without leaving the +library as `laboratory_total_loss_factor`. For this 15 kg/m² pane that estimate +is 0,011 at 500 Hz, barely above the internal value; for a 484 kg/m² concrete +floor it is 0,055, five times the material figure. The measured route is the +structural reverberation time and $\eta = 2{,}2/(fT_s)$, the same quantity the +[ISO 10848](/phonometry/buildings/insulation/flanking-lab/) and +[EN 15657](/phonometry/buildings/design/structure-borne-power/) guides measure. +The stake is worth knowing: the dip depth carries $10\lg\eta$, so a factor of +three in $\eta$ moves the coincidence region by 4,8 dB and changes nothing below +$f_c/2$. + *The predicted Sharp spectrum rated exactly like a measurement: the @@ -165,7 +218,7 @@ ax.fill_between(w.band_centers, w.measured, w.shifted_reference, alpha=0.3, label="unfavourable deviations") ax.axvline(fc, ls=":", color="tab:green", label=f"fc = {fc:.0f} Hz") ax.set_xlabel("Frequency [Hz]") -ax.set_ylabel("Sound reduction index R [dB]") +ax.set_ylabel("Sound reduction index $R$ (transmission loss $TL$) [dB]") ax.set_title(f"Rw = {w.rating} dB (C={w.c:+d}; Ctr={w.ctr:+d})") ax.legend() plt.show() @@ -445,7 +498,8 @@ ax.semilogx(bands, flat.transmission_loss, "-o", ms=4, label="flat sheet") ax.semilogx(bands, corrugated.transmission_loss, "-s", ms=4, label="corrugated, integral") ax.semilogx(bands, heckl.transmission_loss, "--", label="Heckl approximation") -ax.set(xlabel="Frequency [Hz]", ylabel="Transmission loss TL [dB]") +ax.set(xlabel="Frequency [Hz]", + ylabel="Sound reduction index $R$ (transmission loss $TL$) [dB]") ax.legend() plt.show() ``` @@ -657,7 +711,7 @@ from phonometry import ( # A 2 mm x 100 mm-deep slit: its transmission peaks at the half-wavelength # resonances of the slit depth. -print(slit_resonance_frequencies(0.1, 0.002, orders=2).round().tolist()) # [~1500, ~3100] +print(slit_resonance_frequencies(depth=0.1, width=0.002, orders=2).round().tolist()) # [~1500, ~3100] # A wall of Rw = 50 dB with 1 % of its area left open as a slit is capped: print(round(float(composite_transmission_loss([0.99, 0.01], [50.0, 0.0])), 1)) # 20.0 @@ -682,7 +736,7 @@ import numpy as np from phonometry import slit_transmission_coefficient f = np.geomspace(100.0, 5000.0, 200) -result = slit_transmission_coefficient(f, 0.002, 0.1) +result = slit_transmission_coefficient(f, width=0.002, depth=0.1) # One line: the wall section with the slit to scale. result.plot_geometry() @@ -751,6 +805,41 @@ same event seen from the two sides — the same $\sigma$ reappears in the transmission factor of the detailed EN 12354 model and as the radiation factor ISO 7849 measures. + + +*Three regimes on one axis. Below $f_c$ the two panes differ by a factor of three +in $\sigma$ although they are the same glass — the smaller one radiates +relatively better, because its uncancelled edge strip is a larger fraction of it. +At coincidence both peak above unity, the 1.5 × 1.25 m pane at 2.61 in the 2 kHz +band that straddles $f_c$ = 2 107 Hz. Above it $\sigma$ falls back towards 1 only +slowly: still 1.74 one third of an octave past coincidence and 1.32 at 5 kHz. The +right-hand panel is the geometry the model assumes and the reason it needs two +dimensions and an edge condition.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt + +sig_big = radiation_efficiency(bands, 1.5, 1.25, fc) +sig_small = radiation_efficiency(bands, 0.5, 0.4, fc) + +fig, (ax_l, ax_r) = plt.subplots(1, 2, figsize=(11, 4.5)) +ax_l.loglog(bands, sig_big.radiation_efficiency, "-o", ms=3, label="1.5 x 1.25 m") +ax_l.loglog(bands, sig_small.radiation_efficiency, "-s", ms=3, label="0.5 x 0.4 m") +ax_l.axhline(1.0, ls=":") +ax_l.axvline(fc, ls=":", color="r") +ax_l.set(xlabel="Frequency [Hz]", ylabel=r"Radiation efficiency $\sigma$") +ax_l.legend() + +# One line — the baffled plate the model assumes: +sig_big.plot_geometry(ax=ax_r) +plt.show() +``` + +
+ ```python from phonometry import radiation_efficiency, sound_power_from_vibration @@ -847,7 +936,8 @@ fig.tight_layout(); plt.show() | `mass1` / `mass2` | float | kg/m² | > 0 | Double-wall leaf surface densities | | `gap` | float | m | > 0 | Cavity depth $d$ | | `cavity_medium` | `PorousMediumResult` | — | default `None` | Porous fill; lowers $f_0$ | -| `width` / `depth` (slit) | float | m | > 0 | Slit width $w$ / depth $d$ | +| `width` (slit) | float | m | > 0 | Slit width $w$. Third positional argument of `slit_transmission_coefficient`, **second** of `slit_resonance_frequencies` | +| `depth` (slit) | float | m | > 0 | Slit depth $d$ (the wall thickness). Fourth positional argument of `slit_transmission_coefficient`, **first** of `slit_resonance_frequencies` | | `field` / `position` (slit) | str | — | `'diffuse'`/`'normal'`, `'mid'`/`'edge'` | Incident field and slit location | | `radius` / `depth` (hole) | float | m | > 0 | Circular-aperture radius $a$ / depth $d$ | | `areas` / `reduction_indices` | seq | m² / dB | length $N$ | Composite elements (1-D or (N, bands)) | diff --git a/site/src/content/docs/buildings/design/resilient-layers.mdx b/site/src/content/docs/buildings/design/resilient-layers.mdx index d7f9e2f10..58a0666cf 100644 --- a/site/src/content/docs/buildings/design/resilient-layers.mdx +++ b/site/src/content/docs/buildings/design/resilient-layers.mdx @@ -53,6 +53,15 @@ side lives in and [Dynamic stiffness of resilient materials](/phonometry/materials/resilient/dynamic-stiffness/). + + +Every formula below is chosen by a construction detail, so it is worth having the +three build-ups in view: a continuous resilient layer under a screed, discrete +mounts under a walking surface, and a lining fixed to a wall either by bonding or +on studs over a cavity. Which of them you have built decides which law applies — +and, as the last section of this page shows, whether the prediction means +anything at all. + ## The excitation: the tapping machine as a mass-spring-dashpot Everything downstream depends on the force the standard tapping machine @@ -114,6 +123,48 @@ res.power_input_level # 10 lg(Win/1 pW), rising 3 dB per doubling res.plot() # the force spectrum with both asymptotes ``` + + +*The same machine, two floors. On concrete the hammer rebounds +(**under-critical**) and the spectrum hugs the upper asymptote +$|F_n|_\text{upper} = 2mv_\text{h}/T_i$ to within 1 dB right across the building +acoustics range, its cut-off sitting at 6 948 Hz and its hammer limiting +frequency at 120 kHz — both far outside anything that is rated. On 22 mm +chipboard the surface gives way, the hammer does not rebound +(**over-critical**), and both frequencies collapse into the middle of the range: +$f_\text{co}$ = 589 Hz and $f_\text{limit}$ = 555 Hz, so the spectrum bends +towards the lower asymptote $mv_\text{h}/T_i$ where a rated band actually sits. +The two asymptotes are 6.0 dB apart in mean square, and that gap is the whole +reason a tapping-machine level measured on a timber floor cannot be compared with +one measured on concrete: the machine is injecting a different force.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np +# The names come from the import block above. + +freqs = np.logspace(np.log10(50.0), np.log10(20000.0), 400) +fig, ax = plt.subplots() +for label, rho_s, c_s, nu_s, h_s in (("140 mm concrete", 2200.0, 3800.0, 0.2, 0.14), + ("22 mm chipboard", 650.0, 2400.0, 0.3, 0.022)): + e_s = rho_s * c_s**2 * (1 - nu_s**2) + z_s = infinite_plate_impedance(plate_bending_stiffness(e_s, h_s, nu_s), + rho_s * h_s) + k_s = plate_contact_stiffness(e_s, poisson_ratio=nu_s) + r = tapping_force_spectrum(freqs, k_s, z_s) + ax.loglog(freqs, r.peak_force, label=f"{label} (fco = {r.cut_off_frequency:.0f} Hz)") + ax.axhline(r.upper_limit, ls="--", lw=0.8) + ax.axhline(r.lower_limit, ls=":", lw=0.8) +ax.set(xlabel="Frequency [Hz]", ylabel="Line force $|F_n|$ [N]") +ax.legend() +plt.show() +``` + +
+ ## Soft floor coverings: the cut-off frequency is the design A soft covering on a heavyweight floor changes nothing but the force input: @@ -363,6 +414,60 @@ res.plot() # the Annex D ratings against fo, with this system marked round(lining_improvement_in_situ(10.0, 100.0, 60.0), 1) # 4.4 dB on a Rw 60 wall ``` +## What the formulae assume about the build + +Every model on this page assumes the resilient layer is the *only* mechanical +connection between the two masses. None of them can see a rigid bridge, so all of +them are upper bounds on a correctly built construction — and in the field the +gap between a prediction and a measurement is far more often a bridge than a +wrong $s'$. + +**Start with the right $s'$.** ISO 12354-2 Annex C qualifies it three times, in +Formulae (C.2), (C.4)/(C.5) and (C.6), with the same phrase: the dynamic +stiffness per unit area in accordance with EN 29052-1 **measured without any +pre-load**. A stiffness quoted under service load is a different number, and +since $f_0 \propto \sqrt{s'}$ a factor of two in the declared stiffness moves the +resonance by $\sqrt{2}$ and shifts the whole improvement spectrum by +$30\lg\sqrt{2} = 4{,}5$ dB on the 30 lg law, 6,0 dB on the 40 lg one. The +[dynamic-stiffness guide](/phonometry/materials/resilient/dynamic-stiffness/) +shows what the load plate does and why it is what it is. + +**The series law has a condition printed under it.** Formula (C.6), +$s'_\text{tot} = (\sum 1/s'_i)^{-1}$, is followed verbatim by: this holds only if +every resilient layer covers the whole area of the floor without any separations +or cuttings, for example by heating or water-supply pipes or electrical devices. +Services crossing a layer therefore invalidate it; the layer is laid *over* them, +not around them. + +**Then the bridges.** These are the ways the assumption fails on site, roughly in +order of how often: + +- screed in contact with the wall, because the edge strip was cut short, folded + down before the pour, or trimmed flush and then grouted over by the skirting; +- screed touching a service penetration — a pipe, a conduit, a floor box — that + was not sleeved; +- debris and mortar droppings left on the resilient layer before the pour, each + one a point bridge; +- skirtings, door thresholds or floor finishes fixed *through* the floating slab + into the structure below; +- a wall lining bonded with too many or too large adhesive dabs, which moves the + construction from the intended soft case to the D.1 bonded case; +- for discrete mounts, any contact at all besides the mounts. + +The scale is brutal and the signature is recognisable. A handful of point bridges +can cost 10 dB or more; a continuous edge contact can remove the improvement +almost entirely. And because a bridge short-circuits the spring rather than +detuning it, a bridged floating floor loses across the *whole* range above $f_0$ +rather than in one band — which is how it is told apart from a wrong $s'$ or a +misplaced resonance in a +[field measurement](/phonometry/buildings/insulation/insulation-field/). + +For linings the same point has a number on it, and it is on this page already: +the Annex D formula is chosen by the fixing, so a board specified on studs over a +filled cavity but built with adhesive dabs moves $f_0$ from 70,8 Hz to 542 Hz and +turns a +13,8 dB gain into a $-9{,}0$ dB loss. Nearly twenty-three decibels, from +a site decision that never reached a drawing. + ## What is anchored on a published number, and what is not Not every formula on this page has a worked example behind it, and it is worth diff --git a/site/src/content/docs/buildings/design/structure-borne-power.mdx b/site/src/content/docs/buildings/design/structure-borne-power.mdx index 46cfc0ccc..87a1c3ffe 100644 --- a/site/src/content/docs/buildings/design/structure-borne-power.mdx +++ b/site/src/content/docs/buildings/design/structure-borne-power.mdx @@ -52,13 +52,20 @@ import matplotlib.pyplot as plt import numpy as np from phonometry import building -# The same pump-like source measured on a heavy and on a light reception plate. +# The same pump-like source measured on a conforming low-mobility plate +# (100 mm concrete, 2 300 kg/m3 -> m = 230 kg/m2, 3,15 m x 2,23 m = 7,0 m2, +# Ts = 0,25 s so eta >= 0,08 through 50-100 Hz) and on a conforming +# high-mobility plate (1 mm perforated steel, m = 7,9 kg/m2, 2,0 m2). bands = np.array([50.0, 100.0, 200.0, 400.0, 800.0, 1600.0, 3150.0]) -lv_low = np.array([88.0, 90.0, 87.0, 84.0, 80.0, 76.0, 71.0]) - -low = building.reception_plate_power(lv_low, bands, mass_per_area=600.0, - area=2.0, reverberation_time=0.8) -high = building.reception_plate_power(lv_low + 6.0, bands, mass_per_area=150.0, +lv_low = np.array([72.0, 74.0, 71.0, 68.0, 64.0, 60.0, 55.0]) + +# The light plate's point mobility is 1.1e-2 m/(N.s) against the heavy plate's +# 4.9e-6, so for a source of |Y_S| ~ 1e-3 m/(N.s) its spatial-mean velocity +# level runs 35.1 dB higher: 12.0 dB of that is extra injected power and the +# rest is the plate's much smaller eta*m*S dissipating it. +low = building.reception_plate_power(lv_low, bands, mass_per_area=230.0, + area=7.0, reverberation_time=0.25) +high = building.reception_plate_power(lv_low + 35.1, bands, mass_per_area=7.9, area=2.0, reverberation_time=0.5) # One line — the L_Ws(f) bars of one determination with its band-summed total: @@ -124,37 +131,171 @@ bands = np.array([100.0, 200.0, 400.0, 800.0]) lv_i = np.array([88.0, 90.0, 87.0, 89.0, 86.0, 90.0]) # six plate positions @ 200 Hz print(round(building.spatial_mean_velocity_level(lv_i), 2)) # 88.6 dB re 1 nm/s -# Power level injected into the reception plate (loss factor from Ts): +# Power level injected into the low-mobility reception plate of clause 7.2.2 +# (100 mm concrete, 230 kg/m2 over 7,0 m2, Ts = 0,25 s): res = building.reception_plate_power( velocity_level=np.array([90.0, 87.0, 82.0, 77.0]), - frequency=bands, mass_per_area=600.0, area=2.0, reverberation_time=0.8, + frequency=bands, mass_per_area=230.0, area=7.0, reverberation_time=0.25, ) -print(np.round(res.power_level, 1)) # per-band L_Ws -print(round(res.total_level, 1)) # band-summed level [dB re 1 pW] +print(np.round(res.power_level, 1)) # [79.5 76.5 71.5 66.5] per-band L_Ws +print(round(res.total_level, 1)) # 81.8 band-summed level [dB re 1 pW] res.plot() # the L_Ws(f) bars with the band-summed total, as in the figure above (needs matplotlib) ``` ## 2. Low- and high-mobility plates -Two reception plates bracket the installation conditions. On the *low-mobility* -(heavy) plate the source's own dynamics barely change the plate's point mobility -or loss factor; the *high-mobility* (light) plate is dynamically loaded by the -source, so its reverberation time and mobility are measured with the source -attached. The plate-injected power plus the plate's point mobility (see +Two reception plates bracket the installation conditions, and the standard +specifies both. + +**The low-mobility plate (clause 7.2.2)** is concrete of density +$(2\,300 \pm 200)$ kg/m³ and thickness $(10 \pm 1)$ cm — so about 230 kg/m² — +with a minimum area of 5 m² and preferably more than 7 m², a length-to-width +ratio near $\sqrt{2}$, and a loss factor of at least 0,08 in the low bands +(50 Hz to 100 Hz). Its minimum dimension shall be at least the largest contact +spacing of the sample. Every one of those numbers earns its place: the 10 cm +concrete plate is the same plate whose characteristic mobility +$Y_{R,\infty,\text{low}} = 5\times10^{-6}$ m/(N·s) anchors Formula (17), so a +thinner or lighter plate would break the conversion; the $\sqrt{2}$ aspect ratio +spreads the modes so that no band is dominated by a degenerate pair; the +loss-factor floor keeps the plate reverberant but well damped, which is what +makes $\eta = 2{,}2/(fT_s)$ and the steady-state power balance hold — at +$T_s = 0{,}25$ s the plate gives $\eta = 0{,}176$ at 50 Hz and 0,088 at 100 Hz, +just inside the requirement; and the minimum dimension keeps a multi-contact +source from bridging the plate's edges. A bench may carry up to **three** +mutually isolated low-mobility plates so that a source touching several building +elements — a whirlpool bath — can be tested as installed, provided the velocity +level difference between the plates, measured per EN ISO 10848-1 with the +equipment removed, is more than 10 dB in every band. + +**The high-mobility plate (clause 7.3.2)** is a thin metal sheet designed for a +mean point mobility of at least $10^{-2}$ m/(N·s), about 50 % perforated with +roughly 6 mm holes; 1 mm steel or 1,5 mm aluminium achieves it, and the sheet is +held in a support frame for stability. The perforation is not a weight-saving +measure: it exists to stop the sheet being driven by the source's own airborne +sound in a noisy environment, which would be indistinguishable from +structure-borne injection. The sample is fixed **rigidly** to this plate. + +**Mounting (clause 7.2.3).** On the low-mobility plate the source goes towards +the plate centre, away from the vibration nodes, so that the point mobility, the +free velocity and the blocked force vary as little as possible over its contacts — +the reception-plate method works best on sources whose contacts are alike. +The source is mounted exactly as its manufacturer prescribes for real buildings, +and the mounting is described in full in the test report. + +**Which plate gives which quantity.** The equivalent blocked force (Formula 15) +and the characteristic reception-plate power level (Formula 17) are read from the +*low*-mobility plate. The equivalent free velocity (Formula 18) and, with the +blocked force, the source mobility (Formula 19) need the *high*-mobility plate — +whose reverberation time and point mobilities must therefore be measured with the +source attached. The pair brackets the installation: a real building element sits +between the two, and the gap between the two determinations is what says whether +the machine behaves as a force source or as a velocity source. The plate-injected +power plus the plate's point mobility (see [mechanical mobility](/phonometry/vibration/structural/mechanical-mobility/)) yield the source description for the EN 12354-5 model through the conversion chain below. + + :::caution **Two velocity references share the symbol $v_0$.** EN 15657 and EN 12354-5 refer velocity levels to $v_0 = 10^{-9}$ m/s (1 nm/s); ISO 9611 and ISO/TS 7849 refer them to $5\times10^{-8}$ m/s (50 nm/s). The two differ by $20\log_{10}(50) = 33.98$ dB, so a free velocity level taken from an ISO 9611 report must be reduced by 34.0 dB before it enters Formula (18) or any -EN 12354-5 quantity. Section 3 below uses both references, a few lines apart. +EN 12354-5 quantity. Section 4 below uses both references, a few lines apart. ::: -## 3. From plate power to source quantities (Formulae 15–19) +## 3. Running the measurement + +Everything that decides whether a reception-plate determination is valid sits in +clause 7.1, and none of it is in the formulae. + +**Transducers and positions.** Accelerometers calibrated to ISO 16063-21 and +mounted to ISO 5348. The spatial mean velocity level and the structural +reverberation time are measured as EN ISO 10848-1 prescribes. There shall be +**not fewer than six measurement positions**, about 0,5 m apart and at least +0,1 m from the equipment's contact points — the clearance is what makes the mean +a plate average instead of a near-field reading of the contact, and the spacing +is what makes six positions sample different modal patterns rather than one. +The number and the location of the positions are validated with the Annex C +power-substitution method described at the end of this section. + +**Background vibration.** Velocity levels are expressed in dB re +$10^{-9}$ m/s and corrected for background vibration **by the same procedure +used for sound pressure levels**, in accordance with EN ISO 10140-3: measure the +plate with the source off, and correct or reject the band according to the +margin. A plate standing on a laboratory floor picks up traffic and plant +long before a microphone does, and the correction is the only thing between that +and a source spectrum that is really the building's. + +**The loss factor.** $T_s$ is a structural decay measured on the plate itself, +feeding $\eta = 2{,}2/(f\,T_s)$. Formula (14) is linear in $10\lg\eta$, so an +error in $T_s$ moves $L_{Ws}$ decibel for decibel — it is the single most +sensitive input on the page. The loading rule follows the plate: on the +**low-mobility** plate there should be no significant difference whether $T_s$ +and the point mobilities are measured with or without the equipment attached; the +**high-mobility** plate is dynamically loaded by the equipment, so both $T_s$ and +the point mobilities **shall** be measured with the source fitted. + +**Mobilities.** The plate's point mobilities are measured at the source's contact +points per ISO 7626-1, restricted to single-point translational excitation normal +to the plate per ISO 7626-2 (impact excitation per ISO 7626-5 is allowed), in +narrow bands and then reduced to one-third octaves. The receiver is not +dynamically loaded while this is done; a source, by contrast, is isolated per +ISO 9611 or freely suspended. + +**Operating conditions are part of the result, not of the setup.** Formula (14) +equates injected with dissipated power only in the steady state, so an +intermittent or cyclic machine has to be run in a defined condition and the +condition reported: clause 10 requires the free velocity, the blocked force, the +source mobility and the characteristic power to be stated *per tested operating +condition and per source component*. The standard's own whirlpool-bath schedule +in Annex B is the model to copy. + +**What the numbers are worth.** The 2010 interlaboratory test (clause 8.1) gives +a standard deviation of about **3 dB per one-third-octave band for repeatability +within a laboratory and about 4 dB for reproducibility between laboratories**, +for the isolated low-mobility plate with a reference source of controlled +internal forces. That is the scale against which a 1 dB difference between two +determinations means nothing. + +Three failure modes are silent, and each is why one of the requirements above +exists. The source's own airborne sound can drive the plate — which is why the +high-mobility plate is about half perforated. A loss factor measured on the bare +plate can be carried into the high-mobility case, where the standard requires +the source to be attached, and the error goes straight into $L_{Ws}$. And a +machine that has not reached steady state, or that is measured over a cycle +average without saying so, produces a number that no other laboratory can +reproduce. + +### When the plate cannot be isolated: power substitution + +Annex C is normative and covers three situations: validating the measurement +positions on either plate; determining the injected power in the laboratory on a +**non-isolated** low-mobility plate, when connecting the sample to an isolated one +is difficult or impossible (waste-water pipes fixed to both a wall and a floor); +and determining it **in situ**, for equipment such as lifts that can only be +tested where it is installed. + +The plate is first excited by a calibrated structural source of known power +$P_\text{cal}$ — an electrodynamic shaker with broadband noise or an impact +hammer, as EN ISO 10848-1 describes — and its mean-square velocity measured; +replacing the calibrated source by the sample and measuring again gives +$P_\text{source} = \langle v_\text{source}^2\rangle\,P_\text{cal}/\langle v_\text{cal}^2\rangle$ +(Formula C.1). The known power is injected at **three** points on a low-mobility +plate — one central, one 0,5 m from an edge and one 0,5 m from a corner — or at +at least two points away from the contacts on a high-mobility plate, each +averaged over the same six or more receiver positions and combined energetically +(Formula C.2). The standard notes that the substitution is probably valid only up +to about 1 kHz. + +This is how lifts and stack pipes get a characteristic power at all, and it is +also the reason a coupled wall or floor cannot simply be treated as a reception +plate: energy returning from the structure the plate is attached to makes the +plate power balance wrong, and only the substitution measures round it. + +## 4. From plate power to source quantities (Formulae 15–19) The plate-injected $L_{Ws}$ is **not** a source descriptor: the same source injects a different power into a different receiver. EN 15657 derives the @@ -218,6 +359,45 @@ whole lesson: a light, high-mobility receiver accepts more power from the same source, so a declared $L_{Wsn}$ compares machines and is never the power a particular building will see. + + +*The same source, four different levels, and only one of them describes the +machine. Read upward from the grey curve: what the test plate measured, then the +declared $L_{Wsn}$ on the standard 10 cm plate, then the two branches of the +Annex I correction — the receiving wall's 68.2 dB and the plate-independent +84.4 dB. The crosses are $L_{Ws,c} - D_C$, and they land on the installed curve, +which is the arithmetic the two pages share. The 6.8 dB step at every band is +$10\lg(24.1/5.0)$: nothing about the cistern changed, only what it was bolted to.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np +# `building` as imported by the snippet above. + +bands = np.array([63.0, 125.0, 250.0, 500.0, 1000.0, 2000.0]) +l_ws = np.array([61.7, 59.8, 47.2, 44.9, 38.8, 27.2]) # on the test plate +l_fb = building.equivalent_blocked_force_level(l_ws, 5.34e-6) +l_wsn = building.characteristic_reception_plate_power(l_fb) +installed = building.installed_power_from_reception_plate(l_wsn, 24.1e-6) +characteristic = building.installed_power_from_reception_plate(l_wsn, 1.0e-3) + +fig, ax = plt.subplots() +ax.semilogx(bands, l_ws, "-o", label="measured on the test plate") +ax.semilogx(bands, l_wsn, "-s", label="$L_{Wsn}$, the declared value") +ax.semilogx(bands, installed, "-^", label="$L_{Ws,inst}$ on the wall") +ax.semilogx(bands, characteristic, "-D", label="$L_{Ws,c}$, the EN 12354-5 input") +ax.semilogx(bands, characteristic - 16.2, "x", label="$L_{Ws,c} - D_C$") +ax.set(xlabel="Frequency [Hz]", + ylabel="Structure-borne power level [dB re 1 pW]") +ax.legend() +plt.show() +``` + +
+ :::caution **Two quantities come out of the same correction; do not confuse them.** With the *receiver* mobility it gives the installed power level @@ -236,7 +416,7 @@ not the 1 nm/s of Formula 14) measured at the contact points of resiliently mounted machinery; its equation (9) position average is `mean_free_velocity_level()`. -## 4. The characterization report (`.report()`) +## 5. The characterization report (`.report()`) A characterization ends as a *document*. The `StructureBornePowerResult` exposes a `.report()` method that writes a one-page PDF fiche laid out like a @@ -268,9 +448,9 @@ import numpy as np from phonometry import ReportMetadata, reception_plate_power freqs = np.array([125, 250, 500, 1000, 2000, 4000], float) -lv = np.array([88.0, 90, 86, 82, 78, 73]) # spatial mean plate velocity level [dB] -res = reception_plate_power( - lv, freqs, mass_per_area=25.0, area=1.2, reverberation_time=0.3, +lv = np.array([70.0, 72, 68, 64, 60, 55]) # spatial mean plate velocity level [dB] +res = reception_plate_power( # the clause 7.2.2 low-mobility plate + lv, freqs, mass_per_area=230.0, area=7.0, reverberation_time=0.25, ) res.report( @@ -291,7 +471,7 @@ repository; click the preview to open the PDF. @@ -313,8 +493,15 @@ position-averaged free velocity level, equation (9) **Not covered.** Formula 16, the equivalent point mobility of a plate as the arithmetic mean of $\operatorname{Re}(Y)$ over its contact points, is not implemented: the functions above take an already-known `plate_mobility` as input rather -than deriving it from per-point measurements. Of ISO 9611:1996, only the -equation (9) position average is implemented; the rest of the standard is +than deriving it from per-point measurements. The Annex C power-substitution +method is likewise not implemented — the library takes an already-averaged +$L_v$, so a substitution determination must be reduced to a plate power level by +hand (Formulae C.1/C.2) before `structure_borne_power_level` is used. Nor does +anything here check the facility: the plate's dimensions, density, aspect ratio +and loss factor, the position count and clearances, the background correction and +the operating conditions are the operator's responsibility, and a value computed +from a non-conforming plate is returned without complaint. Of ISO 9611:1996, only +the equation (9) position average is implemented; the rest of the standard is cited as the source-side counterpart, not implemented. ## See also diff --git a/site/src/content/docs/buildings/index.md b/site/src/content/docs/buildings/index.md index 7afb6322c..ef05d3e2f 100644 --- a/site/src/content/docs/buildings/index.md +++ b/site/src/content/docs/buildings/index.md @@ -72,7 +72,8 @@ laboratory, and predicted from element data. the rubber ball and the bang machine, the impact force exposure level that specifies them and the ISO 717-2 Annex D single number. - [Laboratory Flanking Transmission (ISO 10848)](/phonometry/buildings/insulation/flanking-lab/): - the measured junction vibration reduction index and the flanking descriptors. + the measured junction vibration reduction index, the flanking descriptors, + and the suspended-ceiling plenum path with its ceiling attenuation class. - [Insulation Ratings (ISO 717)](/phonometry/buildings/insulation/insulation-ratings/): the reference-curve engines behind Rw, DnT,w, Ln,w and their adaptation terms. - [Façade Sound Insulation](/phonometry/buildings/insulation/facade-insulation/): the diff --git a/site/src/content/docs/buildings/insulation/facade-insulation.mdx b/site/src/content/docs/buildings/insulation/facade-insulation.mdx index 0d8f686d1..aaffa5d0c 100644 --- a/site/src/content/docs/buildings/insulation/facade-insulation.mdx +++ b/site/src/content/docs/buildings/insulation/facade-insulation.mdx @@ -72,12 +72,21 @@ Annex F example below, `fac.d_2m_nt_w` is 33 dB. ## Field measurement (ISO 16283-3) -The same source/receiver logic reaches the building **façade**, but now the -source is *outdoors*: a loudspeaker at 45° or the road traffic itself. Rather -than a level difference across an internal partition, ISO 16283-3 references the -receiving-room level $L_2$ to the level **2 m in front of the façade** -$L_{1,2m}$, giving the level difference $D_{2m}$ and, exactly as in the airborne -case, its standardized and normalized forms: +A façade measurement asks a question an internal partition never does: **what +is outside, and where is it?** There is no source room, so the reference level +has to be established in a free field that a reflecting building is standing +in, and every quantity on this page inherits the geometry of that choice. +ISO 16283-3 resolves it by splitting the method twice over — a *global* result +that describes the whole envelope as built, against an *element* result that +describes one component; and a *loudspeaker* source that the operator controls, +against *road traffic* that is free but arrives from everywhere. Those two +splits give the four combinations of Table 1 (plus railway and aircraft in +Annex E), and they are chosen on different grounds, which +[Choosing and running the method](#choosing-and-running-the-method-clauses-9-and-10) +sets out. The quantities themselves follow from the choice: ISO 16283-3 +references the receiving-room level $L_2$ to the level **2 m in front of the +façade** $L_{1,2m}$, giving the level difference $D_{2m}$ and, exactly as in +the airborne case, its standardized and normalized forms: $$ D_{2m} = L_{1,2m} - L_2, \quad @@ -99,6 +108,98 @@ $$ The façade quantity is airborne, so its single-number rating uses the **ISO 717-1** reference curve through `weighted_rating` unchanged (Annex F). +Neither constant is arbitrary. A microphone fastened on the façade reads +incident *plus* reflected pressure, because the façade is the reflector; the +subtraction converts that surface level back to the level of the incident wave +alone, and how much has to come off depends on the geometry the sound arrives +with. ISO 16283-3 states the assumption behind each in its own definitions: +the $-1.5$ dB of $R'_{45°}$ "is based on the assumption that the sound is +incident from one angle only, 45°, and the sound field in the receiving room +approximates to a diffuse field" (3.12, Note 3), while the $-3$ dB of +$R'_{tr,s}$ assumes the sound arrives "from all angles" (3.13, Note 2). So the +1.5 dB between the two methods is a statement about the *source*, not about the +wall, and it is why a loudspeaker result is labelled $D_{ls,2m,nT}$ and a +traffic result $D_{tr,2m,nT}$ rather than both being called the same thing. + +The 2 m of the global method is a compromise of the same kind. Closer in, the +microphone reads a pressure dominated by the façade's own reflection and by +whatever detail of the elevation it happens to sit against; much further out, +it stops describing this façade and starts describing the street. Two metres is +far enough that the direct and reflected paths have settled into a stable sum +over most of the range and close enough to stay in the façade's field — but the +standard is candid about the cost, noting under Clause 9.6.1 that "systematic +errors will occur at low frequencies due to interference effects". The +practical consequence is the one to carry away: the reference level of a +$D_{2m,nT}$ is measured in front of a reflecting surface and is therefore +higher than the free field the same source would produce with the building +removed, so a $D_{2m,nT}$ and an internal $D_{nT}$ are not the same kind of +number even when they are the same size. + + + +### Choosing and running the method (Clauses 9 and 10) + +**Global or element.** They answer different questions and ISO 16283-3 +Table 1 says which is preferred for which. The **global** methods give +$D_{2m,nT}$ (or $D_{2m,n}$) and "quantify the airborne sound insulation of a +whole façade or a whole building in a specified situation"; that result +"cannot be compared with a sound reduction index obtained in a laboratory", +because it is a property of the building as built. The **element** methods give +$R'_{45°}$ or $R'_{tr,s}$ and are the route when the aim is to characterise one +component or to compare against laboratory data. Method 1, element loudspeaker, +is the *preferred* way to estimate an element's apparent index; method 6, global +road traffic, is the *preferred* way to estimate the global insulation of a +façade exposed to road traffic. + +**Loudspeaker or traffic.** A loudspeaker is controllable and always +admissible; traffic is free and is what the façade actually faces, but it comes +with conditions. Traffic varies, so indoor and outdoor levels **must be measured +simultaneously**; the average must include at least **50 vehicle pass-bys**; and +the receiving-room background must be at least 10 dB below the measured +equivalent level, because a background correction normally cannot be applied at +all under a varying source (Clause 10.2). The traffic must flow approximately +along a straight line within ±60° of the angle of sight from the façade, with +deviations up to ±15°, and the elevation angle from the point of closest +approach must be under ±40° (Clause 10.3.2). The standard also states the +ceiling on the element traffic method plainly: background noise usually limits +it to elements or façades with $R'_w < 40$ dB (Clause 10.1 NOTE). + +**Where the loudspeaker goes (Clauses 9.3 and 9.4).** Angle of incidence +45° ± 5°, preferably on the ground or as high above it as practice allows, at a +slant distance $r$ from the source to the centre of the specimen of at least +**5 m** ($D > 3.5$ m) for the element method and at least **7 m** ($D > 5$ m) +for the global method — the larger distance because the global method must +illuminate the whole façade evenly, not one element. Choose the position so the +level varies as little as possible over the specimen: the directivity +requirement is under 5 dB of local variation per band over a surface the size +and orientation of the specimen, relaxed to 10 dB (and stated in the report) +where one dimension exceeds 5 m. The source spectrum must be steady and +continuous, with the one-third-octave levels inside an octave differing by no +more than 6 dB at 125 Hz, 5 dB at 250 Hz and 4 dB above; and it must put the +receiving-room level at least 6 dB over the background. + +**Where the microphones go.** *Element method* (Clause 9.5.1): the microphone is +fastened directly to the specimen, either with its axis parallel to the surface +(centre of the membrane ≤ 10 mm from it) or normal to it (≤ 3 mm), with a +hemispherical windscreen, securely fixed so it cannot move — and so that the +fixing itself does not change what the specimen transmits. Use **3 to 10** fixed +positions, distributed evenly but asymmetrically and never in a regular grid. +The count is not chosen up front: begin with $n = 3$, and if any two positions +differ by more than $n$ dB in any band, add positions, up to 10. A specimen +mounted in a **recess** takes 10 positions outright, and a difference above +10 dB must be stated in the report. *Global method* (Clauses 9.6.1 and 10.4.1): +one microphone $(2.0 \pm 0.2)$ m from the plane of the façade, in front of the +middle of it, at a height of **1.5 m above the receiving-room floor** — or 1 m +in front of a balustrade or similar protrusion where one intervenes. A room +with more than one outside wall, or a very large one, needs a position on each +façade, and a very large façade needs several loudspeaker positions each +complying with Clause 9.4 in full. + +None of this is checked by the functions below: `facade_insulation` and +`facade_sound_reduction` energy-average whatever positions they are given +(Clause 9.5.1, Formula (7)) and combine loudspeaker positions with Formula (8) +if you do it yourself. + ```python import numpy as np from phonometry import building @@ -254,6 +355,12 @@ absorption $\alpha_w$). Single-number ratings reuse EN ISO 717-1 +*A composite façade is governed by its worst element, and the drawn curves say +which one that is band by band: the air inlet, a fraction of a square metre, +holds the low bands down while the 6 m² wall is doing nothing to limit the +result. The two output curves sit far below every element curve because the +composite is an energy sum of transmitted power, not an average of indices.* + ```python from phonometry import building @@ -308,11 +415,13 @@ fig.tight_layout(); plt.show()
-The composite is easier to reason about drawn as areas. `plot_facade_elements` -tiles the elevation with every element's drawn area equal to its real area -(here a 6 m² masonry wall, a 1.5 m² window and its 0.3 m² roller shutter box), -and a prediction that retained its `elements` redraws its own façade with -`fac.plot_geometry()`. +The composite is easier to reason about drawn as areas. The elevation below is +a **second, simpler façade** than the Annex F one above — a 6 m² masonry wall, +a 1.5 m² window and its 0.3 m² roller shutter box, chosen so the tiles are +legible — not a drawing of the prediction just computed. +`plot_facade_elements` tiles it with every element's drawn area equal to its +real area, and a prediction that retained its `elements` redraws *its own* +façade with `fac.plot_geometry()`. @@ -413,7 +522,10 @@ seg = building.radiated_sound_power( r_prime_cap=40.0, octave_bands=bands) print(round(seg.l_w[0], 1), round(seg.l_w[1], 1)) # 59.8 61.2 (LW at 63/125 Hz) -# Exterior level 5 m in front of the centre of the 60×10 m side (LWA = 62.9 dB(A)). +# The exterior level is computed for a whole SIDE, not for the segment above. +# Annex G Table G.8 sums side 1's three segments to LWA = 62.9 dB(A) over the +# full 10 x 60 m side; Table G.9 then reads the level 5 m in front of its +# centre. (`seg.l_w_dba` is 58.2 dB(A): one segment of that side, not the side.) a_tot = building.outdoor_attenuation(width=60.0, height=10.0, distance=5.0) print(round(a_tot, 1), round(building.outdoor_level(62.9, a_tot), 1)) # 26.3 36.6 @@ -485,6 +597,7 @@ plt.show() | `radiated_sound_power(r_prime_cap)` | float | dB | default `None` (off) | Optional field cap on $R'$, an Annex G example footnote (it uses 40 dB), not part of Formula (2)/(3) | | `radiated_sound_power(octave_bands)` | seq of int | Hz | default `None` | Octave centres matching the bands; enables the A-weighted $L_{WA}$ | | `facade_sound_reduction(frequencies)` | seq | Hz | default `None`; length = band count | Band centres carried on the result for plotting | +| `facade_sound_reduction(bands)` | str or `None` | — | `'octave'` / `'third-octave'` / `None` | Which band set the input is in; `None` infers it from the count, as on the [ratings page](/phonometry/buildings/insulation/insulation-ratings/) | | `outdoor_attenuation(width, height, distance)` | float | m | > 0 | Finite radiating side and reception distance (Annex E) | | `outdoor_level(l_w, attenuation)` | float or seq | dB | broadcast-compatible | Exterior $L_p$ from one or more sides (Formula E.1) | @@ -601,9 +714,16 @@ one-page fiche through `.report()`. **Not covered.** The band levels handed to `facade_insulation` are assumed already corrected for background noise, and ISO 16283-3's own procedural -requirements (the number and placement of loudspeaker and microphone -positions, the low-frequency procedure, the choice between the global and the -element method) are not checked. The EN 12354-3 and EN 12354-4 worked examples +requirements — the ones set out under +[Choosing and running the method](#choosing-and-running-the-method-clauses-9-and-10) +— are documented but not checked: nothing verifies the 45° ± 5° incidence, the +5 m / 7 m slant distances, the 3→10 microphone escalation and its recess +special case, the 50 pass-bys and the simultaneity of a traffic measurement, or +that the method chosen matches the question asked. The low-frequency corner +procedure of Clause 7 (the façade counterpart of the +[ISO 16283-1 procedure](/phonometry/buildings/insulation/insulation-field/#small-rooms-the-low-frequency-procedure-clause-8), +triggered by the same 25 m³ receiving-room threshold) is not implemented +either, and neither are the railway and aircraft methods of Annex E. The EN 12354-3 and EN 12354-4 worked examples of the 2000 editions carry small internal rounding inconsistencies at the higher octave bands, noted where they appear: the implementation follows the formulas rather than the printed rows. diff --git a/site/src/content/docs/buildings/insulation/flanking-lab.mdx b/site/src/content/docs/buildings/insulation/flanking-lab.mdx index 0f26f1850..5926ec538 100644 --- a/site/src/content/docs/buildings/insulation/flanking-lab.mdx +++ b/site/src/content/docs/buildings/insulation/flanking-lab.mdx @@ -1,6 +1,6 @@ --- title: "Laboratory Flanking Transmission (ISO 10848)" -description: "The ISO 10848 laboratory measurement of flanking transmission: the junction vibration reduction index Kij from direction-averaged velocity level differences and equivalent absorption lengths, the overall Dn,f and Ln,f descriptors, the Part 4 modal-overlap validity checks and the accredited fiches." +description: "The ISO 10848 laboratory measurement of flanking transmission: the junction vibration reduction index Kij, the Dn,f and Ln,f descriptors, the acquisition and shielding rules behind them, the Part 4 modal-overlap checks, and the suspended-ceiling plenum path with its normalized ceiling attenuation Dn,c and ceiling attenuation class." references: - type: book authors: ["Hopkins, C."] @@ -16,6 +16,13 @@ references: designation: "ISO 10848-1:2006" url: "https://www.iso.org/standard/38284.html" note: "The frame document of the flanking-transmission measurement: definitions, the vibration reduction index Kij, the equivalent absorption length and the normalized flanking descriptors D_n,f / L_n,f that feed the EN 12354 prediction. Because ISO 10848 contains no worked numeric example, conformance is anchored on closed-form identities." + - type: standard + organization: "International Organization for Standardization" + year: 2017 + title: "Acoustics — Laboratory measurement of the flanking transmission of airborne and impact sound between adjoining rooms — Part 1: Frame document" + designation: "ISO 10848-1:2017" + url: "https://www.iso.org/standard/70534.html" + note: "The current frame document, whose Clauses 7.2 to 7.4 and 9 carry the acquisition rules quoted here: accelerometer mounting and the mass-loading inequality (7.2.3), excitation (7.2.4), the excitation and measurement position counts and separations (7.2.5), the structural reverberation time (7.3) and the shielding requirement (Clause 9)." - type: standard organization: "International Organization for Standardization" year: 2006 @@ -73,7 +80,7 @@ velocity level differences across the junction condense into the descriptors $D_{n,f}$ (airborne) and $L_{n,f}$ (impact). This guide covers that measurement chain: the direction-averaged velocity level difference, the equivalent absorption lengths, the SEA validity checks of Part 4 and -the three accredited fiches. The empirical junction values a prediction +the three accredited-report-style fiches. The empirical junction values a prediction falls back on when no measurement exists live in [Predicting Sound Insulation (EN 12354)](/phonometry/buildings/design/insulation-prediction/); the wave-theory $K_{ij}$ of ideal plate junctions is derived in @@ -95,7 +102,56 @@ makes $K_{ij}$ symmetric), the common-edge junction length $l_{ij}$ and the **equivalent absorption lengths** $a_j = 2.2\pi^2 S_j /(T_{s,j} c_0)\sqrt{f_\text{ref}/f}$ (Formula (12), $f_\text{ref} = 1000$ Hz). For lightweight well-damped elements $a_j = S_j / l_0$ ($l_0 = 1$ m) and Formula (13) reduces to the simplified -Formula (14). The related **total loss factor** is $\eta = 2.2/(f T_s)$. +Formula (14), which needs no $T_s$ at all. + + + +Every symbol in Formula (13) is a length or an area in that drawing. The +highlighted corner line is $l_{ij}$, the common edge of the two elements; $S_i$ +and $S_j$ are the areas of the two plates, which enter through their equivalent +absorption lengths $a_i$ and $a_j$; and $\overline{D}_{v,ij}$ is what the pair +of accelerometers reads, once with element $i$ driven and once with element $j$ +driven. The $10\log_{10}(l_{ij}/\sqrt{a_i a_j})$ term is what makes the index a +property of the *junction* rather than of the two particular plates that were +built into the rig, which is the entire reason EN 12354 can consume it. + +### The structural reverberation time, and where it comes from + +$T_{s,j}$ is the second most influential input on this page and the one most +often assumed. It is **not** the room's reverberation time: it is the decay of +*bending-wave* energy on the element itself, measured with accelerometers, and +it is what carries the element's total loss factor into the absorption length, +$\eta_\text{total} = 2.2/(f T_s)$ (ISO 10848-1:2017, Formula (19)). Because +$a_j \propto 1/T_{s,j}$ and $K_{ij}$ carries $-10\log_{10}\sqrt{a_i a_j}$, a +$T_s$ wrong by a factor of two moves $K_{ij}$ by 1.5 dB in each element, and it +moves it in the direction that makes a junction look better than it is when +$T_s$ is overestimated. + +Measure it as ISO 10848-1:2017 Clause 7.3 prescribes: point excitation by an +electrodynamic shaker with an MLS or swept-sine signal (the preferred +laboratory method, per ISO 18233) or by an impact hammer, the integrated +impulse response of ISO 3382-2 with backward integration, acceleration rather +than velocity so no integration smears the decay, at least three excitation +positions and three measurement positions per excitation, and the minimum +separations of Clause 7.3.3 (0.5 m from the element boundaries, 1 m between +the excitation and the measurement positions, 0.5 m between measurement +positions). Evaluate over 5 dB to 15 dB from a decay that starts at least +35 dB above the background (Clause 7.3.4); heavy elements coupled to other +heavy elements give a short straight decay followed by a curve as energy +returns from the rest of the structure, so the short evaluation range is not a +convenience but a requirement of the physics. Clause 7.3.5 sets the floor +below which a forward analysis stops being reliable: $T_s > 70/f$ and +$T_s > 2T_\text{det}$, with $T_\text{det}$ the reverberation time of the +averaging detector. + +Expect a few tenths of a second on a heavy concrete plate built into a +building, falling with frequency, and much less on a well-damped lightweight +element — which is why the lightweight route of Formula (14) drops $T_s$ +entirely. The loss-factor identity is the sanity check on a measured value: at +500 Hz a $T_s$ of 0.35 s gives $\eta = 2.2/(500 \times 0.35) = 0.013$, a +plausible total loss factor for an in-situ heavy plate, while an $\eta$ coming +out above about 0.1 or below 0.005 says the decay was misread rather than that +the plate is unusual. **Overall descriptors.** $D_{n,f} = L_1 - L_2 - 10\log_{10}(A/A_0)$ (Formula (4), airborne) and $L_{n,f} = L_2 + 10\log_{10}(A/A_0)$ (Formula (5), tapping machine), @@ -106,6 +162,11 @@ octave bands (Annex A). +*$K_{ij}$ climbs steadily with frequency for a rigid junction of heavy walls, +so no single band represents it. The dashed line is the arithmetic mean over +200–1250 Hz, the range Annex A prescribes, and it is that mean — not the curve +— that an EN 12354 prediction consumes.* +
Show the code for this figure @@ -220,6 +281,81 @@ plt.show()
+## Making the measurement (ISO 10848-1:2017, Clauses 7 and 9) + +The formulae above are indifferent to how their inputs were obtained. The +standard is not, and one of its requirements decides whether the number means +anything at all. + +**Shielding comes first (Clause 9).** A junction of three or four elements has +two elements facing each room, and a receiving-room level fed by *all* of them +is not attributable to any one path. So the elements not under test are +shielded, successively, and the rule differs by quantity: measuring $D_{n,f}$ +for transmission through $i$ and $j$, shield the other element **in both +rooms**; measuring $L_{n,f}$, shield the other element **in the receiving +room**; measuring $K_{ij}$ with structure-borne excitation, **no shielding is +needed**, because the excitation is applied to one element rather than to a +sound field. Radiated sound measured by intensity to ISO 15186-1 also needs no +receiving-room shielding, because the enclosing surface does the same job. + +The shield has to be good enough to be worth building. Where the three or four +elements of the junction are identical, a $\Delta R$ of 10 dB in every band +suffices. In general, excite element 1 and then element 2 with the same kind of +excitation, read the average velocity level of the receiving element $j$ in +each case, and require +$\Delta R_\text{min} = 10 - L_{v,1j} + L_{v,2j}$ when +$L_{v,1j} - L_{v,2j} \le 10$ dB, and nothing at all when the difference already +exceeds 10 dB (Formulae (23) and (24)). Heavy shielding on a light element can +change the very transmission being measured and is to be avoided. **A $K_{ij}$ +or $D_{n,f}$ quoted without a statement of how the other elements were +shielded, and of how that shielding was verified, is a room-pair number with a +path label attached to it** — and it flows straight into an EN 12354 +prediction, where the error is unbounded in direction. + +**Accelerometers (Clause 7.2.3).** Mounted directly on the surface of the test +element, stiff in the direction normal to it. Bees or petroleum wax is +convenient, but a weak fixing costs high-frequency accuracy; where the surface +texture defeats wax, cement a small metal washer to it and wax or stud onto +that (ISO 5348). The accelerometer mass must be small enough not to load the +plate, which Formula (16) makes explicit: +$m_\text{acc} < 1/(2\pi f Y_\text{dp})$, with the driving-point mobility of a +thin isotropic plate estimated by Formula (17) as +$Y_\text{dp} = 1/(8\sqrt{B\rho_s}) = 1/(2.3\,\rho_s c_L h)$. The inequality +bites at the **top** of the band range, so check it at the highest band, not +the lowest. + +**Excitation (Clause 7.2.4).** Steady-state, from an electrodynamic shaker +driven with noise or from a tapping machine (adapted for walls, with the +impacts mechanically controlled to repeat), or transient, from single or +manually repeated hammer blows — in which case $D_{v,ij}$ must be measured on +both elements **simultaneously**. Manual multiple hits are spread over 1 m² to +2 m² at 1 Hz to 2 Hz over 20 s to 30 s. In every band the receiving element's +velocity level must exceed the background by at least 10 dB; below that, the +ISO 10140-4 correction applies and must not exceed 1.3 dB. Take care that the +source's own airborne noise, or radiation from the excited element, does not +excite the others — that is the same failure the shielding exists to prevent, +arriving by a different route. + +**Positions (Clause 7.2.5).** At least **four** excitation positions on a +Type A (heavy, homogeneous) source element and **six** on a Type B one, with at +least **three** measurement positions per excitation position on each plate, +randomly distributed over the surface rather than gridded. The minimum +separations are: 0.5 m from an excitation position to the element boundaries, +1.0 m between excitation positions (0.7 m for Type B), 1.0 m from an excitation +position to the junction under test, 1.0 m from an excitation position to its +associated measurement positions, 0.25 m from a measurement position to the +element boundaries and 0.5 m between the measurement positions of one +excitation position. On inhomogeneous elements (hollow brick, beam-and-block) +the positions must also be spread over the sub-elements, and on framed floors +the tapping-machine axis sits at 45° to the joists. On lightweight junctions +the operator should stay off the floor unless their weight and damping can be +shown not to matter. + +**Both directions.** $K_{ij}$ is symmetric only because the standard makes it +so: run the whole procedure with element $i$ excited and again with element $j$ +excited, and average the two level differences before Formula (13), which is +exactly what `direction_averaged_level_difference` does in the snippet above. + ## Suspended ceilings: the plenum flanking path (ISO 140-9, Vigran 9.2.3) Two offices separated by a partition that stops at the suspended ceiling share @@ -230,11 +366,62 @@ open-plan fit-out, and it is not what a partition's $R_w$ describes. -*Left: the plenum charges a fixed penalty against the sum of the two ceilings, -and a deeper plenum pays some of it back. Right: the same measured quantity -rated as a ceiling attenuation class.* +*Left: the plenum charges a fixed penalty against the sum of the two ceilings — +about 10 dB for this geometry — and doubling its depth pays back only 3 dB of +it, which is why the tile is the lever and the void is not. Right: the same +quantity as an accredited laboratory measures it, with the ASTM E413 contour +fitted to the measured $D_{n,c}$ and its deficiencies shaded; the class is read +off the shifted contour at 500 Hz.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np + +from phonometry import ceiling_attenuation_class, plenum_flanking_reduction_index + +fig, (ax_path, ax_cac) = plt.subplots(1, 2, figsize=(13.0, 5.6)) + +# Left: Vigran Section 9.2.3 geometry, LS = LR = 4.75 m, 9.5 mm plasterboard +# ceiling, reflecting plenum sidewalls, at two plenum depths. +freqs = np.array([63.0, 125.0, 250.0, 500.0, 1000.0, 2000.0, 4000.0]) +ceiling = np.array([17.0, 21.0, 25.0, 29.0, 32.0, 30.0, 38.0]) +x = np.arange(freqs.size) +for depth, style in ((0.43, "-o"), (0.86, "--o")): + res = plenum_flanking_reduction_index( + ceiling, ceiling, ceiling_length=4.75, plenum_height=depth, + frequency=freqs, + ) + ax_path.plot(x, res.reduction_index, style, label=f"Rcl, plenum h = {depth:g} m") +ax_path.plot(x, 2.0 * ceiling, ":s", label="RS + RR (two ceilings)") +ax_path.set_xticks(x, ["63", "125", "250", "500", "1k", "2k", "4k"]) +ax_path.set(xlabel="Frequency [Hz]", ylabel="Sound reduction index [dB]") +ax_path.legend() + +# Right: an accredited ASTM E1414 test report rated per ASTM E413. +dnc = np.array([14.4, 18.6, 21.7, 24.1, 23.4, 30.3, 33.7, 35.2, + 41.6, 44.2, 42.1, 36.8, 35.7, 36.0, 36.9, 37.9]) +cac = ceiling_attenuation_class(dnc) +xc = np.arange(dnc.size) +ax_cac.fill_between(xc, cac.measured, cac.shifted_reference, + where=cac.measured < cac.shifted_reference, + interpolate=True, alpha=0.25, label="deficiencies") +ax_cac.plot(xc, cac.measured, "-o", label="Dn,c (measured)") +ax_cac.plot(xc, cac.shifted_reference, "--s", label="ASTM E413 contour, fitted") +ax_cac.set(xlabel="Frequency [Hz]", + ylabel="Normalized ceiling attenuation Dn,c [dB]", + title=f"CAC = {cac.rating} dB") +ax_cac.legend() +plt.show() +``` + +
+ +### The one-dimensional model -**The one-dimensional model.** Mechel's one-dimensional variant, as presented +Mechel's one-dimensional variant, as presented by Vigran in Section 9.2.3, treats the plenum as a duct lined on one side. The ceiling on each side has a transmission factor $\tau_S = \tau_{S,pl}\tau_{S,a}$ (plates times any plenum absorber, Eq. (9.14)); the injected power splits, @@ -263,10 +450,8 @@ $R_{cl,p} = R_{cl} + 10\log_{10}(H_S/L_S)$ (Eq. (9.13)), which is what lets the ceiling path be added to the direct path as transmission factors. ```python -from phonometry import ( - partition_referenced_reduction_index, - plenum_flanking_reduction_index, -) +from phonometry import partition_referenced_reduction_index +# `plenum_flanking_reduction_index` is the import of the figure block above. freqs = [63.0, 125.0, 250.0, 500.0, 1000.0, 2000.0, 4000.0] ceiling = [17.0, 21.0, 25.0, 29.0, 32.0, 30.0, 38.0] # 9.5 mm plasterboard @@ -288,7 +473,9 @@ damped = plenum_flanking_reduction_index( print(partition_referenced_reduction_index(res.reduction_index, 2.7, 4.75)) ``` -**The measured quantity.** A ceiling is not rated by $R_{cl}$ but by the +### The measured quantity: normalized ceiling attenuation + +A ceiling is not rated by $R_{cl}$ but by the **normalized ceiling attenuation** $D_{n,c} = D - 10\log_{10}(A/A_0)$ (ISO 140-9:1985 clause 3.3), with $A$ the receiving-room equivalent absorption area and the reference $A_0 = 10\ \text{m}^2$. The facility has two rooms of at least @@ -308,14 +495,18 @@ deficiency exceeds 8 dB (clauses 5.3 and 5.4), and reads the rating off the shifted contour at 500 Hz (clause 5.5). ```python -from phonometry import ( - ceiling_attenuation_class, - normalized_ceiling_attenuation, - weighted_rating, -) - -# ASTM E1414 normalizes to A0 = 12 m2, ISO 140-9 to A0 = 10 m2. -dnc = normalized_ceiling_attenuation(l1, l2, absorption, reference_area=12.0) +from phonometry import normalized_ceiling_attenuation, weighted_rating +# `ceiling_attenuation_class` is the import of the figure block above. + +# Dn,c from the measured pair: source- and receiving-room levels over the +# common plenum and the receiving room's absorption area, per band. ASTM E1414 +# normalizes to A0 = 12 m2, ISO 140-9 to A0 = 10 m2. +l1_c = [80.0] * 16 # source room, per band +l2_c = [45.0] * 16 # receiving room, over the plenum path +absorption = [12.0] * 16 # receiving-room A per band (m2) +astm = normalized_ceiling_attenuation(l1_c, l2_c, absorption, reference_area=12.0) +iso140_9 = normalized_ceiling_attenuation(l1_c, l2_c, absorption) +print(round(float(astm[0]), 2), round(float(iso140_9[0]), 2)) # 35.0 34.21 # A 28 mm perforated plaster acoustic tile, measured to ASTM E1414 (CAC 34). dnc = [14.4, 18.6, 21.7, 24.1, 23.4, 30.3, 33.7, 35.2, @@ -428,9 +619,15 @@ three one-page fiches through `.report()`. specimen types they apply to; phonometry implements only the Part 1 $K_{ij}$/$D_{n,f}$/$L_{n,f}$ formulae generically, plus the Part 4 modal-overlap validity check, not the facility-specific test setups the -other parts describe. Because ISO 10848 contains no worked numeric -example, conformance is anchored on closed-form identities (simplified -$K_{ij}$, $a_j$ at $f_\text{ref}$, $\eta$). +other parts describe. The acquisition of +[Making the measurement](#making-the-measurement-iso-10848-12017-clauses-7-and-9) +is documented here and enforced nowhere: nothing checks that the other +elements were shielded, that the shield met $\Delta R_\text{min}$, that the +position counts and separations were kept, that the accelerometer satisfied +the mass-loading inequality, or that $T_s$ was measured on the elements in +their installed state rather than assumed. Because ISO 10848 contains no +worked numeric example, conformance is anchored on closed-form identities +(simplified $K_{ij}$, $a_j$ at $f_\text{ref}$, $\eta$). The suspended-ceiling branch covers the normalized ceiling attenuation $D_{n,c}$ of ISO 140-9:1985 clause 3.3, the ASTM E413-22 diff --git a/site/src/content/docs/buildings/insulation/heavy-impact-sources.mdx b/site/src/content/docs/buildings/insulation/heavy-impact-sources.mdx index 6566aef57..ce37ea769 100644 --- a/site/src/content/docs/buildings/insulation/heavy-impact-sources.mdx +++ b/site/src/content/docs/buildings/insulation/heavy-impact-sources.mdx @@ -37,6 +37,13 @@ references: publisher: "Butterworth-Heinemann" doi: "10.4324/9780080550473" note: "Section 3.6.4 describes the heavy impact sources and explains why no simple prediction counterpart exists. ISBN 978-0-7506-6526-1." + - type: article + authors: ["Kim, K. W.", "Park, S. H.", "Shin, H. K.", "Kim, K. C."] + year: 2023 + title: "Changes of floor impact sound regulations and future improvement directions in Korea" + journal: "Proceedings of Forum Acusticum 2023 (10th Convention of the European Acoustics Association)" + doi: "10.61782/fa.2023.0364" + note: "Table 1 records the August 2022 revision: the heavyweight source became the rubber ball, the index L'iA,Fmax through KS F ISO 10140-5 and KS F ISO 717-2, the mandatory standard 49 dB (from 50 dB) and the four grades at 4 dB intervals. The only published regulatory scale for the quantity this page computes." --- import ThemeImage from '../../../../components/ThemeImage.astro'; @@ -63,6 +70,52 @@ Right: the rating adds the A-weighted band contributions in energy, and the A-weighting is 23 dB steeper at 63 Hz than at 500 Hz, so the quietest measured band ends up deciding the number.* +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np + +from phonometry import ( + a_weighted_maximum_impact_level, + heavy_impact_source_limits, + heavy_impact_source_specification, +) + +fig, (ax_src, ax_rate) = plt.subplots(1, 2, figsize=(13.0, 5.6)) + +# Left: the printed nominal spectra inside their printed tolerance bands. +x = np.arange(5) +for source in ("rubber_ball", "bang_machine"): + spec = heavy_impact_source_specification(source) + _f, lower, upper = heavy_impact_source_limits(source) + label = source.replace("_", " ") + ax_src.fill_between(x, lower, upper, alpha=0.30, label=f"{label} tolerance") + ax_src.plot(x, spec.force_exposure_level, "-o", label=f"{label} nominal") +ax_src.set_xticks(x, ["31.5", "63", "125", "250", "500"]) +ax_src.set(xlabel="Frequency [Hz]", + ylabel="Impact force exposure level LFE [dB re 1 N]") +ax_src.legend() + +# Right: ISO 717-2:2020 Table D.4, measured levels against their A-weighted +# contributions, with the energy sum drawn across them. +res = a_weighted_maximum_impact_level([65.3, 64.5, 58.0, 55.8]) +xr = np.arange(4) +ax_rate.bar(xr - 0.19, res.levels, width=0.36, label="Li,Fmax (measured)") +ax_rate.bar(xr + 0.19, res.corrected, width=0.36, label="Li,Fmax + A (Table D.3)") +ax_rate.axhline(res.rating, label=f"LiA,Fmax = {res.rating} dB") +ax_rate.set_xticks(xr, ["63", "125", "250", "500"]) +ax_rate.set(xlabel="Frequency [Hz]", + ylabel="Maximum impact sound pressure level [dB]") +ax_rate.text(0.02, 0.03, f"unrounded sum = {res.unrounded:.6f} dB", + transform=ax_rate.transAxes, va="bottom", ha="left") +ax_rate.legend() +plt.show() +``` + +
+ ## Both sources are specified by the energy of their force pulse A heavy source is not defined by its shape but by the **impact force exposure @@ -79,8 +132,9 @@ $t_2 - t_1$ the duration of the impact. Watch the reference: EN 15657 refers its blocked-force levels to $F_0 = 10^{-6}$ N, 120 dB away, so a force level carried between this page and [Structure-borne sound power of equipment](/phonometry/buildings/design/structure-borne-power/) -without conversion is wrong by exactly that. Both characteristics require a **single-peak** waveform of -$20 \pm 2$ ms (JIS A 1418-2:2019 A.2 b)). The octave-band values are printed +without conversion is wrong by exactly that. Both sources require a **single-peak** waveform of +$20 \pm 2$ ms (JIS A 1418-2:2019 A.2 b), where the two are called the +soft and the hard *impact characteristic*). The octave-band values are printed identically in ISO 16283-2:2020 Table A.1, ISO 10140-5:2010 Table F.1 and JIS A 1418-2:2019 Table A.2 for the ball; the bang machine appears only in JIS A 1418-2:2019 Table A.1. @@ -99,12 +153,9 @@ less into the top one, which is why the two sources are not interchangeable and why a floor can pass one and fail the other. ```python -from phonometry import ( - check_heavy_impact_source, - heavy_impact_source_limits, - heavy_impact_source_specification, - impact_force_exposure_level, -) +from phonometry import check_heavy_impact_source, impact_force_exposure_level +# `heavy_impact_source_specification` and `heavy_impact_source_limits` are the +# imports of the figure block above. spec = heavy_impact_source_specification("rubber_ball") print(spec.drop_height, spec.effective_mass) # 1.0 m, 2.5 kg @@ -114,7 +165,10 @@ freqs, lower, upper = heavy_impact_source_limits("bang_machine") print(list(zip(freqs, lower, upper))[0]) # (31.5, 46.0, 48.0) # A calibration run: five measured octave-band LFE against the printed table. -check = check_heavy_impact_source([39.4, 30.2, 23.6, 18.5, 12.9]) +# Name the source: the check defaults to the rubber ball, and the bang machine +# limits fetched above would reject a conforming ball outright. +check = check_heavy_impact_source([39.4, 30.2, 23.6, 18.5, 12.9], + source="rubber_ball") print(check.passed, list(check.within_tolerance)) check.plot() # measured LFE over the tolerance band (needs matplotlib) ``` @@ -157,6 +211,22 @@ $0.8 \pm 0.1$, dropped from $(100 \pm 1)$ cm measured from the bottom of the ball; and a car tyre inflated to $(2.4 \pm 0.2)\times 10^5$ Pa with an effective mass of $(7.3 \pm 0.2)$ kg, dropped from 85 cm. + + +### Which source + +The choice is not free, and it is not a matter of taste. The **rubber ball** is +the source international standardisation adopted: ISO 16283-2:2020 Annex A and +ISO 10140-5:2010 Annex F both specify it, ISO 10052:2021 Clause 6.3.2 measures +with it, and it is light enough to use on a lightweight timber floor without +risk. The **bang machine** exists only in JIS A 1418-2:2019 and is used where +national practice calls for it, chiefly in Japan and Korea; its 7.3 kg tyre +dropped from 85 cm delivers 8 to 9 dB more force in the two lowest octaves, +which is precisely what makes it more searching on a heavy slab and what makes +it capable of damaging a light floor. Use the ball unless a national regulation +or a client specification names the bang machine, and never quote a result from +one against a limit written for the other. + ## The receiving room: a maximum level cannot be corrected like an average The rated quantity is a **maximum** of a Fast time-weighted level, not an @@ -183,12 +253,62 @@ burst. It has a removable singularity at $C = 1$ (i.e. $T = 1{,}7275$ s) where its value is $1/e$. When $T = T_0$ the bracket collapses to 1 and the whole correction reduces to the volume term, as it must. +The constant $1{,}7275$ s is **not** an integration limit: it is the Fast time +weighting written as a reverberation time. An exponential decay of $T$ seconds +has an energy time constant $\tau = T/(6\ln 10) = T/13{,}82$, so a room with +$T = 13{,}82 \times 0{,}125\ \text{s} = 1{,}7275\ \text{s}$ decays with +exactly the Fast detector's own $0{,}125$ s time constant, and $C = T/1{,}7275$ +is the ratio of the two. Well below $C = 1$ the detector keeps up with the +decay and the correction behaves like the energy-average +$10\log_{10}(T/T_0)$; well above it the detector cannot follow, the peak it +reports stops growing with $T$, and the correction saturates. ISO 16283-2:2020 +prints the constant without deriving it and refers to its Reference [1] for the +background. + + + +*Both curves are the term the standardization *subtracts* from the measured +level, so they are directly comparable. At $T = T_0$ they vanish together, as +they must. Above it they separate: the energy-average correction keeps growing +without limit, because energy keeps accumulating, while the Fast term flattens, +because a 0.125 s detector stops resolving more decay. At $T = 5$ s the +energy-average rule would take off 10.0 dB and the Fast rule takes off 5.1 dB — +and that divergence is the whole reason ISO 16283-2 defines a separate +standardization for a maximum.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np + +from phonometry import fast_reverberation_correction + +t = np.linspace(0.2, 5.0, 481) +fast = np.asarray(fast_reverberation_correction(t), dtype=float) +energy = 10 * np.log10(t / 0.5) +print(round(float(fast[-1]), 1), round(float(energy[-1]), 1)) # 5.1 10.0 + +fig, ax = plt.subplots() +ax.fill_between(t, fast, energy, where=np.abs(fast - energy) > 1.0, + interpolate=True, alpha=0.25, label="more than 1 dB apart") +ax.plot(t, fast, label="Fast maximum: 10 lg[g(C)/g(C0)]") +ax.plot(t, energy, "--", label="energy average: 10 lg(T/T0)") +ax.set(xlabel="Receiving-room reverberation time T [s]", + ylabel="Term subtracted from the measured level [dB]") +ax.legend() +plt.show() +``` + +
+ ```python from phonometry import ( - fast_reverberation_correction, heavy_impact_octave_levels, standardized_maximum_impact_level, ) +# `fast_reverberation_correction` is the import of the figure block above. freqs = [63.0, 125.0, 250.0, 500.0] li_fmax = [65.3, 64.5, 58.0, 55.8] # energy-averaged over ball positions @@ -203,6 +323,56 @@ res.plot() # measured and standardized spectra (needs matplotlib) print(heavy_impact_octave_levels([60.0] * 6)) # +10 lg 3 dB per octave ``` +## Measuring in the field (ISO 16283-2:2020, Clauses 6 to 9) + +The functions above consume levels that have already been averaged over +positions. ISO 16283-2:2020 says how those positions are chosen, and the rubber +ball differs from the tapping machine at almost every step. + +**Dropping the ball (Clause 7.2.3).** Vertical free fall from +$(100 \pm 1)$ cm, measured from the **bottom** of the ball to the surface of +the floor under test — not from the operator's hand and not from the centre of +the ball. **Four or more** positions on the floor or stairs under test; on a +lightweight joisted floor, one of them should be over a joist and one at the +centre of the floor, because those are the two extremes of the driving-point +mobility. + +**Microphones (Clauses 7.3.1, 7.3.2, 7.6).** Fixed positions only: the +mechanized continuously moving microphone and the manual scan that the tapping +machine may use are **not** available for the ball, because a maximum level +cannot be spatially averaged along a path the way an energy average can. Fixed +positions may be on a tripod with nobody in the room, or with an operator +present whose trunk stays at least an arm's length from the microphone. +Distribute them through the permitted space, with no two in the same plane +relative to the boundaries and no regular grid, keeping at least 0.7 m between +positions, 0.5 m from the room boundaries and 1.0 m from the partition being +excited. The number of microphone positions equals the number of source +positions or an integer multiple of it: with four or five source positions, at +least two measurements at each from at least two different microphone +positions; with six or more, one measurement per source position at a different +microphone position each time. + +**Averaging, in two stages (Clauses 7.8.3 and 7.3.4).** First energy-average +the maximum levels over the microphone positions belonging to one ball position +(Formula (14)); then energy-average those per-position results over the ball +positions (Formula (9)). Only then apply the standardization of Formulae (4), +(5) and (6). Averaging everything in one pass is not the same operation. + +**Two things the tapping machine does that the ball does not.** The +low-frequency corner procedure of Clause 8 applies to the tapping machine only: +NOTE 2 to Clause 6 says plainly that no link has yet been shown between corner +and central-zone measurements for a *maximum* Fast-weighted level, so there is +nothing to combine. And the ball's level is **not corrected for background +noise** (Clause 9 NOTE), because it cannot be established whether a maximum +representing the background affected the maximum representing the impact. +Instead, keep the background low and say so. + +The survey method reaches the same quantity by a shorter route: +[ISO 10052:2021 Clause 6.3.2](/phonometry/buildings/insulation/insulation-survey/#running-the-survey-clauses-5-and-6) +measures the Fast maximum in octave bands over about 10 s from at least two +fixed positions more than 0.7 m apart, one near the centre and one at a +different height, at least 0.5 m from the boundaries and 1.0 m from the impact. + ## The single number is an A-weighted sum, not a shifted curve ISO 717-2:2020 Annex D is normative and does not use a reference curve at all. @@ -224,7 +394,7 @@ The worked example of Table D.4 is reproduced exactly, including the deliberately unrounded intermediate the standard prints: ```python -from phonometry import a_weighted_maximum_impact_level +# `a_weighted_maximum_impact_level` is the import of the figure block above. # ISO 717-2:2020 Table D.4: a field measurement in octave bands. res = a_weighted_maximum_impact_level([65.3, 64.5, 58.0, 55.8]) @@ -240,6 +410,24 @@ Table D.4 spectrum the four A-weighted contributions are 39.1, 48.3, 49.3 and 52.6 dB, so the 500 Hz band carries the most weight even though 63 Hz is the loudest measured band, 9.5 dB above it. +Read the 55 dB the way an impact quantity is read: **higher is worse**, as for +every impact level on this site. It is a maximum, not an average, so it is not +comparable with an $L'_{nT,w}$ or an $L'_{n,w}$ from the tapping machine, and +ISO sets no limit on it — heavy-impact criteria are national. The most +developed of them is Korea's, where floor impact sound in apartment housing has +been regulated since 2004 and the rules were rewritten in August 2022: the +heavyweight source became the rubber ball, the evaluation index became exactly +the $L'_{iA,F\max}$ of this section (through KS F ISO 10140-5 and +KS F ISO 717-2), and the mandatory performance standard was set at **49 dB**, +tightened from the 50 dB of the previous bang-machine scheme. Above that +threshold sit four grades at 4 dB intervals, grade 1 being the best: +$L \le 37$, $37 < L \le 41$, $41 < L \le 45$ and $45 < L \le 49$ dB. Against +that scale, the 55 dB of the worked example is a floor that fails the standard +outright. Because the number is set by the low-frequency bands, what moves it +is mass and structural decoupling — a thicker slab, a floating floor on a soft +resilient layer, a decoupled ceiling — and *not* a soft covering, which acts +where the A-weighting has already discarded the energy. + ## What this guide covers **Covered.** The impact force exposure level of ISO 16283-2:2020 @@ -257,10 +445,12 @@ Formula (20), via `building.standardized_maximum_impact_level`, ISO 717-2:2020 Annex D with the Table D.3 corrections, via `building.a_weighted_maximum_impact_level`. -**Not covered.** The field measurement procedure itself (the four or more -drop positions of ISO 10140-3 Annex A, the microphone positions and the -low-frequency corner procedure) is not automated: the functions consume levels -that were already energy-averaged over positions. There is no prediction model +**Not covered.** The field procedure documented above is not automated: the +functions consume levels that were already energy-averaged over the microphone +positions of one ball position and then over the ball positions, and nothing +checks the drop height, the four-or-more source positions, the microphone +separations or the two-stage averaging. Nor is the horizontal-arrangement +guidance of ISO 16283-2:2020 Annex E, which is informative. There is no prediction model that takes a floor construction to a heavy-impact level; Hopkins states plainly that the complexity of the input force and the use of a time-weighted maximum leave no simple counterpart to the tapping-machine diff --git a/site/src/content/docs/buildings/insulation/index.md b/site/src/content/docs/buildings/insulation/index.md index 62ecf1206..19613b5de 100644 --- a/site/src/content/docs/buildings/insulation/index.md +++ b/site/src/content/docs/buildings/insulation/index.md @@ -77,8 +77,9 @@ related EN 12354-5, lives in the octave-band control method, its reverberation index and its survey quantities. - [Laboratory Flanking Transmission (ISO 10848)](/phonometry/buildings/insulation/flanking-lab/): - the measured vibration reduction index Kij and the flanking descriptors - Dn,f and Ln,f. + the measured vibration reduction index Kij, the flanking descriptors Dn,f + and Ln,f, and the suspended-ceiling plenum path with its normalized ceiling + attenuation Dn,c and ceiling attenuation class. - [Heavy and Soft Impact Sources (ISO 16283-2)](/phonometry/buildings/insulation/heavy-impact-sources/): the rubber ball and the bang machine, the impact force exposure levels that specify them, the Fast-weighted maximum level and the ISO 717-2 Annex D diff --git a/site/src/content/docs/buildings/insulation/insulation-field.mdx b/site/src/content/docs/buildings/insulation/insulation-field.mdx index 34817d51c..1eac3f2e7 100644 --- a/site/src/content/docs/buildings/insulation/insulation-field.mdx +++ b/site/src/content/docs/buildings/insulation/insulation-field.mdx @@ -120,6 +120,19 @@ map lives in prediction that bridges the two is [EN 12354](/phonometry/buildings/design/insulation-prediction/). +One measurement yields all three quantities, so **which one goes on the report +is a regulatory question, not a measurement one.** $D_{nT}$ describes the room +pair as the occupants experience it, and that is what most national codes for +dwellings state their requirements in. $R'$ describes the partition, normalised +by its area, and is what a comparison against a laboratory $R_w$ or an EN 12354 +prediction needs. Measure once, then report the quantity the requirement is +written in and say which it is: an $R'_A$ cannot be checked against a +$D_{nT,A}$ limit without converting through the room's $T$ and the partition +area first — see +[Spanish Building Code (CTE DB-HR)](/phonometry/buildings/insulation/spanish-building-code/), +which states its between-rooms requirement in $D_{nT,A}$ and its +partition-wall requirement in $R_A$. + ```python import numpy as np from phonometry import building @@ -147,6 +160,12 @@ pass them to `airborne_insulation`. Feed that function's `dnt` (or `r_prime`) spectrum to `weighted_rating`, so every band aligns index-by-index with the ISO 717-1 reference curve. +The scale is worth carrying: for a separating wall or floor between dwellings, +national requirements typically sit around $D_{nT,w} = 50$ dB and rarely below +45 dB, so the 40 dB of this deliberately flat example would fail every one of +them. Higher is better for an airborne quantity, and 5 dB is roughly the step +between a construction that works and one that generates complaints. + ### `airborne_insulation()` parameters | Parameter | Type | Units | Range / default | Notes | @@ -262,6 +281,77 @@ naive = building.airborne_insulation(l1m, l2m, t2, area=10.0, volume=50.0) print(round(float(naive.dnt[0]), 1), building.weighted_rating(naive.dnt).rating) # 43.0 43 ``` +### Small rooms: the low-frequency procedure (Clause 8) + +This one is easy to miss and it is **mandatory**. When the source and/or +receiving room has a volume smaller than 25 m³ — calculated to the nearest +cubic metre, so a 25.4 m³ bedroom does not trigger it and a 24.6 m³ one does — +the 50 Hz, 63 Hz and 80 Hz one-third-octave bands must additionally be measured +in the corners of that room (Clause 6 and Clause 8.1). Most European bedrooms +and every bathroom fall under the threshold, so this is the normal case in +dwelling work, not an edge case. It is **in addition to** the default +procedure, not instead of it, and the same 25 m³ rule governs the +reverberation time. + +The reason is stated in the standard's own NOTE 1: at those frequencies a small +room's field is modal, the spatial variation is large, and the central-zone +average is neither repeatable nor representative of what an occupant hears. A +modal pressure maximum always sits in a corner, so corner measurements bound +the field from above. + +**How a corner measurement is taken (Clauses 8.3 and 8.4).** A fixed +microphone, 0.3 m to 0.4 m from *each* of the three boundaries forming the +corner (the three distances need not be equal), at least 1.0 m from any +loudspeaker — which in practice rules out the corner the loudspeaker occupies. +Measure at least **four** corners, two at floor level and two at ceiling level, +adjacent to the partition or not; each corner must be formed by three mutually +perpendicular surfaces of at least 0.5 m², with no furniture within 0.5 m. Where +that is impossible, corners with pair angles between 45° and 135°, or with an +object such as a cupboard forming one surface, are admitted. Average at least +15 s per position. With a single loudspeaker moved between positions, take the +four corners again for each position. + +**How the corners enter the result (Clause 8.5).** For each of the three bands +independently, take the **highest** of the measured corners — which may be a +different corner in each band — as $L_\text{Corner}$; with several loudspeaker +positions, energy-average those per-position maxima (Formula (12)). Then +combine with the default-procedure average $L$ in a 1:2 weighting +(Formula (13)): + +$$ +L_{LF} = 10\log_{10}\left[\frac{10^{0.1 L_\text{Corner}} + 2 \cdot 10^{0.1 L}}{3}\right]. +$$ + +$L_{LF}$ replaces $L$ in those three bands, and $D_{nT}$ or $R'$ is then formed +exactly as before. Because $L_\text{Corner}$ can exceed $L$ by several +decibels, the procedure raises the source-room level and the receiving-room +level alike — the effect on the level *difference* is whatever the two rooms do +not have in common, which is precisely the information the default procedure +throws away. Clause 9.1 adds the consequence for background noise: a background +measurement is required **in each corner used**, because each band may have +come from a different corner and so may need its own correction. + +```python +# `np` and `building` are the imports of the blocks above. + +# 50, 63, 80 Hz. Four corners measured in a 22 m3 receiving room, one +# loudspeaker position; the default central-zone average alongside. +corners = np.array([ # rows: corners, columns: the 3 bands + [52.1, 55.4, 49.8], + [54.6, 53.0, 51.2], + [51.0, 56.9, 50.4], + [53.3, 54.1, 52.7], +]) +l_default = np.array([49.5, 51.2, 48.6]) + +l_corner = corners.max(axis=0) # Clause 8.5: the loudest corner, per band +print(l_corner) # [54.6 56.9 52.7] (three different corners) + +l_lf = 10 * np.log10((10 ** (0.1 * l_corner) + 2 * 10 ** (0.1 * l_default)) / 3) +print(np.round(l_lf, 1)) # [51.9 54. 50.4] +print(np.round(l_lf - l_default, 1)) # [2.4 2.8 1.8] dB above the default +``` + ## Field impact insulation (ISO 16283-2) Footstep noise is rated the other way round. Instead of how much a floor @@ -283,6 +373,15 @@ needs only the receiving-room $T$, so with $T = 0.5$ s it equals $L_i$; the the receiving-room volume. Note the **minus** sign: more reverberation *lowers* $L'_{nT}$, opposite to the airborne $D_{nT}$. +The tapping machine is not the only source ISO 16283-2 specifies. Its hammers +deliver a hard, quasi-stationary excitation whose energy sits above 100 Hz, +which says almost nothing about the slow low-frequency thumps occupants +actually complain about — a child jumping, an adult walking barefoot. For those, +the same standard specifies a **rubber ball** (Annex A), rated through a +different engine entirely: a Fast-weighted maximum level and the A-weighted sum +of ISO 717-2 Annex D, not a shifted reference curve. It has its own guide, +[Heavy and Soft Impact Sources](/phonometry/buildings/insulation/heavy-impact-sources/). + ```python @@ -312,6 +411,16 @@ Feed `impact_insulation`'s `l_n_t` (or `l_n`) straight into `weighted_impact_rating`; the rating and $C_I$ reproduce the ISO 717-2 Annex C values (thirds $L'_{nT,w} = 79$, $C_I = -11$; octave 54, $C_I = 0$). +The sign of the scale reverses here: **lower is better** for an impact +quantity. National limits for dwellings sit in the 50 to 60 dB range, so +$L'_{nT,w} = 79$ dB is a bare structural floor with no covering and no floating +layer, failing by roughly 20 dB — the Annex C example is a worst case, not a +typical one. What it takes to close a gap of that size is a floating floor on a +resilient layer or a decoupled ceiling, not a carpet; see +[Predicting Sound Insulation (EN 12354)](/phonometry/buildings/design/insulation-prediction/) +and +[Predicting resilient-layer performance](/phonometry/buildings/design/resilient-layers/). + ### `impact_insulation()` parameters | Parameter | Type | Units | Range / default | Notes | @@ -493,9 +602,22 @@ print(round(uv.lower, 1), round(uv.upper, 1)) # 50.2 53.8 -> 52 ± 1.8 dB # Declaring conformity uses the ONE-sided factor (k = 1.65): does R'w provably # clear a 50 dB requirement? uc = building.uncertain_value(52.0, "rprime_w", "B", one_sided=True) +print(round(uc.expanded_uncertainty, 2)) # 1.48 = 1.65 x 0.9 +print(round(52.0 - uc.expanded_uncertainty, 2)) # 50.52 = the lower bound print(building.satisfies_lower_requirement(52.0, uc.expanded_uncertainty, 50.0)) # True ``` +That is the whole content of `satisfies_lower_requirement`: the measured 52.0 +minus the one-sided expanded uncertainty 1.48 is 50.52, which still clears +50.0, so conformity can be *declared* rather than merely observed. The choice +of factor is the point. Reporting a value is a two-sided statement — the true +value lies somewhere in an interval — and takes `k = 1.96`. Declaring +conformity is a one-sided statement: only the lower end matters, because +nothing is at stake if the wall is better than claimed, so `k = 1.65` gives the +same 95 % confidence on the side that counts. Using the two-sided factor here +would demand 1.76 dB of margin instead of 1.48 dB and would fail results that +genuinely comply. + Impact quantities offer situations B/C only (Table 4, no 500 Hz band in the 2020 edition), and $\Delta L$ only situation A. Descriptors are case-insensitive with aliases (`rprime_w`/`dnt_w`→`r_w`, `lprime_n_w`→`ln_w`); combine independent @@ -504,6 +626,13 @@ independent measurements with `reduce_by_independent_measurements` ($u/\sqrt{m}$ +*The same rating, reported three ways. Which interval applies is not a +property of the measurement but of the question: situation A is what a +laboratory quotes for a specimen, B what two teams measuring the same +installed partition should agree within, C what one team repeating itself +should. B is the widest of the three that a field report can honestly claim, +and it is the one that decides whether a result clears a requirement.* +
Show the code for this figure @@ -550,7 +679,7 @@ plt.show() ## Beyond the two-room measurement -Three measurements that used to share this page now have guides of their own, +Three neighbouring measurements have guides of their own, and a fourth sits alongside them. The building envelope, measured against the level 2 m in front of it and predicted from its elements, is [Façade Sound Insulation](/phonometry/buildings/insulation/facade-insulation/). When a full @@ -586,11 +715,16 @@ floor was met; the correction itself is three lines of NumPy, written out under [Correcting for background noise](#correcting-for-background-noise-clause-92) above. (`building.background_correction` is the ISO 10140-4 *laboratory* variant and does not match the field thresholds.) -ISO 16283-1/-2's own position and procedure requirements (the minimum number -of source and microphone positions, the low-frequency loudspeaker or -microphone-sweep procedures) are not checked: energy-averaging happens once -positions are supplied, but nothing here verifies how many were taken or -where. The other members of the family are covered by their own guides: the +ISO 16283-1/-2's own position and procedure requirements — the counts, +distances and averaging of +[Taking the measurement](#taking-the-measurement-iso-16283-1-clauses-7-and-9) +and the corner measurements of +[Small rooms](#small-rooms-the-low-frequency-procedure-clause-8) — are +documented here and checked nowhere: energy-averaging happens once positions +are supplied, but nothing verifies how many were taken, where, or that the +25 m³ trigger was even tested for. The Formula (12) and (13) combination of the +low-frequency procedure is the two lines of NumPy printed above, not a library +function. The other members of the family are covered by their own guides: the façade part ISO 16283-3 ([Façade Sound Insulation](/phonometry/buildings/insulation/facade-insulation/)), the survey method ISO 10052 @@ -608,6 +742,9 @@ sound-intensity route ISO 15186-1/-2 part of ISO 16283, measured and predicted. - [Sound Insulation Survey Method (ISO 10052)](/phonometry/buildings/insulation/insulation-survey/): the octave-band control method these engineering methods are the reference for. +- [Heavy and Soft Impact Sources](/phonometry/buildings/insulation/heavy-impact-sources/): + the rubber ball and the bang machine, the other impact sources of ISO 16283-2, + and the ISO 717-2 Annex D rating that goes with them. - [Laboratory Insulation Measurement](/phonometry/buildings/insulation/insulation-lab/): the ISO 10140 element characterisation these field quantities are compared against. - [Sound Insulation by Intensity (ISO 15186)](/phonometry/buildings/insulation/insulation-intensity/): diff --git a/site/src/content/docs/buildings/insulation/insulation-intensity.mdx b/site/src/content/docs/buildings/insulation/insulation-intensity.mdx index 179b3ba0f..bdc2d10bb 100644 --- a/site/src/content/docs/buildings/insulation/insulation-intensity.mdx +++ b/site/src/content/docs/buildings/insulation/insulation-intensity.mdx @@ -45,14 +45,25 @@ probe physics and its field indicators are the subject of the ## Measuring the transmitted power directly (ISO 15186-1) - -The [ISO 10140 laboratory method](/phonometry/buildings/insulation/insulation-lab/) reads -the transmitted power *indirectly*, from the -receiving-room level and its absorption area; this breaks down when flanking -paths leak power the room integrates in anyway. The **sound-intensity** method -(ISO 15186) sidesteps that: an intensity probe scans a measurement surface that -encloses the specimen and measures the radiated power *directly*, so only the -element under test contributes. It is the tool of choice when flanking is high +The quantity being measured is a **surface integral**: the net sound power +crossing an imaginary surface drawn around the radiating face of the specimen, +$W = \int_S \mathbf{I} \cdot \mathbf{n}\, \mathrm{d}S$, where $\mathbf{I}$ is +the time-averaged intensity vector and $\mathbf{n}$ the outward normal. Two +consequences follow, and between them they are the whole method. First, a +source *outside* the closed surface contributes nothing to the integral: what +enters through one face leaves through another, so a flanking wall radiating +into the same receiving room cancels itself out and only the enclosed specimen +survives. Second, the sign matters — a patch of surface where energy is +flowing back *towards* the specimen subtracts, which is why the standard +carries a minus-sign rule (Clause 6.4.6) that no pressure-based method needs. +The probe reads $\mathbf{I} \cdot \mathbf{n}$ point by point and the operator +performs the integration by moving it, which makes the scan pattern part of +the measurement rather than a matter of technique. + +That is what the pressure method cannot do. It reads the transmitted power +*indirectly*, from the receiving-room level and its absorption area, and the +room integrates every watt that arrives whichever path carried it. The +intensity method is therefore the tool of choice when flanking is high (ISO 15186-1:2000, Clause 1). From the source-room level $L_{p1}$ and the average normal intensity level $L_{In}$ over the surface (area $S_m$), for a specimen of area $S$, @@ -98,6 +109,9 @@ print(res.rating.rating) # 38 -> RI,w (ISO 717-1 engine) # Qualify the measurement surface: FpI = Lp - LIn must stay < 10 dB (< 6 dB when # the receiving side is absorbing); the probe's residual index must exceed FpI+10. +# Lp is the receiving-room pressure level measured over the same surface, if +# possible simultaneously with the scan (Clause 6.4.2). Here it sits 6 dB above +# LIn, i.e. exactly on the absorbing-specimen criterion. fpi = building.surface_pressure_intensity_indicator(np.full(16, 46.0), l_in) print(round(float(fpi[0]), 1)) # 6.0 @@ -109,11 +123,7 @@ res.plot() # measured RI vs shifted ISO 717-1 reference (needs matplotlib) *The modified index $R_{I,M} = R_I + K_c$ lifts $R_I$ (most at the low bands, where $K_c$ is largest), so an intensity measurement reproduces the ISO 10140-2 pressure result. The automatic rating is formed only for exactly 16 -one-third-octave or 5 octave values (`rating`/`rating_modified` are `None` -otherwise). Subareas scanned separately are combined first with -`combine_subareas` (Formulas (11)-(12)); a subarea whose net energy flows back -towards the specimen enters with a negative area, applying the minus-sign rule -of Clause 6.4.6 while $S_m$ keeps the unsigned area sum.* +one-third-octave or 5 octave values.*
Show the code for this figure @@ -148,6 +158,147 @@ plt.show()
+## Scanning the measurement surface (Clause 6.4) + +A method defined by how a probe is moved is not documented by its formula. +Everything below fixes a number that the formula then consumes, and none of it +is checked by the functions on this page. + +**The surface (Clause 6.4.1).** The measurement surface totally encloses the +test specimen. A specimen in a niche deeper than 0.1 m is normally measured on +the flat surface of the niche opening; otherwise, and for most small building +elements, the surface is box-shaped. Choose the measurement distance in the +**0.1 m to 0.3 m** band. Below 0.1 m the near field of the vibrating element +makes the intensity change sign repeatedly, so the integral stops converging; +above 0.3 m a box-shaped surface picks up too much of the room. + +**Qualifying the surface (Clause 6.4.2).** Measure $L_{In}$ and, if possible +simultaneously, the surface-averaged pressure level $L_p$, and form the +surface pressure-intensity indicator $F_{pI} = L_p - L_{In}$ (Formula (10)). +The surface fails qualification if the measured intensity is negative, or if +$F_{pI} > 10$ dB for a sound-reflecting specimen or $> 6$ dB for one with an +absorbing surface facing the receiving room. The remedy is **ordered**: first +increase the measurement distance by 5 cm to 10 cm; only if that fails, add +absorption to the receiving room. The criterion applies per scan and per +loudspeaker position, and to the *total* surface — not to individual subareas +(for discrete positions, to the surface average). The standard's rule of thumb +for how much absorption is enough is $S/A < 1.25$, with $S$ the measurement +surface and $A$ the receiving room's absorption area, and the more flanking +there is the larger $A$ has to be. + + + +*Qualification is per band, and it fails where a receiving room is least +absorbent. Here the three lowest bands sit above the 10 dB line, so the surface +is not qualified for a reflecting specimen at all and the scan is not yet a +result; and even the qualified part sits above the 6 dB line, so this surface +could not be used for a specimen with an absorbing face. The remedy is ordered +by the standard: add 5 cm to 10 cm of measurement distance first, and only then +put absorption into the receiving room.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +# `np` and `building` are the imports of the first block above. + +freqs = [100, 125, 160, 200, 250, 315, 400, 500, 630, 800, + 1000, 1250, 1600, 2000, 2500, 3150] +l_p = np.array([64.0, 63.0, 61.5, 59.0, 57.5, 56.0, 55.0, 54.0, + 53.0, 52.0, 51.0, 50.5, 50.0, 50.0, 51.0, 55.0]) +l_in_q = np.array([51.5, 51.5, 51.0, 49.5, 49.0, 48.0, 47.5, 47.0, + 46.5, 45.5, 44.5, 44.0, 43.5, 43.5, 44.5, 48.5]) +f_pi = building.surface_pressure_intensity_indicator(l_p, l_in_q) +print(int((f_pi > 10.0).sum()), "bands fail the reflecting criterion") # 3 + +fig, ax = plt.subplots() +x = np.arange(len(freqs)) +ax.fill_between(x, 0.0, f_pi, where=f_pi > 10.0, alpha=0.25, + label="surface not qualified") +ax.plot(x, f_pi, "-o", label="FpI = Lp - LIn (Formula (10))") +ax.axhline(10.0, ls="--", label="10 dB: reflecting specimen (6.4.2)") +ax.axhline(6.0, ls=":", label="6 dB: absorbing specimen") +ax.set_xticks(x, [str(f) for f in freqs], rotation=45, fontsize=8) +ax.set(xlabel="Frequency [Hz]", + ylabel="Surface pressure-intensity indicator FpI [dB]") +ax.legend() +plt.show() +``` + +
+ +**The scan (Clause 6.4.3).** Hold the probe **normal** to the surface with its +positive direction pointing outwards, away from the element. Scan in parallel +lines, turning at each edge, with the line spacing normally equal to the +measurement distance and denser where radiation is irregular (leaks). Keep the +scan speed constant between **0.1 m/s and 0.3 m/s**, make the scanning time of +each subarea proportional to its area, and interrupt the measurement when +crossing from one subarea to the next rather than stopping mid-area. Where a +box-shaped surface meets the partition, scan as close to the wall as possible: +that intersection is where radiated power is most easily lost out of the +integral. + +**Two scans, not one (Clause 6.4.5).** For each fixed loudspeaker position, +carry out **two complete scans** with the scanning path turned 90° between +them. If they differ by less than 1.0 dB in every band, the result is their +arithmetic average; if any band differs by more, **the measurement is not +valid** — repeat the pair, and if it still fails, change the line density, the +surface or the environment. With several loudspeaker positions, run a +qualifying pair for each and report the arithmetic mean of all scans. With a +moving loudspeaker, each scan takes one complete traverse (at least one for +doors, windows and small elements, two for walls) and the total +scanning/traverse time per pattern is at least 120 s for windows, doors and +small elements and at least 600 s for walls. + +**Discrete positions instead (Clause 6.4.4).** Space the positions at roughly +the measurement distance, denser for leaky or inhomogeneous specimens but at +constant distance, follow the grade 2 procedure of ISO 9614-1 and check the +array with its Annex B, and dwell at least 10 s per position. A moving +loudspeaker needs at least two traverses over the complete set of positions +for doors, windows and small elements, and eight for walls. + +**Background noise (Clause 6.5).** Both the pressure level and the intensity +level must exceed the background by at least 10 dB. The standard's own test is +elegant: with $F_{pI} < 10$ dB, drop the source level by 10 dB; if $F_{pI}$ +moves by less than 1 dB, the requirement is met. + +### Combining subareas, and the sign that comes with them + +A large or inhomogeneous specimen is scanned as several subareas $S_{mi}$, and +`combine_subareas` performs the area-weighted energy average of Formula (11) +with $S_m = \sum_i |S_{mi}|$ (Formula (12)). Clause 6.4.6 adds the rule with no +counterpart anywhere in the pressure methods: where a subarea's net intensity +points the *wrong way* — energy flowing back towards the test object — a minus +sign goes before that $S_{mi}$ in Formula (11). Express it by passing that +subarea's area as a negative number; its energy is then subtracted from the +numerator while $S_m$ keeps the unsigned sum. + +```python +# `np` and `building` are the imports of the first block above. + +# Three subareas of one 12 m2 surface: the two panes and the frame. The frame +# strip reads a net inward flow, so its area enters Formula (11) negative. +l_in_sub = np.array([ + np.full(16, 41.0), # 5.0 m2, outward + np.full(16, 39.0), # 5.5 m2, outward + np.full(16, 33.0), # 1.5 m2, INWARD -> negative area +]) +l_in_comb, s_m = building.combine_subareas(l_in_sub, [5.0, 5.5, -1.5]) +print(round(float(l_in_comb[0]), 2), s_m) # 39.36 12.0 + +# Ignoring the sign inflates the transmitted power, i.e. lowers RI: +l_in_naive, _ = building.combine_subareas(l_in_sub, [5.0, 5.5, 1.5]) +print(round(float(l_in_naive[0] - l_in_comb[0]), 2)) # 0.24 +``` + +A subarea reading inward is not a curiosity to be signed away. It means the +enclosing surface is cutting through the field of something *outside* it — a +flanking element, a second source in the receiving room — so the qualification +of Clause 6.4.2 should be re-checked before the number is reported at all. +$S_m$ keeps the unsigned area because it is the area actually scanned, which +is what the $10\log_{10}(S_m/S)$ term of $R_I$ needs. + ### `intensity_sound_reduction()` / `adaptation_term_kc()` parameters | Parameter | Type | Units | Range / default | Notes | @@ -159,12 +310,18 @@ plt.show() | `kc` | 1D array | dB | one per band / `None` | Adaptation term for the modified index | | `freq` | 1D array | Hz | > 0 | Midband frequencies (`adaptation_term_kc`) | | `boundary_area` / `volume` | float | m² / m³ | > 0, both or neither | Room $S_{b2}$ / $V_2$ for Formula (B.1) | +| `n` | int | element units | ≥ 1, default `1` | Number of identical elements (`intensity_element_normalized_difference` only) | `intensity_sound_reduction()` returns an `IntensityReductionResult` (`r_i`, `r_i_modified`, `rating`, `rating_modified`); `intensity_element_normalized_difference()` an `IntensityElementNormalizedResult` (`d_i_n_e`, `rating`); -`surface_pressure_intensity_indicator()` and `combine_subareas()` return arrays. +`surface_pressure_intensity_indicator()` returns an array and +`combine_subareas()` a `(LIn, Sm)` pair. The `rating` fields are formed only +for exactly 16 one-third-octave or 5 octave values and are `None` otherwise, +so a scan taken over the full ISO 15186-1 range of 100 Hz to 5000 Hz +(Clause 6.6, 18 bands) must be trimmed to the ISO 717-1 range before it can be +rated. ## ISO 15186-1 intensity test report (`.report()`) @@ -345,10 +502,14 @@ the two-microphone acquisition and phase-mismatch calibration behind $L_{p1}$ and $L_{In}$) is not implemented: both levels are taken as already-measured inputs, and the ISO 15186-1 report fiche states explicitly that it has no field for the measurement-surface geometry or the -scanning-versus-discrete-point acquisition method. ISO 15186-2's own field -procedure (loudspeaker positions, the façade cases) and the low-frequency -Part 3 variant are not implemented either: the formulas here apply -unchanged to field data, but nothing checks how that data was acquired. +scanning-versus-discrete-point acquisition method. Nothing here enforces the +Clause 6.4 acquisition documented above either — the 0.1–0.3 m stand-off, the +0.1–0.3 m/s scan speed, the 90°-rotated second scan and its 1.0 dB validity +test, the 10 dB background margin — so a single scan will produce a number +just as readily as a qualified pair. ISO 15186-2's own field procedure +(loudspeaker positions, the façade cases) and the low-frequency Part 3 variant +are not implemented either: the formulas here apply unchanged to field data, +but nothing checks how that data was acquired. ## See also diff --git a/site/src/content/docs/buildings/insulation/insulation-lab.mdx b/site/src/content/docs/buildings/insulation/insulation-lab.mdx index 2970c5abe..f87ebe375 100644 --- a/site/src/content/docs/buildings/insulation/insulation-lab.mdx +++ b/site/src/content/docs/buildings/insulation/insulation-lab.mdx @@ -61,15 +61,16 @@ and the prediction that consumes these laboratory ratings in ## Laboratory measurement (ISO 10140) -An [ISO 16283 field measurement](/phonometry/buildings/insulation/insulation-field/) yields the primed -quantities ($R'$, $L'_n$): the number a real building achieves, flanking -transmission and all. To rate an -element on its own (a wall type, a floating floor, a window), you take it to a -qualified **laboratory** (ISO 10140), where suppressed flanking makes the -*direct* transmission the whole story. The formulas lose their primes: the -**sound reduction index** $R$ (not $R'$) and the **normalized impact level** -$L_n$ (not $L'_n$), with the receiving room's absorption area $A = 0.16\ V/T$ -now a known property of the facility: +What the laboratory buys is **comparability**. Once flanking is suppressed the +primes disappear, and with them the dependence on the particular pair of rooms +the element happened to be built into: the receiving room's absorption area +$A = 0.16\ V/T$ becomes a known property of the facility rather than a quantity +of the building, so the same wall measured in Madrid and in Munich should +produce the same number. That is what makes a catalogue possible, and it is why +every prediction on this site takes laboratory $R$ and $L_n$ as its input. +Nothing else in building acoustics is transferable in that way. The two +quantities are the **sound reduction index** $R$ (not $R'$) and the +**normalized impact level** $L_n$ (not $L'_n$): $$ R = L_1 - L_2 + 10 \log_{10}\frac{S}{A}, \qquad @@ -80,6 +81,25 @@ The facility itself is what suppresses the flanking: two structurally decoupled reverberation rooms of at least 50 m³ each, with the element under test mounted in a test opening of about 10 m² between them. +Suppression is never total, and the residual matters. Every suite has a +**maximum measurable sound reduction index** $R'_\text{max}$, set by the +indirect paths that survive and estimated by the normative Annex A of +ISO 10140-5:2010; a specimen measured near that ceiling is reporting the +facility rather than itself, which is why an accredited report states the +suite's $R'_\text{max}$ curve alongside the result. Annex A qualifies it on +representative constructions rather than in the abstract — six of them, from a +twin-leaf lightweight partition to a (400 ± 40) kg/m² masonry wall with an +independent lining — and the values obtained apply only to the configurations +tested. Its own illustrative table, for a suite able to measure type C walls +and floors up to $R_w = 55$ dB, runs from 45.0 dB at 100 Hz to 86.0 dB at +3150 Hz, and the standard says in as many words that these are examples and not +targets. When a specimen is expected to run into that ceiling, the intensity +route of +[Sound Insulation by Intensity (ISO 15186)](/phonometry/buildings/insulation/insulation-intensity/) +reads the transmitted power off the radiating face instead and is the tool of +choice when flanking is high — which is also, exactly, what the $K_c$-modified +intensity index exists to make comparable again. + | | Field (ISO 16283) | Laboratory (ISO 10140) | @@ -98,36 +118,89 @@ than an element, so there is no flanking-free counterpart to mark. In a well-built construction $R'_w$ lands a few dB below the laboratory $R_w$ of the same partition; a much larger gap says flanking dominates, and the [EN 12354 model](/phonometry/buildings/design/insulation-prediction/) tells you which -path carries it. +path carries it. The figure below shows all three curves for one wall. The single-number ratings reuse the very same ISO 717-1/2 engines (`weighted_rating`, `weighted_impact_rating`): an $R$ spectrum rates to $R_w$ exactly as an $R'$ spectrum rated to $R'_w$. Before forming the index the receiving-room levels must be **corrected for background noise** (Clause 4.3): -the energy subtraction $10 \log_{10}(10^{L_{sb}/10} - 10^{L_b/10})$ applies for a -6–15 dB signal-to-background margin, a fixed 1.3 dB correction (the *limit of -measurement*) at or below 6 dB, and no correction at or above 15 dB. +the energy subtraction $10 \log_{10}(10^{L_{sb}/10} - 10^{L_b/10})$ (Formula (4)) +applies for a margin above 6 dB and below 15 dB, a fixed 1.3 dB correction (the +*limit of measurement*) at or below 6 dB, and no correction at or above 15 dB. +Those are the **laboratory** thresholds; ISO 16283-1 uses 6 dB and 10 dB in the +field, so the two rules are not interchangeable — see +[Field Insulation Measurement](/phonometry/buildings/insulation/insulation-field/#correcting-for-background-noise-clause-92). + + + +*A three-branch rule with two thresholds, and the thresholds are not the same +in the two standards. The 1.3 dB cap is not a magic constant: it is the value +of the energy subtraction at exactly 6 dB of margin, +$6 - 10\log_{10}(10^{0.6} - 1) = 1.26$ dB, rounded up and frozen. Between +6 and 10 dB the two rules coincide — the dashed field curve is hidden under the +laboratory one — and they part company above 10 dB, where the field standard +stops correcting and the laboratory standard keeps going to 15 dB. Bands +corrected by the cap are lower bounds on the insulation and must be flagged as +the limit of measurement.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np + +margin = np.linspace(0.0, 20.0, 401) +# The energy subtraction of Formula (4), written on the margin alone. It is +# only ever used above 6 dB, where the logarithm is finite. +with np.errstate(divide="ignore"): + formula = margin - 10 * np.log10(10 ** (margin / 10) - 1) +cap = 1.3 +lab = np.where(margin <= 6, cap, np.where(margin < 15, formula, 0.0)) +field = np.where(margin <= 6, cap, np.where(margin < 10, formula, 0.0)) +print(round(float(formula[np.searchsorted(margin, 6.0)]), 2)) # 1.26 + +fig, ax = plt.subplots() +ax.fill_between(margin, 0.0, cap, where=margin <= 6, alpha=0.25) +ax.plot(margin, lab, label="ISO 10140-4 laboratory (6 / 15 dB)") +ax.plot(margin, field, "--", label="ISO 16283-1 field (6 / 10 dB)") +ax.set(xlabel="Signal-to-background margin Lsb - Lb [dB]", + ylabel="Correction applied, Lsb - L [dB]", ylim=(-0.15, 2.3)) +ax.legend() +plt.show() +``` + +
```python import numpy as np from phonometry import building -# Source/receiving levels and receiving-room T over the 16 one-third-octave -# bands; S is the free test-opening area, V the receiving-room volume. -l1 = np.full(16, 80.0) -l2 = np.full(16, 40.0) -t2 = np.full(16, 0.5) -lab = building.lab_airborne_insulation(l1, l2, t2, area=10.0, volume=50.0) -print(round(float(lab.r[0]), 1)) # 38.0 R = L1 - L2 + 10 lg(S/A) -print(round(float(lab.absorption[0]), 1)) # 16.0 A = 0.16 V / T (m^2) -print(lab.rating.rating, lab.rating.c, lab.rating.ctr) # 38 0 0 -> Rw(C;Ctr) +# The ISO 717-1 Annex C wall in an ISO 10140 suite: source-room level, the +# receiving-room level it produces, and the receiving-room T, over the 16 +# one-third-octave bands. S = 10 m2 is the free test opening, V = 50 m3. +r_annex_c = np.array([20.4, 16.3, 17.7, 22.6, 22.4, 22.7, 24.8, 26.6, + 28.0, 30.5, 31.8, 32.5, 33.4, 33.0, 31.0, 25.5]) +l1 = np.full(16, 90.0) +t2 = np.full(16, 0.8) +lab = building.lab_airborne_insulation(l1, l1 - r_annex_c, t2, + area=10.0, volume=50.0) +print(round(float(lab.absorption[0]), 1)) # 10.0 A = 0.16 V / T (m^2) +print(round(float(lab.r[0]), 1)) # 20.4 R = L1 - L2 + 10 lg(S/A) +print(lab.rating.rating, lab.rating.c, lab.rating.ctr) # 30 -2 -3 Rw(C;Ctr) # Impact: the tapping-machine level Li normalized to A0 = 10 m^2 gives Ln li = np.array([62.1, 63.2, 63.5, 66.2, 68.5, 70.0, 71.7, 73.1, 73.8, 73.5, 73.8, 73.3, 73.1, 73.0, 72.4, 71.2]) imp = building.lab_impact_insulation(li, t2, volume=50.0) -print(round(float(imp.l_n[0]), 1)) # 64.1 Ln = Li + 10 lg(A/A0) -print(imp.rating.rating, imp.rating.ci) # 81 -11 -> Ln,w(CI) +print(round(float(imp.l_n[0]), 1)) # 62.1 Ln = Li + 10 lg(A/A0) +print(imp.rating.rating, imp.rating.ci) # 79 -11 -> Ln,w(CI) + +# Sanity check on the algebra, not a wall: with S = A the 10 lg(S/A) term +# vanishes, so a flat 40 dB level difference reads back as a flat R = 40 dB. +flat = building.lab_airborne_insulation(np.full(16, 80.0), np.full(16, 40.0), + np.full(16, 0.5), area=16.0, volume=50.0) +print(round(float(flat.r[0]), 1)) # 40.0 # Background correction: margins 6 / 1 / 20 dB -> capped / capped / unchanged corrected = building.background_correction([30.0, 33.0, 50.0], [24.0, 32.0, 30.0]) @@ -136,10 +209,23 @@ print(np.round(corrected, 1)) # [28.7 31.7 50.0] (1.3 dB cap tw lab.rating.plot() # measured R vs shifted ISO 717-1 reference (needs matplotlib) ``` -A margin at or below 6 dB emits a `LabInsulationWarning` and flags the band as -the limit of measurement; catch it with `warnings.simplefilter("error", -LabInsulationWarning)`. The automatic rating is formed only when exactly 16 -one-third-octave or 5 octave values are supplied (`rating` is `None` otherwise). +Read the numbers rather than collecting them. $R_w = 30$ dB is a light +partition — a single plasterboard leaf or a thin glazed unit — well below the +45 to 55 dB a dwelling separating wall is normally specified at, and its +$C_{tr} = -3$ dB says it gives up a further 3 dB against traffic, so it would +be quoted as 27 dB against a road. $L_{n,w} = 79$ dB is a bare structural slab +with no covering and no floating floor: European impact limits for dwellings +sit around 50 to 60 dB, so this floor fails every one of them by roughly +20 dB. Its $C_I = -11$ dB is the interesting half — a strongly negative $C_I$ +means the measured spectrum is far more high-frequency-weighted than the +reference contour, so the slab is *better* at the low frequencies footsteps +actually excite than $L_{n,w}$ alone suggests, and a soft covering (which acts +at high frequency) will improve the single number more than it improves what +the neighbour hears. Both single numbers are formed only when exactly 16 +one-third-octave or 5 octave values are supplied (`rating` is `None` +otherwise). A margin at or below 6 dB emits a `LabInsulationWarning` and flags +the band as the limit of measurement; catch it with +`warnings.simplefilter("error", LabInsulationWarning)`. @@ -193,6 +279,152 @@ plt.show()
+ + +*The same 150 mm concrete wall, measured three ways. Two decibels of loss is +what a well-built junction costs and is the number to expect; seven says the +sound is arriving by a route the partition does not control, and the twelve +flanking paths of the EN 12354-1 model — three per flanking element — are where +to look for it. The two field curves are predictions, not offsets: only the +junction quality changes between them, through the direction-averaged velocity +level difference $\overline{D}_{v,ij}$ that an +[ISO 10848 measurement](/phonometry/buildings/insulation/flanking-lab/) +supplies.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np +# `building` is the import of the laboratory block above. + +freqs = np.array([100, 125, 160, 200, 250, 315, 400, 500, 630, 800, + 1000, 1250, 1600, 2000, 2500, 3150], dtype=float) +lab_r = np.round(building.single_panel_transmission_loss( + freqs, 345.0, critical_frequency=125.0).transmission_loss, 1) +floor = np.round(building.single_panel_transmission_loss( + freqs, 322.0, critical_frequency=135.0).transmission_loss, 1) +facade = np.round(building.single_panel_transmission_loss( + freqs, 230.0, critical_frequency=160.0).transmission_loss, 1) + +def apparent(dv_100): + """R' over the direct path plus twelve flanking paths (Formula 15).""" + dv = dv_100 + 6 * np.log10(freqs / 100) + tau = 10 ** (-lab_r / 10) + for r_flank, area, length in ((floor, 13.5, 4.5), (floor, 13.5, 4.5), + (facade, 7.65, 2.55), (facade, 7.65, 2.55)): + for _ in range(3): # the Ff, Fd and Df paths + r_ij = building.flanking_reduction_index( + index_i=r_flank, index_j=r_flank, + velocity_level_difference=dv, + separating_area=11.5, area_i=area, area_j=area) + tau = tau + 10 ** (-np.asarray(r_ij) / 10) + return np.round(-10 * np.log10(tau), 1) + +good, poor = apparent(14.0), apparent(4.0) +print(building.weighted_rating(lab_r).rating, + building.weighted_rating(good).rating, + building.weighted_rating(poor).rating) # 49 47 42 + +fig, ax = plt.subplots() +x = np.arange(16) +ax.fill_between(x, poor, lab_r, alpha=0.2) +ax.plot(x, lab_r, "-o", label="laboratory R") +ax.plot(x, good, "-s", label="field R', good junctions") +ax.plot(x, poor, "-^", label="field R', flanking dominant") +ax.set_xticks(x, [f"{f:g}" for f in freqs], rotation=45, fontsize=8) +ax.set(xlabel="Frequency [Hz]", ylabel="Sound reduction index [dB]") +ax.legend() +plt.show() +``` + +
+ +## Procedure (ISO 10140-4:2010) + +The laboratory rules are not the field rules, and a reader moving between this +page and its +[field sibling](/phonometry/buildings/insulation/insulation-field/) will apply +the wrong ones unless they are stated side by side. + +**Bands (Clause 4.1).** One-third octaves from 100 Hz to **5000 Hz** — 18 +bands, two more than the 16 the ISO 717 rating consumes — with 50, 63 and 80 Hz +added when low-frequency information is wanted (Annex A). + +**Microphones (Clauses 4.2.2, 4.2.3).** Minimum separations, to be exceeded +where possible: 0.7 m between fixed positions, 0.7 m from the room boundaries, +0.7 m from any diffuser, **1.0 m from the test element** and 1.0 m from the +sound source. The field standard's 0.7 m / 1.0 m pattern looks similar and is +not the same list. Average at least 6 s per band at each fixed position from +100 Hz to 400 Hz, dropping to no less than 4 s above that; a continuously +moving microphone integrates over a whole number of traverses and never less +than 30 s. + +**Airborne (Clauses 4.4.1 to 4.4.3).** Loudspeakers in at least two positions, +or one loudspeaker moved to at least two, or a moving loudspeaker, qualified per +ISO 10140-5:2010 Annex D. With fixed microphones: at least **five** positions +in each room, no two in the same plane relative to the boundaries and never in +a regular grid — and with a *single* loudspeaker, five per room **per +loudspeaker position**. With a continuously moving microphone: sweep radius at +least 1 m, the plane of the traverse inclined so that it lies at least 10° to +every room surface, traverse period at least 15 s, and one measurement per +loudspeaker position. + +**Impact (Clause 4.5).** The standard tapping machine of ISO 10140-5:2010 +Annex E — five hammers in a line at $(100 \pm 3)$ mm centres, each an effective +mass of 500 g falling freely 40 mm (so it lands at +$(0.886 \pm 0.022)$ m/s), successive impacts $(100 \pm 20)$ ms apart, the whole +machine under 25 kg so it does not load a lightweight floor — in **not less +than four** positions. With fixed microphones the number of microphone +positions equals the number of tapping-machine positions or an integer multiple +of it: with four or five machine positions, at least two measurements at each +from at least two microphone positions; with six or more, at least one +measurement per machine position, each at a different microphone position. +ISO 10140-5:2010 Annex F specifies the rubber ball alongside the tapping +machine, and its low-frequency thumps are rated by an entirely different +engine — see +[Heavy and Soft Impact Sources](/phonometry/buildings/insulation/heavy-impact-sources/). + +**Reverberation time (Clause 4.6).** ISO 3382-2 engineering method (the +precision method is allowed), evaluated from 5 dB below the initial level over +a preferred 20 dB range whose bottom stays at least 10 dB above the system's +background. At least **six** measurements per band: interrupted noise with one +loudspeaker position and either three microphone positions measured twice or +six measured once; or the integrated impulse response with one source position +and six fixed microphone positions, reverse-integrated. Then +$A = 0.16\,V/T$ (Formula (5)). + +### Mounting is a variable, not a caption + +The `mounting` string in the fiche metadata below is the one piece of report +text that changes the number. ISO 10140-1:2010 fixes the boundary and mounting +conditions **per element type**, one annex each — walls, doors, windows, glass +panes, floor coverings and so on — because there is no single rule that could +serve them all: + +- For a lightweight twin-leaf wall (Annex A.3) the decisive parameters are the + niche depth and where the partition sits relative to the laboratory's + **acoustic break**. The partition shall be built on one side of the break, + not across it, precisely because mounting it across can give a *higher* + sound reduction index (NOTE 1) — a laboratory could otherwise flatter a + product by construction. +- For a window (Annex C.3) the niches on the two sides shall have different + depths, preferably in a ratio of about 2:1, and the 10 mm to 13 mm perimeter + gap is filled with absorbing material and sealed airtight on both sides. +- Any other mounting may be used, but it **shall be fully described in the test + report**. That sentence is why the label exists. + +The test opening itself is part of it: approximately 10 m² for walls, 10 m² to +20 m² for floors, shorter edge not less than 2.3 m (ISO 10140-5:2010, +Clause 3.3.1). For a heavy specimen the surround must not damp it into a better +result, so the loss factor of the test element shall be at least +$\eta_\text{min} = 0.01 + 0.3/\sqrt{f}$ (Formula (2)), checked with a +(400 ± 40) kg/m² brick or block wall plastered on one side. A catalogue $R_w$ +quoted without its mounting label and its opening geometry is not a property of +the product, and the same specimen in a different opening is a different +measurement. + ### `lab_airborne_insulation()` / `lab_impact_insulation()` parameters | Parameter | Type | Units | Range / default | Notes | @@ -209,7 +441,7 @@ plt.show() `background_correction(signal_and_background, background)` returns the corrected levels directly. -### ISO 10140 laboratory test report (`.report()`) +## ISO 10140 laboratory test report (`.report()`) Both laboratory results write the one-page ISO 10140 test report directly, laid out like the accredited laboratory reports rated per ISO 717. @@ -289,8 +521,7 @@ repository. Click either preview to open the PDF: ## Beyond the pressure method -Three sibling laboratory measurements used to share this page and now have -guides of their own. When flanking is too high for the pressure method, +Three neighbouring laboratory measurements have guides of their own. When flanking is too high for the pressure method, [Sound Insulation by Intensity (ISO 15186)](/phonometry/buildings/insulation/insulation-intensity/) reads the transmitted power directly off the radiating face. For a soft floor covering, @@ -310,11 +541,18 @@ verified ISO 717-1/ISO 717-2 engines, and both results write the one-page ISO 10140 fiche through `.report()`, with the ISO 10140-4:2010 absorption-area annex in the verbose form. -**Not covered.** ISO 10140-1's general test-facility and mounting-type -requirements are not implemented; the guide only cites them as a label -string in report metadata (`"Type A mounting, mortar-bedded perimeter -(ISO 10140-1)"`). The laboratory methods that used to share this page are -covered by their own guides: sound insulation by intensity (ISO 15186), +**Not covered.** The ISO 10140-4:2010 procedure and the ISO 10140-1:2010 and +ISO 10140-5:2010 facility and mounting requirements are documented above and +implemented nowhere: nothing checks the position counts, the separations, the +averaging times, the band range, the test-opening geometry or the loss-factor +requirement, and the mounting condition survives only as a free-text label in +report metadata (`"Type A mounting, mortar-bedded perimeter +(ISO 10140-1)"`) — which is what ISO 10140-1 asks for, since it requires any +mounting to be *described* rather than selected from a list. Nothing estimates +the suite's $R'_\text{max}$ either, so a result approaching the facility's +ceiling will be produced without complaint; that qualification has to come from +the laboratory's own Annex A tests. The neighbouring laboratory measurements +are covered by their own guides: sound insulation by intensity (ISO 15186), the floor-covering improvement (ISO 16251-1) and flanking transmission (ISO 10848). @@ -331,6 +569,9 @@ the floor-covering improvement (ISO 16251-1) and flanking transmission the small-mock-up $\Delta L$ of soft floor coverings. - [Laboratory Flanking Transmission (ISO 10848)](/phonometry/buildings/insulation/flanking-lab/): the measured junction vibration reduction index. +- [Heavy and Soft Impact Sources](/phonometry/buildings/insulation/heavy-impact-sources/): + the rubber ball that ISO 10140-5:2010 Annex F specifies beside the tapping + machine of Annex E, and the Annex D rating that goes with it. - [Insulation Ratings (ISO 717)](/phonometry/buildings/insulation/insulation-ratings/): the reference-curve engine behind $R_w$ and $L_{n,w}$. - [Sound Power](/phonometry/devices/emission/sound-power/): the $L_W$ methods that share diff --git a/site/src/content/docs/buildings/insulation/insulation-ratings.mdx b/site/src/content/docs/buildings/insulation/insulation-ratings.mdx index 802765eb7..31a57ef89 100644 --- a/site/src/content/docs/buildings/insulation/insulation-ratings.mdx +++ b/site/src/content/docs/buildings/insulation/insulation-ratings.mdx @@ -64,19 +64,57 @@ method** of ISO 717-1: a fixed reference curve is shifted in 1 dB steps toward the measured curve until the sum of *unfavourable* deviations (where the measurement falls below the reference) is as large as possible but not more than 32.0 dB (16 one-third-octave bands) or 10.0 dB (5 octave -bands). The rating ($R_w$, $R'_w$, $D_{nT,w}$ …) is the shifted reference -read at 500 Hz. The **spectrum adaptation terms** $C$ (pink noise) and $C_{tr}$ -(urban traffic) add the low-frequency penalty of a real source. - -The two terms re-rate the same measured curve against the two source spectra -of ISO 717-1 Annex A: $C$ against A-weighted pink noise, representative of -living activities (speech, music, radio, television), and $C_{tr}$ against -A-weighted urban road traffic, whose energy sits at low frequency. They are -defined so that the rating plus the term ($R_w + C$ for a laboratory index, +bands). The two caps are one rule, not two constants: $32.0 = 2.0 \times 16$ +and $10.0 = 2.0 \times 5$, so what the method actually permits is **an average +unfavourable deviation of 2 dB per band**. The rating ($R_w$, $R'_w$, +$D_{nT,w}$ …) is the shifted reference read at 500 Hz. + +The reference curve itself (ISO 717-1:2020, Table 3) is not arbitrary either. +It rises 9 dB per octave from 100 Hz to 500 Hz, then only 4 dB over the next +octave, and is flat from 1250 Hz up. A rating engine carrying that shape is +deliberately lenient at low frequency and unforgiving above 1 kHz, which is +why a construction with a low-frequency dip can still rate well — and why +$C_{tr}$ exists to put the penalty back. The result object hands you the curve +in its shifted position, so the unshifted one is a subtraction away: + +```python +import numpy as np +from phonometry import building + +R = [20.4, 16.3, 17.7, 22.6, 22.4, 22.7, 24.8, 26.6, + 28.0, 30.5, 31.8, 32.5, 33.4, 33.0, 31.0, 25.5] +w = building.weighted_rating(R) + +# The curve is shifted until it reads `rating` at 500 Hz; unshifted it reads +# 52 dB there, so the shift applied was 52 - rating. +reference = np.asarray(w.shifted_reference) + (52 - w.rating) +print(w.rating, 52 - w.rating) # 30 22 (shifted down by 22 dB) +print(reference.astype(int).tolist()) +# [33, 36, 39, 42, 45, 48, 51, 52, 53, 54, 55, 56, 56, 56, 56, 56] +``` + +The **spectrum adaptation terms** $C$ (pink noise) and $C_{tr}$ (urban traffic) +add the low-frequency penalty of a real source. Both come from one definition +(Clause 4.5, Formulae (1) and (2)): re-rate the measured spectrum against a +standard source spectrum and subtract the curve-based rating, + +$$ +C_j = X_{A,j} - X_w, \qquad +X_{A,j} = -10\log_{10}\sum_i 10^{(L_{i,j} - X_i)/10}, +$$ + +where $L_{i,j}$ is the level of source spectrum $j$ in band $i$ (both spectra +are A-weighted and normalised to 0 dB overall) and $X_i$ the measured +insulation in that band, to one decimal place. The two terms differ **only** in +which spectrum is substituted: No. 1, A-weighted pink noise, representative of +living activities (speech, music, radio, television), gives $C$; No. 2, +A-weighted urban road traffic, whose energy sits at low frequency, gives +$C_{tr}$. So the rating plus the term ($R_w + C$ for a laboratory index, $R'_w + C$ or $D_{nT,w} + C$ for the quantities of the - [field guide](/phonometry/buildings/insulation/insulation-field/), and -likewise with $C_{tr}$) is the A-weighted level difference achieved against -that source. Reading them: +[field guide](/phonometry/buildings/insulation/insulation-field/), and likewise +with $C_{tr}$) is the A-weighted level difference the construction achieves +against that source — which is what makes the sum, and not the rating alone, +the thing worth specifying. Reading them: * $C$ stays small for most constructions (0 to −2 dB is typical): the pink spectrum is close to the weighting already implicit in the reference @@ -90,18 +128,80 @@ that source. Reading them: road, $D_{nT,w} + C$ (or the plain rating, where the regulation says so) between dwellings, the two example requirements of ISO 717-1, 5.3. - + + +*Two constructions, one rating. Both spectra come from the library's own panel +models — Sharp's method for the concrete leaf, the mass-air-mass double-wall +model for the lightweight one — and both rate to $R_w = 49$ dB, so a +specification written on $R_w$ alone treats them as interchangeable. They are +not: the double leaf enters the rated range still climbing out of its 82 Hz +mass-air-mass resonance, and against traffic it gives up 6 dB more than the +concrete wall. $R_w + C_{tr}$ is what a façade on a busy road is actually +specified on.* + +
+Show the code for this figure ```python -from phonometry import building +import matplotlib.pyplot as plt +import numpy as np +# `building` is the import of the reference-curve block above. + +freqs = np.array([100, 125, 160, 200, 250, 315, 400, 500, 630, 800, + 1000, 1250, 1600, 2000, 2500, 3150], dtype=float) + +# 150 mm dense concrete: m' = 2300 x 0.15 = 345 kg/m2, fc = 125 Hz. +heavy = np.round(building.single_panel_transmission_loss( + freqs, 345.0, critical_frequency=125.0).transmission_loss, 1) +# Metal-stud double leaf: 12 kg/m2 per leaf, 90 mm cavity. +light_result = building.double_wall_transmission_loss(freqs, mass1=12.0, + mass2=12.0, gap=0.09) +light = np.round(light_result.transmission_loss, 1) + +w_heavy = building.weighted_rating(heavy) +w_light = building.weighted_rating(light) +print(w_heavy.rating, w_heavy.c, w_heavy.ctr) # 49 -2 -7 +print(w_light.rating, w_light.c, w_light.ctr) # 49 -5 -13 +print(round(light_result.resonance_frequency, 1)) # 81.5 Hz + +fig, (ax_spec, ax_bar) = plt.subplots(1, 2, figsize=(13.0, 5.8)) +x = np.arange(16) +ax_spec.plot(x, w_heavy.shifted_reference, "--", label="shifted reference") +ax_spec.plot(x, heavy, "-o", label="150 mm dense concrete") +ax_spec.plot(x, light, "-s", label="double leaf, 12 kg/m2 + 90 mm") +ax_spec.set_xticks(x, [f"{f:g}" for f in freqs], rotation=45, fontsize=8) +ax_spec.set(xlabel="Frequency [Hz]", ylabel="Sound reduction index R [dB]") +ax_spec.legend() + +groups = ("Rw", "Rw + C", "Rw + Ctr") +xb = np.arange(3) +ax_bar.bar(xb - 0.19, [w_heavy.rating, w_heavy.rating + w_heavy.c, + w_heavy.rating + w_heavy.ctr], width=0.36, + label="concrete") +ax_bar.bar(xb + 0.19, [w_light.rating, w_light.rating + w_light.c, + w_light.rating + w_light.ctr], width=0.36, + label="double leaf") +ax_bar.set_xticks(xb, groups) +ax_bar.set_ylabel("Single number [dB]") +ax_bar.legend() +plt.show() +``` -# Single-number rating from a measured 16-band R spectrum (ISO 717-1 Annex C) -R = [20.4, 16.3, 17.7, 22.6, 22.4, 22.7, 24.8, 26.6, - 28.0, 30.5, 31.8, 32.5, 33.4, 33.0, 31.0, 25.5] -w = building.weighted_rating(R) +
+ + + +*The shifted reference has come to rest where the shaded unfavourable area +totals 31.8 dB — one more 1 dB step down would overshoot the 32.0 dB cap. The +rating is then read off that curve at 500 Hz, not off the measurement: the +measured spectrum touches 26.6 dB there, and $R_w$ is 30 dB.* + +```python +# `building`, `R` and `w` come from the reference-curve block above. print(w.rating, w.c, w.ctr) # 30 -2 -3 -> Rw(C;Ctr) = 30(-2;-3) +print(w.unfavourable_sum) # 31.8 (cap 32.0 = 2.0 x 16) -w.plot() # measured R' vs shifted ISO 717-1 reference, deviations shaded (needs matplotlib) +w.plot() # measured R vs shifted ISO 717-1 reference, deviations shaded (needs matplotlib) ```
@@ -122,7 +222,7 @@ plt.show() # By hand, from the band curve the result now carries: fig, ax = plt.subplots() -ax.semilogx(w.band_centers, w.measured, "o-", label="Measured R'") +ax.semilogx(w.band_centers, w.measured, "o-", label="Measured R") ax.semilogx(w.band_centers, w.shifted_reference, "s--", label="Shifted reference") ax.fill_between(w.band_centers, w.measured, w.shifted_reference, where=w.measured < w.shifted_reference, interpolate=True, @@ -143,8 +243,10 @@ plt.show() | `values_by_band` | 1D array | dB | 16 (thirds) or 5 (octaves) | Measured $R$, $R'$, $D_{nT}$ … per band | | `bands` | str or `None` | — | `'third-octave'` / `'octave'` / `None` | `None` infers from the count | -`weighted_rating()` returns a `WeightedRatingResult` -(`rating`, `c`, `ctr`, `unfavourable_sum`, all integers except the sum). +`weighted_rating()` returns a `WeightedRatingResult` (`rating`, `c`, `ctr`, +`unfavourable_sum`, all integers except the sum), plus the three fields the +figures on this page are drawn from: `band_centers`, `measured` and +`shifted_reference`, and `quantity` naming what was rated. ## Impact ratings (ISO 717-2) @@ -153,9 +255,25 @@ but an **unfavourable deviation now occurs where the measurement *exceeds* the reference** (impact noise is worse when higher), the sign opposite to ISO 717-1. The rating ($L_{n,w}$, $L'_{n,w}$, $L'_{nT,w}$) is the shifted reference read at 500 Hz; for octave bands it is then reduced by 5 dB. The spectrum -adaptation term $C_I = L_{n,\text{sum}} - 15 - L_{n,w}$ uses the energetic sum -over 100–2500 Hz (the first 15 thirds, excluding 3150 Hz) or 125–2000 Hz -(octaves). +adaptation term $C_I = L_{n,\text{sum}} - 15 - L_{n,w}$ (ISO 717-2:2020 +Formulae (A.1) to (A.3)) uses the energetic sum over 100–2500 Hz (the first 15 +thirds, excluding 3150 Hz) or 125–2000 Hz (octaves). + +The $-15$ dB is a normalising offset, not physics: it is chosen so that +$C_I$ comes out **about zero** for a massive floor with an effective covering, +slightly positive for a timber joist floor whose low-frequency peaks dominate, +and down to $-15$ dB for a bare or poorly covered concrete floor (Annex A.1). +Read that way, the $C_I = -11$ dB of the example below says the measured +spectrum is far flatter and more high-frequency-weighted than the reference +contour — a bare slab, not a floor with a covering — so the floor is better at +the low frequencies footsteps excite than $L'_{nT,w} = 79$ dB alone suggests. +The corollary is a design trap: a soft covering acts where the reference curve +is most demanding, so it improves the single number more than it improves what +the neighbour hears. The unweighted sum $C_I$ is built on exists precisely +because it correlates better with A-weighted walking noise than the +reference-curve rating does, which is why requirements are sometimes written on +$L'_{n,w} + C_I$ rather than on $L'_{n,w}$. + For measurements extended down to 50 Hz, `weighted_impact_rating_extended` additionally returns the enlarged-range term $C_{I,50\text{–}2500}$ (A.2.1 NOTE), and with `one_decimal=True` the @@ -164,6 +282,11 @@ $L_{n,r,0,w} = 77.6$ dB and $C_{I,r,0} = -10.3$ dB of A.2.2). +*The same fitting rule with the sign reversed: the shaded area is where the +measurement rises **above** the reference, and the curve is shifted up until +that area reaches 28.0 dB against the same 32.0 dB cap. A floor rated this way +is worse the higher its number.* + ```python import numpy as np from phonometry import building @@ -234,7 +357,8 @@ the ISO 717-2 Annex C values (thirds $L'_{nT,w} = 79$, $C_I = -11$; octave | `bands` | str or `None` | — | `'third-octave'` / `'octave'` / `None` | `None` infers from the count | `weighted_impact_rating()` returns an `ImpactRatingResult` (`rating`, -`ci` integers, `unfavourable_sum` in dB). +`ci` integers, `unfavourable_sum` in dB), with the same three plotting fields +as the airborne result: `band_centers`, `measured` and `shifted_reference`. ## Enlarged frequency ranges and one-decimal ratings @@ -329,7 +453,10 @@ disclaimer. `WeightedRatingResult.report()` labels the airborne ISO 717-1 fiche `ImpactRatingResult.report()` labels the impact ISO 717-2 fiche ($L_{n,w}(C_I)$, deviations the opposite way). `SoundReductionResult.report()` is a convenience that rates the predicted -$R(f)$ and writes its fiche in one call. +$R(f)$ and writes its fiche in one call; that result comes from the EN 12354 +panel models of +[Panel sound insulation](/phonometry/buildings/design/panel-sound-insulation/), +so it is the one entry point here whose input was never measured. The report metadata is supplied as a `ReportMetadata` frozen dataclass (every field optional; only the supplied fields are rendered, and the numeric fields @@ -436,7 +563,13 @@ already-measured (or predicted) band spectrum from the [survey](/phonometry/buildings/insulation/insulation-survey/) or [flanking](/phonometry/buildings/insulation/flanking-lab/) guides. The façade single number of ISO 16283-3 Annex F and the flanking $D_{n,f,w}$ reuse these -engines from their own guides rather than duplicating them. +engines from their own guides rather than duplicating them. One member of the +ISO 717 family is deliberately absent: the A-weighted maximum impact level of +**ISO 717-2:2020 Annex D**, which rates the rubber ball and the bang machine. +It shifts no curve at all — it is an energy sum of A-weighted band levels — so +it is not produced by either engine on this page and lives with the sources it +rates, in +[Heavy and Soft Impact Sources](/phonometry/buildings/insulation/heavy-impact-sources/). ## See also diff --git a/site/src/content/docs/buildings/insulation/insulation-survey.mdx b/site/src/content/docs/buildings/insulation/insulation-survey.mdx index 1761f20a6..4cafbf7c7 100644 --- a/site/src/content/docs/buildings/insulation/insulation-survey.mdx +++ b/site/src/content/docs/buildings/insulation/insulation-survey.mdx @@ -1,6 +1,6 @@ --- title: "Sound Insulation Survey Method (ISO 10052)" -description: "The ISO 10052 survey (control) method for sound insulation: octave bands, a hand-held meter and the reverberation index instead of per-band reverberation times, with the airborne, impact, facade and service-equipment quantities and their fiches." +description: "The ISO 10052 survey (control) method for sound insulation: octave bands, a hand-held meter and the reverberation index instead of per-band reverberation times, with the airborne, impact, façade and service-equipment quantities, the sweep procedure and their fiches." references: - type: book authors: ["Vigran, T. E."] @@ -34,18 +34,38 @@ the single-number engines behind the survey ratings in ## Octave bands and the reverberation index -The [engineering methods](/phonometry/buildings/insulation/insulation-field/) buy accuracy with effort: swept microphones, -per-band reverberation times, careful background correction. For a quick check -in a dwelling, ISO 10052 defines a **survey (control) method**: octave bands, a -hand-held meter, and a single quantity, the **reverberation index** -$k = 10\log_{10}(T/T_0)$ ($T_0 = 0.5\ \text{s}$), to carry the receiving-room -correction. Every survey quantity is then just an addition of $k$: the -standardized level difference $D_{nT} = D + k$, the normalized -$D_n = D + k + 10\log_{10}(A_0 T_0/(0.16\,V))$, the apparent -$R' = D + k + 10\log_{10}(S T_0/(0.16\,V))$ (using $V/7.5$ for $S$ where -that is larger), and, for impacts and façades, $L'_{nT} = L_i - k$ and -$D_{2m,nT} = D_{2m} + k$. The clause references follow ISO 10052:2021; the formulas -and the reverberation-index table are identical in the harmonized +One number replaces the whole receiving-room correction. Where the +[engineering methods](/phonometry/buildings/insulation/insulation-field/) +carry a measured reverberation time per band into every quantity, ISO 10052 +collapses that correction into the **reverberation index** +$k = 10\log_{10}(T/T_0)$ ($T_0 = 0.5\ \text{s}$), which may be measured but is +normally read off a table from the room's construction and volume. Every +survey quantity is then an addition or subtraction of $k$: + +$$ +D_{nT} = D + k, \qquad +D_n = D + k + 10\log_{10}\frac{A_0 T_0}{0.16\,V}, \qquad +R' = D + k + 10\log_{10}\frac{S T_0}{0.16\,V}, +$$ + +$$ +L'_{nT} = L_i - k, \qquad +L'_n = L_i - k - 10\log_{10}\frac{A_0 T_0}{0.16\,V}, \qquad +D_{2m,nT} = D_{2m} + k, +$$ + +with $A_0 = 10\ \text{m}^2$ and $V$ the receiving-room volume. The two +normalized quantities carry the same $10\log_{10}(A_0 T_0/(0.16\,V))$ term +with opposite signs, because a level difference improves when the receiving +room is more absorbent and an impact level falls. Where the common partition +area has not been measured, the survey method substitutes $V/7.5$ for $S$ when +that is larger, $V$ being the volume of the receiving room — which should be +the smaller of the pair (Clause 3.6). It is a default partition area inferred +from typical dwelling proportions, and because it can only raise $S$ it can +only raise $R'$ relative to a measured area; state in the report when it was +used, together with the case Clause 3.6 also flags, a common area below +10 m². The clause references follow ISO 10052:2021; the formulas and the +reverberation-index table are identical in the harmonized EN ISO 10052:2004+A1:2010. The reverberation index is either **measured** (feed the reverberation time to @@ -54,9 +74,10 @@ type and volume with `estimate_reverberation_index(V, room)`: furnished `"kitchen"` / `"bathroom"` / `"furnished"`, or the unfurnished construction classes `"a"`–`"h"` and the mixed `"a+e"`…`"d+h"`. Clause 6.5 splits that in two — **Table 3** classifies the room and gives it its letter, **Table 4** -turns the letter and the volume into the index. A fourth -quantity unique to this method is **service-equipment noise** $L_{XY}$: the -energy average of three A- or C-weighted positions. +turns the letter and the volume into the index. A fourth quantity unique to +this method is **service-equipment noise** $L_{XY}$, the energy average of +three A- or C-weighted measurements taken to a fixed positional recipe set out +under [Running the survey](#running-the-survey-clauses-5-and-6). The letters are not arbitrary: Table 3 is a 2 × 2 × 2 grid over the weight of the walls and ceiling, the hardness of the floor covering and the weight of @@ -101,8 +122,13 @@ print(res.r_prime_rating.rating) # 48 -> R'w k_est = building.estimate_reverberation_index(50.0, "h") print(k_est) # [5. 5.5 6. 5. 5.5] -# Service-equipment noise: energy average of three A-weighted positions. -se = building.survey_service_equipment_level([35.0, 30.0, 32.0], 3.0, volume=50.0) +# Service-equipment noise: one corner measurement then two central ones +# (Clause 6.3.4), each over a separate full operating cycle. +se = building.survey_service_equipment_level( + [35.0, 30.0, 32.0], # position 1 (corner), then two at position 2 + reverberation_index=3.0, # scalar k = 3 dB, i.e. T ~ 1 s + volume=50.0, +) print(round(float(se.l_xy), 1), round(float(se.l_xy_nt), 1)) # 32.8 29.8 res.plot() # DnT vs shifted ISO 717-1 reference (needs matplotlib) @@ -145,21 +171,6 @@ plt.show()
-### Background noise: a floor to meet, not a correction to apply - -Unlike the engineering methods, the survey method never corrects for -background noise (Clause 6.2.1). It fixes a signal-to-noise floor instead: -adjust the source so that the receiving-room level exceeds the background by -at least 6 dB in every band, checked by switching the source on and off before -the run. Where the margin still falls below 6 dB, record the uncorrected level -and state in the report that the level difference is underestimated — or, for -service equipment, that the level is overestimated — by an unknown amount. -That is why no correction call appears anywhere on this page: -`building.background_correction` implements the ISO 10140-4 laboratory rule -and must not be applied to survey data. Earlier revisions of this guide said -the opposite, listing the correction as the caller's job; a survey corrected -that way is non-conforming and over-reports the insulation. - ### `survey_airborne_insulation()` and friends: parameters | Parameter | Type | Units | Range / default | Notes | @@ -175,9 +186,131 @@ that way is non-conforming and over-reports the insulation. `survey_airborne_insulation()` returns a `SurveyAirborneResult` (`d`, `d_nt`, `d_n`, `r_prime`, `rating`, `r_prime_rating`); `survey_impact_insulation()` a `SurveyImpactResult` (`l_i`, `l_nt`, `l_n`, `rating`); -`survey_facade_insulation()` a `SurveyFacadeResult`; -`survey_service_equipment_level()` a `SurveyServiceEquipmentResult` (`l_xy`, -`l_xy_nt`, `l_xy_n`). +`survey_facade_insulation()` a `SurveyFacadeResult` (`d_2m`, `d_2m_nt`, +`d_2m_n`, `rating`); `survey_service_equipment_level()` a +`SurveyServiceEquipmentResult` (`l_xy`, `l_xy_nt`, `l_xy_n`). + +## Running the survey (Clauses 5 and 6) + +Everything above consumes band levels. What separates ISO 10052 from +[ISO 16283](/phonometry/buildings/insulation/insulation-field/) is not the +arithmetic, which is simpler, but *how those levels are obtained* — a body +posture, a sweep and a stopwatch instead of five fixed microphone positions +per room. The procedure is short enough to quote in full. + + + +**The instrument (Clause 5).** A sound level meter of class 1 or class 2 to +IEC 61672-1, with filters to IEC 61260, adjusted with a calibrator before each +measurement so the readings are absolute levels. The microphone must be a +diffuse-field type; a free-field microphone needs its diffuse-field correction +applied. The tapping machine and the rubber ball must meet ISO 10140-5:2021 +Annexes E and F and ISO 16283-2:2020 Annex A. Doors and windows are closed and +shutters normally open throughout (Clause 6.1). + +**The source, between rooms (Clause 6.2.2).** Steady noise with a continuous +spectrum; octave-band-filtered noise is allowed, and a broadband spectrum may +be shaped to buy signal-to-noise at high frequencies in the receiving room. +Place the loudspeaker in a **corner of the room opposite the separating +element**, at least 0.5 m from the walls, and if it is a single loudspeaker +system, facing into the corner. Several sources may run at once provided they +are of the same type, driven at the same level by similar but uncorrelated +signals; several loudspeakers inside one enclosure must be driven in phase. +Test a vertical pair from the **lower** room and an unequal horizontal pair +from the **larger** room, unless the other direction was agreed beforehand. + +**The sweep (Clause 6.3.1).** Airborne insulation needs the average level in +both rooms, impact insulation only in the receiving room. In each, stand near +the centre of the floor facing *away* from the loudspeaker (source room) or +from the separating element (receiving room), hold the meter out at arm's +length, and move the microphone four times horizontally through 180°, raising +and lowering the arm gently during each traverse. The four rotations take +about **30 s in total**, which is also the integration time. A rotating +microphone on a stand is the accepted alternative: at least 10° to the +horizontal, sweep radius at least 1 m. Without a real-time octave analyser, +repeat the whole sweep once per band and read each 30 s $L_{eq}$. + +**The tapping machine (Clause 6.2.3).** Near the centre of the floor in the +source room, with the hammer line on the room diagonal. One position is enough +for an isotropic floor and slab. On a ribbed or beamed floor add two more, so +that three positions are randomly distributed over the floor area, with the +hammer line at 45° to the ribs and every position at least 0.5 m from the +edges of the floor. + +**The rubber ball (Clause 6.3.2).** The heavy/soft branch measures the +**Fast-weighted maximum** level $L_{i,Fmax}$ in octave bands, about 10 s per +measurement, from at least two fixed positions — one near the centre and one +at a different height — separated by more than 0.7 m, at least 0.5 m from any +boundary and at least 1.0 m from the impact position, averaged over positions +band by band. Its single number is the ISO 717-2:2020 Annex D A-weighted sum, +not a shifted reference curve; see +[Heavy and Soft Impact Sources](/phonometry/buildings/insulation/heavy-impact-sources/). +Wear hearing protection when measuring in the source room. + +**The façade (Clauses 6.2.4 and 6.3.3).** With a loudspeaker, place it outside +at an angle of incidence as close to 45° as possible, preferably on the +ground, with the slant distance $r$ from the source to the centre of the test +specimen at least **7 m** ($d > 5$ m from the façade) and the position chosen +so that the level varies as little as possible over the specimen — under 5 dB +per band across the whole façade (Clause 5). The outdoor microphone sits +$(2.0 \pm 0.2)$ m from the plane of the façade, or further out if that is what +it takes to keep 1 m of clearance from the nearest part of the façade, a +balustrade for instance. Integrate 30 s inside and out. With road traffic +instead, measure the two sides **simultaneously** over 60 s with at least +15 vehicles passing, repeating the indoor sweep through that period; three or +five fixed positions are sometimes necessary. + +**Service equipment (Clause 6.3.4).** Two fixed positions, three +measurements. Position 1 is close to the apparently hardest surfaces of the +room, preferably 0.5 m from the walls and from the floor or ceiling — in +practice a corner. Position 2 is in the reverberant field, the central area of +the room. Take **one** measurement at position 1 and **two** at position 2, +each covering one full operating cycle under normal conditions, and each on a +separate cycle. No position may be closer than 1.5 m to a source such as a +ventilation outlet. Dropping the corner position and taking three central ones +is the easiest way to bias this quantity low. + +**The band set (Clause 6.4, Table 2).** Airborne insulation and +tapping-machine impact insulation are measured in the five octave bands from +125 Hz to 2000 Hz; the heavy/soft impact source uses 63 Hz to 500 Hz, which is +why 63 Hz appears there and nowhere else. Service-equipment noise is a single +A- or C-weighted level over 63 Hz to 8000 Hz with the stated time weighting. + +### Background noise: a floor to meet, not a correction to apply + +Unlike the engineering methods, the survey method never corrects for +background noise (Clause 6.2.1). It fixes a signal-to-noise floor instead: +adjust the source so that the receiving-room level exceeds the background by +at least 6 dB in every band, checked by switching the source on and off before +the run. Where the margin still falls below 6 dB, record the uncorrected level +and state in the report that the level difference is underestimated — or, for +service equipment, that the level is overestimated — by an unknown amount. +That is why no correction call appears anywhere on this page: +`building.background_correction` implements the ISO 10140-4 laboratory rule +and must not be applied to survey data. Earlier revisions of this guide said +the opposite, listing the correction as the caller's job; a survey corrected +that way is non-conforming and over-reports the insulation. + +The traffic method for façades is the awkward case: the receiving-room +background cannot easily be separated from the traffic signal, so the rule +becomes a duty of care — keep noise from sources inside the building as low as +practicable and say so in the report if you suspect it contaminated the +result, because it can only make the façade look better than it is. + +### How much accuracy the survey buys back + +The trade this page opens on has a published size. Clause 6.6 NOTE states that +survey results and the corresponding engineering method are estimated to agree +**within ± 2 dB**, and Clause 6.6 itself requires the reproducibility of the +procedure to be checked from time to time in accordance with ISO 12999-1, +particularly after any change of procedure or instrumentation — the same +standard the +[field guide's uncertainty section](/phonometry/buildings/insulation/insulation-field/#measurement-uncertainty-iso-12999-1) +runs on. An *estimated* reverberation index adds to that: the tabulated +indices of Table 4 carry a standard deviation of about 1 dB (Table 4 NOTE 1), +and that spread enters every quantity on this page directly, band for band. +Measure $T$ when the result has to survive a dispute; estimate it when the +question is whether a partition is roughly where it should be. ## ISO 10052 survey reports (`.report()`) @@ -287,21 +420,29 @@ exactly three positions via `building.survey_service_equipment_level`; the automatic ISO 717 ratings on 5-octave or 16-third spectra; and the survey fiches through `.report()`. -**Not covered.** The survey procedure itself (where to hold the meter, the -fixed measurement heights, the tapping-machine placement of the control -method) is not checked: the functions consume band levels wherever they -came from. Nothing verifies that the 6 dB signal-to-background floor of -Clause 6.2.1 was met, and no correction is applied when it was not — that is -the method's own rule, not an omission. The survey method's accuracy statement relative to -ISO 16283 is quoted from the standard, not modelled; when the stakes rise, -step up to -[Field Insulation Measurement (ISO 16283)](/phonometry/buildings/insulation/insulation-field/). +**Not covered.** The survey procedure of +[Running the survey](#running-the-survey-clauses-5-and-6) is documented here +but not *checked*: the functions consume band levels wherever they came from, +so nothing verifies the sweep, the source corner, the tapping-machine +positions or the one-corner-plus-two-central service-equipment recipe. Nothing +verifies that the 6 dB signal-to-background floor of Clause 6.2.1 was met +either, and no correction is applied when it was not — that is the method's +own rule, not an omission. The ± 2 dB agreement with the engineering method is +the standard's own estimate (Clause 6.6 NOTE), not something this library +models or propagates: no survey result carries an uncertainty. When the stakes +rise, step up to +[Field Insulation Measurement (ISO 16283)](/phonometry/buildings/insulation/insulation-field/), +whose ISO 12999-1 machinery does produce one. Annex A's report form and +Annex B's operating cycles for service equipment are also outside the library. ## See also - [Field Insulation Measurement (ISO 16283)](/phonometry/buildings/insulation/insulation-field/): the engineering-grade airborne, impact and façade measurements this method approximates, and their ISO 12999-1 uncertainty. +- [Heavy and Soft Impact Sources](/phonometry/buildings/insulation/heavy-impact-sources/): + the rubber ball of Clause 6.3.2, its impact force exposure level and the + ISO 717-2 Annex D single number the survey heavy/soft branch reports. - [Insulation Ratings (ISO 717)](/phonometry/buildings/insulation/insulation-ratings/): the reference-curve engines behind the survey ratings. - [Room Acoustics](/phonometry/buildings/rooms/room-acoustics/): the measured diff --git a/site/src/content/docs/buildings/insulation/spanish-building-code.mdx b/site/src/content/docs/buildings/insulation/spanish-building-code.mdx index e11f82927..2a1d4832c 100644 --- a/site/src/content/docs/buildings/insulation/spanish-building-code.mdx +++ b/site/src/content/docs/buildings/insulation/spanish-building-code.mdx @@ -9,7 +9,7 @@ references: designation: "CTE DB-HR" url: "https://www.codigotecnico.org/pdf/Documentos/HR/DBHR.pdf" primary: true - note: "The Annex A global index (Formulae A.5 to A.7) and its normalised spectra (Tables A.2 to A.5), the rounding of clause 3.1.3.1 point 4 and the requirements of clause 2 (Table 2.1 for facades, 2.1.1 airborne, 2.1.2 impact and 2.2 reverberation)." + note: "The Annex A global index (Formulae A.5 to A.7) and its normalised spectra (Tables A.2 to A.5), the rounding of clause 3.1.3.1 point 4 and the requirements of clause 2 (Table 2.1 for façades, 2.1.1 airborne, 2.1.2 impact and 2.2 reverberation)." - type: standard organization: "Ministerio de la Presidencia (Spain)" year: 2007 @@ -22,7 +22,7 @@ references: year: 2017 title: "Manual de acústica ambiental y arquitectónica" publisher: "Paraninfo" - note: "Ejemplo 7.2 and Ejercicio 7.1 (pp. 394-395) are the numeric oracles of the global index on this page, and Ejemplos 7.4 and 7.5 (pp. 408-410) the window-size correction and the composite-facade calculation. ISBN 978-84-283-3814-1." + note: "Ejemplo 7.2 and Ejercicio 7.1 (pp. 394-395) are the numeric oracles of the global index on this page, and Ejemplos 7.4 and 7.5 (pp. 408-410) the window-size correction and the composite-façade calculation. ISBN 978-84-283-3814-1." --- import ThemeImage from '../../../../components/ThemeImage.astro'; @@ -33,7 +33,7 @@ relatives of, but not identical to, the ISO 717-1 weighted ratings: $R_A$, $R_{A,tr}$, $D_{nT,A}$ and $D_{2m,nT,Atr}$. This page implements the direct Annex A route, which is the normative one for DB-HR, the requirement tables of clause 2, and the two design calculations most often used with them: the -window-size correction and the insulation of a composite facade. +window-size correction and the insulation of a composite façade. The band spectra it consumes come from field measurement or from prediction; the ISO 717 reference-curve engine, which it is worth not confusing this with, @@ -64,10 +64,10 @@ do not always agree. The band centres are in `DB_HR_FREQUENCIES`. | Aircraft noise, $L_{Aav,i}$ | Table A.2 | $D_{2m,nT,Atr}$ | (A.6) | The railway row is the one worth reading twice. Clause 3.1.3.4 point 1 says -that where railway noise dominates the facade is assessed in +that where railway noise dominates the façade is assessed in $D_{2m,nT,A}$ through formula (A.5), and only road traffic and aircraft give $D_{2m,nT,Atr}$ through (A.6); Table H.1 prints the same split. Because -Table A.4 is digit for digit Table A.3, a rail-dominant facade comes out at +Table A.4 is digit for digit Table A.3, a rail-dominant façade comes out at the same *number* as a road one, but the quantity the requirement and the report are stated in is not the same. That is why `d2m_nt_a()` and `d2m_nt_atr()` are separate entry points and each refuses the other's @@ -92,6 +92,13 @@ index.reported # 51 dBA, the integer that defines the requirement +*`DbHrGlobalIndexResult.plot()` draws the band insulation together with the +transmitted level weighted by the normalised spectrum. The point is the second +curve: it shows at a glance which bands carry the energy sum, and therefore +where the element has to be improved. Here the weighted transmitted level peaks +in the low bands where `R'` is weakest, so the 51.4 dBA index is decided well +below 500 Hz.* +
Show the code for this figure @@ -137,11 +144,11 @@ published spectra this page reproduces, the agreement is exact to the integer: | Case | Direct route (Annex A) | ISO 717-1 route | Published? | | :--- | :--- | :--- | :--- | | Separating wall of Ejemplo 7.2 | $R'_A = 51.4$ dBA, rounded to 51 | $R'_w = 52$ with $C_{100-5000} = -1$, i.e. 51 | yes, Ejemplo 7.1 prints $R'_w = 52$, $C = -1$ and the 51 dBA | -| Facade of Ejercicio 7.1 | $D_{2m,nT,Atr} = 32.8$ dBA, rounded to 33 | $D_{2m,nT,w} = 38$ with $C_{tr,100-5000} = -5$, i.e. 33 | no, the book prints neither 38 nor $-5$ | +| Façade of Ejercicio 7.1 | $D_{2m,nT,Atr} = 32.8$ dBA, rounded to 33 | $D_{2m,nT,w} = 38$ with $C_{tr,100-5000} = -5$, i.e. 33 | no, the book prints neither 38 nor $-5$ | The two rows are not equally strong evidence. The wall row is a genuine external check, because the *Manual* prints the ISO 717-1 numbers as well as -the direct one. For the facade the book publishes only the 32,8 dBA; the 38 +the direct one. For the façade the book publishes only the 32,8 dBA; the 38 and the $-5$ come from this library's own ISO 717-1 engine, so that row shows the two routes agreeing with each other rather than agreeing with a source. @@ -152,9 +159,9 @@ indices run to 5 kHz while the ISO 717-1 core range stops at 3150 Hz, the terms that make (H.1) to (H.3) come out right are the **enlarged-range** $C_{100-5000}$ and $C_{tr,100-5000}$; that reading is not in Annex H itself but in the *Manual*, in the note to expressions [7.15] and [7.16]. It matters: -on the facade of Ejercicio 7.1 the core-range $C$ is $-2$ while $C_{100-5000}$ +on the façade of Ejercicio 7.1 the core-range $C$ is $-2$ while $C_{100-5000}$ is $-1$, so taking the wrong one gives 36 dBA instead of 37 for the -$D_{2m,nT,A}$ of that facade. On the same specimen $C_{tr}$ and +$D_{2m,nT,A}$ of that façade. On the same specimen $C_{tr}$ and $C_{tr,100-5000}$ are both $-5$, so the $D_{2m,nT,Atr}$ that DB-HR actually requires happens not to discriminate between the two readings at all. @@ -179,16 +186,23 @@ DB-HR states its requirements on two kinds of room: the **protected room** bedrooms, living areas, classrooms, operating theatres, professional offices) and the **habitable room** (*recinto habitable*) in general. -**Facades (Table 2.1).** The requirement on $D_{2m,nT,Atr}$ is read by bands of +**Façades (Table 2.1).** The requirement on $D_{2m,nT,Atr}$ is read by bands of the site's day noise index $L_d$ ($L_d \le 60$, $60 < L_d \le 65$, $65 < L_d \le 70$, $70 < L_d \le 75$ and $L_d > 75$ dBA): -| Use and room | $\le 60$ | 60-65 | 65-70 | 70-75 | $> 75$ | -| :--- | ---: | ---: | ---: | ---: | ---: | -| Residential and hospital, bedrooms; cultural, health, educational and administrative, living areas | 30 | 32 | 37 | 42 | 47 | -| Residential and hospital, living areas; cultural, health, educational and administrative, classrooms | 30 | 30 | 32 | 37 | 42 | +| Use | Room | `db_hr_facade_requirement(ld, use, room)` | $\le 60$ | 60-65 | 65-70 | 70-75 | $> 75$ | +| :--- | :--- | :--- | ---: | ---: | ---: | ---: | ---: | +| Residential, hospital | Bedrooms | `"residential"`, `"bedrooms"` | 30 | 32 | 37 | 42 | 47 | +| Residential, hospital | Living areas | `"residential"`, `"living"` | 30 | 30 | 32 | 37 | 42 | +| Cultural, health, educational, administrative | Living areas | `"cultural"`, `"living"` | 30 | 32 | 37 | 42 | 47 | +| Cultural, health, educational, administrative | Classrooms | `"educational"`, `"classrooms"` | 30 | 30 | 32 | 37 | 42 | + +The same phrase means different things in the two use groups, which is why the +printed table's single "use and room" column is easy to misread: *living areas* +carry the stricter row under a cultural or educational use and the more lenient +one under a residential use. -Three rules modify the reading: a facade not directly exposed to the dominant +Three rules modify the reading: a façade not directly exposed to the dominant noise (an enclosed courtyard, a quiet surrounding) is assessed with $L_d$ reduced by 10 dBA, where aircraft noise dominates the table value is increased by 4 dBA, and where no official $L_d$ exists for the site, 60 dBA is assumed @@ -263,7 +277,7 @@ comparing it (to an integer for the dB quantities, to one decimal for the reverberation time) and returns the margin; `assess_db_hr()` does the same over a list of value-requirement pairs. -## Windows and composite facades +## Windows and composite façades The tests that determine the sound reduction index of a window are run on specimens of about 1.8 m², and a larger window insulates less. The *Catálogo de @@ -273,12 +287,12 @@ $R_A$ and $R_{A,tr}$ by total window area: 0 dB up to 2.7 m², $-1$ dB between sliding window with 4-6-4 glazing, catalogued at $R_A = 26$ dBA, ends up at 24 dBA (Ejemplo 7.4). -A real facade is not a homogeneous element: it has a blind part and one or more +A real façade is not a homogeneous element: it has a blind part and one or more openings. The sound reduction index of the whole follows from the area-weighted sum of the transmittances, which is what `composite_transmission_loss()` does in [Predicting Panel Sound Insulation](/phonometry/buildings/design/panel-sound-insulation/). -With the 8 m² facade of Ejemplo 7.5, a blind part of 40 dBA and a 2 m² window +With the 8 m² façade of Ejemplo 7.5, a blind part of 40 dBA and a 2 m² window of 26 dBA, the whole comes out at 31.5 dBA: ```python @@ -292,25 +306,52 @@ composite_transmission_loss([6.0, 2.0], [50.0, 26.0]) # 31.97 dBA: +10 dBA on composite_transmission_loss([6.0, 2.0], [40.0, 31.0]) # 35.63 dBA: +5 dBA on the window ``` -Those last three lines hold the most useful rule of thumb in facade design: +Those last three lines hold the most useful rule of thumb in façade design: improving the blind part by 10 dBA raises the overall insulation by 0.4 dBA, practically nothing, whereas improving the window by 5 dBA raises it by 4.1 dBA, almost the full increment. The weak element is where the effort pays. -## Plots + -`DbHrGlobalIndexResult.plot()` draws the band insulation together with the -transmitted level weighted by the normalised spectrum, as in the figure above: -it shows at a glance which bands dominate the energy sum, and therefore where -the element has to be improved. `DbHrAssessment.plot()` draws the achieved -values against their limits, one per checked requirement. +*The rule of thumb made general. While the window is the weak element the three +curves lie on top of each other — the blind part is irrelevant, which is why +adding 10 dBA to it bought 0.4 dBA — and each curve only lifts off once the +window comes within a few decibels of it, then flattens onto the blind part's +own value as its asymptote. Design reads off the x-axis: work on whichever +element the curve is still following.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np +# `composite_transmission_loss` is the import of the block above. + +window = np.linspace(20.0, 55.0, 351) +fig, ax = plt.subplots() +for blind in (40.0, 50.0, 60.0): + overall = [composite_transmission_loss([6.0, 2.0], [blind, float(w)]) + for w in window] + ax.plot(window, overall, label=f"blind part RA = {blind:g} dBA") + ax.axhline(blind, linestyle=":", alpha=0.6) +for w_val, blind in ((26.0, 40.0), (26.0, 50.0), (31.0, 40.0)): + ax.plot([w_val], [composite_transmission_loss([6.0, 2.0], [blind, w_val])], + "o", color="black") +ax.set(xlabel="Window RA [dBA] (2 m2 of an 8 m2 facade)", + ylabel="Overall facade RA [dBA]") +ax.legend() +plt.show() +``` + +
## What this guide covers **Covered.** The DB-HR Annex A global index (Formulae A.5 to A.7) over the eighteen bands from 100 Hz to 5 kHz with the four normalised spectra of Tables A.2 to A.5, the rounding of clause 3.1.3.1 point 4, the requirements of clause -2 (Table 2.1 for facades, 2.1.1 airborne and party walls, 2.1.2 impact and 2.2 +2 (Table 2.1 for façades, 2.1.1 airborne and party walls, 2.1.2 impact and 2.2 reverberation and absorption) and the window-size correction of the *Catálogo de Elementos Constructivos*. @@ -326,7 +367,7 @@ are out of scope as well. - [Insulation Ratings (ISO 717)](/phonometry/buildings/insulation/insulation-ratings/): the reference-curve route with $R_w$, $C$, $C_{tr}$ and the enlarged-range terms that DB-HR calls simply $C$ and $C_{tr}$. - [Spanish Noise Regulation (RD 1367/2007)](/phonometry/environment/assessment/spanish-noise-regulation/): where the site's day noise index $L_d$ that Table 2.1 is entered with comes from. - [Façade Sound Insulation](/phonometry/buildings/insulation/facade-insulation/): the ISO 16283-3 measurement of $D_{2m,nT}$ and its EN 12354-3 prediction, which feed the $D_{2m,nT,Atr}$ index of this page. -- [Predicting Panel Sound Insulation](/phonometry/buildings/design/panel-sound-insulation/): the composite-facade calculation and transmission through openings and slits. +- [Predicting Panel Sound Insulation](/phonometry/buildings/design/panel-sound-insulation/): the composite-façade calculation and transmission through openings and slits. - [Field Insulation Measurement (ISO 16283)](/phonometry/buildings/insulation/insulation-field/): the band spectra of $R'$, $D_{nT}$ and $L'_{nT}$ that these global quantities summarise. - API reference: [`building.regulation.spain`](/phonometry/reference/api/building/spain/). - Theory: [Room and building acoustics](/phonometry/reference/theory/rooms-buildings/#room-and-building-acoustics-iso-18233-iso-3382-iso-16283-iso-10140-en-12354-iso-12999-iso-717-iso-354): the quantities the code requires, derived from ISO 12354 and ISO 717 rather than from the code. diff --git a/site/src/content/docs/buildings/rooms/enclosed-space-absorption.mdx b/site/src/content/docs/buildings/rooms/enclosed-space-absorption.mdx index 018c21437..c917b1be0 100644 --- a/site/src/content/docs/buildings/rooms/enclosed-space-absorption.mdx +++ b/site/src/content/docs/buildings/rooms/enclosed-space-absorption.mdx @@ -38,6 +38,19 @@ impact insulation members live in implements the normative Clause 4 model. (The informative Annex D method for irregular spaces is out of scope.) +That family membership is the reason most acousticians run this calculation. +The equivalent absorption area $A$ is not only an end in itself: it is the +quantity that converts an insulation prediction into a rated one. A prediction +produces a level difference $D$, and the ratings are defined only once the +receiving room's absorption is known — $D_{nT} = D + 10\lg(T/T_0)$ and +$R' = D + 10\lg(S/A)$ — while EN 12354-5 needs the same $A$ to turn a service +installation's sound power into a room level. The direction of the error +matters: over-estimating the receiving room's absorption *flatters* the +predicted $D_{nT}$, so the same optimistic $\alpha_s$ data that shortens the +predicted reverberation time also inflates the predicted insulation rating. +That is why the standard insists the source of every coefficient be stated in +the report. + ## 1. Equivalent absorption area (clause 4.3) @@ -55,12 +68,34 @@ $$ For hard, irregular objects whose absorption is not measured, an empirical estimate from the volume is used (Formula 4): -$A_{\mathrm{obj}} = V_{\mathrm{obj}}^{2/3}$. +$A_{\mathrm{obj}} = V_{\mathrm{obj}}^{2/3}$. The exponent is a surface-area +scaling: an object's exposed area grows as the two-thirds power of its volume, +so the formula credits a hard object with roughly one face of its bounding cube +of perfectly absorbing surface. It is frequency-independent by construction, +which is why it is restricted to *hard, irregular* objects — anything soft, +resonant or tabulated needs a measured $A_{\mathrm{obj}}$ instead — and why +clause 4.5 adds that objects matter only when they are large compared with the +wavelength, so anything under about 1 m across can normally be left out. + +The take-off itself is the half of the calculation a drawing does not hand you. +The diagram below turns EN 12354-6's own Annex E room into the three input lists +the formulae consume, so each number in the snippet that follows has a surface +behind it. + + + +*The Annex E room at 1 kHz, taken off surface by surface. Every row of the +`surfaces` list below is one tagged boundary; the furniture becomes the +`objects` list through Formula 4, and its summed volume becomes $\psi$. The +inset is the rule that governs every real room: a wall carrying a window is two +rows whose areas sum to the wall, never one row with an averaged coefficient.* ```python from phonometry import room # EN 12354-6 Annex E, bare room (29.75 m3), 1000 Hz octave band. +# The six rows are floor, ceiling, long wall, glass facade and the two +# short walls of a 4.54 x 2.73 x 2.40 m room. surfaces = [(12.39, 0.05), (12.39, 0.02), (10.90, 0.04), (10.90, 0.04), (6.55, 0.04), (6.55, 0.04)] print(round(room.equivalent_absorption_area(surfaces), 2)) # 2.26 m2 @@ -83,6 +118,17 @@ $$ where the speed of sound $c_0 = 345.6\ \text{m/s}$ makes the factor $55.3/c_0$ the familiar $0.16$. +The 55.3 is $24\ln 10 = 55.262$, the constant that falls out of the +diffuse-field decay when the mean free path is $4V/S$ and the decay is +extrapolated to a full 60 dB (the +[classical derivation](/phonometry/buildings/rooms/reverberation-prediction/#1-sabine-eyring-and-millington-sette)). +Formula 5 is therefore Sabine's law applied to the *free* volume left after the +objects have displaced their share, and the standard's unusual $c_0$ is a +rounding convention rather than a claim about the air temperature: 345.6 m/s is +chosen precisely so the quotient is the traditional 0.16. The residue is small +but real — for the same room this returns times about 0.7 % shorter than +`sabine_reverberation_time` at its own $c_0 = 343$ m/s. + ```python from phonometry import room @@ -100,6 +146,59 @@ print(round(a2, 2), round(room.reverberation_time(a2, 29.75, object_fraction=psi # 5.03 0.9 ``` +Both numbers are worth reading rather than passing over. A bare 30 m³ room at +2.1 s is unusable for speech — well over three times any classroom target — and +six pieces of hard furniture then supply 2.77 m² of absorption against the +2.26 m² of all six room surfaces together, more than doubling $A$ and halving +$T$. Almost all of that comes from the objects' own absorption; the $\psi$ term +contributes only the last 7 %, as the right-hand panel below separates out. + + + +*The Annex E pair, per octave band. The objects add a flat, frequency-independent +2.77 m² (Formula 4 has no frequency in it), which is why the furnished bars gain +the same absolute height in every band and the relative improvement is largest +where the room was deadest to begin with. On the right, the gap between the two +furnished curves is the whole effect of the displaced volume: $\psi$ = 0.072 +removes 7.2 % of the free volume and so shortens $T$ by 7.2 %, an order of +magnitude less than the objects' absorption does.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np +# `room` is the import of the Annex E block above. + +bands = [125.0, 250.0, 500.0, 1000.0, 2000.0, 4000.0, 8000.0] +alpha = {"floor": 0.05, "ceiling": 0.02, "wall": 0.04} # 1 kHz, held per band +per_band = [(12.39, [alpha["floor"]] * 7), (12.39, [alpha["ceiling"]] * 7), + (10.90, [alpha["wall"]] * 7), (10.90, [alpha["wall"]] * 7), + (6.55, [alpha["wall"]] * 7), (6.55, [alpha["wall"]] * 7)] +volumes = [0.15, 0.60, 0.05, 0.05, 0.65, 0.65] +bare = room.enclosed_space_reverberation(per_band, 29.75, air_condition="20C_50-70") +furnished = room.enclosed_space_reverberation( + per_band, 29.75, objects=room.hard_object_absorption(volumes), + object_fraction=room.object_fraction(volumes, 29.75), + air_condition="20C_50-70", +) + +fig, (left, right) = plt.subplots(1, 2, figsize=(12.5, 5.0)) +x = np.arange(len(bands)) +left.bar(x - 0.2, bare.absorption_area, 0.4, label="bare") +left.bar(x + 0.2, furnished.absorption_area, 0.4, label="furnished") +left.set_ylabel(r"$A$ [m$^2$]") +left.legend() +right.semilogx(bands, bare.reverberation_time, label="bare") +right.semilogx(bands, furnished.reverberation_time, label=r"furnished, $\psi$ = 0.072") +right.set_ylabel(r"$T$ [s]") +right.legend() +plt.show() +``` + +
+ Per octave band, one call takes the surfaces (with per-band absorption coefficients) and the air condition and returns the whole spectrum: @@ -161,6 +260,61 @@ reverberation time in of the reverberation-room absorption of [Sound Absorption Measurement and Rating](/phonometry/materials/absorbers/absorption-measurement/) (ISO 354). +## 2b. Designing to a target + +EN 12354-6 exists to support design, and design runs the formulae backwards: +from a target reverberation time to the absorption area the room must have, to +the deficit against the untreated room, to the area of a chosen product. +Inverting Formula 5 gives + +$$ +A_{\text{required}} = \frac{55.3}{c_0}\,\frac{V\,(1 - \psi)}{T_{\text{target}}} +\;=\; \frac{0.16\,V\,(1-\psi)}{T_{\text{target}}}, +$$ + +which has to be evaluated **band by band**, because the target is normally a +range across 125 Hz to 4 kHz rather than a single number. Subtract the +absorption the untreated room already has to get the per-band deficit, divide +the deficit by the candidate product's per-band $\alpha_s$ to get the area to +install, and then check that area actually fits on the available surfaces. + +```python +import numpy as np +# `room`, `plaster` and `tile` come from the per-band block above. + +bare = room.enclosed_space_reverberation( + [(54.0, plaster), (20.0, plaster), (20.0, plaster)], + volume=60.0, air_condition="20C_50-70", +) +required = 0.16 * 60.0 / 0.6 # 16.0 m2 for a 0.6 s target +deficit = required - bare.absorption_area +print(np.round(deficit, 1)) # [14.1 13.1 13. 12. 10.9 10.3 8.1] +print(np.round(deficit / np.array(tile), 0)) # [94. 37. 20. 14. 12. 11. 9.] m2 of tile +``` + +The answer is the design lesson. Above 500 Hz the target needs about 20 m² of +tile, which is exactly the ceiling area, and the treated room of §2 duly lands +at 0.48 s. At 125 Hz it would need **94 m²** — the room's entire boundary — so +the target is simply unreachable with a thin porous product, which is the +general rule: the deficit is largest at 125 Hz where such products are weakest. +Two consequences follow from the model itself. Because the reverberant level +falls as $10\lg A$, doubling the absorption area buys only 3 dB, so a room a +second over target cannot be rescued with a rug. And because $A$ appears in the +denominator, the first square metres of treatment are worth far more than the +last: going from 2 m² to 6 m² of absorption thirds the reverberation time, while +going from 20 m² to 24 m² changes it by a sixth. + +Anchors for the target itself, since the standard supplies none: speech-critical +rooms such as classrooms and meeting rooms usually sit between about 0.4 s and +0.8 s at mid frequencies depending on volume, with ANSI/ASA S12.60-1:2010 +Table 1 capping unoccupied, furnished core learning spaces at 0.6 s up to 283 m³ +and 0.7 s from 283 m³ to 566 m³; open offices, corridors and stairwells are +specified by *absorption area* rather than by reverberation time, which is +clause 4.5's own advice (§3); and music spaces need longer times than this +standard is intended for. The +[classical prediction guide](/phonometry/buildings/rooms/reverberation-prediction/#what-value-to-aim-at) +carries the same anchors with their frequency-shape rules. + ## 3. Where the input data comes from **Surface coefficients.** The standard expects the $\alpha_{s,i}$ to come @@ -174,6 +328,30 @@ more energy into the sample than its flat area intercepts); it enters Formula 1 as measured, without clamping, because the same diffuse-field convention that produced it is the one the model assumes. +**Not the single-number rating.** The standard admits *frequency-band data +only*. Clause 3.2.1's NOTE is explicit that a single-number rating derived per +EN ISO 11654 — $\alpha_w$, and by the same argument the NRC and SAA of the +American practice — may be used for comparing or specifying products but +**cannot be used directly to calculate the performance in situ**. This is the +commonest way to get the calculation wrong, and it runs silently, because the +API accepts a scalar coefficient per surface and will happily apply a +datasheet's headline figure to every band. Three properties of the rating make +that substitution wrong in a known direction. It is a *shifted reference curve* +read at 500 Hz, fitted by moving the curve in 0.05 steps until the summed +unfavourable deviations fall to 0.10 or less, so a band that under-performs is +absorbed into that allowance rather than reported. Its inputs, the practical +coefficients $\alpha_p$, are already rounded in steps of 0.05 and capped at +1.00. And its reference curve stops at the 250 Hz octave, so ISO 11654 states +that the rating **is not appropriate below that frequency** at all: a flat +$\alpha_w$ carries no information whatsoever about the 125 Hz band, which is +where rooms usually fail. Compare the 20 mm tile of §2, whose $\alpha_s$ runs +0.15 at 125 Hz against 0.85 at 1 kHz, with the single "Class A" figure its +datasheet would print. Take the per-third-octave table from the ISO 354 test +report and average the three thirds into each octave; where only a rating is +available, treat the prediction as indicative and say so in the report. The +rating itself is defined in +[Sound Absorption Measurement and Rating](/phonometry/materials/absorbers/absorption-measurement/). + **Furniture and occupants.** Objects contribute through three routes: a measured equivalent absorption area $A_{obj}$ when one exists (persons and seating have tabulated values in the informative Annex C), the @@ -195,6 +373,55 @@ custom frequency axis; `air_condition=None` (the default) omits the air term, and for other frequencies or conditions compute $m$ per ISO 9613-1 and chain `air_absorption_area` into `equivalent_absorption_area`. + + +*Left: the air term for the six built-in profiles at a fixed 2000 m³. +EN 12354-6 Table 1 gives the same 0.1 × 10⁻³ Np/m at 125 Hz for every climate, +so the six curves are indistinguishable there; by 8 kHz they run from 10.6 to +29.0 × 10⁻³ Np/m, a factor of 2.7, with the cold, dry profile absorbing most. +Right: the same $\bar\alpha$ = 0.15 in two volumes, showing what the thresholds +in the prose are worth. In the 60 m³ office the air term costs 1.7 % at 1 kHz +and is still under 3 % at 2 kHz; in the 2000 m³ hall it costs 5.1 % at 1 kHz, +18 % at 4 kHz and 42 % at 8 kHz. The volume threshold and the frequency +threshold are one rule, not two: the term is $4mV$ against a boundary term that +grows only as the area.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +# `room` is the import of the per-band block above. + +bands = [125.0, 250.0, 500.0, 1000.0, 2000.0, 4000.0, 8000.0] +profiles = ["10C_30-50", "10C_50-70", "10C_70-90", + "20C_30-50", "20C_50-70", "20C_70-90"] +soft = [0.15] * 7 + +# The air term is the difference the air_condition string makes to A. +fig, (left, right) = plt.subplots(1, 2, figsize=(12.5, 5.0)) +still = room.enclosed_space_reverberation([(1000.0, soft)], 2000.0) +for name in profiles: + humid = room.enclosed_space_reverberation( + [(1000.0, soft)], 2000.0, air_condition=name) + left.loglog(bands, humid.absorption_area - still.absorption_area, + marker="o", label=name) +left.set_ylabel(r"$A_{air}$ [m$^2$]") +left.legend(fontsize=8) + +for volume, area in ((60.0, 94.0), (2000.0, 1000.0)): + for condition in (None, "20C_50-70"): + res = room.enclosed_space_reverberation( + [(area, soft)], volume, air_condition=condition) + right.semilogx(bands, res.reverberation_time, + label=f"{volume:g} m3, air={condition}") +right.set_ylabel(r"$T$ [s]") +right.legend(fontsize=8) +plt.show() +``` + +
+ **Validity limits (clause 4.6).** The model assumes an ordinary, reasonably diffuse room: no dimension more than 5 times another, opposite surface pairs whose coefficients differ by less than a factor of 3 (unless @@ -205,6 +432,61 @@ times up to twice the prediction in low-diffusivity rooms. The classical alternatives for those cases live in [Reverberation-time prediction](/phonometry/buildings/rooms/reverberation-prediction/). +Two scope statements sit above those numeric limits. Clause 1 says the model is +based on experience with rooms in dwellings and offices and with common spaces +such as stairwells, corridors and rooms containing machinery, and that it is +**not intended for very large or irregularly shaped spaces such as concert +halls, theatres and factories** — for which the room-acoustic measurement +standards and the classical formulae are the right tools. And clause 4.1 fixes +the normal calculation range at the 125 Hz to 4 kHz octaves, with a NOTE +recording that no accuracy information exists outside it; the air table and this +implementation extend to 8 kHz, so treat that band as an extrapolation. Annex E +supplies a worked demonstration that the limits bite: its own case 3, a single +wall lined over 90 % of its area, is declared to be outside the application +limits of the model, and the annex hands the case to the informative Annex D +method instead. + +**Reading the numbers (clause 4.5).** The standard's own interpretations turn +three of the quantities on this page into judgements: + +- Objects smaller than about 1 m across can normally be neglected, because they + only matter when their dimensions exceed the wavelength. +- An empty room typically has $\psi < 0.05$ and a furnished one + $0.05 \leq \psi \leq 0.2$, which places the Annex E value of 0.072 squarely in + the ordinary furnished range. A $\psi$ far above that band signals a plant + room whose remaining free space may no longer behave as a single space at all, + which is a scope question rather than an accuracy one. +- In a stairwell, an entrance hall or a plant room the reverberation time is a + poor descriptor and the requirement is better written as an amount of + absorption — which is why `equivalent_absorption_area` is exposed + independently of `reverberation_time` rather than only as an intermediate. + +**Estimating the accuracy (clause 5).** The standard declines to state an +accuracy and gives one piece of practical advice instead: vary the input data, +especially in complicated situations and with atypical elements, and read the +resulting spread as the expected accuracy. + +```python +# `room`, `plaster` and `tile` come from the per-band block above. +for factor in (0.8, 1.0, 1.2): # the ceiling alpha, plus or minus 20 % + ceiling = [a * factor for a in tile] + res = room.enclosed_space_reverberation( + [(54.0, plaster), (20.0, plaster), (20.0, ceiling)], + volume=60.0, air_condition="20C_50-70", + ) + print(factor, res.reverberation_time.round(2)) +# 0.8 [2.46 1.22 0.75 0.57 0.52 0.5 0.47] +# 1.0 [2.13 1.03 0.62 0.48 0.43 0.42 0.4 ] +# 1.2 [1.88 0.9 0.53 0.41 0.37 0.37 0.35] +``` + +A ±20 % uncertainty on one surface's coefficient moves the 1 kHz prediction from +0.48 s to 0.57 s or 0.41 s — +19 % and −15 %, asymmetric because $T$ goes as +$1/A$ — and 2.13 s to 2.46 s or 1.88 s at 125 Hz, where the ceiling carries less +of the total. That spread *is* the accuracy statement the standard declines to +give, so a design that clears its target by less than it has not really cleared +it. + ## 4. Enclosed-space report (`.report()`) `ReverberationResult.report(path)` renders a one-page PDF fiche characterising @@ -266,7 +548,41 @@ repository; click the preview to open the PDF. caption="Enclosed-space fiche (ReverberationResult.report), the per-band A/T table and the boxed T_mid." /> +## What this guide covers + +**Covered.** EN 12354-6:2003 Clause 4: the total equivalent sound absorption +area of Formulae 1 to 4 with its surface, object, object-array and air terms +(`room.equivalent_absorption_area`, `room.hard_object_absorption`, +`room.object_fraction`, `room.air_absorption_area`), the Formula 5 reverberation +time (`room.reverberation_time`), the per-octave-band chain +(`room.enclosed_space_reverberation`) and the one-page fiche through +`.report()`, validated against the three worked cases of Annex E. The input-data +rules of clause 4.2, the interpretations of clause 4.5 and the limits of +clause 4.6 are stated in §3, and the design inversion of Formula 5 in §2b. + +**Not covered.** The informative Annex D method for irregular spaces and +irregular absorption distribution, which is where the standard itself sends the +cases that fail clause 4.6 (including its own Annex E case 3). The standard's +scope exclusions — very large or irregularly shaped spaces such as concert +halls, theatres and factories — are outside the model rather than outside this +implementation. Nothing here emits a verdict: EN 12354-6 gives a diffuse-field +estimate, and a target passed through `requirement` is drawn as a reference line +only. + ## See also +- [Reverberation-time prediction (Sabine, Eyring, Arau)](/phonometry/buildings/rooms/reverberation-prediction/): + the classical family, and the models to reach for when the clause 4.6 limits + fail. +- [Room acoustic parameters (ISO 3382-1/2)](/phonometry/buildings/rooms/room-acoustics/): + the measured counterpart of the reverberation time predicted here. +- [Sound Absorption Measurement and Rating](/phonometry/materials/absorbers/absorption-measurement/): + where the $\alpha_s$ come from (ISO 354) and where $\alpha_w$ is defined + (ISO 11654) — the rating §3 forbids as an input. +- [Predicting Sound Insulation (EN 12354)](/phonometry/buildings/design/insulation-prediction/): + the family member that consumes the $A$ computed here, through + $D_{nT} = D + 10\lg(T/T_0)$ and $R' = D + 10\lg(S/A)$. +- [Conformance report](https://github.com/jmrplens/phonometry/blob/main/docs/CONFORMANCE.md): + the three Annex E cases these implementations are checked against. - API reference: [`room.enclosed_space_absorption`](/phonometry/reference/api/rooms/enclosed-space-absorption/). - Theory: [Room and building acoustics](/phonometry/reference/theory/rooms-buildings/#room-and-building-acoustics-iso-18233-iso-3382-iso-16283-iso-10140-en-12354-iso-12999-iso-717-iso-354): the equivalent-absorption-area definition the EN 12354-6 procedure computes. diff --git a/site/src/content/docs/buildings/rooms/open-plan-acoustics.mdx b/site/src/content/docs/buildings/rooms/open-plan-acoustics.mdx index 875cfe9df..274e7d544 100644 --- a/site/src/content/docs/buildings/rooms/open-plan-acoustics.mdx +++ b/site/src/content/docs/buildings/rooms/open-plan-acoustics.mdx @@ -28,8 +28,13 @@ it. ISO 3382-3 therefore characterises the office with four single numbers — $r_D$, $D_{2,S}$, $L_{p,A,S,4m}$ and the average background noise $L_{p,A,B}$ — measured along a line of workstations, walking away from a talker. This -guide covers that measurement chain: the quantities, the to-scale -measurement line and the accredited fiche. The impulse responses and levels +guide covers that measurement chain — the quantities, the to-scale +measurement line and the accredited fiche — and then turns the question +round: at design time, before any office or restaurant exists, Long's crowd +self-noise model predicts the background an occupied room generates from its +own occupants, and converts a target speech-to-noise ratio into an absorption +area per table. Measurement first, design second; the two halves share +nothing but the room. The impulse responses and levels behind it are acquired as in [Measuring the Room Impulse Response](/phonometry/buildings/rooms/room-impulse-response/); the per-position STI comes from the @@ -58,8 +63,33 @@ $$ with **$L_{p,A,S,4m}$** read off the same line at 4 m. The **distraction distance** $r_D$ (STI = 0.50) and **privacy distance** $r_P$ (STI = 0.20) come -from a linear regression of STI against distance. Good offices push $r_D$ -below ~5 m; poor ones leave speech distracting past 10 m. +from a linear regression of STI against distance. + +Both distances are read **off the fitted line**, and clause 6.3 allows the +reading to fall outside the measured span — Figure 3 b) draws the line +extended to the crossing. So an $r_D$ that lands inside the line is a +measurement, while an $r_P$ well beyond the last position is an +extrapolation whose confidence decays with distance: quote it with the +measured span alongside ("$r_P$ = 17 m, extrapolated from positions to 16 m"). +The standard also anticipates offices where the STI never falls to 0.20 — +"it can prove impossible to determine the privacy distance if STI > 0,20 in +all positions" — and that is what a `nan` means here, not a bug. A +*non-decreasing* STI along the line usually means the last position sat near a +reflecting wall, where both level and STI rise; clause 6.2 says to discard +that position from the $D_{2,S}$ and $r_D$ fits rather than to puzzle over it. + +ISO 3382-3 Annex A is informative, but it fixes the two ends of the scale: + +| Quantity | Typical poor office | Good target | +| :--- | :---: | :---: | +| $D_{2,S}$ | < 5 dB | ≥ 7 dB | +| $L_{p,A,S,4m}$ | > 50 dB | ≤ 48 dB | +| $r_D$ | > 10 m | ≤ 5 m | + +Those ranges are informative, and national guidance or the client brief +overrides them. Read $D_{2,S}$ and $L_{p,A,S,4m}$ **as a pair**: the decay rate +is a slope and the 4 m level is its offset, so quoting either alone flatters or +condemns the room. $L_{p,A,B}$ is the fourth required quantity and it is not decoration: the background noise is measured in octave bands at every position with the same @@ -80,6 +110,9 @@ by metres with nothing having changed in the room. import numpy as np from phonometry import room +# A stand-in line: the levels are built to a clean 7 dB per doubling and the +# STI to a straight -0.03 per metre, so every printed number can be checked +# by hand. A measured line is not this tidy (see below). r = np.array([2.0, 4.0, 6.0, 8.0, 12.0, 16.0]) # distances from the talker (m) lp = 65.0 - 7.0 * np.log2(r) # A-weighted speech level (dB) sti = 0.70 - 0.03 * r # STI per position @@ -90,6 +123,19 @@ print(round(m.rd, 1), round(m.rp, 1)) # 6.7 m, 16.7 m m.plot() # the spatial-decay regression of the figure below ``` +**Reading this office.** $D_{2,S}$ = 7.0 dB is exactly the Annex A good-office +threshold, but $L_{p,A,S,4m}$ = 51.0 dB is above the 50 dB *poor* line, and +$r_D$ still lands at 6.7 m. It is a good decay rate spent from too high a +starting level, so the fix is attenuation **near the talker** — a screen, an +absorptive ceiling raft over the workstation — rather than more decay further +out. And a measured line does not look like this one: positions scatter about +the fitted line, typically by one to two decibels, with the near ones pulled up +by the direct field and the far ones flattened by the background floor. What is +reported is the **regression**, not any single position: $L_{p,A,S,4m}$ is read +off the line even when no microphone stood at 4 m, which is also why six +positions are preferred — four barely constrain a slope once one of them has to +be discarded. +
@@ -154,6 +200,38 @@ plt.show()
+Against the Annex A scale, that one office sits between two very different +rooms: + + + +*The two ends of Annex A on one axis. The treated office meets all three +targets; the untreated one misses all three, and its privacy distance — 24 m +read off a 16 m line — is exactly the extrapolation warned about above.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np +# `room` is the import of the first snippet above. + +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() +``` + +
+ The line itself is worth a to-scale plan. `plot_open_plan_geometry` draws the source, the microphone line across the workstations and the two distances on the axis, and a result that retained its positions redraws its own line with @@ -183,6 +261,60 @@ plt.show()
+## Measuring the line + +Clauses 5.1 and 5.2 fix everything the drawing above leaves implicit. + +**The source (5.1.1).** An **omnidirectional** loudspeaker radiating **pink +noise**, meeting the omnidirectionality requirements of ISO 3382-1 — the +standard is explicit about why: people in an open-plan office do not +continuously speak in any fixed direction. A deterministic pink-spectrum +signal (an MLS or a sweep, acquired as in the +[room impulse response guide](/phonometry/buildings/rooms/room-impulse-response/)) +is an accepted substitute, and the results are derived from the impulse +response. Its sound power is verified as in ISO 3382-1, with the source at +1.2 m, and clause 6.2 sets the level: high enough in each octave band that the +pink noise exceeds the background by **6 dB at the most distant position**. + +**The receiving chain (5.1.2).** A sound level meter meeting IEC 61672-1 +**class 1**, an **omnidirectional** microphone (including whatever is attached +to it), and octave filters to **IEC 61260**. If the signal is recorded for +off-line processing, the whole chain has to comply. + +**The room condition (5.2.1).** Measured **furnished**, with nobody present +but the operators, and with the HVAC and any **sound-masking system running at +the power of a typical working day**. The standard states the failure directly: +if the sources run at reduced power the STI values come out too high, which +overestimates both $r_D$ and $r_P$. Because people are absent, the masking that +real conversation provides is not in the measurement either, so the actual +distances in use are *shorter* than the measured ones. + +**The line (5.2.2).** It crosses the workstations and **need not be straight**. +**6 to 10** successive positions are preferred and **4** is the minimum, with +the first at the **nearest workstation**. Source and microphone both stand at +head height in a workstation, **1.2 m** above the floor — standing working +positions are out of scope — and at least **0.5 m from tables** and **2.0 m +from walls and other reflecting surfaces**. **At least two source positions** +are used; if only one line is possible, it is measured with two sources firing +in opposite directions. Where the ceiling or the furniture changes, the office +is treated as separate **zones**, each with its own set of single numbers. + +**What is recorded at each point (5.2.3).** Four things: the octave-band +pink-noise level, the STI, the octave-band background level, and the distance +to the source — over **125 Hz to 8 kHz**, with an integration time of **at +least 10 s** (longer for non-stationary background such as traffic). + + + +**Why the window stops at 2 m and 16 m.** Clause 6.2 admits only positions +between 2 m and 16 m into the $D_{2,S}$ regression, and both ends have a +reason. Nearer than 2 m the receiver sits in the talker's direct field, whose +6 dB per doubling is a property of free space rather than of the office; beyond +16 m the speech level has normally reached the background, so the regression +would be fitting noise. A line of six positions from 2 m to 16 m therefore +keeps at least four points inside the fit even if the last one has to be +discarded for sitting near a wall. + ### From the measured pink noise to $L_{p,A,S,n}$ A loudspeaker is not a talker, so ISO 3382-3 never uses its level directly. @@ -312,6 +444,8 @@ import numpy as np from phonometry import room, ReportMetadata r = np.array([2.0, 3.0, 4.0, 6.0, 8.0, 11.0, 16.0]) # distances from the talker (m) +# Another stand-in line, built to a clean 7 dB per doubling as above; a +# measured one scatters about the fit by a decibel or two. lp = 62.0 - 7.0 * np.log2(r) # A-weighted speech level (dB) sti = 0.65 - 0.03 * r # STI per position @@ -411,10 +545,66 @@ from phonometry import room print(round(room.absorption_per_table(1.0, -6.0), 2)) # 6.31 m2 per table at 1 m print(round(room.absorption_per_table(2.5, -9.0), 1)) # 19.8 m2 at 2.5 m spacing +# A real layout: 1.2 m across the table, 2.0 m to the next one. +print(round(room.absorption_per_table(1.2, -6.0), 2)) # 9.09 m2, the floor +print(round(room.absorption_per_table(2.0, -9.0), 2)) # 12.66 m2, the ceiling + crowd = room.crowd_noise([20.0, 95.0, 190.0], distance=1.2) crowd.plot() # self-noise vs occupancy, against the -6 dB limit ``` +The two bounds are a **window**, and it can be empty. Requiring +$6.31\,r_s^2 < A_\text{tab} < 3.16\,r_t^2$ means the window exists only when +$r_t/r_s > \sqrt{6.31/3.16} \approx 1.41$: pack the tables closer than that and +there is no absorption at all that lets you converse across your own table +without being overheard at the next one. The layout above passes, with +$r_t/r_s = 1.67$ and 3.6 m² of room between the bounds. + + + +*Left: for one layout the two inequalities leave a band of feasible absorption +per table. Right: how wide that band is as the tables move apart — below +$r_t/r_s = 1.41$ it has negative width, which is the geometric statement that +conversation and privacy have become incompatible whatever the ceiling is made +of.* + +
+Show the code for this figure + +```python +import matplotlib.pyplot as plt +import numpy as np +# `room` is the import of the block above. + +span = np.linspace(0.6, 3.2, 200) +plt.plot(span, room.absorption_per_table(span, -6.0), label="communication") +plt.plot(span, room.absorption_per_table(span, -9.0), label="privacy") + +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: the closure ratio +plt.legend(); plt.show() +``` + +
+ +**Where $A_\text{tab}$ itself comes from.** For a room that exists, measure the +reverberation time to ISO 3382-2 and invert Sabine, $A = 0.161\,V/T$ — the same +convention ISO 354 defines — with the +[room impulse response](/phonometry/buildings/rooms/room-impulse-response/) +and [Room Acoustics](/phonometry/buildings/rooms/room-acoustics/) guides +supplying $T$. For a room being designed, take it off surface by surface as in +[Sound absorption in enclosed spaces](/phonometry/buildings/rooms/enclosed-space-absorption/). +Either way $A_\text{tab} = A/N$ with $N$ the number of **simultaneously +occupied** tables — not the covers, and not the tables installed. That is what +makes a half-full restaurant a different room from a full one at the same +absorption, and it is why adding tables at fixed absorption is what pushes a +room past its limit. It also means a T30 measured in the empty room is enough +to predict how it will sound full. + *The same 20 talkers in three rooms. The hard room (20 m² of absorption) @@ -472,9 +662,11 @@ and `absorption_per_table` are callable directly. quantities ($D_{2,S}$, $L_{p,A,S,4m}$, $r_D$, $r_P$) from `room.open_plan_metrics`, with the to-scale measurement-line drawing (`room.plot_open_plan_geometry` and `.plot_geometry()`) and the one-page -ISO 3382-3 fiche through `.report()`. Long's *Architectural Acoustics* 2e -Chapter 17 crowd self-noise model (Eqs. (17.50) to (17.54)) through -`room.crowd_noise` and its parts. +ISO 3382-3 fiche through `.report()`. The clause 5.1 and 5.2 measurement +conditions and the Annex A quality ranges are quoted here for planning and +reading. Long's *Architectural Acoustics* 2e Chapter 17 crowd self-noise model +(Eqs. (17.50) to (17.54)) through `room.crowd_noise` and its parts, with the +Eq. (17.53)-(17.54) design window and its closure condition. **Not covered.** ISO 3382-3's per-position STI is taken as an input to `open_plan_metrics` rather than computed inside it: measure it with the @@ -484,10 +676,11 @@ The fourth required single number, the average A-weighted background noise $L_{p,A,B}$, is likewise not computed here — it is the energetic A-weighted average of the per-position octave-band background levels, and it belongs in the report alongside the three this page produces. -The standard's measurement procedure itself (loudspeaker directivity, the -unoccupied-versus-furnished conditions, background-noise capture) is not -checked: the function consumes distances, levels and STI values wherever -they came from. The crowd self-noise model is a *design* calculation and +Nothing **checks** the measurement conditions of clauses 5.1 and 5.2 either: +the function consumes distances, levels and STI values wherever they came +from, so the source directivity, the furnished-and-unoccupied state and the +background capture are the operator's responsibility, not the library's. The +crowd self-noise model is a *design* calculation and deliberately does not model the Lombard reflex: it cancels out of $L_{SN}$ as long as everyone raises their voice equally, so the model explains why the level spirals upward in a hard room rather than predicting where it stops. It diff --git a/site/src/content/docs/buildings/rooms/reverberation-prediction.mdx b/site/src/content/docs/buildings/rooms/reverberation-prediction.mdx index 5c35856f9..63568a9f1 100644 --- a/site/src/content/docs/buildings/rooms/reverberation-prediction.mdx +++ b/site/src/content/docs/buildings/rooms/reverberation-prediction.mdx @@ -112,19 +112,41 @@ which specialises the same physics to that standard's Clause 4. phonometry offers five models, ordered by how much they account for a **non-uniform** absorption distribution: -| Model | Absorption term in $T = k\,V / (\text{term} + 4mV)$ | Best for | +| Model | How the absorption enters | Best for | |:---|:---|:---| -| **Sabine** | $A = \sum_i S_i\alpha_i$ | low, uniform absorption | -| **Eyring** (Norris-Eyring) | $-S\ln(1-\bar\alpha)$ | strong, uniform absorption | -| **Millington-Sette** | $-\sum_i S_i\ln(1-\alpha_i)$ | a few very absorptive surfaces | +| **Sabine** | absorption term $A = \sum_i S_i\alpha_i$ | low, uniform absorption | +| **Eyring** (Norris-Eyring) | absorption term $-S\ln(1-\bar\alpha)$ | strong, uniform absorption | +| **Millington-Sette** | absorption term $-\sum_i S_i\ln(1-\alpha_i)$ | a few very absorptive surfaces | | **Fitzroy** | area-weighted **arithmetic** mean of three axial Eyring times | anisotropic rooms | | **Arau-Puchades** | area-weighted **geometric** mean of the same three | anisotropic rooms (author-preferred) | -with the Sabine constant $k = 24\ln 10 / c_0$ (so $k = 0.161$ for -$c_0 = 343\ \mathrm{m/s}$) and the air-absorption term $4mV$. +The first three models differ only in the denominator of +$T = k\,V / (\text{term} + 4mV)$, with the Sabine constant +$k = 24\ln 10 / c_0$ (so $k = 0.161$ for $c_0 = 343\ \mathrm{m/s}$) and the +air-absorption term $4mV$. Fitzroy and Arau-Puchades work differently: they +compute three axial Eyring *times* and combine those, so their entries are +reverberation times and cannot be substituted into that denominator (§2). + +EN 12354-6 pins the same constant differently. It rounds $24\ln 10$ to 55.3 and +fixes $c_0 = 345.6\ \mathrm{m/s}$ so that the factor is exactly the traditional +0.16, which makes the +[enclosed-space model](/phonometry/buildings/rooms/enclosed-space-absorption/) +return reverberation times about 0.7 % shorter than +`sabine_reverberation_time` for the same room — 0.608 s against 0.612 s for the +8 × 5 × 3 m shoebox of §1. It is a rounding convention, not a physical +disagreement: passing `speed_of_sound=345.6` to the classical function brings +the two within 0.07 %, the residue of rounding $24\ln 10 = 55.262$ to 55.3. +*A 10 × 7 × 3.5 m room with a carpeted floor and an acoustic ceiling between +hard end walls, run through all five models. Fitzroy sits well above the rest +because a single wall pair carries almost all the absorption; Sabine and Eyring +bracket the middle, and Arau-Puchades tempers Fitzroy's over-prediction with a +geometric mean. Where the five spread like this, the room is telling you its +field is not diffuse (§4) — the spread is the diagnostic, not a defect of one +formula.* +
Show the code for this figure @@ -148,8 +170,96 @@ plt.show()
+## 0. Assembling the inputs + +All five models consume two things a drawing does not hand you directly: a list +of areas with a coefficient each, and — for Fitzroy and Arau-Puchades — one mean +coefficient per pair of opposing walls. Almost every wrong prediction is a wrong +take-off rather than a wrong formula, so this step deserves as much care as the +choice of model. + +**Areas.** Use the *internal* boundary areas of the room, measured to the +finished surfaces, and give every material its own row: a wall carrying a window +and a door becomes three rows whose areas sum to the wall. EN 12354-6 Annex E +case 3 does exactly this, splitting a 10.90 m² long wall into 9.81 m² lined at +$\alpha_s$ = 0.85 plus 1.09 m² bare at 0.04. Do not average a lining into its +wall by hand; the formulae already do the area weighting, and Millington-Sette +does it non-linearly, so pre-averaging changes the answer. + +**Coefficients.** These are random-incidence values measured to ISO 354 on a +10-12 m² sample in a stated mounting, not material constants +([Sound Absorption Measurement and Rating](/phonometry/materials/absorbers/absorption-measurement/)). +Mounting depth and edge condition change them substantially, so a coefficient +quoted for a product bonded direct to the substrate does not describe the same +product on a 200 mm plenum. ISO 354 delivers one-third-octave data and an +octave-band run takes the arithmetic mean of the three thirds. A datasheet's +single-number rating — $\alpha_w$, NRC, SAA — is *not* a substitute for the +per-band table (see the +[EN 12354-6 guide](/phonometry/buildings/rooms/enclosed-space-absorption/#3-where-the-input-data-comes-from), +which states the prohibition normatively). Audience and seating are rated per +square metre of the floor area they occupy, not per person. Feeding +reverberation-room data back into Sabine is self-consistent because the ISO 354 +coefficient is *defined* through Sabine's formula, which is also why a +coefficient above 1.0 is a documented outcome rather than an error (§4). + +**Wall-pair means.** `fitzroy_reverberation_time` and +`arau_puchades_reverberation_time` take one mean coefficient per *opposing +pair*, in the order $(\bar\alpha_x, \bar\alpha_y, \bar\alpha_z)$ where +$\bar\alpha_i$ belongs to the pair perpendicular to axis $i$. Each is the +area-weighted mean over both surfaces of the pair. In a shoebox the two +surfaces have equal areas, so it reduces to their arithmetic mean — but not once +one of them is split by a window or a lining. Absorption that is patchy *within* +one pair (an absorptive wall facing a hard one) is outside both models even +though the code still returns a number; that case belongs to §4's list of +failures. + +```python +# `room` is the import of the figure block above. +# A 9 x 7 x 3 m classroom (V = 189 m3), 1 kHz octave band, taken off by material. +surfaces = [ + (63.0, 0.05), # floor, vinyl on concrete + (63.0, 0.70), # ceiling, 20 mm acoustic tile + (12.0, 0.04), # long wall A: glazing + (15.0, 0.05), # long wall A: plaster around the glazing + (2.0, 0.10), # long wall B: wooden door + (25.0, 0.05), # long wall B: plaster + (21.0, 0.05), # short wall, plaster + (21.0, 0.05), # short wall, plaster +] +print(round(room.sabine_reverberation_time(189.0, surfaces), 2)) # 0.59 s + +def pair_mean(rows): # area-weighted mean over one pair + area = sum(s for s, _ in rows) + return sum(s * a for s, a in rows) / area + +means = (pair_mean(surfaces[6:8]), # x-pair: the two short walls + pair_mean(surfaces[2:6]), # y-pair: the two long walls + pair_mean(surfaces[0:2])) # z-pair: floor and ceiling +print([round(a, 3) for a in means]) # [0.05, 0.05, 0.375] +print(round(room.fitzroy_reverberation_time((9.0, 7.0, 3.0), means), 2)) # 1.33 s +print(round(room.arau_puchades_reverberation_time((9.0, 7.0, 3.0), means), 2)) # 0.76 s +``` + +One take-off, both input forms. The spread it produces — 0.59 s from Sabine +against 1.33 s from Fitzroy — is not a bug: all of this room's absorption sits +on one wall pair, which is exactly the case §2 exists for and §4 warns about. + ## 1. Sabine, Eyring and Millington-Sette +Every model in the family follows from one picture. In a diffuse field a ray +travels a **mean free path** $4V/S$ between reflections, so it meets a boundary +$cS/4V$ times per second and gives up part of its energy each time. Take that +loss as $\alpha$ per reflection and linearise it and you get **Sabine**: the +decay rate is proportional to $\sum_i S_i\alpha_i$, and 60 dB of decay takes +$k V / A$ seconds. Keep the loss multiplicative instead — after $n$ reflections +the energy is down by $(1-\bar\alpha)^n$ — and the logarithm of that factor +gives **Eyring**'s $-S\ln(1-\bar\alpha)$, which is why Eyring is always the +shorter of the two and why the two converge as $\bar\alpha \to 0$. Do the same +bookkeeping surface by surface rather than on the mean and you get +**Millington-Sette**, which collapses to zero the moment one surface absorbs +perfectly, because a ray that strikes it never returns. The air term $4mV$ is +the same path length applied to the medium instead of to the boundary. + The three statistical models take the room volume and a list of `(area, absorption_coefficient)` surfaces. **Sabine** is exact only for low, uniform absorption; **Eyring** replaces the absorption area by @@ -177,9 +287,8 @@ print(round(room.millington_sette_reverberation_time(120.0, surfaces), 3)) # 0. For a **uniform** distribution Eyring and Millington-Sette coincide, and both fall below Sabine; Sabine's over-estimate at high absorption is the reason Eyring exists. As $\alpha \to 0$, Eyring reduces to Sabine. Air absorption -enters every model through the power-attenuation coefficient $m$ (in neper per -metre, from the ISO 9613-1 -[atmospheric absorption](/phonometry/environment/propagation/outdoor-propagation/)): +enters every model through the power (intensity) attenuation coefficient $m$, +in neper per metre: ```python from phonometry import environment, room @@ -188,11 +297,30 @@ m = environment.air_attenuation_m(2000.0, temperature=20.0, relative_humidity=50 surfaces = [(40.0, 0.3), (40.0, 0.3), (24.0, 0.3), (24.0, 0.3), (15.0, 0.3), (15.0, 0.3)] print(round(room.eyring_reverberation_time(120.0, surfaces, air_attenuation=m), 3)) +# 0.337 s, against 0.343 s with the air term omitted ``` +Six milliseconds on a third of a second is why the air term is usually ignored +in a room this size, and it is a scaling argument rather than a rule of thumb: +$4mV$ grows with the **volume** while the boundary term grows with the +**area**, so the air's share rises with the room's linear dimension. In the same +120 m³ room the 2 kHz correction is 1.9 %; in a 20 000 m³ concert hall with +$\bar\alpha = 0.15$ the 4 kHz Eyring time falls from 4.31 s to 2.49 s at +20 °C / 50 % RH — 42 % — and to 1.52 s if the hall is dry at 20 % RH. That is +the second half of the behaviour: $m$ rises steeply with frequency and falls +with humidity, so the driest condition is the worst case and a hall that +measures well in a humid summer can sound noticeably brighter in winter. The +coefficient itself comes from the ISO 9613-1 +[atmospheric absorption](/phonometry/environment/propagation/outdoor-propagation/) +model, evaluated at the room's own temperature and humidity. + Every statistical model also assumes a **diffuse field**, and low -frequencies break that assumption first: below the Schroeder frequency the -room responds as a set of discrete modes, not as a reverberant mixture. The +frequencies break that assumption first: below the **Schroeder frequency** +$f_s \approx 2000\sqrt{T/V}$ ($V$ in m³, $T$ in s — 141 Hz for a 200 m³ +classroom with $T$ = 1 s) the room responds as a set of discrete modes, not as +a reverberant mixture. `room.schroeder_frequency(T, V)` computes it, and +[the modes of a rectangular room](/phonometry/buildings/rooms/room-image-sources/#3-modes-of-a-rectangular-room) +enumerate what is down there. The 2D FDTD simulation below drives a rigid 5 m by 3.5 m room exactly on its (2,1) mode and then between two modes; the standing-wave pattern that builds up on resonance is what Sabine and Eyring cannot see. @@ -219,6 +347,20 @@ T_{\text{Fitz}} = \sum_i \frac{S_i}{S}\,T_i \quad(\text{arithmetic}), \qquad T_{\text{Arau}} = \prod_i T_i^{\,S_i/S} \quad(\text{geometric}). $$ +Each $T_i$ has a physical reading: it is the reverberation time the room *would* +have if every one of its boundaries absorbed like the wall pair on axis $i$, so +it is the decay experienced by sound bouncing predominantly along that axis — +which is why the formula uses the whole surface $S$ and not $S_i$. The weight +$S_i/S$ is then the fraction of the boundary that steers energy into that axis. +A shoebox with a soft floor and ceiling between hard walls therefore has three +coexisting decay rates, and the two models differ only in how they blend them: +Fitzroy averages them arithmetically, so the slowest axis dominates and the +result runs high when one pair is very reflective; Arau-Puchades averages them +geometrically, which lets the fastest axis pull the answer down. Both assume a +rectangular room and absorption uniform *within* each pair, so a room with one +absorptive wall facing a hard one of the same pair is outside the model even +though the code still returns a number (§0). + ```python from phonometry import room @@ -289,8 +431,53 @@ through both, with the validity boundary every statistical formula shares. +*The same 245 m³ room through Sabine and Eyring alone. Eyring reads 11 % +shorter at 125 Hz and 29 % shorter at 4 kHz, because its correction grows with +the mean absorption, which here rises from 0.21 to 0.51 across the spectrum. +The closing note is the domain both share.* + ## 4. Choosing a model, and when every model fails +The single axis along which the first three models disagree is the mean +absorption, so it is worth seeing them plotted against it before reading the +bullets below. + + + +*A 8 × 5 × 3 m shoebox with a uniform mean absorption swept from 0.02 to 0.99. +Below $\bar\alpha \approx 0.1$ all three coincide, which is why Sabine survived +a century of use. Eyring and Millington-Sette are identical for a uniform +distribution and fall away from Sabine as the absorption rises: −10 % at +$\bar\alpha$ = 0.2, −28 % at 0.5, −61 % at 0.9. At the right-hand edge the +structural difference is visible — Sabine still predicts a finite 0.12 s for a +room with an opening in every direction, while the logarithmic models reach +zero.* + +
+Show the code for this figure + +```python +# `room` and `plt` are the imports of the figure block at the top of the page. +import numpy as np + +alpha = np.linspace(0.02, 0.99, 200) +volume, area = 120.0, 158.0 +sab = np.array([room.sabine_reverberation_time(volume, [(area, a)]) for a in alpha]) +eyr = np.array([room.eyring_reverberation_time(volume, [(area, a)]) for a in alpha]) + +fig, (top, bottom) = plt.subplots(2, 1, sharex=True) +top.semilogy(alpha, sab, label="Sabine") +top.semilogy(alpha, eyr, "--", label="Eyring") +top.set_ylabel("T [s]") +top.legend() +bottom.plot(alpha, 100.0 * (eyr / sab - 1.0)) +bottom.set_xlabel(r"Mean absorption $\bar\alpha$") +bottom.set_ylabel("Departure from Sabine [%]") +plt.show() +``` + +
+ The five formulae are not rivals on a single axis of accuracy; each has a domain of validity: @@ -309,36 +496,50 @@ domain of validity: - **Millington-Sette** handles a mix of very absorptive and hard surfaces better than a single mean, but it is meant for measured, sub-unity coefficients: a single surface with $\alpha_i = 1$ drives the whole - prediction to zero. Reverberation-room coefficients at or above 1.0 (a - documented ISO 354 outcome, see the absorption section of - [Room Acoustics](/phonometry/buildings/rooms/room-acoustics/)) lie outside the - domain of the logarithmic term, so phonometry enforces each formula's - own domain: Sabine accepts such coefficients as supplied (its linear - $A = \sum_i S_i\alpha_i$ stays finite); Eyring accepts them as long as - the mean entering $\ln(1-\bar\alpha)$ stays below 1 (Fitzroy and - Arau-Puchades take the wall-pair means themselves as inputs, so each - must already be below 1); Millington-Sette rejects any coefficient at - or above 1. To use Millington anyway, bringing such a - coefficient into $[0, 1)$ is a modelling decision the formula does not - prescribe: whatever adjustment you choose (limiting just below 1 is - common), record it alongside the prediction. + prediction to zero. Reverberation-room coefficients at or above 1.0 are a + documented ISO 354 outcome — edge diffraction scatters more energy into the + sample than its flat area intercepts, see + [Sound Absorption Measurement and Rating](/phonometry/materials/absorbers/absorption-measurement/) + — and they lie outside the domain of the logarithmic term. To use + Millington-Sette anyway you must bring the coefficient into $[0, 1)$, and + that is a modelling decision the formula does not prescribe: whatever + adjustment you choose (limiting to just below 1 is common), record it + alongside the prediction. - **Fitzroy** and **Arau-Puchades** target shoebox rooms whose absorption is concentrated on one axis, the typical office or dwelling with a soft floor and ceiling between hard walls. Arau's geometric mean tempers Fitzroy's known over-prediction when one wall pair is very reflective. +**What each model accepts.** phonometry enforces each formula's own domain, so +an out-of-domain coefficient raises a `ValueError` rather than returning a +meaningless number: + +| Model | Accepts | Why | +|:---|:---|:---| +| Sabine | any $\alpha_i \geq 0$, including above 1 | the linear sum $\sum_i S_i\alpha_i$ stays finite | +| Eyring | individual $\alpha_i$ above 1, provided $\bar\alpha < 1$ | only the mean enters $\ln(1-\bar\alpha)$ | +| Millington-Sette | every $\alpha_i < 1$ | its per-surface $\ln(1-\alpha_i)$ diverges at 1 | +| Fitzroy | each wall-pair mean $< 1$ | the means are the inputs, and each enters a logarithm | +| Arau-Puchades | each wall-pair mean $< 1$ | same | + +All five reject a coefficient above 2.0 outright, on the grounds that it is a +percentage passed as a fraction: measured ISO 354 values do not exceed about +1.2. + **When every formula fails.** All five inherit the same assumption: a diffuse field, with sound arriving equally from all directions at every point, that stays diffuse while it decays. The common breakages: -- **Below the Schroeder frequency** the band holds a handful of discrete +- [**Below the Schroeder frequency**](/phonometry/buildings/rooms/room-image-sources/#3-modes-of-a-rectangular-room) + the band holds a handful of discrete modes (the animation in §1) and a statistical reverberation time is not defined at all; each mode decays at its own rate set by the wall impedances it actually touches. - **Coupled volumes** (a hall with an open stage house, two rooms through a doorway) produce double-slope decays; no single $T$ exists, and the - measured T20 and T30 disagree (the curvature diagnostic of - [Room Acoustics](/phonometry/buildings/rooms/room-acoustics/)). + measured T20 and T30 disagree (the + [curvature diagnostic](/phonometry/buildings/rooms/room-acoustics/#reading-edt-t20-and-t30-against-each-other) + of the room-parameter guide). - **Disproportionate rooms** (corridors, low flat halls) with the absorption on one surface pair keep a grazing sound field parallel to the hard surfaces that the absorber barely touches; the measured time can be @@ -376,6 +577,39 @@ In practice, quote a *band* of predictions (Sabine and Eyring, or Fitzroy and Arau-Puchades for axial cases) rather than a single value; where the models spread, the room is telling you its field is not diffuse. +### What value to aim at + +A prediction is only useful against a target, and a reverberation-time +requirement is a **range across the octave bands**, not a single upper limit — +which is why the fiche of §5 prints the target as a reference line and emits no +verdict. Anchors worth carrying: + +- **Speech-critical rooms** (classrooms, meeting rooms, lecture theatres) land + between roughly 0.4 s and 0.8 s at mid frequencies, tightening as the room + gets smaller. ANSI/ASA S12.60-1:2010 Table 1 is the strictest widely used + version of that: for unoccupied, furnished core learning spaces it caps the + average of the 500 Hz, 1 kHz and 2 kHz octaves at **0.6 s** up to 283 m³ and + **0.7 s** from 283 m³ to 566 m³, with no requirement above that, and it + additionally asks the smaller rooms to be adaptable down to 0.3 s. +- **Open-plan offices, corridors and stairwells** are specified by absorption + *area* rather than by reverberation time, because the field in them is too + far from diffuse for a single $T$ to describe (this is EN 12354-6 clause + 4.5's own advice, and the ISO 3382-3 quantities of + [Open-Plan Office Acoustics](/phonometry/buildings/rooms/open-plan-acoustics/) + replace $T$ entirely). +- **Music rehearsal and performance spaces** need more than 1 s and rise with + volume; ISO 3382-1 Table A.1 quotes 1.0 s to 3.0 s as the typical EDT range + of unoccupied concert and multi-purpose halls up to 25 000 m³. + +Two shape rules go with the numbers. The target is normally read at the 500 Hz +and 1 kHz octaves, and the goal across frequency is a **flat** spectrum: a +low-frequency rise of more than about 20 % over the mid-frequency value is what +makes a treated room sound boomy even when it passes at 500 Hz, and a rise of +that size is tolerated in music spaces but not in classrooms. And because the +prediction band is often 20 to 30 % wide — the §0 classroom spans 0.59 s to +1.33 s — a design that only just meets its target on the most favourable model +has no margin at all. + ## 5. Prediction report (`.report()`) `ReverberationModelResult.report(path)` renders a one-page PDF fiche of the @@ -453,5 +687,15 @@ rather than a statistical prediction. ## See also +- [Sound Absorption Measurement and Rating](/phonometry/materials/absorbers/absorption-measurement/): + the ISO 354 measurement every $\alpha_s$ on this page comes from, its mounting + dependence, and the ISO 11654 rating that must *not* be substituted for the + per-band table (§0). +- [Room acoustic parameters (ISO 3382-1/2)](/phonometry/buildings/rooms/room-acoustics/#how-much-decay-range-the-noise-floor-allows): + the measured counterpart, and the curvature diagnostic that tells you a + prediction's diffuse-field assumption has failed. +- [Modes of a rectangular room](/phonometry/buildings/rooms/room-image-sources/#3-modes-of-a-rectangular-room): + what is below the Schroeder frequency, where none of these five formulae + applies. - API reference: [`room.reverberation_prediction`](/phonometry/reference/api/rooms/reverberation-prediction/) and [`environment.propagation.air_absorption`](/phonometry/reference/api/environment/air-absorption/). - Theory: [Room and building acoustics](/phonometry/reference/theory/rooms-buildings/#room-and-building-acoustics-iso-18233-iso-3382-iso-16283-iso-10140-en-12354-iso-12999-iso-717-iso-354): the diffuse-field assumption every Sabine-family formula makes, and where it stops holding. diff --git a/site/src/content/docs/buildings/rooms/room-acoustics.mdx b/site/src/content/docs/buildings/rooms/room-acoustics.mdx index bee9839e1..a306748a9 100644 --- a/site/src/content/docs/buildings/rooms/room-acoustics.mdx +++ b/site/src/content/docs/buildings/rooms/room-acoustics.mdx @@ -1,5 +1,5 @@ --- -title: "Room Acoustics" +title: "Room acoustic parameters (ISO 3382-1/2)" description: "Decay analysis of the measured room impulse response per ISO 3382-1/2: the Schroeder curve, EDT, T20, T30, clarity, definition and centre time, the validity flags that keep them honest and the accredited fiche." references: - type: book @@ -101,6 +101,23 @@ with $te = 50$ ms → C50 (speech) and $te = 80$ ms → C80 (music), plus the **just-noticeable difference** (ISO 3382-1 Table A.1: EDT 5 %, C80 1 dB, D50 0.05, Ts 10 ms) that sets how precisely it is worth reporting. +**Where $t = 0$ is.** All three energy integrals start at the arrival of the +**direct sound**, not at the start of the file. ISO 3382-1 A.3.4 places that +point where the response first rises significantly above the background while +still being more than 20 dB below its maximum, and `room_parameters` applies +that trigger per band before integrating, so any propagation and system delay +carried by the recording is removed automatically — a measured IR needs no +manual trimming. It matters asymmetrically. The reverberation times use only the +*slope* of the decay and are indifferent to where it starts, but C50, C80 and +$T_s$ integrate *from* $t = 0$, so an onset placed one millisecond late throws +away part of the direct sound and can move C50 and C80 by several decibels and +$T_s$ by tens of milliseconds, while leaving T20 and T30 almost untouched — the +error is invisible in the number everyone checks. The detector deliberately errs +early, which is the harmless direction. Two working rules follow: never trim an +IR by hand to remove its pre-delay, and be suspicious of C50/C80 from a +recording whose direct sound is soft or has been pre-ringed by external +processing, because the trigger can then fire late. +