Skip to content

Spanish Building Code (CTE DB-HR)

Standards: RD 1367/2007Key references: Avilés López & Perera Martín 2017

The Documento Básico HR “Protección frente al ruido” of the Spanish building code states its requirements in A-weighted global quantities that are close relatives of, but not identical to, the ISO 717-1 weighted ratings: , , and . 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 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, is in Insulation Ratings (ISO 717).

Instead of shifting a reference curve, DB-HR weights the measured band insulation with a normalised source spectrum and sums it energetically (Formulae A.5 to A.7):

where is the band insulation (the sound reduction index or , the standardized level difference , and so on) and the normalised source spectrum. The sum runs over eighteen one-third-octave bands, 100 Hz to 5 kHz, two more than the sixteen of ISO 717-1 (100 Hz to 3150 Hz): the 4 kHz and 5 kHz bands, which are the first reason the two routes do not always agree. The band centres are in DB_HR_FREQUENCIES.

Normalised spectrumAnnex A tableQuantity it definesFormula
A-weighted pink noise, Table A.5, , (A.5), (A.7)
Road traffic, Table A.3, (A.6)
Railway noise, Table A.4 (numerically identical to A.3)(A.5)
Aircraft noise, Table A.2(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 façade is assessed in through formula (A.5), and only road traffic and aircraft give through (A.6); Table H.1 prints the same split. Because 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 spectra, rather than one function with a spectrum switch that would silently put the wrong name on the result.

All four are in DB_HR_NORMALISED_SPECTRA under the keys "pink", "traffic", "railway" and "aircraft". The calculation below reproduces Ejemplo 7.2 of the Manual, the apparent sound reduction index of a party wall taken from a real field test report:

from phonometry import building
r_prime = [36.2, 41.5, 36.9, 40.4, 44.7, 42.4, 45.7, 46.1, 47.1,
52.3, 54.3, 57.5, 57.8, 57.3, 59.0, 62.8, 64.7, 65.3]
index = building.ra(r_prime)
index.value # 51.44 dBA
index.intermediate # 51.4 dBA, the one-decimal intermediate
index.reported # 51 dBA, the integer that defines the requirement
CTE DB-HR global index R'A: per-band apparent sound reduction index as bars with the pink-noise weighted transmitted level per band, whose energy sum sets the 51.4 dBA indexCTE DB-HR global index R'A: per-band apparent sound reduction index as bars with the pink-noise weighted transmitted level per band, whose energy sum sets the 51.4 dBA index

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
import matplotlib.pyplot as plt
from phonometry import building
r_prime = [36.2, 41.5, 36.9, 40.4, 44.7, 42.4, 45.7, 46.1, 47.1,
52.3, 54.3, 57.5, 57.8, 57.3, 59.0, 62.8, 64.7, 65.3]
building.ra(r_prime).plot()
plt.show()

ra(), ra_tr(), dnt_a(), d2m_nt_a() and d2m_nt_atr() are named shortcuts over db_hr_global_index(), which accepts any spectrum and, given the frequencies argument, selects the eighteen DB-HR bands out of a longer series.

Rounding and the relationship with the ISO 717 route

Section titled “Rounding and the relationship with the ISO 717 route”

Clause 3.1.3.1 point 4 of DB-HR requires the final values of the quantities that define the requirements to be expressed rounded to an integer, while intermediate values are carried with one decimal. The result object therefore exposes all three forms: .value (unrounded), .intermediate (one decimal) and .reported (the integer used in the check).

DB-HR and ISO 717-1 reach the same place by different routes, and Annex H of the document itself accepts three approximations as long as the two routes differ by less than 1 dB:

with (H.2) covering the rail-dominant case of the previous section. On the two published spectra this page reproduces, the agreement is exact to the integer:

CaseDirect route (Annex A)ISO 717-1 routePublished?
Separating wall of Ejemplo 7.2 dBA, rounded to 51 with , i.e. 51yes, Ejemplo 7.1 prints , and the 51 dBA
Façade of Ejercicio 7.1 dBA, rounded to 33 with , i.e. 33no, the book prints neither 38 nor

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 façade the book publishes only the 32,8 dBA; the 38 and the 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.

The real trap is the name of the spectrum adaptation terms. Annex H writes them as plain and and refers their definition to UNE-EN ISO 717-1 without narrowing the frequency range. Since the DB-HR 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 and ; 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 façade of Ejercicio 7.1 the core-range is while is , so taking the wrong one gives 36 dBA instead of 37 for the of that façade. On the same specimen and are both , so the that DB-HR actually requires happens not to discriminate between the two readings at all.

from phonometry import building, weighted_rating_extended
d2m_nt = [28.5, 28.5, 18.9, 23.7, 30.7, 31.3, 37.8, 35.2, 34.7,
38.5, 37.7, 43.1, 42.3, 44.2, 41.9, 37.5, 39.4, 41.5]
direct = building.d2m_nt_atr(d2m_nt)
direct.intermediate, direct.reported # 32.8 dBA -> 33 dBA
iso = weighted_rating_extended(d2m_nt, building.DB_HR_FREQUENCIES)
iso.rating, iso.ctr_100_5000 # 38 dB, -5 dB -> 33 dBA, the same figure
iso.c, iso.c_100_5000 # -2 and -1: core range versus enlarged range

DB-HR states its requirements on two kinds of room: the protected room (recinto protegido, a habitable room with reinforced acoustic protection: bedrooms, living areas, classrooms, operating theatres, professional offices) and the habitable room (recinto habitable) in general.

Façades (Table 2.1). The requirement on is read by bands of the site’s day noise index (, , , and dBA):

UseRoomdb_hr_facade_requirement(ld, use, room)60-6565-7070-75
Residential, hospitalBedrooms"residential", "bedrooms"3032374247
Residential, hospitalLiving areas"residential", "living"3030323742
Cultural, health, educational, administrativeLiving areas"cultural", "living"3032374247
Cultural, health, educational, administrativeClassrooms"educational", "classrooms"3030323742

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 façade not directly exposed to the dominant noise (an enclosed courtyard, a quiet surrounding) is assessed with reduced by 10 dBA, where aircraft noise dominates the table value is increased by 4 dBA, and where no official exists for the site, 60 dBA is assumed for residential acoustic areas.

Airborne insulation between rooms (clause 2.1.1). Partition walls (tabiquería) within one use unit must have dBA. Against a room of another use unit, a protected room requires dBA and a habitable room dBA; against a services or activity room, a protected room requires dBA and a habitable room dBA. When the two rooms share a door or a window, the requirement moves to the opening (sound reduction index of 30 dBA for the protected room, 20 dBA for the habitable one) and to the enclosure around it (50 dBA).

Party walls (clause 2.1.1 c). Against a medianería DB-HR offers two alternative routes, not cumulative ones: either each of the two leaves reaches dBA, or the two leaves taken together reach dBA. db_hr_party_wall_requirement() returns whichever route is asked for.

Impact sound (clause 2.1.2). The standardized impact sound pressure level must not exceed 65 dB in a protected room against a room of another use unit, nor 60 dB against a services or activity room; that same 60 dB limit applies to the habitable room.

Reverberation and absorption (clause 2.2). The reverberation time must not exceed 0.7 s in an empty classroom or conference hall under 350 m³, 0.5 s with the fixed seating installed, or 0.9 s in empty restaurants and dining rooms. In common areas sharing doors with protected rooms, the equivalent sound absorption area must be at least 0.2 m² per cubic metre of volume.

import numpy as np
from phonometry import building
facade = building.db_hr_facade_requirement(65.0, "residential", "bedrooms")
facade.limit # 32 dBA (Table 2.1)
airborne = building.db_hr_airborne_requirement("protected", "other_unit")
[(r.quantity, r.limit) for r in airborne] # [("DnT,A", 50.0)]
building.db_hr_impact_requirement("protected", "other_unit").limit # 65 dB
building.db_hr_party_wall_requirement().limit # 40 dBA per leaf
building.db_hr_party_wall_requirement("DnT,A").limit # 50 dBA both together
building.db_hr_reverberation_requirement("classroom").limit # 0.7 s
# The between-rooms requirement is stated in DnT,A, so the party-wall R' of the
# field report cannot be checked against it as it stands. Re-reference it first:
# a receiving room of V = 50 m3 with T = 0.5 s behind a partition of S = 12 m2
# has A = 0.16 V / T = 16 m2, and DnT = R' + 10 lg(A/S) + 10 lg(T/T0).
d_nt = np.asarray(r_prime) + 10 * np.log10(16.0 / 12.0) + 10 * np.log10(0.5 / 0.5)
building.dnt_a(d_nt).intermediate # 52.7 dBA (R'A was 51.4 dBA)
check = building.assess_db_hr([(33.0, facade), (52.7, airborne[0])])
check.complies # True

The quantity has to match the requirement. DB-HR states the between-rooms limit in , and and normalise the same level difference by different things — by the partition area and the receiving-room absorption, by the reverberation time — so an from a field report has to be converted through the room’s and the partition area before it means anything against the 50 dBA. Only the tabiquería requirement ( dBA) is stated in the family. Earlier revisions of this page checked the party wall’s dBA straight against the requirement: the verdict happened to come out the same here, but the comparison was between two different quantities and nothing guarantees the agreement in general.

check_db_hr_requirement() rounds the achieved value the way DB-HR asks before 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.

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 Elementos Constructivos of the building code corrects the catalogue value of and by total window area: 0 dB up to 2.7 m², dB between 2.7 and 3.6 m², dB between 3.6 and 4.6 m² and dB above 4.6 m². A 4 m² sliding window with 4-6-4 glazing, catalogued at dBA, ends up at 24 dBA (Ejemplo 7.4).

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. 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:

from phonometry import building
from phonometry.building.prediction.aperture_transmission import composite_transmission_loss
building.window_size_correction(4.0) # -2 dB: 26 dBA catalogued -> 24 dBA
composite_transmission_loss([6.0, 2.0], [40.0, 26.0]) # 31.53 dBA
composite_transmission_loss([6.0, 2.0], [50.0, 26.0]) # 31.97 dBA: +10 dBA on the blind part
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 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.

Overall facade RA against the window RA from 20 to 55 dBA for three blind-part values of 40, 50 and 60 dBA, on the Ejemplo 7.5 geometry of a 6 square metre blind part and a 2 square metre window, with the three printed cases marked and each curve saturating at its own blind-part asymptoteOverall facade RA against the window RA from 20 to 55 dBA for three blind-part values of 40, 50 and 60 dBA, on the Ejemplo 7.5 geometry of a 6 square metre blind part and a 2 square metre window, with the three printed cases marked and each curve saturating at its own blind-part asymptote

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
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()
  • 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 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.

  • Not covered

    The design options of clause 3 (the simplified option with its solution tables, and the general option, which is the EN 12354 prediction) are not implemented here: the calculation route of the general option lives in Predicting Sound Insulation (EN 12354). The execution conditions of clause 5 and the maintenance conditions of clause 6 are out of scope as well.

How does the DB-HR index RA differ from the Rw of ISO 717-1?

Section titled “How does the DB-HR index RA differ from the Rw of ISO 717-1?”

The of ISO 717-1 comes from shifting a reference curve over sixteen one-third-octave bands (100 Hz to 3150 Hz). The of DB-HR comes from weighting the band sound reduction index with a normalised pink-noise spectrum and summing energetically over eighteen bands (100 Hz to 5 kHz). DB-HR accepts the equivalence , but that is the enlarged-range term , not the core-range one.

  • Avilés López, R., & Perera Martín, R. (2017). Manual de acústica ambiental y arquitectónica. Paraninfo. 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.
  • Ministerio de Fomento (Spain). (2019). Código Técnico de la Edificación, Documento Básico HR Protección frente al ruido (CTE DB-HR). 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).
  • Ministerio de la Presidencia (Spain). (2007). Real Decreto 1367/2007, developing Ley 37/2003 del Ruido on acoustic zoning, quality objectives and acoustic emissions (RD 1367/2007 (BOE-A-2007-18397), consolidated text). The site's day noise index Ld that Table 2.1 of DB-HR is read against comes from the acoustic zoning and the noise maps regulated here.