Building Acoustics: Sound insulation measurements#
Contact: c.m.l.van.hoorickx@tue.nl
This assignment is part of the course “Architectural Acoustics” at the Eindhoven University of Technology. It is designed to help in understanding the concept of measuring structure-borne sound insulation and computing single number ratings.
Duration: 65 Minutes
Requirements: Knowledge about the indicators for structure-borne sound insulation and about how single number ratings are computed. Familiarity with Python and the used libraries is helpful.
References
Kuttruff, Acoustics: an introduction.
Dependencies
If you are running this notebook locally or in Google Colab, make sure to install the required dependencies. You can do this by executing the following command in an arbitrary code cell:
!pip install numpy matplotlib
[ ]:
import numpy as np
import matplotlib.pyplot as plt
Normalized impact sound level#
Measurements have been conducted in two vertically aligned offices. The upper room measures 2.8m × 4.7m × 2.4 m, and the lower room measures 4.2m × 4.7m × 2.3 m. In this document, the upper room is referred to as index 1, and the lower room as index 2.
Two types of measurements were conducted in these rooms:
Reverberation time in room 2 (
T).Sound pressure levels in room 2 (
Lp) with a tapping machine placed on the floor in room 1. They have both been measured in one-third octave bands between 100 and 3150 Hz (f).
Task: Calculate the normalized impact sound level (Ln) from these measurements.
[ ]:
f = np.array([100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150]) # Hz
T = np.array([0.5215, 0.5230, 0.3890, 0.4310, 0.3310, 0.3930, 0.3390, 0.2810, 0.3095, 0.3315, 0.3425, 0.3515, 0.3485, 0.3960, 0.3835, 0.3935]) # s
Lp = np.array([60.9, 68.1, 68.1, 66.8, 69.3, 72.3, 68.9, 72.0, 69.8, 64.3, 60.3, 56.4, 55.0, 53.2, 55.6, 55.6]) # dB
# Calculate the normalized impact sound level Ln from these measurements
# YOUR CODE HERE
raise NotImplementedError()
Now plot the normalized impact sound level using the code below.
[ ]:
f1 = f[1::3] # Hz
plt.figure(figsize=(8, 5))
plt.plot(f, Ln, linewidth=2)
plt.xscale("log")
plt.minorticks_off()
plt.xticks(f)
plt.gca().set_xticklabels(
[str(x) if x in f1 else "" for x in f]
)
plt.ylim(0, 90)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Normalized impact sound level [dB]')
plt.grid(True)
plt.show()
Single number rating#
The results for impact sound insulation are typically summarized using a single number rating, known as the weighted impact sound level \(L_\mathrm{n,w}\). This procedure is detailed in ISO 717-2 and is summarized here. It utilizes a reference curve, as shown in the slides. The reference curve is adjusted in increments of 1 dB until the average sum of unfavourable deviations (where the measured curve lies above the shifted reference curve) reaches 2 dB. For one-third octave bands, which include 16 bands within the building acoustics range (100 Hz to 3150 Hz), the sum over unfavourable deviations becomes:
where \(L_\mathrm{n}\) is the measured normalized sound level and \(X_\mathrm{impact}'\) is the shifted reference curve. The weighted normalized impact sound level is then taken as the value at 500 Hz. The procedure is illustrated in the course slides.
Task: Complete the following code such that calculate_SNR can be used to compute the single number rating of the impact sound level X (e.g., the normalized impact sound level Ln).
Tip: 500 Hz is index 7 of the frequency-array `f’.
[ ]:
# Reference curve for impact sound levels
Lnref = np.array([62, 62, 62, 62, 62, 62, 61, 60, 59, 58, 57, 54, 51, 48, 45, 42]) # dB
# Calculate the sum of unfavorable deviations
def positive_sum(X, Lnshift):
"""Calculate the sum of unfavorable deviations.
Parameters
----------
X : numpy.array
The impact sound levels at the specified frequencies.
Lnshift : numpy.array
The shifted reference curve at the specified frequencies.
"""
# Calculate the sum of unfavorable deviations and return it as output of this function
# YOUR CODE HERE
raise NotImplementedError()
# Calculate the single number rating (SNR) for a impact sound level X.
def calculate_SNR(X):
"""Calculate the single number rating (SNR) for a impact sound level X.
Parameters
----------
X : numpy.array
The impact sound levels at the 1/3 octave band frequencies between 100 Hz and 3150 Hz.
"""
Lnshift = Lnref.copy()
sumunfdev = positive_sum(X, Lnshift)
# Calculate the weighted impact sound level Xw from the frequency dependent impact sound level X
# YOUR CODE HERE
raise NotImplementedError()
return Xw
Plot again the normalized sound level, but this time also add the shifted reference curve. The plot might help you evaluate whether what you did is correct.
Tip: if you want to zoom, you can change the limits in plt.ylim(0, 80) (or simply remove this line).
[ ]:
Lnw = calculate_SNR(Ln)
Lnshift = Lnref+(Lnw - Lnref[7])
plt.figure(figsize=(8, 5))
plt.plot(f, Ln, linewidth=2)
plt.plot(f, Lnshift, linewidth=2, color='k')
plt.xscale("log")
plt.minorticks_off()
plt.xticks(f)
plt.gca().set_xticklabels(
[str(x) if x in f1 else "" for x in f]
)
plt.ylim(0, 90)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Normalized impact sound level [dB]')
plt.grid(True)
plt.show()
print(f"The weighted normalized impact sound levels is: {Lnw} dB.")
Effect of a floating floor#
To improve the impact sound insulation of the floor, a floating floor is installed in room 1. This consists of a \(t = 50\,\mathrm{mm}\) concrete floating screed (mass density \(\rho = 2400\,\mathrm{kg/m^3}\), giving a surface mass \(m' = \rho t = 120\,\mathrm{kg/m^3}\)) on a \(d = 10\,\mathrm{mm}\) resilient layer. Two material options are proposed for the resilient layer. The first is mineral wool with dynamic stiffness of \(s = 0.2/d\,\mathrm{MN/m^3}\); the second is expanded polystyrene (EPS) with dynamic stiffness of \(s = 2.0/d\,\mathrm{MN/m^3}\) . Both have a damping loss factor \(\eta = 0.2\). The change \(\Delta L\) (\(L_\mathrm{p,new} = L_\mathrm{p}+\Delta L\)) in radiated sound level in room 2 can be estimated by:
Task: Calculate the new normalized impact sound level \(L_\mathrm{n}\) for each resilient layer type. Please name the normalized impact sound level for the floating floor with mineral wool LnMW and for the one with expanded polystyrene LnEPS.
[ ]:
d = 0.01 # m
sMW = 0.2/d*1e6 # N/m³
sEPS = 2/d*1e6 # N/m³
eta = 0.2 # -
rho = 2400 # kg/m³
t = 0.05 # m
m = rho*t # kg/m²
# Calculate the normalized impact sound levels LnMW and LnEPS
# YOUR CODE HERE
raise NotImplementedError()
Now you can plot the new normalized impact sound levels and compute the corresponding single number ratings \(L_\mathrm{nw}\).
[ ]:
plt.figure(figsize=(8, 5))
plt.plot(f, Ln, linewidth=2, label='No floating floor')
plt.plot(f, LnMW, linewidth=2, label='Mineral wool')
plt.plot(f, LnEPS, linewidth=2, label='Expanded Polystyrene')
plt.xscale("log")
plt.minorticks_off()
plt.xticks(f)
plt.gca().set_xticklabels(
[str(x) if x in f1 else "" for x in f]
)
plt.ylim(0, 90)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Normalized impact sound level [dB]')
plt.grid(True)
plt.legend()
plt.show()
LnwMW = calculate_SNR(LnMW)
LnwEPS = calculate_SNR(LnEPS)
print(f"The weighted normalized impact sound levels of the original floor is: {Lnw} dB.")
print(f"The weighted normalized impact sound levels of the floating floor with mineral wool is: {LnwMW} dB.")
print(f"The weighted normalized impact sound levels of the floating floor with expanded polystyrene is: {LnwEPS} dB.")
Question: Based on the results, which resilient layer would you recommend? Can you explain, based on the curves that you plotted, the main reason for the differences in weighted normalized impact sound levels?
YOUR ANSWER HERE
License notice#
This notebook © 2026 by Cedric Van hoorickx is licensed under CC BY 4.0
Watermark#
The following watermark might help others to install specific package versions that might be required to run the notebook. Please give at least the versions of Python, IPython, numpy , and scipy, major third party packagers (e.g., pytorch), and all used pyfar packages.
[ ]:
%load_ext watermark
%watermark -v -m -p numpy,scipy,pyfar,sofar,nbgrader,watermark