Skip to content

Orthotropic panel insulation and the limp-frame equivalent fluid - #438

Merged
jmrplens merged 1 commit into
mainfrom
orthotropic-and-limp-frame
Jul 30, 2026
Merged

Orthotropic panel insulation and the limp-frame equivalent fluid#438
jmrplens merged 1 commit into
mainfrom
orthotropic-and-limp-frame

Conversation

@jmrplens

@jmrplens jmrplens commented Jul 30, 2026

Copy link
Copy Markdown
Owner

Two physics additions from the books, both closing a hole in models that were
isotropic-only or rigid-frame-only.

Orthotropic (ribbed and corrugated) panels

building/panel_transmission.py, from Vigran, Building Acoustics, Sections
3.7.3.3 and 6.5.3, cross-read against Bies, Hansen & Howard 5e Section 7.2.4.5
(whose Eqs 7.30, 7.31 and 7.38 are an independent transcription of Vigran's
Eqs 6.108, 6.109 and 6.111, which is how I checked mine).

Cladding that is stiff along the corrugations and limp across them has no single
coincidence frequency but a whole range. orthotropic_critical_frequencies
returns the pair (fc1, fc2) from the two principal bending stiffnesses
(Eq. 6.107), and orthotropic_transmission_loss predicts the flattened R(f)
over it by either published route:

  • method="integral" averages the azimuth-dependent transmission coefficient
    of Heckl (1960) and Hansen (1993) over the diffuse field numerically. It is
    the only route that responds to the loss factor. Near-grazing angles are
    excluded either by the size-dependent limiting angle of Bies Eq. 7.36 (pass
    area) or by a fixed one (78 degrees by default, Sharp's value, which is
    Vigran's sin^2 phi = 0.96).
  • method="heckl" is Heckl's closed form for eta = 0, the design chart of
    Bies Fig. 7.9(b): field-incidence mass law below fc1/2, Eq. 7.59 across the
    coincidence range, Eq. 7.60 above 2 fc2, straight lines in log10 f across
    the two gaps. It needs no loss factor and no numerical work, but it requires
    fc2 > 4 fc1 for its four construction points to stay ordered, and it raises
    a ValueError pointing at method="integral" when they would not.

SoundReductionResult gains critical_frequency_upper and .plot() shades the
coincidence range, so the orthotropic path composes with the existing Sharp
physical model and with the plateau estimate on one axes and through the same
ISO 717-1 rating. For the sinusoidal profile, corrugated_plate_stiffness gives
the Timoshenko and Woinowsky-Krieger equivalent stiffnesses (Eq. 3.115, whose
Bxz is the pure twisting term, with no Bx nu_z contribution, unlike the
general Eq. 3.114) and corrugated_plate_mass_factor the developed-length
increase in surface density that has to accompany them.
orthotropic_plate_resonance is the eigenfrequency of a simply supported
orthotropic plate (Eq. 3.113 = Bies Eq. 7.27, after Hearmon 1959), whose lowest
mode bounds the validity of both transmission models.

Limp-frame equivalent fluid

limp_frame, decoupling_frequency and limp_frame_applicable in
materials/porous_absorber.py, from Allard & Atalla, Propagation of Sound in
Porous Media
2e Section 11.3.4, Eqs 11.53 to 11.55, after Panneton (2007).

Delany-Bazley, Miki and Johnson-Champoux-Allard all assume a motionless frame,
which only holds above the Zwikker-Kosten decoupling frequency
Fd = sigma phi^2 / (2 pi rho1). Below it a light frame (felts, screens,
aeronautic-grade fibreglass) is dragged along by the pore fluid and its inertia
has to be carried by the equivalent fluid. limp_frame corrects the effective
density of any rigid-frame PorousMediumResult, keeps its bulk modulus, and
returns another PorousMediumResult, so it drops straight into a PorousLayer
of the transfer-matrix stack. limp_frame_applicable and LIMP_FRAME_CRITERIA
carry the published rules of thumb for when a frame may be treated as limp at
all (Beranek's |Kc/Kf| < 0.05, the 0.2 to which Doutres et al. 2007 relaxed
it, and the "bulk modulus lower than 20 kPa" that the latter becomes for air).

Oracles: what is digit-pinned and what is not

The orthotropic side is digit-anchored.

  • Vigran's own worked example, printed p. 96: a 1 mm steel plate 1 m by 1 m
    gives f(1,1) = 4.9 Hz and f(2,2) = 19.7 Hz flat, and f(1,1) = 25.5 Hz
    and f(2,2) = 102 Hz once corrugated 20 mm deep at a 100 mm pitch. Four
    published values, and the corrugated pair only comes out with the
    developed-length surface density the same paragraph warns about; with the flat
    7.8 kg/m2 the same formulas return 26.7 Hz and 106.7 Hz. That is what pins the
    mass factor.
  • The printed design-chart constants of Bies Fig. 7.9(b) and Eqs 7.59/7.60:
    -54 dB at point A, -13.2 dB across the coincidence branch, -17 dB at point D
    and -23 dB on the recovery branch, all stated for rho c = 414. Each is
    recovered by subtracting the leading terms from the computed TL.
  • The 25 h.fc rows of Hopkins Table A2 (printed p. 608), added to
    tests/reference_data.py as the shared source for both the test and the
    conformance report: a multi-row check on the isotropic coincidence frequency
    the orthotropic pair generalises.
  • Two exact identities: below fc1 the double integral collapses to
    tau = ln((1+q^2)/(1+q^2(1-u)))/q^2, which it reproduces to 1e-6 dB; and as
    fc2 -> fc1 the orthotropic impedance becomes Cremer's isotropic one, checked
    against an independently evaluated single integral.

The limp-frame side is transcription-anchored, not digit-oracled, and it is
worth being exact about what that means.
Allard & Atalla publishes exactly one
table of computed numbers in the whole book (Table 10.2, Rayleigh waves in a
frame in vacuum), and it is not a surface impedance: every
prediction-versus-measurement pair in the porous chapters, Fig. 11.2 included,
is a figure. No other source checked (Cox & D'Antonio, Mechel, Atalla & Sgard,
the round-robin and Biot literature) tabulates a limp effective density, surface
impedance or absorption coefficient for a fully specified material.

What pins the model is the printed Eq. 11.55 itself, restated term by term
in test_limp_effective_density_matches_the_printed_closed_form independently
of the implementation, and behind that test a human reading of the printed page.
The two limits the book states in prose are verified as well, but they are
weaker than their names suggest and it is better to say so than to let them
carry weight they do not bear: neither constrains the rho0^2 and 2 rho0
terms.
A sign-flipped variant of Eq. 11.55 satisfies the heavy-frame limit,
the omega -> 0 limit and the 1/rho1 scaling of the heavy-frame residual,
whose analytic value is -(rho_eq - rho0)^2 / (rho_t + rho_eq - 2 rho0). They
stay in the suite because they would catch a broken composition or a wrong
rho_t, not because they identify the form.

Ordered by what each check is actually worth:

  • the printed closed form of Eq. 11.55, transcribed in the test: the anchor;
  • the decoupling frequency on the fully specified glass wool of their Table 6.1
    (printed p. 124), where pure arithmetic gives 43.27 Hz: exact, and independent
    of everything above;
  • the printed applicability thresholds 0.05 and 0.2, and the "bulk modulus lower
    than 20 kPa" the second becomes for air;
  • the heavy-frame limit stated in prose on printed p. 253 (as rho1 grows the
    correction vanishes and the rigid-frame result comes back, the residual
    falling as 1/rho1) and the low-frequency limit (the rigid-frame density
    diverges as sigma/(j omega) while the limp one converges on the apparent
    total density rho_t = rho1 + phi rho0): corroboration, not identification,
    for the reason above.

Ten new conformance rows, six under the panel section and four under the porous
one. The limp_frame docstring, the test module docstring, the CHANGELOG entry
and both guide sections all state plainly that the transcription is the anchor
and that the limits corroborate rather than pin it.

Two notes on the source, for whoever reads the equations next. The pdf-to-printed
page offset of Allard & Atalla is not constant: it is +6 in chapter 11 (pdf
259 is printed 253), against +9 in chapter 6 and +7 in chapter 10. And the
paragraph carrying the applicability rules straddles a page break, so the
Beranek 0.05 threshold is on printed p. 253 while the Doutres 0.2 and the
"bulk modulus lower than 20 kPa" it implies for air are on printed p. 254
(pdf 260); the citations now say pp. 253-254 where they cover both.

Figures and docs

Two figures via scripts/generate_graphs.py, in the usual four variants, both
clearing check_figures.py and check_figure_contrast.py:

  • orthotropic_transmission_loss: Vigran's own corrugated geometry against a
    flat sheet of the same material and thickness. Identical within 2 dB below
    fc1, then up to 13 dB worse across the coincidence range, Rw falling from
    28 dB to 25 dB for a panel that is stiffer and 9 % heavier. The caption is
    explicit that the small low-frequency offset is the extra mass plus the
    different limiting-angle conventions of the two schemes, not a model
    discrepancy.
  • limp_frame_effective_density: the Table 11.2 material under both models, the
    view of the book's own Fig. 11.2, with the decoupling frequency and rho_t
    marked. The two curves merging above the decoupling frequency is the figure's
    own check on the correction.

New sections in the panel-insulation and porous-absorber guides, English and
Spanish, both with the double snippet and the caveats the sources attach (below
0.7 fc1 the Heckl branch underestimates R on small panels; real corrugated
cladding shows a 2 kHz to 4 kHz dip caused by resonances of the panel sections
between the ribs, which neither route predicts; only the sinusoidal profile has
equivalent stiffnesses here, trapezoidal cladding needs its own).

Gates

ruff check ., mypy src scripts, bandit -r src (0 issues at every
severity), the full pytest suite (6884 passed, 69 skipped), check_figures.py
(1636 figures), check_figure_contrast.py, check_api_reference.py,
check_conformance_claims.py and regenerated conformance, api-docs, site
reports and llms, all green locally on the rebased head.

Rebased onto main at 9499d9f. The conformance report regenerates to
484/484 checks across 55 domains and 325 standards (main is at 474/55/316;
this branch adds ten checks and nine standards), and the six hand-written count
sites are re-fixed from that regenerated report and re-checked with
scripts/check_conformance_claims.py: .zenodo.json, docs/getting-started.md,
both landing-page meta descriptions and the JSON-LD description of both
conformance pages.

Review follow-ups

Two non-blocking points from the review, both fixed:

  • orthotropic_transmission_loss validated area and limiting_angle only on
    the integral route, so method="heckl", area=-5.0, limiting_angle=170.0 was
    accepted silently while the same call raised on the other route. The three
    ignored-by-one-route arguments (loss_factor, area, limiting_angle) are
    now validated together before the method branch, the docstring says which
    route uses each and that all are validated regardless, and a new
    parametrised test pins identical rejection on both routes.
  • The CHANGELOG quoted the applicability rule as "softer than about 20 kPa".
    The book prints "a bulk modulus lower than 20 kPa"; the quotation is
    corrected there and in docs/api-reference.md, which carried the same
    wording.

Summary by Sourcery

Add orthotropic panel sound insulation modelling and limp-frame equivalent fluid support, with corresponding API, figures, documentation, tests, and conformance checks.

New Features:

  • Introduce orthotropic panel transmission loss prediction, including coincidence range handling and support for both numerical integral and Heckl closed-form methods.
  • Add utilities for corrugated panels: developed-length mass factor, equivalent orthotropic bending stiffnesses, and eigenfrequency calculation for simply supported orthotropic plates.
  • Provide a limp-frame equivalent fluid model that adjusts rigid-frame porous medium results, along with a Zwikker-Kosten decoupling frequency helper and applicability criteria API.

Enhancements:

  • Extend SoundReductionResult to carry an upper coincidence frequency and update plotting to shade orthotropic coincidence ranges.
  • Expose new panel and porous-material functions at the top-level API and include them in the generated API reference.
  • Generate new example figures for orthotropic transmission loss and limp-frame effective density and wire them into the graph generation pipeline and translations.

Documentation:

  • Add English and Spanish guide sections explaining orthotropic panel behaviour and limp-frame porous absorber modelling, including usage examples and caveats.
  • Update reference documentation, API reference, changelog, site index, and conformance pages to cover the new orthotropic and limp-frame functionality and revised conformance totals.

Tests:

  • Add dedicated test suites for orthotropic panel models and limp-frame porous media, including analytical identities, literature examples, and limit-behaviour checks.
  • Expand the numerical conformance report with additional checks for orthotropic panels and limp-frame behaviour, increasing total check and standard counts.

Summary by CodeRabbit

  • New Features
    • Added orthotropic/corrugated panel sound-insulation support with coincidence-frequency ranges, resonance calculations, and both integral and Heckl prediction methods.
    • Added limp-frame modeling for porous absorbers, including decoupling-frequency evaluation and applicability checks.
  • Documentation
    • Expanded English and Spanish guides, API reference entries, worked examples, figure generation, and bibliography updates for the new modeling approaches.
  • Tests
    • Increased conformance coverage to 484/484 passing checks across 325 standards.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @jmrplens, your pull request is larger than the review limit of 150000 diff characters

@bito-code-review

bito-code-review Bot commented Jul 30, 2026

Copy link
Copy Markdown

This pull request exceeds the fair usage size limit for the Bito Code Review Agent trial. Please reduce the PR size or upgrade to a paid plan. Contact support@bito.in for assistance. Learn more

@github-actions github-actions Bot added documentation Improvements or additions to documentation conformance Standard clause coverage, reference values or errata validation Reference data and oracles used to check results against normative values api Public API surface, naming and deprecations figures Generated plots, diagrams and animations site Documentation website i18n English and Spanish translations area: building Sound insulation and building acoustics area: materials Absorption, impedance and material properties area: core Shared internals and cross-cutting code every domain depends on labels Jul 30, 2026
@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The pull request adds orthotropic corrugated-panel transmission models and limp-frame porous-medium corrections, exposes their APIs, adds validation and conformance checks, generates supporting figures, and updates English, Spanish, API, release, and conformance documentation.

Changes

Orthotropic panel modeling

Layer / File(s) Summary
Orthotropic transmission calculations and result shape
src/phonometry/building/panel_transmission.py, src/phonometry/building/__init__.py, src/phonometry/__init__.py
Adds corrugation mass/stiffness helpers, orthotropic resonance and critical-frequency calculations, integral and Heckl transmission-loss methods, and the critical_frequency_upper result field.
Orthotropic validation and conformance
tests/building/test_orthotropic_panels.py, tests/reference_data.py, scripts/conformance_report.py
Adds published-reference, limiting-case, continuity, damping, geometry, validation, and Hopkins Table A2 checks.
Orthotropic plotting and documentation
src/phonometry/_plot/building.py, scripts/generate_graphs.py, docs/panel-sound-insulation.md, site/src/content/docs/guides/panel-sound-insulation.mdx, site/src/content/docs/reference/api/building/panel-transmission.md
Documents coincidence ranges, adds localized range plotting, and generates the orthotropic transmission-loss figure.

Limp-frame porous modeling

Layer / File(s) Summary
Limp-frame correction and exports
src/phonometry/materials/porous_absorber.py, src/phonometry/materials/__init__.py, src/phonometry/__init__.py
Adds decoupling_frequency, limp_frame, limp_frame_applicable, and LIMP_FRAME_CRITERIA, including effective-density, impedance, wavenumber, and validation behavior.
Limp-frame validation and conformance
tests/materials/test_limp_frame.py, scripts/conformance_report.py
Validates published formulas, low- and high-frequency limits, passivity, layered absorption, plotting, applicability thresholds, and four new porous conformance checks.
Limp-frame plotting and documentation
scripts/generate_graphs.py, docs/porous-absorbers.md, site/src/content/docs/guides/porous-absorbers.mdx, site/src/content/docs/es/guides/porous-absorbers.mdx
Documents decoupling and frame-motion behavior and generates the effective-density comparison figure.

Release and conformance metadata

Layer / File(s) Summary
Updated coverage and release descriptions
.zenodo.json, llms.txt, docs/getting-started.md, site/src/content/docs/index.mdx, site/src/content/docs/es/index.mdx, site/public/llms/llms-start.txt
Updates published conformance totals and related getting-started and site descriptions.
Generated conformance reports
docs/CONFORMANCE.md, site/src/content/docs/reference/conformance.md, site/src/content/docs/es/reference/conformance.md
Refreshes report totals and adds new porous and panel validation rows.
Changelog and bibliography updates
CHANGELOG.md, docs/references.md, site/src/content/docs/reference/bibliography.md
Records the new features and adds related guide references.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

Suggested labels: reports

Poem

A rabbit hops through panels wide,
Finds limp frames moving side to side.
Corrugated waves now sing,
Twin critical bounds take wing.
Tests and figures bloom just right—
Binky, models, into flight!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 67.44% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly names the two main additions in the PR and is concise.
Description check ✅ Passed The description covers the changes, validation, oracles, docs, and gates, so it is mostly complete despite not matching the template exactly.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch orthotropic-and-limp-frame

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@sourcery-ai

sourcery-ai Bot commented Jul 30, 2026

Copy link
Copy Markdown

Reviewer's Guide

Adds orthotropic (ribbed/corrugated) panel transmission models and limp-frame porous equivalent fluid support, with full API exposure, plotting updates, documentation, figures, and conformance tests to numerically anchor the new physics.

Flow diagram for orthotropic panel transmission pipeline

flowchart LR
    corrugated_geometry["corrugated geometry (thickness, amplitude, wavelength, E, nu)"] --> corrugated_plate_stiffness
    corrugated_geometry --> corrugated_plate_mass_factor
    corrugated_plate_stiffness --> orthotropic_critical_frequencies
    corrugated_plate_mass_factor --> orthotropic_critical_frequencies
    orthotropic_critical_frequencies --> orthotropic_transmission_loss
    orthotropic_transmission_loss --> SoundReductionResult
    SoundReductionResult --> plot_sound_reduction["plot_sound_reduction (shades coincidence range fc1..fc2)"]
Loading

Flow diagram for rigid-frame to limp-frame porous absorber pipeline

flowchart LR
    porous_input["material data (sigma, porosity, geometry)"] --> johnson_champoux_allard
    johnson_champoux_allard --> PorousMediumResult_rigid["PorousMediumResult (rigid frame)"]
    PorousMediumResult_rigid --> limp_frame
    limp_frame --> PorousMediumResult_limp["PorousMediumResult (limp frame)"]
    PorousMediumResult_limp --> PorousLayer
    PorousLayer --> layered_absorber
    layered_absorber --> DiffuseFieldAbsorptionResult["DiffuseFieldAbsorptionResult / absorption"]
Loading

File-Level Changes

Change Details Files
Implement orthotropic panel transmission loss and supporting corrugated-plate mechanics, and expose the coincidence range in results and plotting.
  • Introduce corrugated plate mass factor based on sinusoidal developed length using elliptic integrals.
  • Add Timoshenko/Woinowsky-Krieger equivalent bending stiffnesses and orthotropic plate eigenfrequency calculation.
  • Provide orthotropic coincidence frequency pair computation and diffuse-field integral/Heckl approximation for transmission loss.
  • Extend SoundReductionResult with an upper critical frequency and shade fc1–fc2 range in plot output.
  • Update building panel transmission API docs and guides (EN/ES) with orthotropic theory, examples, and figure integration.
src/phonometry/building/panel_transmission.py
src/phonometry/building/__init__.py
src/phonometry/_plot/building.py
site/src/content/docs/reference/api/building/panel-transmission.md
site/src/content/docs/guides/panel-sound-insulation.mdx
site/src/content/docs/es/guides/panel-sound-insulation.mdx
docs/panel-sound-insulation.md
scripts/generate_graphs.py
tests/building/test_orthotropic_panels.py
Add limp-frame equivalent fluid correction for porous media, including decoupling frequency, applicability criteria, documentation, figures, and tests.
  • Implement Zwikker–Kosten decoupling frequency and limp-frame effective density correction that preserves bulk modulus and passivity.
  • Expose limp-frame criteria constants and applicability helper based on Beranek/Doutres bulk-modulus thresholds.
  • Integrate limp-frame functions and constants into public porous absorber API and reference docs.
  • Add porous absorber guides (EN/ES) section with limp-frame explanation, usage examples, and validation caveats.
  • Generate and translate a figure comparing rigid-frame vs limp-frame effective density for a reference material.
src/phonometry/materials/porous_absorber.py
src/phonometry/materials/__init__.py
src/phonometry/__init__.py
site/src/content/docs/reference/api/materials/porous-absorber.md
site/src/content/docs/guides/porous-absorbers.mdx
site/src/content/docs/es/guides/porous-absorbers.mdx
docs/porous-absorbers.md
scripts/generate_graphs.py
tests/materials/test_limp_frame.py
Extend conformance reporting, change log, site metadata, and LLMS helper texts to cover the new orthotropic and limp-frame features and their numerical anchors.
  • Add orthotropic and limp-frame related checks to the conformance report, including Hopkins table products and Allard & Atalla limits.
  • Update dataset metadata, conformance counts, and site index descriptions to reflect increased check and standard totals.
  • Document the new features in the CHANGELOG and API reference, including usage and theoretical provenance.
  • Wire new graph generators into the global index of figures and Spanish text-processing rules for annotations.
scripts/conformance_report.py
docs/CONFORMANCE.md
site/src/content/docs/reference/conformance.md
site/src/content/docs/es/reference/conformance.md
CHANGELOG.md
docs/api-reference.md
docs/getting-started.md
site/src/content/docs/index.mdx
site/src/content/docs/es/index.mdx
scripts/generate_graphs.py
llms.txt
llms-full.txt
site/public/llms/llms-start.txt
site/public/llms/llms-absorbers.txt
site/public/llms/llms-insulation-design.txt
Add image assets for the new orthotropic and limp-frame figures used in docs and guides.
  • Include light/dark and English/Spanish variants of orthotropic transmission loss figure.
  • Include light/dark and English/Spanish variants of limp-frame effective density figure.
.github/images/orthotropic_transmission_loss.svg
.github/images/orthotropic_transmission_loss_dark.svg
.github/images/orthotropic_transmission_loss_es.svg
.github/images/orthotropic_transmission_loss_es_dark.svg
.github/images/limp_frame_effective_density.svg
.github/images/limp_frame_effective_density_dark.svg
.github/images/limp_frame_effective_density_es.svg
.github/images/limp_frame_effective_density_es_dark.svg

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@jmrplens
jmrplens force-pushed the orthotropic-and-limp-frame branch from aa8a060 to 5fddd4a Compare July 30, 2026 04:03

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@llms-full.txt`:
- Line 2539: Update the orthotropic_plate_resonance example to avoid the
undefined b argument by reusing the existing flat_b variable or defining b
before the function call; keep all three bending-stiffness parameters
consistent.

In `@scripts/generate_graphs.py`:
- Around line 8441-8445: Update the English caption in the ax.text call to an
f-string that interpolates the existing local porosity, resistivity, and
frame_density parameters, matching the established Spanish caption pattern.
Preserve the wording, units, formatting, and plot styling while removing the
hard-coded numeric values.

In `@site/src/content/docs/reference/api/building/panel-transmission.md`:
- Line 492: Fix the documentation resolver’s attribute disambiguation so
SoundReductionResult.critical_frequency resolves to the SoundReductionResult
attribute rather than the module-level flanking_transmission.critical_frequency
function. Then regenerate the API documentation for the orthotropic-integral and
orthotropic-heckl return description, ensuring the generated link targets the
SoundReductionResult section.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: cde0fcaa-fe89-474a-8603-5dccd5f952f4

📥 Commits

Reviewing files that changed from the base of the PR and between 9dc0e2b and aa8a060.

⛔ Files ignored due to path filters (8)
  • .github/images/limp_frame_effective_density.svg is excluded by !**/*.svg
  • .github/images/limp_frame_effective_density_dark.svg is excluded by !**/*.svg
  • .github/images/limp_frame_effective_density_es.svg is excluded by !**/*.svg
  • .github/images/limp_frame_effective_density_es_dark.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss_dark.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss_es.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss_es_dark.svg is excluded by !**/*.svg
📒 Files selected for processing (33)
  • .zenodo.json
  • CHANGELOG.md
  • docs/CONFORMANCE.md
  • docs/api-reference.md
  • docs/getting-started.md
  • docs/panel-sound-insulation.md
  • docs/porous-absorbers.md
  • llms-full.txt
  • llms.txt
  • scripts/conformance_report.py
  • scripts/generate_graphs.py
  • site/public/llms/llms-absorbers.txt
  • site/public/llms/llms-insulation-design.txt
  • site/public/llms/llms-start.txt
  • site/src/content/docs/es/guides/panel-sound-insulation.mdx
  • site/src/content/docs/es/guides/porous-absorbers.mdx
  • site/src/content/docs/es/index.mdx
  • site/src/content/docs/es/reference/conformance.md
  • site/src/content/docs/guides/panel-sound-insulation.mdx
  • site/src/content/docs/guides/porous-absorbers.mdx
  • site/src/content/docs/index.mdx
  • site/src/content/docs/reference/api/building/panel-transmission.md
  • site/src/content/docs/reference/api/materials/porous-absorber.md
  • site/src/content/docs/reference/conformance.md
  • src/phonometry/__init__.py
  • src/phonometry/_plot/building.py
  • src/phonometry/building/__init__.py
  • src/phonometry/building/panel_transmission.py
  • src/phonometry/materials/__init__.py
  • src/phonometry/materials/porous_absorber.py
  • tests/building/test_orthotropic_panels.py
  • tests/materials/test_limp_frame.py
  • tests/reference_data.py

Comment thread llms-full.txt
Comment on lines +8441 to +8445
ax.text(0.015, 0.03,
"Soft fibrous layer: porosity 0.98, "
"flow resistivity 25 kPa s/m², frame density 30 kg/m³",
transform=ax.transAxes, va="bottom", ha="left", fontsize=8.5,
color=COLOR_FG)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Derive the caption from the parameters instead of retyping them.

porosity, resistivity and frame_density are already local; the literal caption will silently disagree with the curves if any of them is edited. The Spanish pattern captures the values, so an f-string is transparent to the translation pass.

♻️ Proposed refactor
-    ax.text(0.015, 0.03,
-            "Soft fibrous layer: porosity 0.98, "
-            "flow resistivity 25 kPa s/m², frame density 30 kg/m³",
-            transform=ax.transAxes, va="bottom", ha="left", fontsize=8.5,
-            color=COLOR_FG)
+    ax.text(0.015, 0.03,
+            f"Soft fibrous layer: porosity {porosity:g}, "
+            f"flow resistivity {resistivity / 1e3:g} kPa s/m², "
+            f"frame density {frame_density:g} kg/m³",
+            transform=ax.transAxes, va="bottom", ha="left", fontsize=8.5,
+            color=COLOR_FG)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
ax.text(0.015, 0.03,
"Soft fibrous layer: porosity 0.98, "
"flow resistivity 25 kPa s/m², frame density 30 kg/m³",
transform=ax.transAxes, va="bottom", ha="left", fontsize=8.5,
color=COLOR_FG)
ax.text(0.015, 0.03,
f"Soft fibrous layer: porosity {porosity:g}, "
f"flow resistivity {resistivity / 1e3:g} kPa s/m², "
f"frame density {frame_density:g} kg/m³",
transform=ax.transAxes, va="bottom", ha="left", fontsize=8.5,
color=COLOR_FG)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/generate_graphs.py` around lines 8441 - 8445, Update the English
caption in the ax.text call to an f-string that interpolates the existing local
porosity, resistivity, and frame_density parameters, matching the established
Spanish caption pattern. Preserve the wording, units, formatting, and plot
styling while removing the hard-coded numeric values.

Comment thread site/src/content/docs/reference/api/building/panel-transmission.md
@jmrplens
jmrplens force-pushed the orthotropic-and-limp-frame branch from 5fddd4a to f78b3c5 Compare July 30, 2026 04:14
@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Numerical conformance report

484/484 conformance checks pass across 55 domains and 325 standards - filters class 1 - weightings within IEC 61672-1 class 1.

Each row pins a standard clause to its expected normative value and the value the library computes. Every section below is collapsible and stays collapsed while all of its rows pass; a section with any failing row opens automatically.

Numerical validation - filters & weightings: class showcase (IEC 61260-1 · IEC 61672-1 · ISO 7196)

IEC 61260-1:2014 class per filter architecture (order 6, one-third-octave, 100 Hz-10 kHz, fs = 48 kHz). For each architecture the table shows, at its binding band, the measured relative attenuation and the class-1 limit it must clear, so the number and the range it must sit in are both visible. A positive margin means the acceptance limits are met with that much room.

Architecture Class verdict Binding band Measured rel. atten. Class-1 limit Margin cl.1 Margin cl.2
butter Class 1 (default) 100 Hz +0.00 dB ≥ -0.40 dB +0.400 dB +0.600 dB
cheby1 By design (passband ripple) 6310 Hz +0.19 dB ≥ +1.44 dB -1.246 dB -0.837 dB
cheby2 Class 1 100 Hz +0.00 dB ≥ -0.40 dB +0.400 dB +0.600 dB
ellip By design (passband ripple) 10000 Hz +0.10 dB ≥ +1.32 dB -1.218 dB -0.813 dB
bessel By design (soft rolloff) 100 Hz +12.46 dB ≥ +16.60 dB -4.133 dB -3.133 dB

Only Butterworth (the library default) and Chebyshev-II are class-compliant architectures. Chebyshev-I and elliptic trade the mask for passband ripple, and Bessel for a maximally-flat group delay (soft rolloff); they cannot satisfy the IEC 61260-1 Class 1/2 attenuation mask by construction, so they are labelled By design - this is expected, not a failure or regression.

Frequency-weighting conformance (A/C: IEC 61672-1 Table 3; G: ISO 7196 A.3). The max deviation from nominal is informational (it falls at a frequency extreme where the tolerance is widest and asymmetric); compliance is judged at the binding frequency - the one with the least headroom - where the deviation, the applicable tolerance band and the headroom are shown together.

Curve fs Max dev. from nominal (info) Binding freq Deviation there Tolerance band Headroom
A 48 kHz -0.867 dB @ 19953 Hz 1000 Hz +0.000 dB [-0.70, +0.70] dB +0.700 dB
A 96 kHz -0.482 dB @ 19953 Hz 1000 Hz +0.000 dB [-0.70, +0.70] dB +0.700 dB
C 48 kHz -0.900 dB @ 19953 Hz 1000 Hz +0.000 dB [-0.70, +0.70] dB +0.700 dB
G 48 kHz +0.047 dB @ 1 Hz 1 Hz +0.047 dB [-1.00, +1.00] dB +0.953 dB
Filters & weightings: 100% (10/10)
Standard Quantity Expected (norm) Computed Δ Status
IEC 61260-1:2014 Table 1 Octave-band filter class (butterworth, fs=48 kHz) class 1 class 1 (margin +0.400 dB) +0.400 dB
IEC 61260-1:2014 Table 1 One-third-octave filter class (butterworth, fs=48 kHz) class 1 class 1 (margin +0.400 dB) +0.400 dB
IEC 61260:1995 / ANSI S1.11-2004 Table 1 Class 0 (strictest) octave-band filter (butterworth, fs=48 kHz) class 0 class 0 (margin +0.150 dB) +0.150 dB
IEC 61260-1:2014 Table F.1 Formula (9) breakpoint mapping, b=3, Omega at G**(1/2) 1.12202 (+/-0.00001) 1.12202 0
IEC 61672-1:2013 Table 3 A-weighting deviation vs class-1 limits (fs=48 kHz) deviation within limits @ 1000 Hz +0.000 dB in [-0.70, +0.70] dB headroom +0.700 dB
IEC 61672-1:2013 Table 3 C-weighting deviation vs class-1 limits (fs=48 kHz) deviation within limits @ 1000 Hz +0.000 dB in [-0.70, +0.70] dB headroom +0.700 dB
ISO 7196:1995 Table 2 / A.3 G-weighting deviation vs +/-1 dB tolerance (fs=48 kHz) deviation within limits @ 1 Hz +0.047 dB in [-1.00, +1.00] dB headroom +0.953 dB
ANSI S1.4-1983 Tables IV/V B-weighting (historical) deviation vs Type 0 limits (fs=48 kHz) deviation within limits @ 200 Hz -0.049 dB in [-0.70, +0.70] dB headroom +0.651 dB
IEC 61012:1990 Table 1 / 2.2 AU-weighting deviation vs separate-unit tolerances (fs=96 kHz) deviation within limits @ 10000 Hz -0.072 dB in [-1.00, +1.00] dB headroom +0.928 dB
IEC 537:1976 (withdrawn) via NASA CR-3406 Table SLD-I D-weighting response vs the published tabulated curve (fs=48 kHz) abs(response - table) <= 0.2 dB (0.45 dB at 1600/2500 Hz) -0.131 dB @ 8000 Hz (bound 0.20 dB) headroom +0.069 dB
Levels & dosimetry: 100% (9/9)
Standard Quantity Expected (norm) Computed Δ Status
IEC 61672-1:2013 (Leq) Leq of a 1 Pa 1 kHz sine 90.97 dB (+/-0.05 dB) 90.969 dB -0.001 dB
IEC 61252:1995 (LEX,8h) 8 h exposure to 90 dB(A) noise 90 dB (+/-0.05 dB) 90.008 dB 0.008 dB
ISO 1996-1:2016 3.6.4 Lden, constant 60 dB in day/evening/night 66.3952 dB (+/-0 dB) 66.3952 dB 0 dB
ISO 1996-2:2007 Annex C.5 Example 1 Tonal audibility ΔLta (Formula C.3), 4 kHz tone 13.7 dB (+/-0.05 dB) 13.66 dB -0.044 dB
ISO 1996-2:2007 Annex C.5 Example 1 Tonal adjustment Kt (Formulae C.4-C.6) 6 dB (+/-0 dB) 6 dB 0 dB
ISO 1996-2:2017 Annex G.2 Combined measurement uncertainty u = √(Σ(cj·uj)²) 2.18 dB (+/-0.01 dB) 2.18 dB -0.002 dB
RD 1367/2007 Annex IV A.3.4.2 b Corrected period level LKeq,d (Manual Ejemplo 3.1: 3 noise phases, 12 h) 57 dB (+/-0 dB) 57 dB 0 dB
RD 1367/2007 Annex I A.2 d Long-term level LK,d (Manual Ejemplo 3.2: 303 operating days of 365) 56 dB (+/-0 dB) 56 dB 0 dB
RD 1367/2007 Annex III Table B1, Article 25 Activity verdict (Manual Ejemplo 3.3: area type a, LK,d 56 dB over 55 dB) phase and daily pass, annual fails, activity not compliant phase and daily pass, annual fails, activity not compliant -
Room & building acoustics: 100% (60/60)
Standard Quantity Expected (norm) Computed Δ Status
CTE DB-HR Annex A, Formula (A.5) Global index R'A for pink noise (Manual Ejemplo 7.2) 51.4 dBA (+/-0.05 dBA) 51.4 dBA 0 dBA
CTE DB-HR Annex A, Formula (A.6) Global index D2m,nT,Atr for road traffic (Manual Ejercicio 7.1) 32.8 dBA (+/-0.05 dBA) 32.8 dBA 0 dBA
Manual de acustica ambiental y arquitectonica, Ejemplo 7.1 Reported R'A of the field-test wall (printed 51 dBA = R'w 52 + C -1) 51 dBA (+/-0 dBA) 51 dBA 0 dBA
Manual de acustica ambiental y arquitectonica, Ejemplo 7.1 Reported R'A,tr of the same wall (printed 47 dBA = R'w 52 + Ctr -5) 47 dBA (+/-0 dBA) 47 dBA 0 dBA
CTE Catalogo de Elementos Constructivos Window size correction of RA (Manual Ejemplo 7.4: 4 m2 window, -2 dB) 24 dBA (+/-0 dBA) 24 dBA 0 dBA
ISO 3382-2:2008 5.3.3 T30 from a synthetic exponential decay (T=1.0 s) 1 s (+/-1%) 1 s 0 s
ISO 18233:2006 (swept-sine method) Sweep deconvolution recovers a known IIR response 0 dB in-band error (+/-0.1 dB) 0.0006 dB 0.001 dB
ISO 717-1 Annex C, Table C.1 Weighted sound reduction index Rw (C;Ctr) Rw 30 (C -2; Ctr -3) Rw 30 (C -2; Ctr -3) sum 31.8 dB
ISO 717-1:2020 Annex C, Table C.2 Enlarged range 50-5000 Hz: Rw (C; Ctr; C50-5000; Ctr,50-5000) Rw 30 (C -2; Ctr -3; C50-5000 -2; Ctr,50-5000 -4) Rw 30 (C -2; Ctr -3; C50-5000 -2; Ctr,50-5000 -4) exact
ISO 717-2 Annex C, Table C.1 Weighted impact sound pressure level Ln,w (CI) Ln,w 79 (CI -11; sum 28.0 dB) Ln,w 79 (CI -11; sum 28.0 dB) +0 dB
ISO 717-2 Annex C, Table C.1 (covered) Weighted impact level of the floor WITH covering Ln,w (CI) Ln,w 64 (CI -3; sum 30.0 dB) Ln,w 64 (CI -3; sum 30.0 dB) +0 dB
ISO 717-2 Annex C, Table C.2 Floor-covering improvement ΔLw and CI,Δ (Formulae (2)/(A.4); CI,Δ from the normative Table 4 floor, not the 2020 print's misprinted C.2 chain) ΔLw 15 dB; CI,Δ -9 dB (Table 4 reference floor) ΔLw 15 dB; CI,Δ -9 dB +0 dB
ISO 354:2003 Eq. 5/8 Sabine inversion recovers absorption area 9.212828 m^2 (+/-0 m^2) 9.212828 m^2 0 m^2
ISO 3382-3:2012 Clause 6.2 Open-plan spatial decay rate D2,S (-6 dB/doubling) 6 dB (+/-0 dB) 6 dB 0 dB
ISO 16283-3:2016 Clause 3.12 Facade R'45 isolates the -1.5 dB incidence correction (S=A) 38.5 dB (+/-0 dB) 38.5 dB 0 dB
ISO 10140-2:2010 Formula (2) Lab airborne R on the ISO 717-1 reference shape -> Rw = 54 Rw 54 dB Rw 54 dB +0 dB
ISO 10140-5:2010+A1 Annex B, Table B.1 Reference elements end-to-end: printed Rw (C; Ctr) of all three Rw(C;Ctr) = 53(-1;-5) / 52(-1;-5) / 33(-1;-2) 53(-1;-5) / 52(-1;-5) / 33(-1;-2) exact
ISO 10140-5:2010+A1 Annex C, Table C.1 Reference floors end-to-end: printed Ln,t,r,0,w (CI) of both Ln,t,r,0,w(CI) = 72(0) / 75(-3) 72(0) / 75(-3) exact
ISO 15186-1:2000 Formula (7) Intensity RI on the ISO 717-1 reference shape -> RI,w = 30 RI,w 30 dB (scalar anchor RI = 34 dB) RI,w 30 dB (RI = 34 dB) +0 dB
ISO 15186-1:2000 Annex B, Table B.1 Adaptation term Kc: all 21 printed rows; (B.1) reduces to (B.2) max abs(Kc - Table B.1) <= 0,05 dB (1 dp print) 0.047 dB (B.1 vs B.2: 4.33e-04 dB) 0.047 dB
ISO 10052:2021 Clause 3.6 Survey R' applies the V/7,5 minimum-area rule 26.197888 dB (+/-0 dB) 26.197888 dB 0 dB
ISO 10052:2021 Clause 3.16 Service-equipment LXY is the 3-position energy average 32.823329 dB (+/-0 dB) 32.823329 dB 0 dB
ISO 10052:2021 Table 4 Reverberation-index estimate (35 <= V < 60, type g) k = [4.5, 5.0, 5.5, 5.5, 5.5] dB k = [4.5, 5.0, 5.5, 5.5, 5.5] dB exact
ISO 717-2:2020 Table 4 / Clause 5.2 Reference-floor weighted level Ln,r,0,w and CI (ISO 16251-1 ΔLw anchor) Ln,r,0,w = 78 dB, CI = -11 dB Ln,r,0,w = 78 dB, CI = -11 dB exact
ISO 16251-1:2014 / ISO 717-2 Formula (2) Floor-covering ΔLw: zero improvement gives ΔLw = 0 ΔLw = 0 dB (ΔL = 0 -> Ln,r = Ln,r,0) ΔLw = 0 dB exact
ISO 16251-1 / ISO 717-2 (Foret et al. 2011, carpet) Measured textile-carpet improvement rates to ΔLw = 29 dB ΔLw = 29 dB (paper, ISO 16251-1) ΔLw = 29 dB +0 dB
ISO 10848-1:2006 Formula (14) Flanking Kij (simplified) matches closed form Kij = 1.9897 dB Kij = 1.9897 dB exact
ISO 10848-1:2006 Formula (12) Flanking equivalent absorption length aj at f_ref aj = 1.2661 m aj = 1.2661 m exact
ISO 10848-1:2006 Clause 7.3.1 Flanking total loss factor η = 2,2/(f·Ts) η = 0.0044 η = 0.0044 exact
ISO 12354-1:2017 Formula (20) vs Hopkins Eq. 2.201 (6 mm glass) Flanking critical frequency (c0²/1,8·cL·h) vs plate coincidence (c0²/2π · sqrt(m''/B')) 2107.4 Hz (+/-1%) 2123.5 Hz 16.156 Hz
EN 29052-1:1992 Formula 4 Apparent dynamic stiffness s't = 4π²·m't·fr² (m't=200 kg/m², fr=25 Hz) 4.934802 MN/m³ (+/-0.000001 MN/m³) 4.934802 MN/m³ 0 MN/m³
EN 29052-1:1992 clause 8.2 NOTE Enclosed-gas stiffness s'a·d = 111 MN·mm/m³ (p₀=0,1 MPa, ε=0,9) 5.55556 MN/m³ (+/-0.0001 MN/m³) 5.55556 MN/m³ 0 MN/m³
EN 29052-1:1992 Formula 2 Floating-floor natural frequency f0 = (1/2π)√(s'/m') (s'=10 MN/m³, m'=100 kg/m²) 50.32921 Hz (+/-0 Hz) 50.32921 Hz 0 Hz
ISO 7626-1:2011 Table 1 / 3.1.2 Closed-form SDOF driving-point mobility peak mag(Y(f0)) = 1/c (c=5 N·s/m) 0.2 m/(N·s) (+/-0.000001 m/(N·s)) 0.2 m/(N·s) 0 m/(N·s)
ISO 7626-1:2011 Table 1 / 3.1.2 Closed-form SDOF static receptance H(0) = 1/k (k=8000 N/m) 0.000125 m/N (+/-0.0001%) 0.000125 m/N 0 m/N
ISO 7626-1:2011 Table 1 FRF reciprocity: impedance × mobility = 1 (at 37 Hz) 1 (= Z·Y) 1 0
ISO 10846-2:2008 3.17 Transfer-stiffness level Lk = 20 lg( k /k0), k0 = 1 N/m ( k = 1 MN/m)
ISO 10846-3:2002 Formula (1) Indirect method k2,1 = -(2πf)²·m2·T (f=500 Hz, m2=10 kg, T=0,01) -986960.4 N/m (+/-0.1%) -986960.4 N/m 0 N/m
ISO 10846-1:2008 Table A.2 FRF relation k = jω·Z at 250 Hz ( k recovered from impedance) 1001249.2 N/m (+/-0.0001%) 1001249.2 N/m
ISO 7626-2:2015 7.5.2 Rigid-mass calibration: accelerance mag(A) = 1/m (m=10 kg) 0.1 1/kg (+/-0 1/kg) 0.1 1/kg 0 1/kg
ISO 7626-2:2015 7.5.2 Rigid-mass calibration: mobility mag(Y) = 1/(2πf·m) at 100 Hz (m=10 kg) 0.0001592 m/(N·s) (+/-0.001%) 0.0001592 m/(N·s) 0 m/(N·s)
ISO 7626-2:2015 Annex A Normalized random error ε = √((1−γ²)/(2nγ²)): γ²=0,8, n=75 → 4,08 % (< 5 %) 4.08 % (+/-0.01 %) 4.08 % 0.002 %
ISO 7626-1:2011 Table 1 Rigid 1 kg mass at ω = 1000 rad/s: mobility 1e-3, compliance 1e-6 (decades) 0.001 m/(N·s) (+/-1e-07%) 0.001 m/(N·s) 0 m/(N·s)
ISO 10846-3:2002 6.1 Inequality (2) Indirect-method validity limit mag(T) = 0,1 ↔ ΔL1,2 = 20 dB 20 dB (+/-0 dB) 20 dB 0 dB
ISO 10846-3:2002 6.1 Model bias at the validity limit: k_ind/k = 1,1 (0,83 dB ≤ 1 dB, 10 % ≤ 12 %) 1.1 (+/-1e-07%) 1.1 0
ISO 10846-1:2008 Equation (6) Delivered/blocking force F2/F2,b = 1/1,1 at mag(k2,2/kt) = 0,1 (within 10 %) 0.9091 (+/-0) 0.9091 0
ISO 10846-2:2008 / -3:2002 7.6 Linearity: ΔLk ≤ 1,5 dB for input spectra 10 dB apart (linear element: 0) ΔLk ≤ 1,5 dB (7.6 c) 0 dB 0 dB
ISO/TS 7849-1:2009 Formula (8) Calibration L_v from â = 9,81 m/s² at 100 Hz (standard's EXAMPLE) 106.9 dB (+/-0.1 dB) 106.9 dB -0.02 dB
ISO/TS 7849-2:2009 Formula (15) L_W from L_v via measured radiation factor = 10 lg(P/P0) (round-trip) 84.771 dB (+/-0 dB) 84.771 dB 0 dB
ISO/TS 7849-1:2009 Formula (12) Impedance term: L_W − L_v = 10 lg(411/400) at ε = 1, S = S0 0.1178 dB (+/-0 dB) 0.1178 dB 0 dB
EN 15657:2018 Formula (14) Reception-plate L_Ws = resonant-plate power P = ωη(mS)⟨v²⟩ (round-trip) 55.545 dB (+/-0 dB) 55.545 dB 0 dB
EN 15657:2018 Formula (13) Plate loss factor η = 2,2/(f·Ts) at 1 kHz, Ts = 0,3 s 0.0073 (+/-0) 0.0073 0
EN 15657:2018 Formulae (15)/(17) + EN 12354-5 Annex I.3 Source conversion chain reproduces Table I.8 (wall, installed) max abs(L_Ws,inst - Table I.8) <= 0,15 dB 0.055 dB 0.055 dB
ISO 9611:1996 eq. (9) Mean free velocity level (energy mean, v0 = 5e-8 m/s) 72.3017 dB (+/-0 dB) 72.3017 dB 0 dB
ISO 12354-1:2017 Annex L, Tables L.2 to L.4 In-situ element chain: 10 lg sigma, 10 lg sigma_f, eta_tot, Rsitu, a_situ (21 bands x 5 elements) 0 dB (+/-0.1 dB) 0.057 dB 0.057 dB
ISO 12354-1:2017 Annex L, Table L.1 Detailed airborne model: 13 paths + R' per band, R'w = 57 dB max path/total dev <= 0,1 dB; R'w = 57 dB 0.055 dB; 57 dB 0.055 dB
ISO 12354-2:2017 Annex G, Tables G.3, G.4 and G.1 Detailed impact model: Ln,situ, Ln,Dd, Ln,Df, L'n per band, L'n,w = 41 dB max path/total dev <= 0,1 dB; L'n,w (CI) = 41 (2) dB 0.077 dB; 41 (2) dB 0.077 dB
EN 12354-5:2009 Formula (19b/19c) Coupling term → force-source limit 10 lg(mag(Ys)/Re{Yi}) as mag(Ys) ≫ mag(Yi) 40 dB (+/-0.01 dB) 40.001 dB 0.001 dB
EN 12354-5:2009 Annex I.3, Table I.9 Flushing cistern: four paths + Formula (17) total -> 29 dB(A) max path/total dev <= 0.15 dB; total 29 dB(A) 0.055 dB; 29.3 dB(A) 0.055 dB
EN 12354-5:2009 Annex I.2, Table I.6a Whirlpool floor component: mobility correction + path 11 max abs(dev vs Table I.6a) <= 0,15 dB 0.1 dB 0.1 dB
Room acoustics: 100% (16/16)
Standard Quantity Expected (norm) Computed Δ Status
Sabine (W. C. Sabine, 1922) Reverberation time T = k·V/A (V=120 m³, S=158 m², α=0.2) 0.611825 s (+/-0.000001 s) 0.611825 s 0 s
Long, Architectural Acoustics 2e, Table 8.1 Room modes of a 7 x 5 x 3 m room: the six printed frequencies, Hz 42.4 Hz (+/-0.13 Hz) 42.27 Hz -0.126 Hz
Long, Architectural Acoustics 2e, Eq. (8.46) Modal density of a 7 x 5 x 3 m room at 1 kHz = 34 modes/Hz 34 modes/Hz (+/-0.5 modes/Hz) 34.32 modes/Hz 0.32 modes/Hz
Long, Architectural Acoustics 2e, Eq. (17.51) Restaurant self-noise, 20 talkers over 20 metric sabins = 76 dB 76 dB (+/-0.05 dB) 76.021 dB 0.021 dB
Long, Architectural Acoustics 2e, Eq. (17.54) Privacy bound A_tab < 3.16 rt^2 (Q = 2, L_SN = -9 dB) 3.16 m^2 (+/-0.005 m^2) 3.164 m^2 0.004 m^2
Everest, Master Handbook of Acoustics 4th ed, Fig. 7-22 Sabine RT, worked Example 1 @ 1 kHz (untreated 23.3×16×10 ft room, SI) 3.39 s (+/-0.02 s) 3.402 s 0.012 s
Eyring (Norris-Eyring, 1930) Reverberation time T = k·V/(-S·ln(1-ᾱ)) (α=0.2) 0.548369 s (+/-0.000001 s) 0.548369 s 0 s
Arau-Puchades (Acustica 65, 1988, Formula 18) T (α=0.5/0.1/0.1 per wall pair, dims 8×5×3 m) 0.812147 s (+/-0.000001 s) 0.812147 s 0 s
Model identity (uniform absorption) Arau-Puchades ≡ Eyring when ᾱ is uniform 0.548369 s (= Eyring) 0.548369 s 0 s
Vorlander Auralization 2e, Eq. (11.38)-(11.39) Image-source direct-sound amplitude 1/(4πr) and delay r/c (r = 4 m) 0.0198944 (+/-0) 0.0198944 0
Kuttruff Room Acoustics 6e, Eq. (9.23) Audible shoebox image count up to order 10 (= 1560) 156 (+/-0) 156 0
Kuttruff Room Acoustics 6e, Eq. (4.6) Temporal reflection density dN/dt = 4πc³t²/V (t = 0.1 s, V = 120 m³) 42258.2 1/s (+/-0 1/s) 42258.2 1/s 0 1/s
Bies Engineering Noise Control 5e, Eq. (6.44) Room constant R = Sᾱ/(1-ᾱ) (S = 100 m², ᾱ = 0.2 → 25 m²) 25 m² (+/-0 m²) 25 m² 0 m²
Bies Engineering Noise Control 5e, Eq. (6.43) Critical distance rc: direct field = reverberant field (R = 25, Q = 1) 0.160000 (= reverberant term) 0.16 0
Kuttruff Room Acoustics 6e, Eq. (3.44) Schroeder frequency f_s = 2000√(T/V) (V = 200 m³, T = 1 s) 141.421 Hz (+/-0 Hz) 141.421 Hz 0 Hz
Bies Engineering Noise Control 5e, Eq. (6.43) Steady-state SPL Lp = Lw + 10lg(Q/4πr² + 4/R) (Lw=90, r=1, R=25, Q=1) 83.7945 dB (+/-0 dB) 83.7945 dB 0 dB
Psychoacoustics: 100% (14/14)
Standard Quantity Expected (norm) Computed Δ Status
Moore, Psychology of Hearing 6e, p. 77 (Glasberg & Moore 1990) ERB_N number of 1000 Hz = 15.59 Cam 15.59 Cam (+/-0.005 Cam) 15.5932 Cam 0.003 Cam
Moore, Psychology of Hearing 6e, p. 76 (Glasberg & Moore 1990) ERB_N at 1 kHz vs the printed 24.7(4.37F + 1), Hz 132.639 Hz (+/-0.3%) 132.445 Hz -0.194 Hz
ISO 532-1:2017 Annex B.2 Zwicker loudness N, stationary test signal 1 83.2957 sone (+/-0.1%) 83.2957 sone 0 sone
ISO 532-1:2017 Annex B.5 Time-varying loudness Nmax, technical signal 14 (aircraft, free field) 22.6399 sone (+/-0.1%) 22.6399 sone 0 sone
ISO 532-1:2017 Annex B.5 Time-varying loudness Nmax, technical signal 15 (vehicle interior, diffuse field) 9.6059 sone (+/-0.1%) 9.6059 sone 0 sone
DIN 45692:2009 Clause 6 Sharpness of the standard 1 kHz reference signal 1 acum (+/-0 acum) 1 acum 0 acum
DIN 45692:2009 Table A.2 Sharpness of critical-band noise at 2.5 kHz (2320-2700 Hz, 4 sone) 1.78 acum (+/-0.089 acum) 1.747 acum -0.033 acum
ISO 226:2023 Table B.1 Equal-loudness contour, 60 phon @ 100 Hz 78.5 dB SPL (+/-0.05 dB SPL) 78.504 dB SPL 0.004 dB SPL
ECMA-418-2:2025 Clause 5.1.8 HMS loudness of a 1 kHz / 40 dB tone (c_N=0.0211964) 1 sone_HMS (+/-0.03 sone_HMS) 0.9843 sone_HMS -0.016 sone_HMS
ECMA-418-2:2025 Clause 6.2.8 HMS tonality of a 1 kHz / 40 dB tone (c_T=2.8758615) 1 tu_HMS (+/-0.03 tu_HMS) 0.9998 tu_HMS 0 tu_HMS
ECMA-418-2:2025 Clause 7 HMS roughness of a 1 kHz / 70 Hz / m=1 / overall 60 dB tone (c_R=0.0180685) 1 asper (+/-0.01 asper) 0.9999 asper 0 asper
ISO 532-2:2017 Clause 3.17 / Annex B.1 Moore-Glasberg loudness of a 1 kHz / 40 dB tone (C=0.0617) 1 sone (+/-0.01 sone) 1.0001 sone 0 sone
ISO 532-3:2023 Annex C.1 Moore-Glasberg-Schlittenlacher peak LTL, steady 1 kHz / 40 dB 1 sone (+/-0.02 sone) 0.9996 sone 0 sone
ECMA-418-2:2025 Clause 9 HMS fluctuation strength of a 1 kHz / 4 Hz / m=1 / overall 60 dB tone (c_F=0.003840572) 1 vacil_HMS (+/-0.01 vacil_HMS) 0.9931 vacil_HMS -0.007 vacil_HMS
Speech transmission (IEC 60268-16): 100% (10/10)
Standard Quantity Expected (norm) Computed Δ Status
IEC 60268-16:2020 A.2.2 STI weighting-factor pair (500 Hz + 1 kHz bands) 0.398 (+/-0.001) 0.398 0
IEC 60268-16:2020 A.3.1.2 Uniform MTF m=0.5 maps to STI=0.5 0.5 (+/-0.01) 0.5 0
IEC 60268-16 Annex M Full-STI worked example: printed MTF + speech/noise spectra -> STI STI 0.76 (MTI row of step 4c) STI 0.758 (max MTI dev 0.00) -0.002
IEC 60268-16:2020 C.3.2 STIPA direct method, Formula (C.1) signal at m=0.2 0.3 (+/-0.01) 0.2992 -0.001
IEC 60268-16:2020 C.3.2 STIPA direct method, Formula (C.1) signal at m=0.5 0.5 (+/-0.01) 0.4998 0
IEC 60268-16:2020 C.3.2 STIPA direct method, Formula (C.1) signal at m=0.8 0.7 (+/-0.01) 0.7002 0
IEC 60268-16:2020 C.3.3 Indirect method: exponential decay RT60=1 s vs Schroeder MTF 0.5885 (+/-0.005) 0.5885 0
IEC 60268-16:2020 C.4.2 Filter-bank slope: +41 dB unmodulated tone one octave below 125 Hz m >= 0.5 (C.4.2 pass criterion) 0.9812 0.481
IEC 60268-16:2020 A.2.2 (audio path) Weighting factors: modulated 500 Hz + 1 kHz pair through stipa() 0.398 (+/-0.005) 0.398 0
IEC 60268-16:2020 A.3.1.2 (audio path) Filter-bank phase: half-octave edge carriers at TI=0.9 0.9 (+/-0.01) 0.8975 -0.003
System measurement (Golay / Kirkeby / Mueller-Massarani): 100% (5/5)
Standard Quantity Expected (norm) Computed Δ Status
Havelock 2008 Part I Ch. 6 (Xiang), Eq. (2) Golay pair: sum of periodic autocorrelations = 2L*delta (L = 4096) 0 (algebraic identity, +/-1e-10) 0 0
Havelock 2008 Part I Ch. 6 (Xiang), Eq. (4) Golay chain recovers a delay+gain system IR (noiseless, exact) 0 (machine precision, +/-1e-13) 0 0
Kirkeby & Nelson 1999 Eq. (17) / Mueller-Massarani 2001 Sec. 3.1 In-band equalization residue equals eps/( H ^2 + eps) bin by bin 0 (closed form, +/-1e-12) 0
Kirkeby & Nelson 1999 (max of x/(x^2+eps) = 1/(2*sqrt(eps))) Out-of-band inverse-filter gain within the regularization cap <= -6.021 dB (analytic cap) -6.034 dB headroom +0.013 dB
Mueller-Massarani 2001 Secs. 4.2-4.3 (group-delay synthesis) Shaped sweep's Welch spectrum follows the pink target, in-band 0 dB in-band deviation (+/-0.5 dB) 0.0652 dB 0.065 dB
Intensity & sound power: 100% (10/10)
Standard Quantity Expected (norm) Computed Δ Status
IEC 61043:1993 Clause 5 Plane-wave intensity I = p^2 / (rho c) 0.00238 W/m^2 (+/-1.5%) 0.00239 W/m^2 0 W/m^2
ISO 3744:2010 Eq. 18 Monopole hemisphere recovers LW (r=4 m) 95 dB (+/-0 dB) 95 dB 0 dB
ISO 9614-2:1996 Eq. 12 Intensity scan recovers LW of an enclosed source 90 dB (+/-0.000001 dB) 90 dB 0 dB
IEC 61043:1993 Table 2 Minimum delta_pI0 per band, probe/processor/instrument, class 1/2 132 tabulated minima reproduced max absolute deviation 0.000 dB 0 dB
IEC 61043:1993 Table 2 Note 1 Separation rule +10 lg(x/25) on all six columns of 25 mm minima (x = 50 mm) 3.0103 dB (+/-0 dB) 3.0103 dB 0 dB
Fahy, Sound Intensity 2e, 6.8 delta_pI0 = 20 dB is a phase mismatch of 0.26 deg (1 kHz, 25 mm) 0.26 deg (+/-0.005 deg) 0.2624 deg 0.002 deg
ISO 9614-1:1993 Eqs (A.1)/(A.2) Temporal variability F1 is the coefficient of variation of M samples 0.185164 (+/-0) 0.185164 0
ISO 4871:1996 clause 3.15 / Annex B Declared L_WAd = L_WA + K_WA (Annex B, L_WA=88, K_WA=2) 90 dB (+/-0 dB) 90 dB 0 dB
ISO 4871:1996 clause 6.2 Single-machine verification boundary L_1 <= L_WAd L_1=90 verified, L_1=91 rejected (L_WAd=90) 90->True, 91->False boundary L_1 = L_WAd
ISO 3741:2010 Eq. 20 Reverberation-room method inverts to a known LW 0 dB error 0 dB 0 dB
Building prediction & uncertainty: 100% (15/15)
Standard Quantity Expected (norm) Computed Δ Status
EN 12354-1:2000 Annex H.3 Airborne prediction R'w (direct + 12 flanking paths) R'w 52 dB (13 paths) R'w 52 dB (13 paths, 52.17) +0.17 dB
EN 12354-1:2000 Annex H.3 (paths) All 12 printed flanking-path values Rij,w max abs(Rij,w - printed) <= 0,05 dB 0.042 dB 0.042 dB
EN 12354-1:2000 Formula (5b) / Annex H.3 DnT,w closure from R'w (both H.3 examples -> 54 dB) DnT,w 54 dB (printed 53,8/54,3) DnT,w 53.63 / 54.13 dB -0.17 dB vs printed
EN 12354-2:2000 Annex E.3 Impact prediction L'n,w = Ln,w,eq - dLw + K 45 dB (+/-0 dB) 45 dB 0 dB
EN 12354-2:2000 Formula (3) / Annex E.3 Standardized impact level L'nT,w (exact 0,032 V form -> 43 dB) L'nT,w 43 dB (exact 42,96; E.3 prints 42,8) L'nT,w 42.96 dB -0.001 dB
EN 12354-3:2000 Annex F Facade airborne prediction (R'tr,s,w / D2m,nT,w single numbers) R'tr,s,w 31 (Ctr -3); D2m,nT,w 33 dB R'tr,s,w 31 (Ctr -3); D2m,nT,w 33 dB 0
EN 12354-4:2000 Annex G / Formula (2) Radiated LW of a wall+door segment (side 1, low bands) LW 63/125 Hz [59.8, 61.2] dB (+/-0.1) LW [59.8, 61.2] dB 0.038 dB
EN 12354-4:2000 Annex E / Table G.9 Exterior level of all four Table G.9 reception cells Lp 36,6 / 28,5 / 44,6 / 37,3 dB (+/-0,05) Lp 36.6 / 28.5 / 44.6 / 37.3 dB 0.046 dB
ISO 12999-1:2020 Table 2 Airborne band uncertainty, situation A @ 1 kHz 1.8 dB (+/-0 dB) 1.8 dB 0 dB
ISO 12999-1:2020 Annex B, Table B.2 One-decimal single numbers Rw / Rw+C50-5000 / Rw+Ctr,50-5000 57.4 / 56.4 / 51.1 dB 57.4 / 56.4 / 51.1 dB +0.00 dB
ISO 12999-1:2020 Annex B, Formulae (B.2)/(B.6) Single-number uncertainties (uncorrelated 0,6/0,8; correlated u(Rw) 1,9) u_uncorr 0.6 / 0.8 dB; u_corr(Rw) 1.9 dB 0.60 / 0.79 dB; 1.90 dB -0.00 dB
ISO 12999-1:2020 Clause 8 / Table 8 Expanded uncertainty U = 1.96 u (95 % two-sided, Rw sit. A) 2.352 dB (+/-0 dB) 2.352 dB 0 dB
ISO 12999-2:2020 Table 4 / Formula (1) Absorption coefficient +/-U (k=2), reproducibility, 20 x 1/3-oct bands U(k=2) = [0.33, 0.26, 0.22, 0.17, 0.13, 0.11, 0.09, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.09, 0.09, 0.09, 0.1, 0.11, 0.13, 0.16] U(k=2) = [0.33, 0.26, 0.22, 0.17, 0.13, 0.11, 0.09, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.09, 0.09, 0.09, 0.1, 0.11, 0.13, 0.16] exact
ISO 12999-2:2020 Table 5 / Formula (4) Practical coefficient +/-U (k=2), reproducibility, 5 octave bands U(k=2) = [0.09, 0.08, 0.08, 0.08, 0.1] U(k=2) = [0.09, 0.08, 0.08, 0.08, 0.1] exact
ISO 12999-2:2020 Clause 7, Examples 1/2 Single-number U (k=2): alpha_w and DLalpha,NRD alpha_w +/-0.07, DLalpha +/-1.6 dB alpha_w +/-0.07, DLalpha +/-1.6 dB exact
Outdoor propagation & occupational exposure: 100% (10/10)
Standard Quantity Expected (norm) Computed Δ Status
ISO 9613-1:1993 Table 1 Air attenuation @ 10 degC, 70 %, 1 kHz 3.66 dB/km (+/-0.01 dB/km) 3.658 dB/km -0.002 dB/km
ISO 9613-1:1993 Table 1 Air attenuation @ 0 degC, 20 %, 2 kHz 34.6 dB/km (+/-0.1 dB/km) 34.64 dB/km 0.04 dB/km
ISO 9613-2:1996 Table 2 Atmospheric attenuation grid, 6 conditions x 8 octave bands, dB/km all 48 cells within half a printed digit worst residual 0.939 x tolerance 0.939 x
ISO 9613-2:1996 Eq. (7) Geometrical divergence Adiv = 20 lg(d/d0) + 11 at 100 m 51 dB (+/-0 dB) 51 dB 0 dB
ISO 9613-2:1996 Table 3 Ground b'(0) porous limit -> Agr(250 Hz) = 2(-1.5 + 10.1) 17.2 dB (+/-0 dB) 17.2 dB 0 dB
ISO 9613-2:1996 clause 7.4 Single-edge diffraction saturates at the 20 dB cap 20 dB (+/-0 dB) 20 dB 0 dB
ISO 9613-2:1996 clause 7.4 Double-edge diffraction saturates at the 25 dB cap 25 dB (+/-0 dB) 25 dB 0 dB
ISO 9612:2009 Annex D Task-based LEX,8h + U (welder day, case a) LEX,8h 84.3; U 2.7 dB LEX,8h 84.3; U 2.7 dB -0.01; +0.02 dB
ISO 9612:2009 Annex E Job-based LEX,8h + U (production line, 18 workers) LEX,8h 88.1; U 3.8 dB LEX,8h 88.2; U 3.8 dB +0.06; -0.03 dB
ISO 9612:2009 Annex F Full-day LEX,8h + U (forklift drivers) LEX,8h 90.1; U 3.4 dB LEX,8h 90.1; U 3.4 dB +0.02; +0.03 dB
Materials: absorption, airflow & impedance: 100% (6/6)
Standard Quantity Expected (norm) Computed Δ Status
ISO 11654:1997 Annex A.1 Weighted absorption alpha_w (no indicator) 0.60 (class C, no indic.) 0.60 (class C, '') 0
ISO 11654:1997 Annex A.2 Weighted absorption alpha_w with M indicator 0.60(M) 0.60(M) 0
ISO 9053-2:2020 Annex A.3 Thermal boundary-layer thickness b 0.00183 m (+/-0.00001 m) 0.00183 m 0 m
ISO 9053-2:2020 Annex A.3 Effective ratio of specific heats kappa' 1.37 (+/-0.001) 1.37 0
ISO 10534-1:1996 Eqs (9)/(13)/(14) Absorption from standing-wave ratio s=3 alpha 0.75 (+/-0), |r| 0.5 alpha 0.75, |r| 0.5000 0
ISO 10534-2 Eq. (17) / Annex D Two-microphone round trip recovers a known reflection factor abs(r - (0.3-0.4j)) = 0 (identity, +/-1e-9) 0 0
Scattering & diffusion (ISO 17497): 100% (14/14)
Standard Quantity Expected (norm) Computed Δ Status
ISO 17497-1:2004 Eq (2) Reference speed of sound at 20 C 343.2 m/s (+/-0 m/s) 343.2 m/s 0 m/s
ISO 17497-1:2004 Eqs (1)/(4)/(5) Scattering coefficient (synthetic chain) 0.0931 (+/-0) 0.0931 0
ISO 17497-1:2004 Annex A.5 Expanded uncertainty of scattering coefficient 0.02971 (+/-0) 0.02971 0
ISO 17497-2:2012 Formula (5) Directional diffusion coefficient (QRD, model arc) 0.1099 (+/-0) 0.1099 0
ISO 17497-2:2012 Formula (5) Directional diffusion coefficient (flat reference) 0.0049 (+/-0) 0.0049 0
ISO 17497-2:2012 Formula (7) Normalised diffusion coefficient (QRD, model arc) 0.1055 (+/-0) 0.1055 0
Cox & D'Antonio 3e App. B (2D BEM) Normalised diffusion d_n, N=7 QRD x 6 periods, 200 Hz band (low-band anchor) 0 (+/-0.015) 0 0
Cox & D'Antonio 3e App. B (2D BEM) Normalised diffusion d_n, N=7 QRD x 6 periods, 250 Hz band (low-band anchor) 0.01 (+/-0.015) 0.001 -0.009
Cox & D'Antonio 3e App. B (2D BEM) Normalised diffusion d_n, N=7 QRD x 6 periods, 315 Hz band (low-band anchor) 0.01 (+/-0.015) 0.002 -0.008
Cox & D'Antonio 3e App. B (2D BEM) Normalised diffusion d_n, N=7 QRD x 6 periods, 400 Hz band (low-band anchor) 0.01 (+/-0.015) 0.008 -0.002
ISO 17497-2:2012 Formula (8) Zenith area factor (radians convention) 1.57105 (+/-0) 1.57105 0
Cox & D'Antonio Eq (10.3) QRD deepest well depth (N=7, f0=500 Hz) 0.196 m (+/-0 m) 0.196 m 0 m
Cox & D'Antonio Eq (5.8) + ISO 17497-2 Formula (7) Flat-panel predicted normalised diffusion (self-reference zero) 0 (+/-0) 0 0
Cox & D'Antonio Eq (5.8) + ISO 17497-2 Formula (7) QRD predicted normalised diffusion at 2 kHz (above flat panel) 0.208 (+/-0) 0.208 0
In-situ road absorption (ISO 13472): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
ISO 13472-1:2002 Clause 4.2 Geometrical-spreading factor Kr 0.6667 (+/-0) 0.6667 0
ISO 13472-1:2002 Annex A Maximum-sampled-area radius 1.3425 m (+/-0 m) 1.3425 m 0 m
ISO 13472-2:2010 Clause 5.4.1 Spot-tube upper usable frequency f_u 1989.4 Hz (+/-0.1 Hz) 1989.4 Hz 0 Hz
Precision sound power (ISO 3745 / 9614-3): 100% (4/4)
Standard Quantity Expected (norm) Computed Δ Status
ISO 3745:2012 Clause 10.5 EXAMPLE Expanded uncertainty U (k=2) 4.123 dB (+/-0.001 dB) 4.123 dB 0 dB
ISO 3745:2012 Eq (11) K1 background floor (6 dB edge band) 1.2563 dB (+/-0.0001 dB) 1.2563 dB 0 dB
ISO 3745:2012 Eq (16) Meteorological C1 at 23 C reference -0.1282 dB (+/-0.0001 dB) -0.1282 dB 0 dB
ISO 9614-3:2002 Eqs (5)/(8)/(9) Uniform-intensity LW recovery 80 dB (+/-0 dB) 80 dB 0 dB
Human vibration (ISO 8041 / 2631 / 5349): 100% (15/15)
Standard Quantity Expected (norm) Computed Δ Status
ISO 8041-1:2017 Table B.8 Wk design-goal factor at 6,31 Hz 1.054 (+/-0.1%) 1.0544 0
ISO 8041-1:2017 Table B.9 Wm design-goal factor at 1,585 Hz 0.9342 (+/-0.1%) 0.9342 0
ISO 8041-1:2017 Table 1 Wh factor at the 500 rad/s reference 0.202 (+/-0.15%) 0.202 0
ISO 8041-1:2017 Table B.1 Wb design-goal factor at 6,31 Hz 1.054 (+/-0.1%) 1.0545 0
ISO 8041-1:2017 Table B.1 Wb design-goal factors at 1 / 100 Hz max rel dev ≤ 0,1 % 0.000267 0
ISO 8041-1:2017 Table 1 Wc factor at the 100 rad/s reference 0.5145 (+/-0.1%) 0.5145 0
ISO 8041-1:2017 Table 1 + Table B.3 Wd factors at the 100 rad/s reference and 1 Hz max rel dev ≤ 0,1 % 0.000162 0
ISO 8041-1:2017 Table B.4 We design-goal factor at 8 Hz 0.1263 (+/-0.1%) 0.1263 0
ISO 8041-1:2017 Table B.5 Wf design-goal factors at 0,1585 / 0,1 Hz max rel dev ≤ 0,1 % 0.000098 0
ISO 8041-1:2017 Table B.7 Wj design-goal factors at 6,31 / 8 Hz max rel dev ≤ 0,1 % 0.00001 0
ISO 8041-1:2017 Table 5 + Annex B All nine weightings inside the tolerance envelope (318 printed bands) 0 bands outside the Table 5 tolerances 0 0
ISO 5349-2:2001 Example E.2.1 Single-tool daily exposure A(8) 4.1 m/s^2 (+/-0.05 m/s^2) 4.14 m/s^2 0.037 m/s^2
ISO 5349-2:2001 Example E.3 Forestry three-task A(8) 3.6 m/s^2 (+/-0.05 m/s^2) 3.61 m/s^2 0.01 m/s^2
ISO 5349-1:2001 Eq. (C.1) VWF 10 % lifetime Dy at A(8)=7 4 yr (+/-0.1 yr) 4.04 yr 0.042 yr
Directive 2002/44/EC Art. 3 HAV/WBV action & limit values HAV 2.5/5.0, WBV 0.5/1.15 m/s^2 HAV 2.5/5.0, WBV 0.5/1.15 m/s^2 0
Speech intelligibility (ANSI S3.5-1997): 100% (7/7)
Standard Quantity Expected (norm) Computed Δ Status
ANSI S3.5-1997 Table 3 Band-importance function normalisation 1 (+/-0) 1 0
ANSI S3.5-1997 clause 5.4 Equivalent masking spectrum level at 200 Hz -1.665 (+/-0.001) -1.665 0
ANSI S3.5-1997 clause 5.6 Equivalent disturbance in quiet at 5000 Hz -23.6 dB (+/-0.01 dB) -23.6 dB 0 dB
ANSI S3.5-1997 clause 6 SII, noise 30 dB plus hearing loss 40 dB 0.2185 (+/-0.0001) 0.2185 0
R CRAN 'SII' Example C.2 One-third-octave method, independent oracle 0.851375 (+/-0.0001) 0.851375 0
ANSI S3.5-1997 clause 6 SII, standard speech in quiet, normal hearing 0.99582517 (+/-0.000001) 0.99582517 0
ANSI S3.5-1997 Table 3 Loud-effort speech spectrum level at 1 kHz 42.16 dB (+/-0 dB) 42.16 dB 0 dB
Objective intelligibility (STOI / ESTOI): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
Taal et al. 2011 (Eq. 6, degenerate) STOI of a signal against itself = 1 (perfect correlation) 1 (+/-0.000001) 1 0
Jensen & Taal 2016 (Eq. 8, degenerate) ESTOI of a signal against itself = 1 (perfect spectral correlation) 1 (+/-0.000001) 1 0
Taal et al. 2011 (monotonicity with SNR) STOI rises from -15 dB to +25 dB SNR speech-shaped noise STOI(+25 dB) - STOI(-15 dB) > 0.2 0.462 (0.389 -> 0.851) 0
Impulsive-sound prominence (NT ACOU 112): 100% (2/2)
Standard Quantity Expected (norm) Computed Δ Status
NT ACOU 112:2002 Formula 1 Predicted prominence, OR=1000 dB/s, LD=30 dB 11.9542 (+/-0.0001) 11.9542 0
NT ACOU 112:2002 Formula 2 Adjustment KI to LAeq at prominence P=10 9 dB (+/-0 dB) 9 dB 0 dB
Impulsive-sound prominence (ISO/PAS 1996-3): 100% (2/2)
Standard Quantity Expected (norm) Computed Δ Status
ISO/PAS 1996-3:2022 3.5 Onset rate of a 30 dB ramp over 0.30 s 100 dB/s (+/-0 dB/s) 100 dB/s 0 dB/s
ISO/PAS 1996-3:2022 Formula 3 Adjustment KI of the ramp onset 7.1176 dB (+/-0 dB) 7.1176 dB 0 dB
Room noise (ANSI S12.2-2019): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
ANSI S12.2-2019 Table 1 NC-40 curve, tangency self-consistency 40 (+/-0) 40 0
ANSI S12.2-2019 Table D.1 RC-31 Mark II curve, 63 Hz level 51 (+/-0) 51 0
ANSI S12.2-2019 clause D.4 RC-35 curve, mid-frequency average LMF 35 (+/-0) 35 0
Hearing threshold (ISO 7029 / ISO 389-7): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
ISO 7029:2017 Table 1 Median threshold, male age 60 at 4 kHz 20.209 dB (+/-0.001 dB) 20.208 dB 0 dB
ISO 7029:2017 Table 2 Upper spread su, male age 60 at 1 kHz 10.153 dB (+/-0.001 dB) 10.153 dB 0 dB
ISO 389-7:2005 Table 1 Free-field reference threshold at 1 kHz 2.4 dB (+/-0 dB) 2.4 dB 0 dB
Measurement uncertainty (GUM / Supplement 1): 100% (7/7)
Standard Quantity Expected (norm) Computed Δ Status
ISO/IEC Guide 98-3-1 clause 9.2 Combined uncertainty, additive model 2 (+/-0) 2 0
ISO/IEC Guide 98-3 Table G.2 Coverage factor, p=0.99, v=16 2.92 (+/-0.005) 2.921 0.001
ISO/IEC Guide 98-3 Annex G.4 Welch-Satterthwaite effective dof 40 (+/-0) 40 0
ISO/IEC Guide 98-3 Annex H.1 End-gauge combined uncertainty uc, nm 31.71 nm (+/-0.01 nm) 31.71 nm 0.001 nm
ISO/IEC Guide 98-3 Annex H.1 End-gauge expanded uncertainty U99, nm 92.1 nm (+/-0.1 nm) 92.1 nm 0.04 nm
ISO/IEC Guide 98-3 Annex H.2 (Table H.3) Correlated V/I/phi budget: uc(R), ohm 0.071 ohm (+/-0.001 ohm) 0.071 ohm 0 ohm
ISO/IEC Guide 98-3-1 Table 3 (clause 9.2.3) Seeded Monte Carlo, rectangular sum: 95 % interval endpoint +/-3.88 (u = 2.0) +/-3.886 (u = 2.002) 0.006
Noise-induced hearing loss (ISO 1999): 100% (6/6)
Standard Quantity Expected (norm) Computed Δ Status
ISO 1999:2013 Table D.2 Median NIPTS, 4 kHz, 90 dB, 20 yr 13 dB (+/-0.5 dB) 12.9 dB -0.057 dB
ISO 1999:2013 Table D.2 Worst-10 % NIPTS, 4 kHz, 90 dB, 20 yr 18 dB (+/-0.5 dB) 17.8 dB -0.239 dB
ISO 1999:2013 Table D.4 Worst-10 % NIPTS, 3 kHz, 100 dB, 40 yr 60 dB (+/-0.5 dB) 59.8 dB -0.172 dB
ISO 1999:2013 Annex C, Formulae (C.6) to (C.8) NIPTS at 1/2/4 kHz, 90 dB, 30 yr, Q = 10 % (annex inputs) 0, 9, 19 dB 0, 9, 19 dB 0 dB
ISO 1999:2013 Annex C, Formula (C.5) Compressed 4 kHz shift, Formula (1) with the annex's H = 36 dB 13.3 dB (+/-0.1 dB) 13.3 dB 0 dB
ISO 1999:2013 Annex C, Formula (C.11) Hearing threshold level with age and noise, 1/2/4 kHz mean, Q = 10 % 31.1 dB (+/-0.1 dB) 31.1 dB 0 dB
Multiple-shock whole-body vibration (ISO 2631-5): 100% (6/6)
Standard Quantity Expected (norm) Computed Δ Status
ISO 2631-5:2018 Formula 3 Daily acceleration dose, 5 x 40 m/s2 peaks 55.97 m/s2 (+/-0.01 m/s2) 55.97 m/s2 -0.002 m/s2
ISO 2631-5:2018 Formula C.3 Stress variable R, Annex C male example 1.22 (+/-0.01) 1.22 0
ISO 2631-5:2018 Formula C.5 Injury probability, Annex C male example 0.37 (+/-0.01) 0.37 -0.003
ISO 2631-5:2018 Annex C NOTE 5 Compressive stress Sd, female example 1.4 MPa (+/-0.01 MPa) 1.4 MPa -0.001 MPa
ISO 2631-5:2018 Annex C NOTE 5 Stress variable R, female example 0.97 (+/-0.01) 0.96 -0.008
ISO 2631-5:2018 Formula 1 vs Annex D Table D.1 Seat-to-spine transfer vs the 256 Hz digital filter (0,5-80 Hz) max abs(Formula 1 - filter) ≤ 0,04 0.001 0.001
Sound absorption in enclosed spaces (EN 12354-6): 100% (2/2)
Standard Quantity Expected (norm) Computed Δ Status
EN 12354-6:2003 Formula 1 Equivalent absorption area, Annex E bare room 2.26 m2 (+/-0.01 m2) 2.26 m2 0.003 m2
EN 12354-6:2003 Formula 5 Reverberation time, Annex E bare room 2.1 s (+/-0.1 s) 2.1 s 0.003 s
Prominent discrete tones (ECMA-418-1): 100% (2/2)
Standard Quantity Expected (norm) Computed Δ Status
ECMA-418-1:2024 Clause 10 Formula (2) Critical band at 1 kHz (f1,c / f2,c / dfc) dfc 162.2 Hz (+/-0.05 Hz); edges 922.2-1084.4 Hz dfc 162.22 Hz; edges 922.2-1084.4 Hz 0.017 Hz
ECMA-418-1:2024 Clause 11.6 Formula (14) Proximity spacing dfprox at 150 / 850 Hz 23 Hz @ 150 Hz; 63.8 Hz @ 850 Hz (+/-0.5 Hz) 23.0 Hz; 63.8 Hz +0.004; +0.044 Hz
Tonal audibility (ISO/PAS 20065): 100% (11/11)
Standard Quantity Expected (norm) Computed Δ Status
ISO/PAS 20065:2016 Formulae (12)-(14) Audibility at 137.3 Hz, Annex E spectrum 1 4.99 dB (+/-0.05 dB) 5.01 dB 0.022 dB
ISO/PAS 20065:2016 Formula (13) Masking index av at 137.3 / 592.2 Hz -2.02 dB @ 137.3 Hz; -2.4 dB @ 592.2 Hz (+/-0.005 dB) -2.017 dB; -2.400 dB +0.003; +0.000 dB
ISO/PAS 20065:2016 Formula (20) Mean audibility of the five spectra, Annex E 6.96 dB (+/-0.05 dB) 6.98 dB 0.018 dB
ISO/PAS 20065:2016 Formula (6) Mean narrow-band level LS from spectrum, Table E.1 49.22 dB (+/-0.02 dB) 49.22 dB -0.001 dB
ISO/PAS 20065:2016 Clause 6 Extended uncertainty U of the 137.3 Hz tone, Table E.2 2.79 dB (+/-0.02 dB) 2.8 dB 0.006 dB
ISO/PAS 20065:2016 Formulae (28)-(29) Extended uncertainty of the mean audibility, Annex E Step 4 1.38 dB (+/-0.01 dB) 1.38 dB -0.003 dB
ISO/PAS 20065:2016 Formula (8) Tone level LT from spectrum, Table E.1 67.96 dB (+/-0.02 dB) 67.96 dB -0.005 dB
ISO/PAS 20065:2016 Clause 5.3.8 Tone detection over the spectrum, Table E.1 tones at [118.4, 137.3, 158.8] Hz tones at [118.4, 137.3, 158.8] Hz exact
ISO/PAS 20065:2016 Clause 5.3.8 Step 3 Same-band FG combination inside analyze_spectrum, Table E.2 row 2 FG 72.15 dB (+/-0.02 dB) 72.15 dB -0.002 dB
ISO/PAS 20065:2016 Formula (17) Multi-tone FG combination, Table E.1 72.15 dB (+/-0.02 dB) 72.15 dB -0.002 dB
ISO/PAS 20065:2016 Formulae (18)/(19) Two-tone separation fD (DIN 45681 Annex J), 137.3 / 212 Hz fD(137.3)=24.09, fD(212)=21.0 Hz; Annex E pair combined fD(137.3)=24.09, fD(212)=21.00 Hz; Annex E pair combined exact
Psychoacoustic annoyance & fluctuation strength (Fastl & Zwicker): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
Fastl & Zwicker Eqs (16.2)-(16.4) Psychoacoustic annoyance, worked (N5,S,F,R) tuple 37.0478 (+/-0.001) 37.0477 0
Fastl & Zwicker Eq (10.2) Fluctuation strength of AM broadband noise (60 dB, m=1, 4 Hz) 3.6943 vacil (+/-0.001 vacil) 3.6943 vacil 0 vacil
Fastl & Zwicker Ch. 10 / Osses et al. 2016 Fluctuation-strength calibration: 1 kHz / 60 dB / m=1 / 4 Hz AM tone 1 vacil (+/-0.05 vacil) 1 vacil 0 vacil
Electroacoustics: distortion & frequency response: 100% (20/20)
Standard Quantity Expected (norm) Computed Δ Status
IEC 60268-3:2013 (14.12.3.2) THD (rel. total RMS, the R convention the clause defines) 0.112853 (+/-0.0001) 0.112853 0
Closed-form harmonic synthesis (THD_F convention) THD (rel. fundamental, the widespread datasheet convention) 0.113578 (+/-0.0001) 0.113578 0
IEC 60268-5:2003 (20.3/20.4) Characteristic sensitivity level, 1 W into 8 ohm at 1 m (flat 90 dB) 90 dB (+/-0.000001 dB) 90 dB 0 dB
IEC 60268-5:2003 (21.2) Effective frequency range = -10 dB crossings (50 Hz / 18 kHz) 50 Hz / 18000 Hz (ref -10 dB crossings) 50.000 Hz / 18000.0 Hz -0.000 / -0.000 Hz
IEC 60268-3:2013 (14.12.5) 2nd-order harmonic distortion d2 (rel. total) 0.099361 (+/-0.0001) 0.099361 0
IEC 60268-4:2014 (11.1/11.3) Microphone sensitivity level, 12.5 mV/Pa -> 20 lg 0.0125 dB re 1 V/Pa -38.0618 dB (+/-0.00001 dB) -38.0618 dB 0 dB
IEC 60268-4:2014 (12.2) Effective frequency range = +/-3 dB tolerance crossings (40 Hz / 18 kHz) 40 Hz / 18000 Hz (+/-3 dB tolerance crossings) 40.000 Hz / 18000.0 Hz 0.000 / -0.000 Hz
IEC 60268-4:2014 (13.2.2) Directivity index of the ideal cardioid, 10 lg 3 dB (11.2.2 a integral) 4.771213 dB (+/-0.005 dB) 4.771214 dB 0 dB
IEC 60268-4:2014 (17.2) Equivalent noise level, 2.5 uV over 12.5 mV/Pa -> 200 uPa = 20 dB SPL 20 dB SPL (+/-0 dB SPL) 20 dB SPL 0 dB SPL
IEC 60268-3:2013 (14.12.7.2 g) Modulation distortion d_m,2 (arithmetic sideband sum over U_2,f2) 0.16 (+/-0.0001) 0.16 0
IEC 60268-3:2013 (14.12.7.2 h) Modulation distortion d_m,3 (arithmetic sideband sum over U_2,f2) 0.08 (+/-0.0001) 0.08 0
IEC 60268-3:2013 (14.12.8.1 a) Difference-frequency distortion d_d,2 (over U_2,ref = 2 U_2,f2) 0.03 (+/-0.0001) 0.03 0
IEC 60268-3:2013 (14.12.8.1 b) Difference-frequency distortion d_d,3 (arithmetic product sum) 0.04 (+/-0.0001) 0.04 0
IEC 60268-3:2013 (14.12.10) Total difference-frequency distortion (8 kHz / 11.95 kHz tones) 0.03605551 (+/-0.0001) 0.03605551 0
ITU-R BS.468-4 Table 1 Weighting network response at the 6.3 kHz peak (14.12.11 network) 12.2 dB (+/-0 dB) 12.2 dB 0 dB
IEC 60268-3:2013 (14.12.9) DIM of the 15 kHz / 3.15 kHz signal (Table 2, 9 products) 0.168819 (+/-0.0001) 0.168819 0
Bendat & Piersol, Random Data 4e H1 recovers a known first-order IIR gain at 1 kHz 0.8954 (+/-2%) 0.8954 0
Bendat & Piersol, Random Data 4e Ordinary coherence = 1 for a noiseless LTI path 1 (+/-0.001) 1 0
AES17-2015 (6.4.2 / 5.2.7) Idle channel noise, 1 kHz -20 dBFS tone (CCIR-RMS -5.63 dB offset) -25.63 dB (+/-0.01 dB) -25.63 dB 0 dB
AES17-2015 (6.4.1) Dynamic range, full-scale reference over a -40 dBFS residual at 2 kHz 40 dB (+/-0.6 dB) 40.41 dB 0.414 dB
Calibrated spectral analysis (Bendat & Piersol): 100% (12/12)
Standard Quantity Expected (norm) Computed Δ Status
Bendat & Piersol, Random Data 4e Eq. (5.67) White-noise autospectral density = sigma^2/(fs/2) 0.000977 (+/-3%) 0.000982 0
Bendat & Piersol, Random Data 4e Eq. (8.158) PSD random error = 1/sqrt(nd) (Monte Carlo, 100 seeded records) 0.1768 (+/-6%) 0.1764 0
Bendat & Piersol, Random Data 4e Eq. (8.163) 95% chi-square confidence interval coverage (Monte Carlo) 0.95 (+/-0.025) 0.94 -0.01
Bendat & Piersol, Random Data 4e Eqs. (9.55)/(6.39) Coherent output spectrum of a known-SNR path: gamma^2 = SNR/(1+SNR) 0.7191 (+/-0.03) 0.7255 0.006
Closed-form power-law slope (10*lg(2) dB/octave per unit exponent) Pink-noise PSD slope over 20 Hz - 20 kHz, dB/octave -3.0103 dB/oct (+/-0.05 dB/oct) -3.0116 dB/oct -0.001 dB/oct
IEC 60268-1:1985 Clause A2.1 / Table AII 5 ms burst of 5 kHz tone at 48 kHz: gate RMS = A/sqrt(2) (integral periods) 0.707107 (+/-0) 0.707107 0
Harris 1978 closed form (DFT-even Hann) Hann window ENBW = n*sum(w^2)/sum(w)^2 = 3/2 exactly 1.5 (+/-0) 1.5 0
Constant-power 1/n-octave kernel (closed form) 1/3-octave smoothed line level = Pdf/(f0(2^(1/6)-2^(-1/6))) 0.021592 (+/-1e-07%) 0.021592 0
Percival & Walden 1993, Table 382 Slepian taper concentration lambda_14(31, 8/31), quadruple-precision table 0.92943822082 (+/-0.000000000001) 0.92943822082 0
Percival & Walden 1993, Section 7.2 / Eq. (333) Multitaper white-noise density = sigma^2/(fs/2), NW=4, K=7 tapers 0.000977 (+/-3%) 0.000963 0
Percival & Walden 1993, Eq. (369a) tone calibration Multitaper 'spectrum' scaling reads a sinusoid peak at A^2/2 4.5 (+/-0.01%) 4.500003 0
Percival & Walden 1993, Eq. (370b) Adaptive multitaper dof -> 2K on white noise (weights -> uniform) 14 (+/-2%) 13.9847 -0.015
Multiple-input coherence (Bendat & Piersol): 100% (5/5)
Standard Quantity Expected (norm) Computed Δ Status
Bendat & Piersol, Random Data 4e Problem 7.2 / Eqs. (7.86)/(7.94) Conditioned coherent output of the 2nd input abs(G2y.1)^2/G22.1 = 4/3 exactly 1.333333333 (+/-0) 1.333333333 0
Bendat & Piersol, Random Data 4e Problem 7.2 / Eqs. (7.87)/(7.116) Partial coherence gamma^2_2y.1 = 2/15 and multiple coherence = 0.7 0.7 (+/-0) 0.7 0
Bendat & Piersol, Random Data 4e Eq. (7.35) with Eqs. (6.40)/(6.41) Multiple coherence of a known-SNR system: gamma^2_{y:x} = SNR/(1+SNR) 0.8889 (+/-0.03) 0.8913 0.002
Bendat & Piersol, Random Data 4e Eq. (7.117) Uncorrelated inputs: multiple coherence = sum of ordinary coherences 0 (+/-0.02) -0.0098 -0.01
Bendat & Piersol, Random Data 4e Eqs. (7.88)/(7.121) Output-power decomposition Gyy = sum of Gvi + Gnn (exact) 0 (+/-0.000000000001) 0 0
Time-frequency analysis (Bendat & Piersol): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
Bendat & Piersol, Random Data 4e Eq. (12.173) Spectrogram of an on-bin tone reads its mean square A^2/2 in every column 2 (+/-1e-07%) 2 0
Parseval + COLA identity (Hann taper, 75% overlap) Time-integrated STFT power = time-domain energy of an interior burst 0.236151 (+/-1e-10%) 0.236151 0
Bendat & Piersol, Random Data 4e Eqs. (11.128)-(11.130) Zoom FFT tone amplitude = demodulate-decimate-DFT chain, machine precision 0.7 (+/-1e-10%) 0.7 0
Correlation, time delay and envelope (B&P / Knapp & Carter): 100% (7/7)
Standard Quantity Expected (norm) Computed Δ Status
Bendat & Piersol, Random Data 4e Eq. (5.21) Cross-correlation peak of a 16-sample pure delay, samples 16 (+/-0.001) 16 0
Knapp & Carter 1976, Table I (PHAT) + sub-sample interpolation GCC-PHAT estimate of an exact 12.25-sample fractional delay, samples 12.25 (+/-0.005) 12.2483 -0.002
Bendat & Piersol, Random Data 4e Eq. (5.101) Cross-spectrum phase-slope estimate of the same fractional delay 12.25 (+/-0.001) 12.2498 0
Bendat & Piersol, Random Data 4e Eq. (8.120) BLWN autocorrelation coefficient at 3 samples vs sin(2piBt)/(2piBt) -0.1559 (+/-0.02) -0.1666 -0.011
Bendat & Piersol, Random Data 4e Example 8.5 Random error of the correlation peak: B=100 Hz, T=5 s, M/S=N/S=10 0.35 (+/-0.001) 0.3493 -0.001
Bendat & Piersol, Random Data 4e Table 13.1 Hilbert transform of cos recovers sin: max interior error 0 (+/-0) 0 0
Bendat & Piersol, Random Data 4e Eq. (13.27) Envelope of an AM waveform recovers 1 + mcos(2pifm*t) exactly 0 (+/-0) 0 0
Cepstrum, liftering and envelope spectrum (Havelock / B&P): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
Havelock 2008 Ch. 27 Fig. 21 + Mercator series of ln(1+ae^{-jtheta}) Power-cepstrum height at the echo delay = reflection coefficient a 0.4 (+/-0) 0.4 0
Havelock 2008 Ch. 87 Eq. (14): complex cepstrum, series term n = 2 Second rahmonic of a reflection a = 0.4 equals -a^2/2 -0.08 (+/-0) -0.08 0
Bendat & Piersol, Random Data 4e Sec. 13.3 (Fig. 13.11) Envelope-spectrum line of an AM tone (A0 = 2, m = 0.35) at fm 0.7 (+/-0.002) 0.7 0
Time synchronous averaging (McFadden 1987): 100% (5/5)
Standard Quantity Expected (norm) Computed Δ Status
McFadden 1987 Eq. 8 / Eq. 9: comb filter |C(f)| at a harmonic k/T Comb-filter tooth height at a harmonic equals unity (any N) 1 (+/-0) 1 0
McFadden 1987 Eq. 8: comb filter one quarter-order from a tooth, N = 2 Comb-filter magnitude = 1/sqrt(2) at order 0.25 0.70710678 (+/-0) 0.70710678 0
McFadden 1987 Sec. 4 (Fig. 5): node selection, tone at 32.05 orders N = 20 places a comb node on 32.05 orders (|C| = 0), not the power-of-2 N = 32 0 (+/-0.0000000001) 0 0
McFadden 1987 Eq. 5: exact recovery, integer samples per period Noiseless periodic waveform (M = 256) recovered to machine precision 0 (+/-0.0000000001) 0 0
McFadden 1987 Sec. 1: asynchronous-noise variance reduced by 1/N Residual noise std of the average falls as sigma/sqrt(N), N = 64 0.125 (+/-15%) 0.12414 -0.001
Data qualification and Rice statistics (Bendat & Piersol): 100% (8/8)
Standard Quantity Expected (norm) Computed Δ Status
Bendat & Piersol, Random Data 4e Example 4.4 Reverse arrangements of the 20-observation sequence 86 (+/-0) 86 0
Bendat & Piersol, Random Data 4e Table A.6 Lower percentage point A(20; 0.975) at alpha = 0.05 64 (+/-0) 64 0
Bendat & Piersol, Random Data 4e Table A.6 Upper percentage point A(20; 0.025) at alpha = 0.05 125 (+/-0) 125 0
Wald & Wolfowitz 1940 exact run distribution Runs acceptance region for n1 = n2 = 10, alpha = 0.05: lower point 6 (+/-0) 6 0
Wald & Wolfowitz 1940 exact run distribution Runs acceptance region for n1 = n2 = 10, alpha = 0.05: upper point 15 (+/-0) 15 0
Bendat & Piersol, Random Data 4e Example 5.13 / Eq. (5.195) Zero-crossing rate of bandlimited noise (fc = 1 kHz, B = 400 Hz) 2013 (+/-1%) 2013 -0.551
Bendat & Piersol, Random Data 4e Example 5.12 Apparent frequency of low-pass noise (B = 2 kHz) = 0.577 B 1155 (+/-1%) 1159 3.911
Bendat & Piersol, Random Data 4e Example 5.14 / Eq. (5.206) Prob[positive peak > 4 sigma] of a narrow bandwidth record 0.000335 (+/-0.00001) 0.000334 0
Underwater acoustics (ISO 18405/17208/18406): 100% (6/6)
Standard Quantity Expected (norm) Computed Δ Status
ISO 18405:2017 / ISO 18406 Formula 7 Sound pressure level of a synthetic tone, dB re 1 µPa 123.0103 (+/-0.0001) 123.0103 0
ISO 18405:2017 / ISO 18406 Formulae 3-4 Sound exposure level of a 2 s tone, dB re 1 µPa²·s 120 (+/-0.001) 120 0
ISO 18406:2017 (6.4.2.1.3) Peak sound pressure level of a known waveform, dB re 1 µPa 129.5424 (+/-0.0001) 129.5424 0
ISO 17208-1:2016 Radiated noise level from RMS pressure and distance, dB re 1 µPa·m 46.0206 (+/-0.0001) 46.0206 0
ISO 17208-2:2019 (Formula 3) Lloyd's-mirror surface correction ΔL at a known k·d_s -3.5211 (+/-0.0001) -3.5211 0
ISO 18406:2017 (Formulae 8-9) Cumulative SEL of N identical strikes = SEL_ss + 10·lg(N) 196.9897 (+/-0) 196.9897 0
Underwater sound propagation (transmission loss): 100% (16/16)
Standard Quantity Expected (norm) Computed Δ Status
Mackenzie (1981) nine-term equation Speed of sound at 25 °C, 35 ‰, 1000 m (canonical check value), m/s 1550.744 m/s (+/-0.01 m/s) 1550.744 m/s 0 m/s
UNESCO/Chen-Millero vs Mackenzie Sound-speed agreement at 10 °C, 35 ‰, 1000 m (cross-model), m/s 1506.264 m/s (+/-1 m/s) 1506.524 m/s 0.261 m/s
Del Grosso (1974) vs Mackenzie Sound-speed agreement at 10 °C, 35 ‰, 1000 m (cross-model), m/s 1506.264 m/s (+/-1 m/s) 1506.313 m/s 0.049 m/s
Spherical spreading 20·lg(R) Geometrical spreading loss at R = 1000 m, dB 60 dB (+/-0 dB) 60 dB 0 dB
Thorp (1967) absorption Volume absorption α at 10 kHz (cold deep water), dB/km 1.1498 dB/km (+/-0 dB/km) 1.1498 dB/km 0 dB/km
Ainslie-McColm (1998) vs Francois-Garrison (1982) Absorption agreement at 10 kHz, 10 °C, 35 ‰, 0 m, pH 8, dB/km 0.9626 dB/km (+/-0.0963 dB/km) 0.9866 dB/km 0.024 dB/km
Francois-Garrison (1982) Part II Table IV Absorption α at 100 kHz, 10 °C, 35 ‰, 0 m, pH 8 (printed value), dB/km 33.6 dB/km (+/-0.05 dB/km) 33.63 dB/km 0.03 dB/km
Del Grosso refit (Wong-Zhu 1995 Table IV) c(t90 = 20 °C, S = 35, P = 500 bar) vs the printed check table, m/s 1603.679 m/s (+/-0.001 m/s) 1603.679 m/s 0 m/s
Wales-Heitmeyer (2002) ensemble spectrum Merchant-ship source PSD at 100 Hz (printed equation), dB re 1 µPa²/Hz 158.45 dB (+/-0.001 dB) 158.45 dB 0 dB
Passive sonar equation (Urick/Etter) Figure of merit SL − (NL − DI) − DT, dB 85 dB (+/-0 dB) 85 dB 0 dB
Seabed reflection (Rayleigh, normal incidence) Bottom loss at 90° grazing, sand ρ=1900 c=1650 over water, dB 9.0506 dB (+/-0 dB) 9.0506 dB 0 dB
Wenz wind noise (rule of fives) Wind spectrum level at 1 kHz, 5 kn (canonical anchor), dB re 1 µPa²/Hz 51.0206 dB (+/-0.0001 dB) 51.0206 dB 0 dB
Mellen thermal noise Thermal spectrum level at 50 kHz, 16.85 °C (physical), dB re 1 µPa²/Hz 19.3426 dB (+/-0 dB) 19.3426 dB 0 dB
JOMOPANS-ECHO ship source level Bulker V=13.5 kn L=211 m band level at 1 kHz (File S1 oracle), dB re 1 µPa m 161.394 dB (+/-0.01 dB) 161.394 dB 0 dB
UNESCO sound speed (EOS-80 canonical value) SVEL(S = 40, T68 = 40 °C, P = 1000 bar) vs Fofonoff & Millard 1983, m/s 1731.995 m/s (+/-0.02 m/s) 1732.004 m/s 0.009 m/s
Medwin (1975) sound speed (Ainslie Eqs. 1.2-1.4) ∂c/∂T at 10 °C, neglecting the bracketed terms, m/s per °C 3.5 m/s per °C (+/-0.001 m/s per °C) 3.5 m/s per °C 0 m/s per °C
Underwater propagation regimes (Weston flux theory): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
Ainslie (2010) Table 9.1, medium sand Reflection loss gradient η from Equation (9.51), Np/rad 0.28 Np/rad (+/-0.005 Np/rad) 0.278 Np/rad -0.002 Np/rad
Ainslie (2010) Table 9.1, mud Reflection loss gradient η from Equation (9.53) at 1 Hz, Np/rad 0.021 Np/rad (+/-0.0005 Np/rad) 0.02073 Np/rad 0 Np/rad
Weston cylindrical spreading vs normal modes Range-averaged TL in an ideal 100 m waveguide at 100 Hz, 20-30 km, dB 58.949 dB (+/-1 dB) 58.399 dB -0.55 dB
Marine-mammal auditory weighting (NMFS / Southall): 100% (4/4)
Standard Quantity Expected (norm) Computed Δ Status
NMFS (2018) Appendix D worked example Weighting factor adjustment W(1 kHz) for high-frequency cetaceans, dB -37.55 dB (+/-0.01 dB) -37.545 dB 0.005 dB
NMFS (2024) v3.0 Table 5, otariid C C recomputed as the peak of W(f) for the OW row (printed 1.37, corrected 1.36), dB 1.3643 dB (+/-0.0005 dB) 1.3643 dB 0 dB
Ainslie (2010) Equation (11.159), orca audiogram Hearing threshold at 50 kHz (third branch), dB re 1 µPa 51.2 dB (+/-0.05 dB) 51.199 dB -0.001 dB
Ainslie (2010) §11.4.6, orca versus salmon Noise-limited figure of merit (SL + TS − NL + AG − DT)/2, dB re m² 51 dB (+/-0 dB) 51 dB 0 dB
Underwater numerical propagation (modes / rays / PE): 100% (4/4)
Standard Quantity Expected (norm) Computed Δ Status
Normal modes vs ideal waveguide Fundamental horizontal wavenumber kr1 at 20 Hz, 100 m (analytic), rad/m 0.077662 rad/m (+/-0.0001 rad/m) 0.077662 rad/m 0 rad/m
Normal modes vs image-source oracle Absolute TL at 1 km in the ideal waveguide (converged image sum), dB 48.238 dB (+/-0.02 dB) 48.239 dB 0.001 dB
Ray tracing vs linear gradient Turning depth of a 10° ray, c = 1500 + 0.05z (circular arc), m 462.8 m (+/-1 m) 462.8 m 0 m
Parabolic equation vs free field PE transmission loss at 2 km, homogeneous medium (spherical spreading), dB 66.021 dB (+/-0.1 dB) 66.021 dB 0 dB
Aircraft noise (ICAO Annex 16 / IEC 61265): 100% (15/15)
Standard Quantity Expected (norm) Computed Δ Status
ECAC Doc 29 noise fraction (half path) Finite-segment correction ΔF for a perpendicular foot at the segment start, dB -3.0103 dB (+/-0.001 dB) -3.0103 dB 0 dB
ECAC Doc 29 single-event chain SEL of a long level flyover vs the infinite-path limit LE∞ + ΔI − Λ, dB 83.444 dB (+/-0.01 dB) 83.444 dB 0 dB
ECAC Doc 29 impedance adjustment (standard atmosphere) Acoustic-impedance adjustment of NPD data at 15 °C / 101.325 kPa (Eq. 4-6/4-7), dB 0.074 dB (+/-0.0005 dB) 0.0741 dB 0 dB
ECAC Doc 29 reference workbook (segment Λ) Lateral attenuation of a climbing segment vs the ECAC Vol 3 Part 1 workbook, dB 6.3769 dB (+/-0.01 dB) 6.3769 dB 0 dB
ECAC Doc 29 start-of-roll directivity (jet) ΔSOR behind a takeoff ground-roll segment vs the Vol 3 Part 1 workbook, dB 0.3196 dB (+/-0.01 dB) 0.3196 dB 0 dB
ECAC Doc 29 start-of-roll directivity (turboprop) ΔSOR behind a takeoff ground-roll segment (turboprop, Eq. 4-24b), dB 1.0943 dB (+/-0.01 dB) 1.0944 dB 0 dB
ECAC Doc 29 workbook event assembly (JETFDS/R03, behind SOR) Energy sum of the reference per-segment SELs vs the B-1 event total, dB 74.73 dB (+/-0.01 dB) 74.733 dB 0.003 dB
SAE ARP 5534 band-attenuation continuity SAE-Method δ_B at the 150 dB branch split (Eq. 7 vs Eq. 8), dB 123.95 dB (+/-0.01 dB) 123.953 dB 0.003 dB
EASA ANP database round-trip Interpolated NPD level at a tabulated node vs the published ANP value, dB 98.8 dB (+/-0 dB) 98.8 dB 0 dB
ECAC Doc 29 NPD interpolation Log-linear NPD level at the log-midpoint distance (Eq. 4-4), dB 97 dB (+/-0 dB) 97 dB 0 dB
SAE ARP 5534 pure-tone coefficient (ISO 9613-1) Mid-band α at 1 kHz, 25 °C, 70 % RH, 101.325 kPa, dB/m 0.006186 dB/m (+/-0 dB/m) 0.006186 dB/m 0 dB/m
ICAO Annex 16 Vol. I App. 2 Table A2-3 Perceived noisiness at SPL(b), 1 kHz band, in noys 1 (+/-0) 1 0
ICAO Doc 9501 ETM Vol. I Table 3-7 Tone correction of the turbofan example, dB 2 (+/-0) 2 0
ICAO Doc 9501 ETM Vol. I Table 4-4 Integrated-method reference EPNL, EPNdB 92.619 EPNdB (+/-0.01 EPNdB) 92.619 EPNdB 0 EPNdB
IEC 61265:1995 Table 1 Directional-response tolerance at 4 kHz / 90°, dB 2 dB (+/-0 dB) 2 dB 0 dB
Rotorcraft noise (ECAC Doc 32 / NORAH2): 100% (12/12)
Standard Quantity Expected (norm) Computed Δ Status
ECAC Doc 32 atmospheric attenuation (Table 4) ΔLa over a 1 km excess path at 1 kHz vs the NORAH2 guidance Table 4, dB 6.3 dB (+/-0.2 dB) 6.186 dB -0.114 dB
ECAC Doc 32 spherical spreading ΔLs at ten times the 60 m hemisphere reference distance (Eq. 24), dB -20 dB (+/-0 dB) -20 dB 0 dB
ECAC Doc 32 ground effect (rigid limit) ΔLg over a rigid surface at grazing incidence tends to +6 dB (Eq. 29), dB 6 dB (+/-1 dB) 6 dB 0.002 dB
ECAC Doc 32 propagation chain (NORAH2 prototype) LA of a single-hemisphere emission vs the NORAH2 prototype single-event history (R22 approach, 223.66 m slant), dB(A) 55.87 dB(A) (+/-0.1 dB(A)) 55.886 dB(A) 0.016 dB(A)
ECAC Doc 32 flight-condition interpolation (NORAH2 Eq. 8) Distance-scaled triangle blend of three uniform hemispheres, hand-checked, dB 97.0367 dB (+/-0.001 dB) 97.0364 dB 0 dB
ECAC Doc 32 flight-path kinematics (Eq. 17) Airspeed of a straight climbing track, 40 m/s ground speed at a 5° path angle, m/s 40.15279 m/s (+/-0.0001 m/s) 40.15279 m/s 0 m/s
ECAC Doc 32 retarded time (Eq. 22) Recorded-time delay at 100 m slant distance, r/c with c = 346.1 m/s, s 0.288934 s (+/-0.00001 s) 0.288934 s 0 s
ECAC Doc 32 single event (Eq. 27) SEL − LASmax of a constant-speed level flyover, 10·lg(π·d/V) closed form, dB 7.982 dB (+/-0.1 dB) 7.942 dB -0.04 dB
NORAH2 guidance mean ground plane (Eq. 36-40) Intercept of the plane fitted to a symmetric 20 m roofline, hand-checked, m 10 m (+/-0 m) 10 m 0 m
NORAH2 guidance mean flow resistivity (Eq. 41) Log-average of equal 1e4 and 1e6 Pa·s/m2 halves, hand-checked, Pa·s/m2 100000 Pa·s/m² (+/-0 Pa·s/m²) 100000 Pa·s/m² 0 Pa·s/m²
NORAH2 guidance diffraction at grazing (Eq. 42) Pure diffraction with the edge on the line of sight, 10·lg 3, dB 4.7712 dB (+/-0.0001 dB) 4.7712 dB 0 dB
NORAH2 guidance screening path difference (§A.4.5) Rubber-band delta over a 40 m hill, hand-checked geometry, m 4.2848 m (+/-0 m) 4.2848 m 0 m
Wind-turbine noise (IEC 61400-11): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
IEC 61400-11:2012 Formula 30 Critical bandwidth about a 500 Hz tone, Hz 117.255 Hz (+/-0 Hz) 117.255 Hz 0 Hz
IEC 61400-11:2012 Formula 26 Apparent sound power level of a single band, dB re 1 pW 148.5139 dB (+/-0.0001 dB) 148.5139 dB 0 dB
IEC 61400-11:2012 Formulae 31-34 Tonal audibility of a synthetic clean tone, dB 16.38 dB (+/-0.06 dB) 16.38 dB -0.001 dB
Porous & multilayer absorbers (Mechel / Bies / Cox & D'Antonio): 100% (14/14)
Standard Quantity Expected (norm) Computed Δ Status
Bies 5e App. D Table D.1 / Mechel 2e G.11 (2) Delany-Bazley normalised Zc at X = 0.1, real part 1.3241 (+/-0) 1.3241 0
Bies 5e App. D Table D.1 / Mechel 2e G.11 (2) Delany-Bazley normalised Zc at X = 0.1, imaginary part -0.4694 (+/-0) -0.4694 0
Miki 1990 Eqs. (30)-(34) Miki normalised wavenumber at f/sigma = 0.1, real part 1.4523 (+/-0) 1.4523 0
Johnson et al. 1987 / Cox & D'Antonio 3e Eq. (6.19) JCA static viscous limit j w rho_e -> sigma, Pa s/m2 20000 Pa s/m2 (+/-0.01%) 20000 Pa s/m2 0 Pa s/m2
Mechel 2e Sect. D.3 Eq. (1) Hard-backed layer: TMM vs -j Zc cot(kd), max rel deviation 0 (+/-0) 0 0
Lossless-layer limit (Mechel 2e Sect. D.3-D.4) Air cavity over a rigid wall at lambda/4: alpha 0 (+/-0) 0 0
Mechel 2e Sect. D.5 Maximum statistical absorption of a locally reacting plane 0.951 (+/-0.001) 0.951 0
Cox & D'Antonio 3e Eq. (7.9) Membrane resonance 60/sqrt(m d), m = 5 kg/m2, d = 5 cm, Hz 120 Hz (+/-2%) 119.85 Hz -0.15 Hz
Maa 1998 Fig. 5 / Cox & D'Antonio 3e Fig. 7.28 Microperforated panel (d=t=0.2 mm, b=2.5 mm, D=6 cm): peak alpha 0.95 (+/-0.05) 0.956 0.006
Maa 1998 Eqs. (5a)/(10) MPP peak absorption vs 4r/(1+r)^2 with Maa's printed resistance 4r/(1+r)^2 = 0.949 0.956 0.007
Allard & Atalla 2e Sect. 11.3.4 (Eq. 6.90), Table 6.1 glass wool Zwikker-Kosten decoupling frequency Fd, Hz 43.27 Hz (+/-0.005 Hz) 43.271 Hz 0.001 Hz
Allard & Atalla 2e Eq. (11.55), printed p. 253 (prose limit) Limp effective density at DC = apparent total density rho_t, kg/m3 31.1809 kg/m3 (+/-0.01%) 31.1809 kg/m3 0 kg/m3
Allard & Atalla 2e Eq. (11.55), printed p. 253 (prose limit) Heavy frame recovers the rigid-frame Zc (relative deviation) 0 (+/-0.00001) 0 0
Allard & Atalla 2e printed p. 254 (Doutres et al. 2007) Limp-frame bulk-modulus limit for air, kPa 20 kPa (+/-0.3 kPa) 20.27 kPa 0.265 kPa
Slow-sound perfect absorbers (Jimenez et al. Appl. Sci. 2017): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
Jimenez et al. Appl. Sci. 2017 Eq. (9) Critical coupling: alpha at the design frequency (300 Hz, normal) 1 (+/-0.001) 1 0
Poiseuille limit (Stinson 1991) Slit: j w rho_s -> 12 eta / h^2 as w -> 0 (h = 1.2 mm) 153.3 Pa s/m2 (+/-0.1%) 153.3 Pa s/m2 0 Pa s/m2
Poiseuille limit (Stinson 1991) Square duct: j w rho -> 28.454 eta / w^2 as w -> 0 (w = 3 mm) 58.2 Pa s/m2 (+/-0.2%) 58.2 Pa s/m2 0 Pa s/m2
Program loudness (ITU-R BS.1770 / EBU R 128): 100% (8/8)
Standard Quantity Expected (norm) Computed Δ Status
ITU-R BS.1770-5 Annex 1 997 Hz sine at 0 dB FS on the left channel, LKFS -3.01 LKFS (+/-0.01 LKFS) -3.01 LKFS 0 LKFS
EBU Tech 3341:2023 Table 1 case 1 Integrated loudness of the -23 dBFS stereo sine, LUFS -23 LUFS (+/-0.1 LUFS) -22.99 LUFS 0.007 LUFS
EBU Tech 3341:2023 Table 1 case 5 Gated integrated loudness of the -26/-20/-26 dBFS steps, LUFS -23 LUFS (+/-0.1 LUFS) -22.98 LUFS 0.021 LUFS
EBU Tech 3341:2023 Table 1 case 6 Integrated loudness of the 5.0-channel sine (Table 3 weights), LUFS -23 LUFS (+/-0.1 LUFS) -23.02 LUFS -0.016 LUFS
EBU Tech 3341:2023 Table 1 case 15 True-peak level of the fs/4 sine at 0.5 FFS, dBTP -6 dBTP (+0.2/-0.4 dB) -6.02 dBTP -0.015 dBTP
EBU Tech 3341:2023 Table 1 case 19 True-peak level of the fs/4 sine at 1.41 FFS, dBTP 3 dBTP (+0.2/-0.4 dB) 3 dBTP 0.001 dBTP
EBU Tech 3342:2023 Table 1 case 1 Loudness range of the -20/-30 dBFS tone steps, LU 10 LU (+/-1 LU) 10 LU 0 LU
EBU Tech 3342:2023 Table 1 case 3 Loudness range of the -40/-20 dBFS tone steps, LU 20 LU (+/-1 LU) 20 LU 0 LU
2D FDTD wave simulation (Attenborough & Van Renterghem 2021, Ch. 4): 100% (4/4)
Standard Quantity Expected (norm) Computed Δ Status
Rigid rectangular box eigenfrequency Mode (1,1) of a 1.0 x 0.7 m rigid box, f = (c/2)*sqrt(1/lx^2 + 1/ly^2), Hz 299.06 Hz (+/-1.5 Hz) 298.91 Hz -0.153 Hz
Free-field pulse arrival delay Probe-to-probe delay of a pulse over 0.6 m of air, (r2 - r1)/c, ms 1.749 ms (+/-0.05 ms) 1.756 ms 0.007 ms
2D Kirchhoff-Helmholtz NTFF: monopole directivity Far-field pattern ripple of an enclosed line source, dB 0 dB (+/-0.2 dB) 0.044 dB 0.044 dB
2D Kirchhoff-Helmholtz NTFF: monopole level NTFF far-field level vs the 2D Green function A sqrt(2/(pi k)), dB 0 dB (+/-0.3 dB) 0.106 dB 0.106 dB
Swept-sine distortion & phase utilities (Farina / Novak): 100% (7/7)
Standard Quantity Expected (norm) Computed Δ Status
Farina 2000 / Novak et al. 2015 (Chebyshev identity) 3rd-harmonic response H3 magnitude of a cubic polynomial, re a3/4 0.05 (+/-0.0005) 0.05001 0
Novak et al. 2015, JAES 63(10), Eqs. 18/49 Synchronized-sweep phase of H3 (Chebyshev: -sin(3wt)), rad 3.1416 rad (+/-0.005 rad) 3.1411 rad 0 rad
Farina 2000, AES 108th Conv. (THD from one sweep) THD(1 kHz) of the polynomial vs sqrt((a2/2)^2+(a3/4)^2)/(1+3a3/4) 0.06149 (+/-0.001) 0.06159 0
Farina 2000 (distortion rejected from the linear IR) THD floor of a purely linear path (gain 0.5), max over 100-2000 Hz 0 (+/-0.001) 0.00033 0
Bendat & Piersol, Random Data 4e Sec. 13.1.4 (Hilbert relation) Min-phase reconstruction of a strictly min-phase biquad, max err, rad 0 rad (+/-0 rad) 0 rad 0 rad
First-order allpass closed form (1-a^2)/(1+2a cos w+a^2) Group delay of the a = 0.5 allpass at w = pi/2, samples 0.6 (+/-0.00001) 0.6 0
All-pass decomposition of a pure latency (B&P Sec. 13.1.4) Excess group delay of a biquad delayed 7.25 samples, samples 7.25 (+/-0) 7.25 0
Spherical ground & barriers (Attenborough / Salomons / Bies): 100% (7/7)
Standard Quantity Expected (norm) Computed Δ Status
Attenborough 2e Eq. (2.40c) (spherical Q, hard-ground limit) abs(Q) as Z grows large (Rp -> 1 so (1 - Rp) -> 0 and Q -> 1) 1 (+/-0.000001) 1 0
Salomons 2001 Sec. 3.4 (two-ray field over a rigid ground) dL enhancement at small path difference (constructive, +6 dB) 6.0206 dB (+/-0.1 dB) 6.0205 dB 0 dB
Salomons 2001 Eq. (D.59) (plane-wave Rp, grazing incidence) Re(Rp) at grazing (hs, hr -> 0, cos(theta) -> 0 so Rp -> -1) -1 (+/-0.001) -1 0
Salomons 2001 Fig. D.3 (grassland ground dip, sigma = 200 kPa s/m2) Minimum dL for hs = hr = 2 m, r = 100 m (dip near 395 Hz), dB -12.7 dB (+/-0.3 dB) -12.72 dB -0.022 dB
Bies 5e Eq. (5.138) (Kurze-Anderson, N -> 0) Barrier attenuation at the shadow boundary N = 0 5 dB (+/-0 dB) 5 dB 0 dB
Bies 5e Eq. (5.138) (Kurze-Anderson, large-N slope) Delta(N=10) - Delta(N=1) vs the 10 lg(10) = 10 dB decade growth 10 dB (+/-0.5 dB) 9.8845 dB -0.116 dB
Attenborough 2e Eqs. (9.19)-(9.20) (rigid half-plane, shadow boundary) Exact thin-screen insertion loss at grazing (field halved, 6 dB) 6.0206 dB (+/-0.6 dB) 5.7932 dB -0.227 dB
Panel & aperture sound insulation (Bies / Hopkins / Cremer): 100% (17/17)
Standard Quantity Expected (norm) Computed Δ Status
Bies 5e Eq. 7.40 (mass law) 6 dB per octave (500 -> 1000 Hz) 6.0206 dB (+/-0.01 dB) 6.02 dB -0.001 dB
Bies 5e Eq. 7.40 (mass law) 6 dB per doubling of mass 6.0206 dB (+/-0.01 dB) 6.02 dB -0.001 dB
Bies 5e Eq. 7.42 (field incidence) One-third-octave correction 5.5 dB 5.5 dB (+/-0.001 dB) 5.5 dB 0 dB
Hopkins Eq. 2.201 / Bies Eq. 7.3 Coincidence frequency, 6 mm glass 2079 Hz (+/-3%) 2107.3639 Hz 28.364 Hz
Cremer Table 5.1 Thin-plate point impedance Z = 8 sqrt(B' m'') 2529.8221 N.s/m (+/-0 N.s/m) 2529.8221 N.s/m 0 N.s/m
Cremer Table 5.1 Infinite-beam mobility phase -45 deg -45 deg (+/-0 deg) -45 deg 0 deg
Hopkins Eq. 2.229 (Leppington/Maidanik) Radiation efficiency at f = 2 fc 1.4142 (+/-0) 1.4142 0
Bies Eq. 7.62 / Hopkins Eq. 4.73 Mass-air-mass resonance f0, empty cavity 76.9484 Hz (+/-0.5%) 76.8521 Hz -0.096 Hz
Bies Eq. 7.64 (double wall) Below f0 = mass law of the combined mass 11.6144 dB (+/-0 dB) 11.6144 dB 0 dB
Hopkins Eq. 4.92 (composite) 1 % open area caps R at 10 lg(S/Sa) 20 dB (+/-0.05 dB) 19.9996 dB 0 dB
Vigran Building Acoustics Eq. (3.109), printed p. 96 Flat 1 mm steel plate 1 m x 1 m, f(1,1) 4.9 Hz (+/-0.05 Hz) 4.93 Hz 0.033 Hz
Vigran Eqs. (3.113)/(3.115), printed p. 96 Corrugated 1 mm steel plate (H = 10 mm, L = 100 mm), f(2,2) 102 Hz (+/-0.1 Hz) 102.09 Hz 0.092 Hz
Bies 5e Eq. (7.59) / Vigran Eq. (6.112) Heckl coincidence-branch constant, dB (rho c = 414) -13.2 dB (+/-0.02 dB) -13.217 dB -0.017 dB
Bies 5e Eq. (7.60) / Vigran Eq. (6.112) Heckl recovery-branch constant, dB (rho c = 414) -23 dB (+/-0.2 dB) -23.16 dB -0.16 dB
Vigran Eq. (6.111) / Bies Eq. (7.38) Orthotropic diffuse integral below fc1 vs its exact mass-law form 6.287723 dB (+/-0.000001 dB) 6.287723 dB 0 dB
Hopkins Table A2, printed p. 608 h.fc products of 25 building-material rows, worst deviation 0 m.Hz (+/-0.06 m.Hz) 0.0476 m.Hz 0.048 m.Hz
Hopkins Eq. 4.99/4.101 (Gomperts slit) Transmission maximum at first resonance 1544.9615 Hz (+/-15 Hz) 1542.9615 Hz -2 Hz
Bending-wave plate-junction transmission (Cremer / Craik / Hopkins): 100% (6/6)
Standard Quantity Expected (norm) Computed Δ Status
Hopkins Eq. 5.12 (identical plates) X-junction corner tau12(0 deg) = 1/8 0.125 (+/-0) 0.125 0
Hopkins Eqs 5.12 + 5.6 (identical plates) X-junction corner angular average = 1/12 0.0833 (+/-0) 0.0833 0
Hopkins Eqs 5.12 + 5.6 (identical plates) L-junction corner angular average = 1/3 0.3333 (+/-0) 0.3333 0
Hopkins Eq. 5.14 (identical plates) In-line junction tau12(0 deg) = 1 1 (+/-0) 1 0
Hopkins Eq. 5.7 (SEA consistency) X-junction reciprocity tau_bar_12 / tau_bar_21 = chi 1.5 (+/-0) 1.5 0
Hopkins Eq. 5.116 (identical plates, fc_j = f_ref) X-junction vibration reduction index = 10 lg(12) 10.7918 dB (+/-0 dB) 10.7918 dB 0 dB
Atmospheric refraction (Salomons rays / GFPE): 100% (3/3)
Standard Quantity Expected (norm) Computed Δ Status
Salomons Sec. 4.4 (ray turning height, linear profile) Turning height of a 10 deg ray vs Rc(1 - cos theta0) (circular arc), m 26.457 m (+/-0.1 m) 26.457 m 0 m
Salomons Eq. (3.4) (GFPE vs spherical-wave ground effect, homogeneous) PE relative level at 500 m over grassland vs Weyl-Van der Pol, dB -16.368 dB (+/-0.5 dB) -16.402 dB -0.035 dB
Salomons Eq. (3.4) (GFPE hard ground vs two-ray, homogeneous) PE relative level at 500 m over a rigid ground vs the coherent two-ray, dB 5.997 dB (+/-0.6 dB) 5.593 dB -0.405 dB
Electroacoustics: 100% (9/9)
Standard Quantity Expected (norm) Computed Δ Status
Beranek & Mellow 2e Eq. (13.117) Piston resistance R1(x) = 1 - 2 J1(x)/x at x = 2ka = 2 0.423275 (+/-0.00001) 0.423275 0
Beranek & Mellow 2e Eq. (13.118) Piston reactance X1(x) = 2 H1(x)/x at x = 2ka = 2 0.646764 (+/-0.00001) 0.646764 0
Beranek & Mellow 2e Eq. (13.117) (low-frequency limit) R1 -> (ka)^2/2 as ka -> 0 (x = 0.02, ka = 0.01) 0.00005 (+/-0.01%) 0.00005 0
Beranek & Mellow 2e Eq. (4.151) Radiation mass M = 8 rho a^3 / 3 (a = 0.1 m, rho = 1.206) 0.003216 kg (+/-0 kg) 0.003216 kg 0 kg
Beranek & Mellow 2e Eq. (13.102), Table 14.1 First directivity null at ka sin(theta) = 3.8317 (first zero of J1) 0 (+/-0.000001) 0 0
Beranek & Mellow 2e §4.19 (half-space baffle) Directivity index DI -> 10 lg 2 = 3.01 dB as ka -> 0 3.0103 dB (+/-0.001 dB) 3.0103 dB 0 dB
Long, Architectural Acoustics 2e, Eq. (18.21) Omnidirectional mic at Zs = -6 dB: L(H-M) <= L(H-L) - 4 dB 76 dB (+/-0 dB) 76 dB 0 dB
Long, Architectural Acoustics 2e, Eq. (18.22) Cardioid mic (DM = -2 dB) at Zs = -6 dB: L(H-M) <= L(H-L) - 2 dB 78 dB (+/-0 dB) 78 dB 0 dB
Long, Architectural Acoustics 2e, Eq. (18.23) Number-of-open-microphones correction 10 lg Nm at Nm = 4 6.0206 dB (+/-0 dB) 6.0206 dB 0 dB
Industrial noise control: 100% (22/22)
Standard Quantity Expected (norm) Computed Δ Status
Bies 5e Eq. (8.111) Expansion-chamber peak TL = 10 lg[1 + (1/4)(m - 1/m)^2], m = 4 at kL = pi/2 6.5472 dB (+/-0 dB) 6.5472 dB 0 dB
Bies 5e Eq. (8.111) Expansion-chamber trough TL = 0 at kL = pi (chamber transparent) 0 dB (+/-0 dB) 0 dB 0 dB
Bies 5e Eq. (8.44) / Example 8.1 Quarter-wave tube tuning f = c/(4 l_e), l_e = 1.516 m -> 56.6 Hz 56.6 Hz (+/-0.1 Hz) 56.6 Hz 0.003 Hz
Bies 5e Eq. (8.46) Helmholtz resonance f0 = (c/2pi) sqrt(S/(l_e V)) (S=1e-4, l_e=0.02, V=1e-3) 122.067 Hz (+/-0 Hz) 122.067 Hz 0 Hz
Bies 5e Eq. (8.73) Side-branch TL = 20 lg abs(1 + rho c/(2 Sd Zb)) (QWT branch, closed form) 0.1638 dB (+/-0 dB) 0.1638 dB 0 dB
Bies 5e Eqs. (8.141)/(8.148) (four-pole insertion loss) Insertion loss = transmission loss for the anechoic reference Zs=Zr=rho c/S 6.2498 dB (= TL) 6.2498 dB 0 dB
Bies 5e Eq. (8.275) (Wells' plenum method) Plenum TL = -10 lg[S_out(cos0/pi r^2 + (1-a)/(Sw a))] (S_out=.1,r=1,Sw=20,a=.2) 12.8541 dB (+/-0 dB) 12.8541 dB 0 dB
Bies 5e Table 8.14 (ASHRAE end reflection, flush) Duct end reflection D = 200 mm at 125 Hz = 10 dB (table node) 10 dB (+/-0 dB) 10 dB 0 dB
Long 2e Eq. 13.1 with Table 13.5 (ASHRAE 1987 fan model) Forward-curved fan at Q_REF, P_REF, peak efficiency -> K_F + C_BFI at 500 Hz 38 dB (+/-0 dB) 38 dB 0 dB
Long 2e Eq. 14.12 with Table 14.2 (Reynolds lined rectangular duct) 18 x 12 in duct, 6 ft, 1 in lining at 1 kHz -> 1.77 (10/3)^0.695 6 dB 24.5203 dB (+/-0 dB) 24.5203 dB 0 dB
Long 2e Table 14.4 (ASHRAE 1995 lined flexible duct) 8 in diameter, 9 ft long -> 6/8/16/25/28/28/18 dB (table node) 0 dB (max diff over the 7 bands) 0 dB
Long 2e Eq. 14.17 (branch power division) 25 per cent split with area-matched branches -> -10 lg 0.25 = 6.02 dB 6.0206 dB (+/-0 dB) 6.0206 dB 0 dB
Long 2e Table 14.9 (worked duct-borne sheet, supply path) Fan to room, 8 octave bands -> 52/42/30/18/9/-2/-2/-1 dB at the receiver 0 dB +/-1 (max diff over the 8 bands) 1 dB
Long 2e Eqs. 13.27-13.33 (Reynolds diffuser self-noise) 24 x 24 in rectangular diffuser, 312 cfm, 0.05 in pd -> the 33/32/29/23/15 dB row of Table 14.9 0 dB +/-1 (max diff over the five bands) 0.8853 dB
ASHRAE 2019 Applications Ch. 49 Table 9 Max neck velocity of a supply outlet for design RC(30) -> 2.2 m/s 2.2 m/s (+/-0 m/s) 2.2 m/s 0 m/s
Norton & Karczub 2e Eqs. 7.6/7.8/7.9 (problem 7.1 answer) 254 mm duct, steam, 200 m/s: (1,0) cut-on 812 Hz and k_x = -8.23 1/m 0 +/-1 (Hz, and 1/m x100) 0.591 0.591
Norton & Karczub 2e Eq. 7.10 (problem 7.2 answer) 0.65 x 0.4 m duct, 15 m/s: first three cut-on 264 / 428 / 503 Hz 0 Hz (max diff over the 3 modes) 0 Hz
Bies 5e Eqs. (7.103), (7.111) (enclosure, fully absorbing limit) Enclosure correction C -> 10 lg 0.3 = -5.23 dB as alpha_i -> 1 -5.2288 dB (+/-0.001 dB) -5.2288 dB 0 dB
Norton & Karczub 2e Eq. (4.101) (problem 4.21 answer) Double brick wall into an 8 x 9 x 3 m room -> NR 37.5/40.8/49.0/62.8/65.3/65.9 dB 0 dB +/-0.05 (max diff over the 6 bands) 0.0308 dB
Norton & Karczub 2e 4.6/4.9 (problem 4.18 answer) Blower in a plant room to the operator room -> 72.3/60.4/41.4/41.0/33.8/30.7 dB 0 dB +/-0.1 (max diff over the 6 bands) 0.0682 dB
Norton & Karczub 2e Eq. (4.115) (problem 4.16 answer) Lined compressor enclosure against NC-45 -> required TL 14.4/25.2/28.9/34.4/35.2/34.7/34.7/31.6 dB 0 dB +/-0.15 (max diff over the 8 bands) 0.1099 dB
Norton & Karczub 2e Table 4.5 (constant-volume source power) Source in the intersection of two flat surfaces (Q = 4) -> +10 lg 4 = 6.02 dB 6.0206 dB (+/-0 dB) 6.0206 dB 0 dB

Tests & coverage — 41718 tests, 0 failures (✅ all green)
Python Version Tests Failures Coverage Status
macos-latest-3.13 6953 0 96.9% ✅ Passed
macos-latest-3.14 6953 0 96.9% ✅ Passed
ubuntu-latest-3.13 6953 0 96.9% ✅ Passed
ubuntu-latest-3.14 6953 0 96.9% ✅ Passed
windows-latest-3.13 6953 0 96.9% ✅ Passed
windows-latest-3.14 6953 0 96.9% ✅ Passed

Conformance harness: scripts/conformance_report.py · full CI artifacts

@jmrplens
jmrplens force-pushed the orthotropic-and-limp-frame branch from f78b3c5 to 73c1725 Compare July 30, 2026 04:19
@coderabbitai coderabbitai Bot added the reports Accredited-format .report() fiches and their rendering label Jul 30, 2026
@codecov

codecov Bot commented Jul 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 96.88%. Comparing base (9499d9f) to head (097b339).

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #438      +/-   ##
==========================================
+ Coverage   96.86%   96.88%   +0.01%     
==========================================
  Files         242      242              
  Lines       36273    36413     +140     
==========================================
+ Hits        35137    35277     +140     
  Misses       1136     1136              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

♻️ Duplicate comments (1)
site/src/content/docs/reference/api/building/panel-transmission.md (1)

499-499: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Resolver bug still present: critical_frequency link points to the wrong target.

This was previously flagged and marked "Addressed", but the same broken link persists here: critical_frequency still resolves to /phonometry/reference/api/building/flanking-transmission/#critical_frequency (the unrelated module-level function) instead of the SoundReductionResult attribute, while the sibling critical_frequency_upper link on the same line was correctly fixed to #soundreductionresult. The generator's attribute-disambiguation fix appears to only cover the newly added attribute name, not the pre-existing collision with flanking_transmission.critical_frequency.

🔧 Suggested doc-generator fix (scripts/generate_api_docs.py)

Ensure the resolver prefers a member match on the enclosing return type (SoundReductionResult) over a same-named module-level function elsewhere in the package when resolving :attr:~SoundReductionResult.critical_frequency`` references, then regenerate this page.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/src/content/docs/reference/api/building/panel-transmission.md` at line
499, Fix the documentation resolver used for the return description so the
critical_frequency link resolves to the SoundReductionResult member rather than
flanking_transmission.critical_frequency. Update the attribute-disambiguation
logic in the relevant generator flow to prefer members of the enclosing return
type, then regenerate this page while preserving the existing
critical_frequency_upper link.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/panel-sound-insulation.md`:
- Around line 338-343: Hyphenate “78 degree limiting angle” as “78-degree
limiting angle” in docs/panel-sound-insulation.md (338-343) and
site/src/content/docs/guides/panel-sound-insulation.mdx (386-391). Regenerate
site/public/llms/llms-insulation-design.txt (1126-1131) from the corrected
source; do not edit it manually. The Spanish mirror requires no change.

In `@llms-full.txt`:
- Around line 23790-23792: Update the mounting discussion in the passage around
“Neither accounts for mounting” to explicitly state that bonded materials are
unsuitable for both rigid-frame and limp-frame equivalent-fluid models, and
require modeling the frame–structure coupling instead.

In `@scripts/conformance_report.py`:
- Around line 6893-6914: Align the provenance comment above _AA_TABLE_11_2 and
_chk_limp_decoupling_frequency with the actual checks: identify the three checks
using the _AA_TABLE_11_2 material as the prose limits on printed page 253, and
identify _chk_limp_decoupling_frequency as the separate closed-form Table 6.1
glass-wool anchor using its hardcoded inputs. Do not rename or alter the
constants or calculations.
- Around line 7580-7592: The _chk_corrugated_plate_mode_22 check currently
passes only at the numeric tolerance boundary. Update its numeric() expectation
and tolerance so the computed f22 aligns robustly with Vigran’s printed 102.1 Hz
reference, using a tight tolerance appropriate for the calculation rather than
relying on 102.0 ±0.1.

In `@site/src/content/docs/es/guides/porous-absorbers.mdx`:
- Line 260: Update the ThemeImage `src` in the Spanish porous absorbers guide to
use the translated `limp_frame_effective_density_es.svg` asset instead of the
English-labelled `limp_frame_effective_density.svg`; leave the existing alt text
and image attributes unchanged.

In `@site/src/content/docs/reference/api/materials/porous-absorber.md`:
- Line 510: Update the source docstring for the porous absorber API, including
the porosity default and the values at the corresponding criterion entry, to use
decimal points consistently with the signature and LIMP_FRAME_CRITERIA. Then
regenerate the English reference page so the rendered values appear as 1.0, 0.2,
and 0.05; retain decimal commas only where reproducing standard text.

---

Duplicate comments:
In `@site/src/content/docs/reference/api/building/panel-transmission.md`:
- Line 499: Fix the documentation resolver used for the return description so
the critical_frequency link resolves to the SoundReductionResult member rather
than flanking_transmission.critical_frequency. Update the
attribute-disambiguation logic in the relevant generator flow to prefer members
of the enclosing return type, then regenerate this page while preserving the
existing critical_frequency_upper link.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 20365c03-d3dd-485b-ab6b-5a6d1f197eb1

📥 Commits

Reviewing files that changed from the base of the PR and between aa8a060 and 73c1725.

⛔ Files ignored due to path filters (8)
  • .github/images/limp_frame_effective_density.svg is excluded by !**/*.svg
  • .github/images/limp_frame_effective_density_dark.svg is excluded by !**/*.svg
  • .github/images/limp_frame_effective_density_es.svg is excluded by !**/*.svg
  • .github/images/limp_frame_effective_density_es_dark.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss_dark.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss_es.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss_es_dark.svg is excluded by !**/*.svg
📒 Files selected for processing (36)
  • .zenodo.json
  • CHANGELOG.md
  • docs/CONFORMANCE.md
  • docs/api-reference.md
  • docs/getting-started.md
  • docs/panel-sound-insulation.md
  • docs/porous-absorbers.md
  • docs/references.md
  • llms-full.txt
  • llms.txt
  • scripts/conformance_report.py
  • scripts/generate_graphs.py
  • site/public/llms/llms-absorbers.txt
  • site/public/llms/llms-insulation-design.txt
  • site/public/llms/llms-start.txt
  • site/src/content/docs/es/guides/panel-sound-insulation.mdx
  • site/src/content/docs/es/guides/porous-absorbers.mdx
  • site/src/content/docs/es/index.mdx
  • site/src/content/docs/es/reference/bibliography.md
  • site/src/content/docs/es/reference/conformance.md
  • site/src/content/docs/guides/panel-sound-insulation.mdx
  • site/src/content/docs/guides/porous-absorbers.mdx
  • site/src/content/docs/index.mdx
  • site/src/content/docs/reference/api/building/panel-transmission.md
  • site/src/content/docs/reference/api/materials/porous-absorber.md
  • site/src/content/docs/reference/bibliography.md
  • site/src/content/docs/reference/conformance.md
  • src/phonometry/__init__.py
  • src/phonometry/_plot/building.py
  • src/phonometry/building/__init__.py
  • src/phonometry/building/panel_transmission.py
  • src/phonometry/materials/__init__.py
  • src/phonometry/materials/porous_absorber.py
  • tests/building/test_orthotropic_panels.py
  • tests/materials/test_limp_frame.py
  • tests/reference_data.py

Comment on lines +338 to +343
*The trade corrugating makes, on Vigran's own geometry. Below $f_{c1}$ the two
panels are within about 2 dB of each other (the corrugated one slightly higher:
it is 9 % heavier, and the diffuse-field integral uses a 78 degree limiting
angle rather than Sharp's 5.5 dB band correction). Across the coincidence range
the corrugated sheet gives away up to 13 dB, and $R_w$ falls from 28 dB to
25 dB, for a panel that is stiffer and barely heavier.*

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Hyphenate the compound modifier "78-degree limiting angle". The same figure caption is authored once and mirrored into the site guide and the generated llms text, so the missing hyphen appears three times; fix it at the source and regenerate.

  • docs/panel-sound-insulation.md#L338-L343: change "a 78 degree limiting angle" to "a 78-degree limiting angle".
  • site/src/content/docs/guides/panel-sound-insulation.mdx#L386-L391: apply the same wording change to the English caption.
  • site/public/llms/llms-insulation-design.txt#L1126-L1131: regenerate this mirror so the caption picks up the fix rather than editing it by hand.

The Spanish mirror needs no change ("un ángulo límite de 78 grados").

🧰 Tools
🪛 LanguageTool

[grammar] ~340-~340: Use a hyphen to join words.
Context: ...and the diffuse-field integral uses a 78 degree limiting angle rather than Sharp'...

(QB_NEW_EN_HYPHEN)

📍 Affects 3 files
  • docs/panel-sound-insulation.md#L338-L343 (this comment)
  • site/src/content/docs/guides/panel-sound-insulation.mdx#L386-L391
  • site/public/llms/llms-insulation-design.txt#L1126-L1131
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/panel-sound-insulation.md` around lines 338 - 343, Hyphenate “78 degree
limiting angle” as “78-degree limiting angle” in docs/panel-sound-insulation.md
(338-343) and site/src/content/docs/guides/panel-sound-insulation.mdx (386-391).
Regenerate site/public/llms/llms-insulation-design.txt (1126-1131) from the
corrected source; do not edit it manually. The Spanish mirror requires no
change.

Source: Linters/SAST tools

Comment thread llms-full.txt
Comment thread scripts/conformance_report.py
Comment on lines +7580 to +7592
@register(_PANEL, "Vigran Eqs. (3.113)/(3.115), printed p. 96",
"Corrugated 1 mm steel plate (H = 10 mm, L = 100 mm), f(2,2)")
def _chk_corrugated_plate_mode_22() -> Outcome:
b_x, b_z, b_xz = ph.corrugated_plate_stiffness(
1.0e-3, 0.010, 0.100, youngs_modulus=2.1e11, poisson_ratio=0.3
)
mass = 7.8 * ph.corrugated_plate_mass_factor(0.010, 0.100)
f22 = ph.orthotropic_plate_resonance(
2, 2, length_x=1.0, length_z=1.0, mass_per_area=mass,
bending_stiffness_x=b_x, bending_stiffness_z=b_z,
bending_stiffness_xz=b_xz,
)
return numeric(102.0, f22, 0.1, unit="Hz", places=2)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Recompute f(2,2) for the corrugated plate and show the deviation from 102.0,
# and print numeric()'s comparison semantics (strict < vs <=).
fd -t f 'conformance_report.py' -x rg -n -A 25 'def numeric\('
fd -t f 'panel_transmission.py' -x rg -n -A 6 'def corrugated_plate_mass_factor|def corrugated_plate_stiffness|def orthotropic_plate_resonance'

Repository: jmrplens/phonometry

Length of output: 2183


🏁 Script executed:

#!/bin/bash
set -e
python3 - <<'PY'
import sys
sys.path.insert(0, ".")
import phonometry as ph
args = (1.0e-3, 0.010, 0.100)
kwargs = {"youngs_modulus": 2.1e11, "poisson_ratio": 0.3}
b_x, b_z, b_xz = ph.corrugated_plate_stiffness(*args, **kwargs)
mass = 7.8 * ph.corrugated_plate_mass_factor(*args[:2])
f22 = ph.orthotropic_plate_resonance(
    2, 2, length_x=1.0, length_z=1.0, mass_per_area=mass,
    bending_stiffness_x=b_x, bending_stiffness_z=b_z,
    bending_stiffness_xz=b_xz,
)
expected = 102.0
tol = 0.1
print("b_x=", b_x)
print("b_z=", b_z)
print("b_xz=", b_xz)
print("mass=", mass)
print("f22=", repr(f22))
print("f22_rounded=", f"{f22:.1f}")
print("delta=", repr(f22 - expected))
print("abs_delta=", abs(f22 - expected))
print("tol_limit=", tol)
print("passes_boundary_0_1=", abs(f22 - expected) <= tol)
print("passes_boundary_0_0999=", abs(f22 - expected) <= tol - 1e-14)
PY

Repository: jmrplens/phonometry

Length of output: 280


🏁 Script executed:

#!/bin/bash
set -e
echo "== package hints =="
git ls-files | rg '(^|/)(pyproject\.toml|setup\.py|setup\.cfg|phonometry\.py|panel_transmission\.py|conformance_report\.py)$' || true
echo "== relevant source snippets =="
sed -n '1,160p' scripts/conformance_report.py
echo "-----"
sed -n '560,695p' scripts/panel_transmission.py
echo "-----"
sed -n '7568,7600p' scripts/conformance_report.py

Repository: jmrplens/phonometry

Length of output: 5890


🏁 Script executed:

#!/bin/bash
set -e
sed -n '560,695p' src/phonometry/building/panel_transmission.py
echo "-----"
sed -n '7568,7600p' scripts/conformance_report.py
echo "-----"
echo "== orthotropic references =="
rg -n "corru|orthotropic_plate_resonance|ellipe" scripts/conformance_report.py src/phonometry/building/panel_transmission.py

Repository: jmrplens/phonometry

Length of output: 12067


🏁 Script executed:

#!/bin/bash
set -e
python3 - <<'PY'
from scipy.special import ellipe

h, H, L = 1.0e-3, 0.010, 0.100
E, nu = 2.1e11, 0.3
rho_flat = 7.8

q = 2.0 * 3.141592653589793 * H / L
q2 = q * q
mass_factor = float(2.0 / 3.141592653589793 * (1.0 + q2)**0.5 * ellipe(q2 / (1.0 + q2)))
mass = rho_flat * mass_factor

shape = (3.141592653589793 * H / L) ** 2
flat = E * h**3 / 12.0
Bx = flat / ((1.0 - nu**2) * (1.0 + shape))
Bz = 0.5 * E * H**2 * h * (1.0 - 0.81 / (1.0 + 2.5 * (H / L) ** 2))
Bxz = flat / (1.0 + nu) * (1.0 + shape)

m = 1.0
n = 1.0
a = length_x = 1.0
b = length_z = 1.0
f22 = (3.141592653589793 / (2 * mass**0.5)) * (
    (m**4 * Bx / a**4) + (n**4 * Bz / b**4) + 2 * m**2 * n**2 * Bxz / (a**2 * b**2)
)**0.5

for x in ("mass", "mass_factor", "Bx", "Bz", "Bxz", "f22"):
    print(f"{x} = {locals()[x]!r}")
for expected, tol in [(102.0, 0.1), (102.1, 0.05), (102.1, 0.1)]:
    print(f"expected={expected} tol={tol} passes={'pass' if abs(locals()['f22'] - expected) <= tol else 'fail'}")
PY

Repository: jmrplens/phonometry

Length of output: 275


🏁 Script executed:

#!/bin/bash
set -e
python3 - <<'PY'
# Recreate the library formulas from source without importing the package.
import math

def ellipe(m):
    # scipy.special.ellipe is the complete elliptic integral of the second kind,
    # E(m), not E(phi, m). Use numpy's standard polynomial approximation for
    # a narrow checked range: m = (2*pi*H/L)^2 / (1 + (2*pi*H/L)^2)
    # for H=0.010, L=0.100.
    m = float(m)
    # Use the built-in scipy approximation only if available; otherwise raise.
    import importlib.util
    if importlib.util.find_spec("scipy.special") is not None:
        import importlib
        special = importlib.import_module("scipy.special")
        return special.ellipe(m)
    raise RuntimeError("scipy unavailable")

h, H, L = 1.0e-3, 0.010, 0.100
E, nu = 2.1e11, 0.3
rho_flat = 7.8

q = 2.0 * math.pi * H / L
q2 = q * q
mass_factor = float(2.0 / math.pi * math.sqrt(1.0 + q2) * ellipe(q2 / (1.0 + q2)))
mass = rho_flat * mass_factor

shape = (math.pi * H / L) ** 2
flat = E * h**3 / 12.0
Bx = flat / ((1.0 - nu**2) * (1.0 + shape))
Bz = 0.5 * E * H**2 * h * (1.0 - 0.81 / (1.0 + 2.5 * (H / L) ** 2))
Bxz = flat / (1.0 + nu) * (1.0 + shape)

m = n = 1.0
a = b = 1.0
f22 = (math.pi / (2 * mass**0.5)) * (
    (m**4 * Bx / a**4) + (n**4 * Bz / b**4) + 2 * m**2 * n**2 * Bxz / (a**2 * b**2)
)**0.5

print(f"mass_factor = {mass_factor!r}")
print(f"mass = {mass!r}")
print(f"Bx = {Bx!r}")
print(f"Bz = {Bz!r}")
print(f"Bxz = {Bxz!r}")
print(f"f22 = {f22!r}")
print(f"f22_rounded_1dp = {f22:.1f}")
print(f"|f22-102.0| = {abs(f22 - 102.0)!r}")
print(f"|f22-102.1| = {abs(f22 - 102.1)!r}")
print("passes_102_0_tol_0_1 =", abs(f22 - 102.0) <= 0.1, f"delta={f22 - 102.0:.15f}")
print("passes_102_1_tol_0_05 =", abs(f22 - 102.1) <= 0.05, f"delta={f22 - 102.1:.15f}")
PY

Repository: jmrplens/phonometry

Length of output: 444


🌐 Web query:

scipy.special.ellipe complete elliptic integral of second kind documentation

💡 Result:

The scipy.special.ellipe function calculates the complete elliptic integral of the second kind [1][2]. Definition The function is defined by the integral: E(m) = integral from 0 to pi/2 of [1 - m sin(t)^2]^(1/2) dt [1][2] Parameters - m (array_like): The parameter of the elliptic integral [1][2]. Note that this parameterization uses m = k^2, where k is the modulus [1]. Care should be taken as other conventions use the complementary parameter (1 - m) or the modular angle (sin^2(alpha) = m) [1][2]. - out (ndarray, optional): An optional output array for the function values [1][2]. Returns - Returns the scalar or ndarray value of the elliptic integral [1][2]. Technical Details - Implementation: It is a wrapper for the Cephes routine ellpe [1][2]. - Computation: For m > 0, it uses a tenth-order polynomial approximation involving log(1-m) [1][2]. For m < 0, it employs the relationship E(m) = E(m / (m - 1)) * sqrt(1 - m) [1][2]. - Applications: It is commonly used to calculate the circumference of an ellipse with semi-major axis a and semi-minor axis b, where the eccentricity squared is e_sq = 1.0 - b^2/a^2, and the circumference is given by 4 * a * scipy.special.ellipe(e_sq) [1][2].

Citations:


Avoid relying on this check passing exactly at the tolerance boundary.

numeric() uses abs(delta) <= tol, but this f(2,2) check targets 102.0 ±0.1 while Vigran’s worked example prints 102.1. The current check will pass by virtue of the boundary condition, and small numeric drift can flip the result. Align the expected/computed pair (for example, expect 102.1 with a tight tolerance) or widen the tolerance comfortably beyond the printed/reference deviation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/conformance_report.py` around lines 7580 - 7592, The
_chk_corrugated_plate_mode_22 check currently passes only at the numeric
tolerance boundary. Update its numeric() expectation and tolerance so the
computed f22 aligns robustly with Vigran’s printed 102.1 Hz reference, using a
tight tolerance appropriate for the calculation rather than relying on 102.0
±0.1.

`limp_frame` recibe un `PorousMediumResult` y devuelve otro, así que encaja
directamente en un `PorousLayer` de la pila.

<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/limp_frame_effective_density.svg" alt="Densidad efectiva normalizada frente a la frecuencia de 0 a 2000 hercios para una capa fibrosa blanda, comparando los modelos de esqueleto rígido y flexible. La parte real del esqueleto rígido es una línea discontinua plana en 1,2 mientras su parte imaginaria se hunde por debajo del borde inferior del gráfico bajo la frecuencia de desacoplo de 127 hercios, marcada con una línea vertical punteada. La parte real del esqueleto flexible parte de la densidad total aparente de 25,9 en cero hercios y cae suavemente hasta la línea del esqueleto rígido hacia los 1500 hercios, mientras su parte imaginaria baja hasta menos 12 cerca de 130 hercios y luego se confunde con la curva de esqueleto rígido" width="88%" loading="lazy" />

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Confirm whether an "_es" translated variant of this figure is produced anywhere in the pipeline.
rg -n "limp_frame_effective_density" --hidden -g '!.git'

Repository: jmrplens/phonometry

Length of output: 157


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Repo files relevant to docs/images/graphs:"
git ls-files | rg '(^site/src/content/docs/es/guides/porous-absorbers\.mdx$|scripts/generate_graphs\.py$|\.github/images/.*limp_frame|images/.*limp_frame)' || true

echo
echo "Occurrences of limp_frame_effective_density in tracked files:"
git ls-files -z | xargs -0 rg -n "limp_frame_effective_density" || true

echo
echo "Occurrences of effective_density_es suffix:"
git ls-files -z | xargs -0 rg -n "effective_density_es|esqueleto rígido, parte real|A Limp Frame Carries Its Own Inertia" || true

Repository: jmrplens/phonometry

Length of output: 6911


Point the Spanish limp-frame chart at the _es image.

scripts/generate_graphs.py provides translated annotations for this figure, and limp_frame_effective_density_es.svg exists, but this Spanish guide still loads the English-labelled limp_frame_effective_density.svg.

🌐 Proposed fix
-    <ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/limp_frame_effective_density.svg" alt="..." width="88%" loading="lazy" />
+    <ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/limp_frame_effective_density_es.svg" alt="..." width="88%" loading="lazy" />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/limp_frame_effective_density.svg" alt="Densidad efectiva normalizada frente a la frecuencia de 0 a 2000 hercios para una capa fibrosa blanda, comparando los modelos de esqueleto rígido y flexible. La parte real del esqueleto rígido es una línea discontinua plana en 1,2 mientras su parte imaginaria se hunde por debajo del borde inferior del gráfico bajo la frecuencia de desacoplo de 127 hercios, marcada con una línea vertical punteada. La parte real del esqueleto flexible parte de la densidad total aparente de 25,9 en cero hercios y cae suavemente hasta la línea del esqueleto rígido hacia los 1500 hercios, mientras su parte imaginaria baja hasta menos 12 cerca de 130 hercios y luego se confunde con la curva de esqueleto rígido" width="88%" loading="lazy" />
<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/limp_frame_effective_density_es.svg" alt="Densidad efectiva normalizada frente a la frecuencia de 0 a 2000 hercios para una capa fibrosa blanda, comparando los modelos de esqueleto rígido y flexible. La parte real del esqueleto rígido es una línea discontinua plana en 1,2 mientras su parte imaginaria se hunde por debajo del borde inferior del gráfico bajo la frecuencia de desacoplo de 127 hercios, marcada con una línea vertical punteada. La parte real del esqueleto flexible parte de la densidad total aparente de 25,9 en cero hercios y cae suavemente hasta la línea del esqueleto rígido hacia los 1500 hercios, mientras su parte imaginaria baja hasta menos 12 cerca de 130 hercios y luego se confunde con la curva de esqueleto rígido" width="88%" loading="lazy" />
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/src/content/docs/es/guides/porous-absorbers.mdx` at line 260, Update the
ThemeImage `src` in the Spanish porous absorbers guide to use the translated
`limp_frame_effective_density_es.svg` asset instead of the English-labelled
`limp_frame_effective_density.svg`; leave the existing alt text and image
attributes unchanged.

| :--- | :--- |
| `medium` | A rigid-frame [`PorousMediumResult`](/phonometry/reference/api/materials/porous-absorber/#porousmediumresult) (its `effective_density` is `rho_eq` and its `bulk_modulus` is kept). |
| `frame_density` | Bulk density of the frame `rho1`, in kg/m3 (> 0). |
| `porosity` | Open porosity `phi` (0 \< phi \<= 1, Default: 1,0, the high-porosity assumption of the one-parameter models). |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use decimal points for API parameter values.

The English API page renders actual defaults and criterion values as 1,0, 0,2, and 0,05, while the signature and LIMP_FRAME_CRITERIA use 1.0, 0.2, and 0.05. This is ambiguous and can mislead users.

Update the source docstring and regenerate this page:

-`porosity` | Open porosity `phi` (0 \< phi \<= 1, Default: 1,0, the high-porosity assumption of the one-parameter models). |
+`porosity` | Open porosity `phi` (0 \< phi \<= 1, Default: 1.0, the high-porosity assumption of the one-parameter models). |
...
-`criterion` | Key into [`LIMP_FRAME_CRITERIA`](/phonometry/reference/api/materials/porous-absorber/#limp_frame_criteria), `"doutres"` (Default, 0,2) or `"beranek"` (0,05). |
+`criterion` | Key into [`LIMP_FRAME_CRITERIA`](/phonometry/reference/api/materials/porous-absorber/#limp_frame_criteria), `"doutres"` (Default, 0.2) or `"beranek"` (0.05). |

Based on learnings: non-standard numeric values in English API prose should use decimal points, while decimal commas are reserved for reproduced standard text.

Also applies to: 549-549

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/src/content/docs/reference/api/materials/porous-absorber.md` at line
510, Update the source docstring for the porous absorber API, including the
porosity default and the values at the corresponding criterion entry, to use
decimal points consistently with the signature and LIMP_FRAME_CRITERIA. Then
regenerate the English reference page so the rendered values appear as 1.0, 0.2,
and 0.05; retain decimal commas only where reproducing standard text.

Source: Learnings

@jmrplens jmrplens left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent review against the printed sources (Vigran 2008, Hopkins 2007, Bies/Hansen/Howard 5e, Allard & Atalla 2e), with every oracle recomputed from the books rather than from the branch. The automated reviewers produced nothing actionable on this diff, so this was done as a full adversarial pass: transcription checks digit by digit, independent recomputation of every pinned value, mutation testing of the new oracles, and the house-rules checklist.

Blocking

Nothing blocking. I looked hard for transcription errors, for a rearranged limp-frame formula that only agrees at the limits, and for an implementation error hiding behind the documented Heckl-versus-integral gap, and found none. Details below so the basis for that conclusion is on the record.

Non-blocking

  1. CHANGELOG.md (Unreleased, limp-frame entry): misquoted book prose. The entry puts the book's "softer than about 20 kPa" in quotation marks. Allard & Atalla, printed p. 253, actually prints "the limp model is applicable for materials having a bulk modulus lower than 20 kPa". The docstring of limp_frame_applicable quotes it correctly; the CHANGELOG (the only shipped text with the wrong wording, the PR body has it too but does not ship) should either quote verbatim or drop the quotation marks.

  2. orthotropic_transmission_loss: the heckl route skips input validation that the integral route enforces. In src/phonometry/building/panel_transmission.py the method="heckl" branch returns before the area / limiting_angle checks, so orthotropic_transmission_loss(..., method="heckl", area=-5.0, limiting_angle=170.0) succeeds silently (verified on the branch), while the same call on the integral route raises. Meanwhile loss_factor is validated as positive even on the heckl route, where it is equally unused. Either validate all three uniformly before branching or document that the heckl route ignores area and limiting_angle the way the docstring already documents loss_factor. Cosmetic, but the asymmetry will confuse someone.

Verified correct

Hopkins Table A2 (printed p. 608, pdf 635): all 25 (cL, h.fc) pairs in tests/reference_data.py match the printed table digit for digit, row order included; I also confirmed the identity h.fc = c0^2 sqrt(12) / (2 pi cL) is density- and Poisson-independent, so each row is a real check. Worst printed-rounding deviation is 0.048 m.Hz against the 0.06 tolerance, so the margin is thin but correct.

Vigran worked example (printed p. 96, pdf 118): recomputed independently from Eqs (3.109)/(3.113)/(3.115) as printed: flat 4.93 / 19.73 Hz, corrugated 25.52 / 102.09 Hz with the developed-length mass (factor 1.0924, which I verified equals both the elliptic closed form and the numeric arc length), and 26.68 / 106.70 Hz with the flat 7.8 kg/m2. The claimed discrimination of corrugated_plate_mass_factor is real: the difference (1.15 Hz and 4.6 Hz) dwarfs the 0.05 / 0.1 Hz test tolerances. Eq. (3.115) is transcribed exactly, including the 0.81 and 5/2 constants and the footnoted Blevins misprint warning.

Bies constants and equations: Eqs (7.30), (7.31), (7.36), (7.38), (7.58), (7.59), (7.60) and the Fig. 7.9(b) caption (printed pp. 377-384) all match the implementation and the four printed constants -54, -13.2, -17 and -23 dB. The exact values 10 lg(2 pi^2/414) = -13.2167 and 10 lg(2/414) = -23.159 pinned in the tests are correct, and point A reproduces 20 lg(fc1 m) - 54 to 0.12 dB with the 5.5 dB field correction, inside the stated 0.15 dB rounding tolerance.

The Heckl-versus-integral gap is a book property, not a defect. At eta -> 0 the Eq. (7.59) branch sits +4.0 to +4.9 dB above the diffuse-field integral across the 500 Hz to 2000 Hz plateau of the Fig. 6.27 case (and the gap grows, not shrinks, if the limiting angle is pushed to 90 degrees, so the 78 degree cutoff is not the cause). Vigran's own Figure 6.27 (printed p. 254) draws Heckl's approximation above its 1 % integral by the same few dB. The integral itself is bracketed on both sides by exact checks that pass: below fc1 it reproduces the elementary mass-law integral to 1e-6 dB, and above 2 fc2 it converges on Eq. (7.60) to under 0.3 dB. Documenting the plateau gap as the accuracy of Heckl's approximation is the right call.

Limp frame (A&A 11.3.4): the implementation is the printed Eq. (11.55) verbatim, (rho_t rho_eq - rho0^2)/(rho_t + rho_eq - 2 rho0) with rho_t = rho1 + phi rho0, not a rearrangement; I checked the printed page directly, and the claimed +6 pdf-to-printed offset of chapter 11 is correct (pdf 259 = printed 253), as are +9 in chapter 6 and the Table 11.2 and Table 6.1 parameter sets. One honesty note the test file already half-makes, stated fully here: the two prose limits alone do not pin the rho0^2 and 2 rho0 terms; a sign-flipped variant satisfies the heavy-frame limit, the omega -> 0 limit and even the 1/rho1 residual scaling (which I confirmed analytically: the residual is -(rho_eq - rho0)^2 / (rho_t + rho_eq - 2 rho0)). What pins those terms is the direct transcription test plus a human reading of the printed equation, which this review supplies. The decoupling frequency 43.27 Hz from Eq. (6.90) (printed p. 126) with the Table 6.1 glass wool recomputes to 43.2706 Hz, and the Beranek 0.05 / Doutres 0.2 / 20 kPa thresholds are as printed on p. 253.

Mutation testing: six deliberate mutations each killed at least one test: a Hopkins row (12.3 -> 12.5), the 2 pi^2 of the Eq. (7.59) branch, the mass factor forced to 1, the 5/2 constant of Bz, the sign of 2 rho0 in the limp density, and sqrt(fc1 fc2) -> fc1 in the Eq. (7.60) branch. The oracles are live.

Composition and house rules: orthotropic_transmission_loss (both methods), single_panel_transmission_loss and plateau_transmission_loss all return SoundReductionResult and all reach .rating() through the same ISO 717-1 path; critical_frequency_upper is appended last with a None default, and the full suite run locally on this head (6844 passed, 69 skipped, no failures) plus the six-platform CI confirm no existing consumer breaks. The ten conformance rows are 6 + 4 as stated, honestly labelled where they are limit-anchors rather than printed digits. EN and ES guide sections are structurally identical and numerically identical token for token (after normalising the Spanish decimal comma in comments). No em-dashes in any added prose, no assert in src/, no module-level level-2 relative imports in _plot/, docs/api-reference.md covers all nine new __all__ names, both new figures come from generate_graphs.py, and the new SVGs are vector-only with the generic sans-serif family.

Two physics additions from the books, both closing a visible hole in models
that were isotropic-only or rigid-frame-only.

**Orthotropic (ribbed and corrugated) panels** in
`building/panel_transmission.py`, from Vigran, Building Acoustics, Sections
3.7.3.3 and 6.5.3, cross-read against Bies, Hansen & Howard 5e Section
7.2.4.5. Cladding that is stiff along the corrugations and limp across them
has no single coincidence frequency but a whole range:
`orthotropic_critical_frequencies` returns the pair (fc1, fc2) from the two
principal bending stiffnesses (Eq. 6.107), and
`orthotropic_transmission_loss` predicts the flattened R(f) over it, either by
numerically averaging the azimuth-dependent transmission coefficient of Heckl
(1960) and Hansen (1993) over the diffuse field (Eqs 6.108 to 6.111 = Bies
Eqs 7.30, 7.31 and 7.38, with the size-dependent limiting angle of Bies
Eq. 7.36 or a fixed one) or by Heckl's closed-form design chart
(`method="heckl"`, Bies Fig. 7.9(b) and Eqs 7.59 and 7.60), which needs no
loss factor but requires fc2 > 4 fc1 for its four construction points to stay
in order. `SoundReductionResult` gains `critical_frequency_upper` and `.plot()`
shades the coincidence range, so the new path composes with the existing Sharp
physical model and the plateau estimate on the same axes and through the same
ISO 717-1 rating. For the sinusoidal profile,
`corrugated_plate_stiffness` gives the Timoshenko and Woinowsky-Krieger
equivalent stiffnesses (Eq. 3.115) and `corrugated_plate_mass_factor` the
developed-length increase in surface density that has to accompany them;
`orthotropic_plate_resonance` is the eigenfrequency of a simply supported
orthotropic plate (Eq. 3.113 = Bies Eq. 7.27, after Hearmon 1959), whose lowest
mode bounds the validity of both transmission models.

**Limp-frame equivalent fluid** (`limp_frame`, `decoupling_frequency`,
`limp_frame_applicable` in `materials/porous_absorber.py`), from Allard &
Atalla, Propagation of Sound in Porous Media 2e Section 11.3.4, Eqs 11.53 to
11.55 after Panneton (2007). Delany-Bazley, Miki and Johnson-Champoux-Allard
all assume a motionless frame, which only holds above the Zwikker-Kosten
decoupling frequency. Below it a light frame (felts, screens, aeronautic-grade
fibreglass) is dragged along by the pore fluid and its inertia has to be
carried. `limp_frame` corrects the effective density of any rigid-frame
`PorousMediumResult`, keeps its bulk modulus, and returns another
`PorousMediumResult` that drops straight into a `PorousLayer` of the
transfer-matrix stack. `limp_frame_applicable` and `LIMP_FRAME_CRITERIA` carry
the published rules of thumb for when a frame may be treated as limp at all.

Oracles. The orthotropic side is digit-anchored: Vigran's own worked example
(a 1 mm steel plate 1 m by 1 m, 4,9 and 19,7 Hz flat, 25,5 and 102 Hz
corrugated, which only come out with the developed-length mass), the printed
design-chart constants of Bies Fig. 7.9(b) (-54, -13,2, -17 and -23 dB for
rho c = 414), the 25 h.fc products of Hopkins Table A2, and the exact reduction
of the diffuse integral to its elementary mass-law form and of the orthotropic
impedance to Cremer's isotropic one. The limp-frame side is closed-form and
limit-anchored, not digit-oracled: Allard & Atalla publishes no table of
computed limp densities (its only numeric output table is the Rayleigh-wave
Table 10.2), so the checks are the printed closed form, the book's own two
exact limits (a heavy frame recovers the already-oracled rigid-frame result
digit for digit; the density converges on the apparent total density
rho_t = rho1 + phi rho0 as the frequency falls, where the rigid model diverges)
and the decoupling frequency of their Table 6.1 glass wool, 43,27 Hz. Ten new
conformance rows.

Two figures and new sections in the panel-insulation and porous-absorber
guides, English and Spanish.
@jmrplens
jmrplens force-pushed the orthotropic-and-limp-frame branch from 73c1725 to 097b339 Compare July 30, 2026 05:52

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

♻️ Duplicate comments (1)
scripts/generate_graphs.py (1)

8443-8447: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Derive the caption from the local variables instead of retyping them (still unresolved).

porosity, resistivity and frame_density are already local (line 8396); the literal caption will silently disagree with the plotted curves if any of them is edited.

♻️ Proposed fix
     ax.text(0.015, 0.03,
-            "Soft fibrous layer: porosity 0.98, "
-            "flow resistivity 25 kPa s/m², frame density 30 kg/m³",
+            f"Soft fibrous layer: porosity {porosity:g}, "
+            f"flow resistivity {resistivity / 1e3:g} kPa s/m², "
+            f"frame density {frame_density:g} kg/m³",
             transform=ax.transAxes, va="bottom", ha="left", fontsize=8.5,
             color=COLOR_FG)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/generate_graphs.py` around lines 8443 - 8447, Update the caption in
the ax.text call to interpolate the local porosity, resistivity, and
frame_density variables instead of hard-coded values, preserving the existing
labels, units, formatting, and plot styling.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Around line 79-82: Update the numeric literals in the English release notes,
including the referenced range, to use decimal points consistently instead of
decimal commas: 4.9, 19.7, 25.5, -13.2, 0.05, 0.2, and 43.27. Preserve the
surrounding wording and values.

In `@scripts/generate_graphs.py`:
- Around line 11927-11934: Update the caption construction in the info block to
derive the corrugation height and pitch from the local amplitude and pitch
variables, converting metres to millimetres for display. Replace the hardcoded
9% with a formatted percentage calculated from the existing mass_corr/mass_flat
ratio, while preserving the surrounding fc and mass formatting.

In `@site/src/content/docs/reference/api/building/panel-transmission.md`:
- Around line 159-165: Update the API source docstrings for the affected
defaults, including the entries corresponding to poisson_ratio and the
additional lines around the cited range, to use Python decimal-point notation
such as 0.3, 0.01, and 78.0 instead of comma decimals. Regenerate the
panel-transmission reference page so its rendered defaults match the callable
signatures.

In `@site/src/content/docs/reference/api/materials/porous-absorber.md`:
- Around line 539-558: Align the documented applicability boundary with
limp_frame_applicable: either change the prose criteria to use “≤” and state
that equality is accepted, or update the implementation to reject equality.
Ensure the parameter and Returns descriptions consistently use the same
inclusive or strict threshold semantics.

In `@src/phonometry/materials/porous_absorber.py`:
- Around line 135-142: Update the limp-frame applicability API around
LIMP_FRAME_CRITERIA and limp_frame to accept porosity and evaluate the general
porosity-dependent FSIr expression instead of exposing criterion="doutres" as a
universal Kc/Kf <= 0.2 test. If retaining the shortcut, explicitly scope or
rename it as a high-porosity rule of thumb; then update the corresponding test
cases in test_limp_frame.py and reporting logic in conformance_report.py to pass
porosity and validate the revised behavior.

---

Duplicate comments:
In `@scripts/generate_graphs.py`:
- Around line 8443-8447: Update the caption in the ax.text call to interpolate
the local porosity, resistivity, and frame_density variables instead of
hard-coded values, preserving the existing labels, units, formatting, and plot
styling.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 01e77305-5a52-4b05-a399-00255b65332f

📥 Commits

Reviewing files that changed from the base of the PR and between 73c1725 and 097b339.

⛔ Files ignored due to path filters (8)
  • .github/images/limp_frame_effective_density.svg is excluded by !**/*.svg
  • .github/images/limp_frame_effective_density_dark.svg is excluded by !**/*.svg
  • .github/images/limp_frame_effective_density_es.svg is excluded by !**/*.svg
  • .github/images/limp_frame_effective_density_es_dark.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss_dark.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss_es.svg is excluded by !**/*.svg
  • .github/images/orthotropic_transmission_loss_es_dark.svg is excluded by !**/*.svg
📒 Files selected for processing (36)
  • .zenodo.json
  • CHANGELOG.md
  • docs/CONFORMANCE.md
  • docs/api-reference.md
  • docs/getting-started.md
  • docs/panel-sound-insulation.md
  • docs/porous-absorbers.md
  • docs/references.md
  • llms-full.txt
  • llms.txt
  • scripts/conformance_report.py
  • scripts/generate_graphs.py
  • site/public/llms/llms-absorbers.txt
  • site/public/llms/llms-insulation-design.txt
  • site/public/llms/llms-start.txt
  • site/src/content/docs/es/guides/panel-sound-insulation.mdx
  • site/src/content/docs/es/guides/porous-absorbers.mdx
  • site/src/content/docs/es/index.mdx
  • site/src/content/docs/es/reference/bibliography.md
  • site/src/content/docs/es/reference/conformance.md
  • site/src/content/docs/guides/panel-sound-insulation.mdx
  • site/src/content/docs/guides/porous-absorbers.mdx
  • site/src/content/docs/index.mdx
  • site/src/content/docs/reference/api/building/panel-transmission.md
  • site/src/content/docs/reference/api/materials/porous-absorber.md
  • site/src/content/docs/reference/bibliography.md
  • site/src/content/docs/reference/conformance.md
  • src/phonometry/__init__.py
  • src/phonometry/_plot/building.py
  • src/phonometry/building/__init__.py
  • src/phonometry/building/panel_transmission.py
  • src/phonometry/materials/__init__.py
  • src/phonometry/materials/porous_absorber.py
  • tests/building/test_orthotropic_panels.py
  • tests/materials/test_limp_frame.py
  • tests/reference_data.py

Comment thread CHANGELOG.md
Comment on lines +79 to +82
Anchored on Vigran's own worked example (a 1 mm steel plate 1 m by 1 m: 4,9
and 19,7 Hz flat, 25,5 and 102 Hz corrugated, which only come out with the
developed-length mass), on the printed design-chart constants of Bies
Fig. 7.9(b) (-54, -13,2, -17 and -23 dB for `rho c` = 414), on the 25 `h fc`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use decimal points in the English release notes.

These numeric literals mix decimal commas with English prose. Use 4.9, 19.7, 25.5, -13.2, 0.05, 0.2, and 43.27 consistently.

Proposed fix
-  4,9 and 19,7 Hz flat, 25,5 and 102 Hz corrugated
+  4.9 and 19.7 Hz flat, 25.5 and 102 Hz corrugated

-  Fig. 7.9(b) (-54, -13,2, -17 and -23 dB
+  Fig. 7.9(b) (-54, -13.2, -17 and -23 dB

-  `|Kc/Kf| < 0,05` and the 0,2
+  `|Kc/Kf| < 0.05` and the 0.2

-  Table 6.1 glass wool, 43,27 Hz
+  Table 6.1 glass wool, 43.27 Hz

Also applies to: 100-110

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@CHANGELOG.md` around lines 79 - 82, Update the numeric literals in the
English release notes, including the referenced range, to use decimal points
consistently instead of decimal commas: 4.9, 19.7, 25.5, -13.2, 0.05, 0.2, and
43.27. Preserve the surrounding wording and values.

Comment on lines +11927 to +11934
info = [
(f"1 mm steel sheet, m'' = {mass_flat:.1f} kg/m², flat "
f"fc = {flat_fc / 1000.0:.1f} kHz"),
(f"corrugated H = 10 mm, L = 100 mm, m'' = {mass_corr:.1f} kg/m², "
f"fc1 = {fc1:.0f} Hz, fc2 = {fc2 / 1000.0:.1f} kHz"),
(f"worst penalty {penalty:.0f} dB at {nominal[worst]:g} Hz, "
"for a stiffer and only 9 % heavier panel"),
]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Same caption-drift pattern as the limp-frame figure: hardcode H/L/9 % from the local variables.

amplitude (0.010 m), pitch (0.100 m) and the mass_corr/mass_flat ratio are already computed locally (lines 11873-11881), but the caption spells out "H = 10 mm, L = 100 mm" and "9 %" as literals instead of interpolating them, unlike the neighboring fc1/fc2/mass f-strings in the same block.

♻️ Proposed fix
     info = [
         (f"1 mm steel sheet, m'' = {mass_flat:.1f} kg/m², flat "
          f"fc = {flat_fc / 1000.0:.1f} kHz"),
-        (f"corrugated H = 10 mm, L = 100 mm, m'' = {mass_corr:.1f} kg/m², "
+        (f"corrugated H = {amplitude * 1000:g} mm, L = {pitch * 1000:g} mm, "
+         f"m'' = {mass_corr:.1f} kg/m², "
          f"fc1 = {fc1:.0f} Hz, fc2 = {fc2 / 1000.0:.1f} kHz"),
         (f"worst penalty {penalty:.0f} dB at {nominal[worst]:g} Hz, "
-         "for a stiffer and only 9 % heavier panel"),
+         f"for a stiffer and only "
+         f"{(mass_corr / mass_flat - 1) * 100:.0f} % heavier panel"),
     ]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/generate_graphs.py` around lines 11927 - 11934, Update the caption
construction in the info block to derive the corrugation height and pitch from
the local amplitude and pitch variables, converting metres to millimetres for
display. Replace the hardcoded 9% with a formatted percentage calculated from
the existing mass_corr/mass_flat ratio, while preserving the surrounding fc and
mass formatting.

Comment on lines +159 to +165
| `thickness` | Sheet thickness `h`, in m (> 0). |
| `corrugation_amplitude` | Corrugation amplitude `H`, in m (> 0). |
| `corrugation_wavelength` | Corrugation wavelength `L`, in m (> 0). |
| `youngs_modulus` | Young's modulus `E`, in Pa (> 0). |
| `poisson_ratio` | Poisson's ratio `nu` (Default: 0,3). |

**Returns:** The triple `(Bx, Bz, Bxz)` in N.m.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use Python decimal syntax for API defaults.

0,3, 0,01, and 78,0 conflict with the callable signatures’ 0.3, 0.01, and 78.0. Update the source docstrings and regenerate this page.

Based on learnings: non-standard numeric values representing Python defaults should use decimal points.

Also applies to: 487-497

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/src/content/docs/reference/api/building/panel-transmission.md` around
lines 159 - 165, Update the API source docstrings for the affected defaults,
including the entries corresponding to poisson_ratio and the additional lines
around the cited range, to use Python decimal-point notation such as 0.3, 0.01,
and 78.0 instead of comma decimals. Regenerate the panel-transmission reference
page so its rendered defaults match the callable signatures.

Source: Learnings

Comment on lines +539 to +558
Both published criteria compare the bulk modulus of the frame *in vacuum*
`K_c` with that of the fluid in the pores `K_f` (Allard & Atalla 2e,
printed pp. 253-254): Beranek (1947) requires `|K_c/K_f| < 0.05`, and the
frame structural interaction study of Doutres et al. (2007) relaxes it to
`|K_c/K_f| < 0.2`. With `K_f` taken as the isothermal bulk modulus of
air, `P0 = 101,3 kPa`, the relaxed criterion is the book's statement that
"the limp model is applicable for materials having a bulk modulus lower
than 20 kPa". Neither criterion accounts for boundary or mounting
conditions, and the book notes that a thin light foam decoupled from a
vibrating structure by an air gap behaves limply well above the limit.

**Parameters**

| Name | Description |
| :--- | :--- |
| `frame_bulk_modulus` | Bulk modulus of the frame in vacuum `K_c`, in Pa (>= 0; pass `abs(K_c)` for a complex modulus). |
| `criterion` | Key into [`LIMP_FRAME_CRITERIA`](/phonometry/reference/api/materials/porous-absorber/#limp_frame_criteria), `"doutres"` (Default, 0,2) or `"beranek"` (0,05). |
| `fluid_bulk_modulus` | Bulk modulus of the pore fluid `K_f`, in Pa (Default: 101 325, the isothermal value for air). |

**Returns:** `True` when `|K_c/K_f|` does not exceed the threshold.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Align the applicability boundary with the implementation.

The prose specifies |K_c/K_f| < threshold, but limp_frame_applicable returns true at equality and the return text says “does not exceed.” Document <= or make the implementation strict.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/src/content/docs/reference/api/materials/porous-absorber.md` around
lines 539 - 558, Align the documented applicability boundary with
limp_frame_applicable: either change the prose criteria to use “≤” and state
that equality is accepted, or update the implementation to reject equality.
Ensure the parameter and Returns descriptions consistently use the same
inclusive or strict threshold semantics.

Comment on lines +135 to +142
#: Published upper limits on ``|K_c / K_f|`` (frame-in-vacuum bulk modulus over
#: pore-fluid bulk modulus) below which the limp-frame equivalent fluid of
#: :func:`limp_frame` may be used, from Allard & Atalla 2e printed pp. 253-254:
#: ``"beranek"`` is Beranek's (1947) original 0,05 and ``"doutres"`` the 0,2
#: to which Doutres et al. (2007) relaxed it with their frame structural
#: interaction criterion (which, with ``K_f`` approximated by the isothermal
#: value of air ``P0 = 101,3 kPa``, is the book's "lower than 20 kPa").
LIMP_FRAME_CRITERIA: Mapping[str, float] = {"beranek": 0.05, "doutres": 0.2}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Do not expose the high-porosity Doutres shortcut as a general applicability test.

criterion="doutres" evaluates only Kc/Kf <= 0.2 for every material. The primary criterion depends on porosity, while the 0.2 ratio is the near-unity-porosity simplification calibrated for specific absorption/radiation configurations, thicknesses, and frequencies. Add porosity and evaluate the general FSIr expression, or explicitly scope/rename this API as a high-porosity rule of thumb. Update tests/materials/test_limp_frame.py Lines 272-289 and scripts/conformance_report.py Lines 6959-6971 accordingly. (espace2.etsmtl.ca)

Also applies to: 501-532

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/phonometry/materials/porous_absorber.py` around lines 135 - 142, Update
the limp-frame applicability API around LIMP_FRAME_CRITERIA and limp_frame to
accept porosity and evaluate the general porosity-dependent FSIr expression
instead of exposing criterion="doutres" as a universal Kc/Kf <= 0.2 test. If
retaining the shortcut, explicitly scope or rename it as a high-porosity rule of
thumb; then update the corresponding test cases in test_limp_frame.py and
reporting logic in conformance_report.py to pass porosity and validate the
revised behavior.

@sonarqubecloud

Copy link
Copy Markdown

@jmrplens
jmrplens merged commit b21412a into main Jul 30, 2026
27 checks passed
@jmrplens
jmrplens deleted the orthotropic-and-limp-frame branch July 30, 2026 06:18
@bito-code-review

Copy link
Copy Markdown

Bito Automatic Review Skipped – PR Already Merged

Bito scheduled an automatic review for this pull request, but the review was skipped because this PR was merged before the review could be run.
No action is needed if you didn't intend to review it. To get a review, you can type /review in a comment and save it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api Public API surface, naming and deprecations area: building Sound insulation and building acoustics area: core Shared internals and cross-cutting code every domain depends on area: materials Absorption, impedance and material properties conformance Standard clause coverage, reference values or errata documentation Improvements or additions to documentation figures Generated plots, diagrams and animations i18n English and Spanish translations reports Accredited-format .report() fiches and their rendering site Documentation website validation Reference data and oracles used to check results against normative values

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant