<!-- canonical: https://docs.jmrp.io/phonometry/materials/reading-a-datasheet/ -->
Source: https://docs.jmrp.io/phonometry/materials/reading-a-datasheet/

# Reading a material datasheet

A data sheet prints fewer numbers than a book and means more by each of
them. The same "0,90 at 1 kHz" can be a laboratory's one-third-octave
measurement, a rounded practical coefficient or a level the manufacturer
declares no product falls below, and the sheet does not always say which.
This page is about reading those numbers before you type them: what each
kind is, which row class of the library holds it, and how a
[catalogue of your own](https://docs.jmrp.io/phonometry/io/material-catalogues/) keeps what the
sheet prints without turning it into something it is not.

Nothing here ships with data. The sheets are yours, you type them into a
file of yours, and the library reads the file; a sheet pasted into an issue
or a pull request is never merged.

## Two absorption coefficients that are not the same number

A reverberation-room test (ISO 354) measures the **sound absorption
coefficient** $\alpha_\mathrm{s}$ in one-third octave bands. It is referred
to the area of the specimen, and ISO 354 notes that it can exceed 1.0, for
example because of diffraction effects, so a value above 1 is common and is
not an error. A test report prints it to two decimals, one
value per band, and `ThirdOctaveAbsorptionSpectrum` holds it as printed,
from 50 Hz to 10 kHz.

A European data sheet usually prints something else: the **practical sound
absorption coefficient** $\alpha_\mathrm{p}$ of ISO 11654. Clause 4.1 forms
it for each octave band from the three one-third octaves inside it: their
mean to the second decimal, rounded in steps of 0.05, and set to 1.00 when
it rounds above. Six values from 125 Hz to 4 kHz that all end in 0 or 5
look like practical coefficients, but only a sheet that names them says so;
when it does not, the row's `note` is the place to write what you concluded.
`PracticalAbsorptionSpectrum` holds them. The
Sabine coefficients of a book's table are neither; `AbsorptionSpectrum` holds
those.

A test report's table goes straight into the first class, and
`practical()` turns it into the second, marking every octave as derived:

```python
from phonometry import io, materials

bands = (100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250,
         1600, 2000, 2500, 3150, 4000, 5000)
alpha_s = (0.12, 0.15, 0.17, 0.21, 0.31, 0.51, 0.54, 0.80, 0.93, 1.05, 1.10,
           1.19, 1.20, 1.13, 1.02, 0.99, 0.94, 0.81)
row = {"key": "e200", "name": "Panel 40", "mounting": "E-200",
       "construction_depth_mm": 200}
row |= {f"absorption_coefficient_{b}": a for b, a in zip(bands, alpha_s, strict=True)}
report = {
    "schema": "phonometry-catalogue",
    "schema_version": 1,
    "catalogue": "panel-40-report",
    "row_type": "ThirdOctaveAbsorptionSpectrum",
    "about": "The one-third-octave table of the laboratory report on Panel 40.",
    "provenance": {
        "kind": "test_report",
        "document": "Sound absorption test report 26-015",
        "publisher": "Example Lab",
        "version": None,
        "consulted": "2026-09-25",
        "laboratory": "Example Lab",
        "report": "26-015",
        "test_standard": "ISO 354:2003",
    },
    "basis": "measured",
    "rows": [row],
}
panel = io.parse_catalogue(
    report, row_type=materials.ThirdOctaveAbsorptionSpectrum
)["panel-40-report/e200"]

print(panel.absorption_coefficient(1250))   # 1.19, above 1 and kept
practical = panel.practical()
print(practical.spectrum())
# {125: 0.15, 250: 0.35, 500: 0.75, 1000: 1.0, 2000: 1.0, 4000: 0.9}
print(practical.derived["practical_absorption_coefficient_1000"])
# from the one-third-octave coefficients at 800, 1000 and 1250 Hz, averaged,
# rounded in steps of 0.05 and capped at 1.00 (ISO 11654 Clause 4.1)
rating = panel.rating()
print(rating.rating_label, rating.absorption_class)   # 0.65(MH) C
```

The 1 kHz octave is 1.10 before the cap and 1.00 after it; the report's
1.19 stays 1.19. An octave whose three one-third octaves the report does
not all print is left empty, and `why_missing` says it does not follow from
the cells the row has: nothing is borrowed from a neighbouring band. A
negative coefficient, which a measurement can give in a band where the
specimen adds almost nothing to the room's absorption, is not read as 0
either: its octave is left empty with the band and the value in
`why_missing`, and `rating()` refuses it, naming the band.

<picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/datasheet_absorption_rating_dark.svg"><img src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/datasheet_absorption_rating.svg" alt="ISO 11654 rating of a test report's one-third-octave absorption: the practical coefficients of the five rating octaves above the reference curve shifted to 0.65, with one unfavourable deviation of 0.10 at 250 Hz" width="80%"></picture>

*`AbsorptionRatingResult.plot()` of the report's row: the practical
coefficients of the five rating octaves, and the reference curve of
ISO 11654 shifted down until the unfavourable deviations add up to no more
than 0.10. Here they are 0.10, all of it at 250 Hz, so the curve stops at
$\alpha_\mathrm{w}$ = 0.65. The coefficients stand 0.35 above it at 1, 2 and
4 kHz, past the 0.25 of Clause 4.3, which is what the indicators M and H
say.*

<details>
<summary>Show the code for this figure</summary>

```python
import matplotlib.pyplot as plt
from phonometry import materials

bands = (100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250,
         1600, 2000, 2500, 3150, 4000, 5000)
alpha_s = (0.12, 0.15, 0.17, 0.21, 0.31, 0.51, 0.54, 0.80, 0.93, 1.05, 1.10,
           1.19, 1.20, 1.13, 1.02, 0.99, 0.94, 0.81)
panel = materials.ThirdOctaveAbsorptionSpectrum(
    name="Panel 40",
    source="Sound absorption test report 26-015",
    **{f"absorption_coefficient_{b}": a for b, a in zip(bands, alpha_s, strict=True)},
)
panel.rating().plot()
plt.show()
```

</details>

### The grid, the cap and the 125 Hz band

Because $\alpha_\mathrm{p}$ is rounded in steps of 0.05 and capped at 1.00, a
practical coefficient printed as 0.83 or as 1.05 is not one ISO 11654 can
give. Such a value is kept as the sheet prints it, and reading the file adds
a note. The weighted coefficient $\alpha_\mathrm{w}$ is on the same grid, and
Clause 5 asks for every coefficient to two decimals, with the shape
indicators in parentheses after $\alpha_\mathrm{w}$: "0,70(MH)". Write the
letters alone in `shape_indicator`.

The 125 Hz octave is defined like the others (Clause 4.1 forms
$\alpha_\mathrm{p}$ for each octave band, and Clause 5.2 plots it from
125 Hz) and is not rated: the reference curve starts at 250 Hz, and Clause 1
says the rating is not appropriate below it. `PracticalAbsorptionSpectrum`
holds it, and `rating()` never reads it.

### From a spreadsheet

A data sheet's octave table is a spreadsheet's job. Its header declares the
dialect and the provenance, and the CSV beside it holds the rows as the
sheet prints them: a mounting, a depth, a word where a number would be, and
an `x-` column for the sheet's own edge code.

```python
import json
import pathlib
import warnings

from phonometry import io, materials

header = {
    "schema": "phonometry-catalogue",
    "schema_version": 1,
    "catalogue": "panel-40-alpha",
    "row_type": "PracticalAbsorptionSpectrum",
    "about": "The practical coefficients Panel 40's data sheet prints on its page 2.",
    "provenance": {
        "kind": "datasheet",
        "document": "Panel 40 technical data sheet",
        "publisher": "Example Acoustics Ltd",
        "version": "Rev. 4",
        "consulted": "2026-09-25",
        "laboratory": "Example Lab",
        "report": "26-015",
    },
    "basis": "measured",
    "csv": {"delimiter": ";", "decimal": ","},
}
pathlib.Path("panel-40-alpha.csv.phonometry.json").write_text(
    json.dumps(header, indent=2), encoding="utf-8"
)
pathlib.Path("panel-40-alpha.csv").write_text(
    "key;name;mounting;construction_depth_mm;"
    "practical_absorption_coefficient_125;practical_absorption_coefficient_250;"
    "practical_absorption_coefficient_500;practical_absorption_coefficient_1000;"
    "practical_absorption_coefficient_2000;practical_absorption_coefficient_4000;"
    "weighted_absorption_coefficient;shape_indicator;absorption_class;x-edge\n"
    "e200;Panel 40;E-200;200;0,40;0,70;0,95;1,00;0,95;0,90;0,95;;A;A24\n"
    "a;Panel 40;A;;[n.m.];0,25;0,70;1,05;1,00;0,95;0,60;MH;C;A24\n",
    encoding="utf-8",
)
with warnings.catch_warnings():
    warnings.simplefilter("ignore", io.CatalogueWarning)
    sheet = io.read_catalogue(
        "panel-40-alpha.csv", row_type=materials.PracticalAbsorptionSpectrum
    )
for note in sheet.notes:
    print(note)
# panel-40-alpha.csv, line 3, row 'a': the practical coefficient at 1000 Hz
#   is printed as 1.05, above the 1.00 it is capped at (ISO 11654 Clause 4.1)
# panel-40-alpha.csv, line 3, row 'a': the weighted coefficient is printed as
#   0.60 and the bands give 0.55 (ISO 11654 Clause 4.2); the printed value is
#   kept as printed
# panel-40-alpha.csv, line 3, row 'a': the absorption class is printed as 'C'
#   and the bands give 'D' (ISO 11654 Annex B); the printed one is kept as
#   printed
mounted = sheet["panel-40-alpha/a"]
print(mounted.practical_absorption_coefficient_1000)   # 1.05
print(mounted.rating().rating_label)                   # 0.55(MH)
print(sheet["panel-40-alpha/e200"].rating().rating_label)   # 0.95
print(mounted.why_missing("practical_absorption_coefficient_125"))
# the datasheet prints “n.m.” where the number would be
```

The first row prints a rating its bands give, so it has no note. The second
has three: a coefficient above the cap, and a weighted coefficient and a
class its own bands do not give. The notes are made once, when the file is
read, and change nothing: the row keeps 1.05, 0.60 and C as printed, and
`rating()` answers with what the bands give, without warning again. Whether
the sheet or its table is the one in error is for you to find out.

## A declared level is not a measurement

A product under CE marking declares its performance under a product
standard, and a declaration is a level, not a result. EN 13162, for mineral
wool, declares the practical and the weighted coefficients in levels of
0.05 that no test result falls below (clause 4.3.11), the airflow
resistivity in levels of 1 kPa·s/m² that no result falls below (4.3.12), and
the dynamic stiffness in levels of 1 MN/m³ that no result exceeds (4.3.9),
and its clause 6 codes them as APi, AWi, AFri and SDi. So "AFr5" is a lower
bound of 5 kPa·s/m², "SD9" an upper bound of 9 MN/m³, and a sheet that
prints "s′ ≤ 9 MN/m³" is printing the second.

Write a bound as a bound: `ranges` with `bounded_below` or `bounded_above`
in JSON, or `>=5` and `<=9` in a CSV cell, and the value stays empty. Give
the row, or the cell, `basis` `"declared"`. A model that needs the number is
then refused, and the refusal says what the sheet printed; nothing turns a
bound into a value. The
[catalogues guide](https://docs.jmrp.io/phonometry/io/material-catalogues/) walks through a
declared airflow resistivity and a declared dynamic stiffness.

## Measured, declared, calculated, estimated

`basis` says what the document claims a value is: `measured`, `declared`,
`calculated` (by the document, with a standard's model or a program),
`estimated` or `extended` (a laboratory's extended application of a
result). Some catalogues mark their values with a legend of this kind, by
colour or by symbol; others say nothing, and then a row with no `basis` is
the honest answer. A value the document marks as calculated is not a
measurement even when it sits in the same column as one, and the library
never promotes it.

## Mounting and depth of construction

An absorber over an air space absorbs differently from the same absorber
against the wall, and the sheet's mounting says which. ISO 354 Annex B names
them: type A is the specimen laid against a room surface; type E is the
specimen over an air space, and its number is the distance in millimetres
from the specimen's exposed face to the surface behind it, so E-200 is
200 mm. Write it in `mounting` as the sheet prints it; an empty mounting
means the sheet prints none, which is not type A.

ISO 11654 Clause 5.4 asks for the depth of construction of a product
mounted over an air space: from the room surface to the absorber's exposed
face, the absorber included. `construction_depth_mm` holds it, and some
sheets call it the total construction height. It is not the cavity behind
the absorber, which is shorter by the absorber's thickness.

## The revision and the day you read it

A data sheet is revised under the same title, and not always with a note of
what changed: one elastomer's static modulus is printed as 0.19 N/mm² on one
revision and 0.13 N/mm² on the next, with the test standard changed beside
it. A project needs the revision it was specified against. Write the
revision the sheet prints in `version`, or `None` when it prints none, and
the day you read it in `consulted`; the row's source cites both.

## Decimal commas and a corrupt text layer

A sheet printed in Spanish, German or French writes 0,85, and a JSON number
never does: in JSON write 0.85, and a text "0,85" is refused rather than
guessed. A CSV file declares its decimal mark in the header; with a comma,
its delimiter is a semicolon or a tab.

Type the numbers from the page as you see it. A PDF's text layer can carry
substituted glyphs, so text copied out of it reads as nonsense or, worse,
as a different figure. A cell that is not a number in a CSV file is refused
at its line and column, and a text the page prints where the number would
be (n.m., a class code) goes between brackets, `[n.m.]`, never as a bare
word.

## Sound insulation: R and ΔLw

A laboratory report of a wall or a door prints the sound reduction index
$R$ of ISO 10140-2 in one-third octaves and rates it with ISO 717-1:
$R_\mathrm{w}(C; C_\mathrm{tr})$, and with the enlarged ranges of Annex B
when the report measured from 50 Hz. `SoundReductionSpectrum` holds the
bands and the numbers as printed, and `rating()` works them out again. It
is not the transmission loss a book compiles, which
`TransmissionLossSpectrum` holds.

```python
from phonometry import building, io

bands = (50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000,
         1250, 1600, 2000, 2500, 3150, 4000, 5000)
r_db = (18.7, 19.2, 20.0, 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, 26.8, 29.2)
wall = {
    "key": "partition",
    "name": "Glazed partition",
    "construction": "single 4 mm glass pane",
    "weighted_sound_reduction_index_db": 30,
    "spectrum_adaptation_term_db": -2,
    "traffic_spectrum_adaptation_term_db": -3,
    "spectrum_adaptation_term_50_5000_db": -2,
    "traffic_spectrum_adaptation_term_50_5000_db": -4,
}
wall |= {f"sound_reduction_index_{b}_db": r for b, r in zip(bands, r_db, strict=True)}
provenance = {
    "kind": "test_report",
    "document": "Airborne sound insulation test report 26-021",
    "version": None,
    "consulted": "2026-09-25",
    "laboratory": "Example Lab",
    "report": "26-021",
    "test_standard": "ISO 10140-2:2010",
}
tested = io.parse_catalogue(
    {
        "schema": "phonometry-catalogue",
        "schema_version": 1,
        "catalogue": "lab-walls",
        "row_type": "SoundReductionSpectrum",
        "about": "Walls rated in the laboratory, from their test reports.",
        "provenance": provenance,
        "basis": "measured",
        "rows": [wall],
    },
    row_type=building.SoundReductionSpectrum,
)
rated = tested["lab-walls/partition"].rating()
print(rated.rating, rated.c, rated.ctr, rated.c_50_5000, rated.ctr_50_5000)
# 30 -2 -3 -2 -4
print(tested.notes)   # () : the printed numbers are the ones the bands give
```

The partition's printed numbers are the ones its bands give, so there is no
note.

<picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/datasheet_sound_reduction_rating_dark.svg"><img src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/datasheet_sound_reduction_rating.svg" alt="ISO 717-1 rating of a laboratory sound reduction index from 50 Hz to 5 kHz: the reference curve shifted to Rw = 30 dB over 100 Hz to 3.15 kHz, the unfavourable deviations shaded, and the enlarged range of Annex B greyed with its six adaptation terms in the title" width="80%"></picture>

*`ExtendedWeightedRatingResult.plot()` of the partition's row: the
reference curve of ISO 717-1 shifted over the sixteen bands from 100 Hz to
3.15 kHz until it rates the partition at $R_\mathrm{w}$ = 30 dB, the
unfavourable deviations shaded, and the bands of the enlarged range of
Annex B greyed, with their six terms in the title. The deepest deviation is
the dip at 3.15 kHz, where the pane's coincidence is.*

<details>
<summary>Show the code for this figure</summary>

```python
import matplotlib.pyplot as plt
from phonometry import building

bands = (50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000,
         1250, 1600, 2000, 2500, 3150, 4000, 5000)
r_db = (18.7, 19.2, 20.0, 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, 26.8, 29.2)
partition = building.SoundReductionSpectrum(
    name="Glazed partition",
    source="Airborne sound insulation test report 26-021",
    **{f"sound_reduction_index_{b}_db": r for b, r in zip(bands, r_db, strict=True)},
)
partition.rating().plot()
plt.show()
```

</details>

A floating floor's or a covering's sheet prints the weighted reduction of
impact sound pressure level $\Delta L_\mathrm{w}$ of ISO 717-2, often with
$C_\mathrm{I,r}$ beside it. A laboratory report prints per band the
reduction of impact sound pressure level $\Delta L$ of ISO 10140-1 Annex H:
the normalized impact level of a reference floor without the covering less
the one with it (Equation (H.1)), both measured by ISO 10140-3.
`ImpactImprovementSpectrum` holds them, and `rating()` works out
$\Delta L_\mathrm{w}$, $C_{\mathrm{I},\Delta}$ and
$C_\mathrm{I,r} = -11 - C_{\mathrm{I},\Delta}$ dB (Clause A.2.2).

```python
from phonometry import building, io

bands = (100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600,
         2000, 2500, 3150)
delta_l_db = (3.0, 3.7, 1.9, 3.0, 3.2, 3.5, 4.0, 6.1, 6.7, 7.0, 7.7, 10.8,
              15.2, 20.3, 25.4, 23.2)
covering = {
    "key": "covering",
    "name": "Floor covering",
    "weighted_impact_improvement_db": 15,
    "reference_floor_adaptation_term_db": -2,
}
covering |= {f"impact_improvement_{b}_db": d for b, d in zip(bands, delta_l_db, strict=True)}
coverings = io.parse_catalogue(
    {
        "schema": "phonometry-catalogue",
        "schema_version": 1,
        "catalogue": "lab-coverings",
        "row_type": "ImpactImprovementSpectrum",
        "about": "Floor coverings rated in the laboratory, from their test reports.",
        "provenance": {
            "kind": "test_report",
            "document": "Impact sound insulation test report 26-022",
            "version": None,
            "consulted": "2026-09-25",
            "laboratory": "Example Lab",
            "report": "26-022",
            "test_standard": "ISO 10140-1:2010 Annex H",
        },
        "basis": "measured",
        "rows": [covering],
    },
    row_type=building.ImpactImprovementSpectrum,
)
rated = coverings["lab-coverings/covering"].rating()
print(rated.delta_lw, rated.ci_delta, rated.ci_r)   # 15 -9 -2
print(coverings.notes)   # ()
```

<picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/datasheet_impact_improvement_rating_dark.svg"><img src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/datasheet_impact_improvement_rating.svg" alt="ISO 717-2 rating of a floor covering's reduction of impact sound pressure level per one-third octave from 100 Hz to 3.15 kHz, with ΔLw = 15 dB, CI,Δ = −9 dB and CI,r = −2 dB in the title" width="80%"></picture>

*`ImpactImprovementRatingResult.plot()` of the covering's row: the
$\Delta L$ the report prints per band, rated in the title. The covering
takes 20 dB and more off the impact level from 2 kHz up and only 2 to 4 dB
up to 400 Hz, and $C_{\mathrm{I},\Delta}$ = −9 dB says so: the single
number on the unweighted linear level,
$\Delta L_\mathrm{lin} = \Delta L_\mathrm{w} + C_{\mathrm{I},\Delta}$
(ISO 717-2 Formula (A.5)), is 6 dB, not 15. A floating floor whose
mass-spring resonance makes $\Delta L$ negative in its lowest bands keeps
those bands in view.*

<details>
<summary>Show the code for this figure</summary>

```python
import matplotlib.pyplot as plt
from phonometry import building

bands = (100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600,
         2000, 2500, 3150)
delta_l_db = (3.0, 3.7, 1.9, 3.0, 3.2, 3.5, 4.0, 6.1, 6.7, 7.0, 7.7, 10.8,
              15.2, 20.3, 25.4, 23.2)
covering = building.ImpactImprovementSpectrum(
    name="Floor covering",
    source="Impact sound insulation test report 26-022",
    **{f"impact_improvement_{b}_db": d for b, d in zip(bands, delta_l_db, strict=True)},
)
covering.rating().plot()
plt.show()
```

</details>

A sheet that declares $\Delta L_\mathrm{w}$ rather than printing the bands
is written as the bound it is:

```python
from phonometry import building, io

sheet = io.parse_catalogue(
    {
        "schema": "phonometry-catalogue",
        "schema_version": 1,
        "catalogue": "floor-mats",
        "row_type": "ImpactImprovementSpectrum",
        "about": "Floating-floor mats as their data sheets declare them.",
        "provenance": {
            "kind": "datasheet",
            "document": "Floor mat 33 data sheet",
            "publisher": "Example Acoustics Ltd",
            "version": "04-2026",
            "consulted": "2026-09-25",
        },
        "basis": "declared",
        "rows": [
            {
                "key": "mat-33",
                "name": "Floor mat 33 under a 50 mm screed",
                "ranges": {"weighted_impact_improvement_db": [26, None]},
                "bounded_below": ["weighted_impact_improvement_db"],
            }
        ],
    },
    row_type=building.ImpactImprovementSpectrum,
)
mat = sheet["floor-mats/mat-33"]
try:
    building.predicted_impact_insulation(
        ln_w_eq=78.0,
        delta_l_w=mat.printed(
            "weighted_impact_improvement_db", wanted_by="EN 12354-2 Formula 21"
        ),
    )
except ValueError as error:
    print(error)
# 'Floor mat 33 under a 50 mm screed' has no weighted_impact_improvement_db,
# which 'EN 12354-2 Formula 21' needs: the datasheet prints a lower bound of
# 26 and no value (...)
```

The mat's sheet declares its improvement as at least 26 dB, which is not a
value the prediction can take, and the refusal says so. A rating a
sheet prints and no function of this library works out (an STC, an IIC, a
flanking level difference) has no field of its own; write it in the row's
`note`.

## What never happens

- No printed coefficient is rounded, clipped or moved to the grid, and no
  rating printed on the sheet is replaced by the one its bands give; the
  practical coefficients `practical()` works out are rounded as Clause 4.1
  says, and marked as derived.
- No octave is formed from one-third octaves the row does not print or from
  a negative one, no negative coefficient is read as 0, and no band is
  filled from its neighbours.
- No bound becomes a value, and no declared level is read as a
  measurement.
- No note changes a cell: a note is read once, beside the catalogue.

## What this guide covers

**Covered.** Reading a data sheet's practical absorption coefficients
(`materials.PracticalAbsorptionSpectrum`), a test report's one-third-octave
coefficients (`materials.ThirdOctaveAbsorptionSpectrum`) with the practical
coefficients they give, a laboratory sound reduction index
(`building.SoundReductionSpectrum`) and a reduction of impact sound pressure
level (`building.ImpactImprovementSpectrum`), each rated again from its bands
with `rating()`, whose result draws itself with `plot()`; the notes a reader keeps for a value off the ISO 11654 grid
or above its cap and for a printed rating the bands do not give; and how to
write a declared level, a mounting, a revision and a word printed where a
number would be.

**Not covered.** The noise reduction coefficient, the sound absorption average, the STC, the
IIC and any other rating no function of this library works out are held as
printed or in a note and never checked. No sheet is read from a PDF: the
numbers are typed from the page. No manufacturer's data ships with the
library, and a sheet pasted into an issue or a pull request is never merged.

## See also

- [Your own catalogues](https://docs.jmrp.io/phonometry/io/material-catalogues/): the file, its provenance, the CSV front end and every refusal.
- [Sound Absorption Measurement and Rating](https://docs.jmrp.io/phonometry/materials/absorbers/absorption-measurement/): ISO 354 and the rating of ISO 11654 in full.
- [Dynamic stiffness of resilient materials](https://docs.jmrp.io/phonometry/materials/resilient/dynamic-stiffness/): $s'$ and $s'_\mathrm{t}$, which a floating floor's sheet declares.
- API reference: [`materials.absorbers.datasheets`](https://docs.jmrp.io/phonometry/reference/api/materials/datasheets/), [`building.datasheets`](https://docs.jmrp.io/phonometry/reference/api/building/datasheets/).

## References

- International Organization for Standardization. (1997). *Acoustics — Sound absorbers for use in buildings — Rating of sound absorption* (ISO 11654:1997).
  [iso.org catalogue](https://www.iso.org/standard/19583.html).
  The practical coefficient of Clause 4.1, the mean of three one-third octaves rounded in steps of 0.05 and set to 1.00 above it; the weighted coefficient and its shape indicators of Clauses 4.2 and 4.3; Clause 1, which starts the rating at 250 Hz; Clause 5, which gives every coefficient to two decimals and asks for the depth of construction. Read from BS EN ISO 11654:1997.
- International Organization for Standardization. (2003). *Acoustics — Measurement of sound absorption in a reverberation room* (ISO 354:2003).
  [iso.org catalogue](https://www.iso.org/standard/34545.html).
  The one-third-octave sound absorption coefficient a test report prints, which 3.9 NOTE 2 says can exceed 1.0 because of diffraction effects, and the mountings of Annex B: type A against a room surface, type E over an air space whose number is the distance in millimetres from the specimen's face to the surface behind it.
- European Committee for Standardization. (2015). *Thermal insulation products for buildings — Factory made mineral wool (MW) products — Specification* (EN 13162:2012+A1:2015).
  A product standard under CE marking and what its declarations mean: clause 4.3.9 declares the dynamic stiffness in levels no test result exceeds, 4.3.11 the practical and weighted coefficients in levels no result falls below, 4.3.12 the airflow resistivity likewise, and clause 6 codes them as SDi, APi, AWi and AFri. Read from BS EN 13162:2012+A1:2015.
- International Organization for Standardization. (2010). *Acoustics — Laboratory measurement of sound insulation of building elements — Part 2: Measurement of airborne sound insulation* (ISO 10140-2:2010).
  [iso.org catalogue](https://www.iso.org/standard/42088.html).
  The laboratory sound reduction index R of a wall or a door, one-third octave by one-third octave, which a test report prints and SoundReductionSpectrum holds.
- International Organization for Standardization. (2010). *Acoustics — Laboratory measurement of sound insulation of building elements — Part 1: Application rules for specific products* (ISO 10140-1:2010).
  Annex H, Equation (H.1): the reduction of impact sound pressure level ΔL = Ln0 − Ln of a floor covering on a reference floor, the difference between the normalized impact levels without and with it, which ImpactImprovementSpectrum holds. Read from BS EN ISO 10140-1:2010+A2:2014.
- International Organization for Standardization. (2010). *Acoustics — Laboratory measurement of sound insulation of building elements — Part 3: Measurement of impact sound insulation* (ISO 10140-3:2010).
  [iso.org catalogue](https://www.iso.org/standard/42089.html).
  The measurement of the normalized impact sound pressure levels, with the covering and without it, from which Annex H of ISO 10140-1 forms ΔL.
- International Organization for Standardization. (2020). *Acoustics — Rating of sound insulation in buildings and of building elements — Part 1: Airborne sound insulation* (ISO 717-1:2020).
  [iso.org catalogue](https://www.iso.org/standard/77435.html).
  Rw with C and Ctr, and the adaptation terms of the enlarged frequency ranges of Annex B, which a report prints beside R.
- International Organization for Standardization. (2020). *Acoustics — Rating of sound insulation in buildings and of building elements — Part 2: Impact sound insulation* (ISO 717-2:2020).
  [iso.org catalogue](https://www.iso.org/standard/69867.html).
  The weighted reduction of impact sound pressure level against the reference floor of Table 4, and Clause A.2.2 with CI,Δ = CI,r,0 − CI,r, CI,r,0 = −11 dB (Formula (A.4)).
