// WIKI

acmap

Browser-based acoustic mapping: sound-level surveys and a simplified octave-band propagation model, with ISO 9613 terms and Maekawa diffraction on OSM buildings.

Published on Updated on JavaScriptLeafletISO 9613-2MaekawaOpenStreetMapApache-2.0
Code on GitHub ↗

acmap is a demonstrative tool for environmental acoustics that runs entirely in the browser without any backend. It visualises sound-level surveys loaded as CSV and simulates point-source propagation per octave band with a simplified model: geometric divergence, atmospheric absorption per ISO 9613-1, a G-factor ground term and Maekawa diffraction over real buildings fetched live from OpenStreetMap via the Overpass API.

One clarification is owed, because the name of the standard is easy to misread: acmap does not implement the full ISO 9613-2 method. It uses some of its terms — divergence, and Part 1 atmospheric absorption — while screening is handled by Maekawa rather than the standard’s §7.4, the ground effect is a simplified broadband model, and reflections, lateral diffraction, multiple diffraction, topography, directivity and the standard’s meteorological treatment are absent altogether. The correct description is therefore a simplified propagation model using terms from the ISO 9613 family, not “ISO 9613-2 implemented”. This page summarises the README and documents the method, assumptions and result interpretation; the authoritative code reference remains GitHub.

Origin and added value

The tool grew from ST-LINE’s work in environmental acoustics, in parallel with the development of the commercial product SoundPro. acmap is explicitly a demo: an open-source educational tool that embodies ST-LINE’s technical approach to acoustic computation, without claiming to replace a model adequate to the methodology, or the professional judgement of whoever signs an assessment.

The added value over other online acoustic demos is data transparency: OSM buildings almost always have estimated heights rather than measured ones, and acmap declares this visually (dashed borders, % estimated statistics, warning above the 70% threshold). The limit of the data is stated on the page, not left to be inferred from numbers presented as certain. How nearly always is settled by a count on real data: in an Overpass response for central Treviso, zero of 1365 buildings carried an explicit height tag and only 8 had building:levels.

What it does

Measure mode: load a CSV with columns lat, lon, leq, visualise points labelled 1..N coloured by level, kernel-density heatmap, interpolated isolines (IDW — a cartographic interpolation, not a propagation model: between two measured points no physical law says the field follows the inverse square of the plan distance), aggregate statistics. Selecting a DPCM 14/11/1997 class (I–VI) colours the points green (below the selected threshold) or red (above it) — a numerical pre-screening, not a compliance check; see How to read the results. Export to GeoJSON and CSV with a label column.

Predict mode: place a point source on the map by clicking, auto-fetch OSM buildings in the area from Overpass, compute propagation on a configurable receiver grid applying per octave band (8 bands, 63 Hz – 8 kHz) geometric divergence, atmospheric absorption (T, RH editable), ground effect with G-factor, and Maekawa diffraction over the first intercepted building.

Source spectra (9 presets): flat, traffic, rail, industrial, low-frequency (HVAC), plus 4 specific low-frequency sources — wind turbine, power transformer, industrial plant hum, HVAC chiller.

A / Z / C weighting: the output can be expressed in dB(A) (regulatory default), flat-weighted dB (“Z”) or dB(C), which attenuates low frequencies far less. Two terminological cautions: acmap’s dB(Z) is not “the physical level” in absolute terms, it is the unweighted sum over the eight bands from 63 Hz to 8 kHz and ignores everything outside them; and dB(C) is not an impulsiveness indicator — in Italian environmental acoustics impulsive character is determined by the procedure of DM 16/03/1998, not from an L_Ceq. The panel selector changes the applied weighting; the map extent and building shadows do NOT change with the weighting — only the point colours do, because receiver retention uses the physical linear level.

The octave-band charts (“Typical spectrum” canvas, receiver spectrum tooltips) show eight-band octave spectra, not a transform: they cannot resolve tonal components. They are are dual-series: a linear bar (the source’s unweighted physical character) next to a weighted one (the contribution to the Leq in the chosen weighting). The comparison makes explicit how much A-weighting crushes low frequencies: a wind turbine looks low-frequency-dominated in linear and mid-peaked in dB(A).

Calculation method

The engine is shared with the barrier-calculator tool (@lib/physics/ module). In Predict mode, for each octave band f ∈ {63, 125, 250, 500, 1000, 2000, 4000, 8000} Hz the level at the receiver is:

  • Lw(f) = Lw + ΔL_spectrum(f) — band sound power. Lw is to be read as unweighted: A or C weighting is applied afterwards, band by band, so entering an L_WA as if it were an L_W weights it twice. ΔL_spectrum is the preset’s relative shape, and it should be said that those shapes are stylised, not derived from measurements: choosing “traffic” gives the typical spectral signature of a road, not a road emission model. The offsets are, however, normalised, that is their energetic sum is exactly 0 dB: changing preset at constant Lw changes the spectrum’s shape and not the total power. Until 25 August 2026 they were not, and the total departed from the Lw set by up to +1.36 dB.
  • A_div = 20·log₁₀(d) + 11 — geometric divergence (spherical spreading of the single point, ISO 9613-2).
  • A_atm(f) = α(f, T, RH)·d — atmospheric absorption, coefficient α per ISO 9613-1: grows with frequency (high frequencies attenuate fast).
  • A_gr — G-factor ground effect (G = 0 reflecting … G = 1 absorbing), frequency-independent in this engine: a broadband term interpolated between −3 dB (hard ground) and a “soft ground” shape, with mean height taken as (h_s + h_r)/2. It is not the per-band A_gr of the ISO 9613-2 general method, nor an application of its simplified method, which is defined for A-weighted levels, requires predominantly porous ground, excludes pure tones and admits no negative values. A consequence for the outputs follows: the dB(Z) and dB(C) spectra and totals remain useful for reading the source’s character, but they are not coherent with a ground term derived from an A-weighted method.
  • A_dif(f) — Maekawa diffraction over the first building the line of sight meets: D = 10·log₁₀(3 + 20·N), Fresnel number N = 2δ/λ, λ = c/f, δ the path difference of the wave passing over the building, with the result clamped between 0 and 25 dB. Two points: the code picks the first intercepted obstacle (firstBuildingHit), not the acoustically dominant one — a second, taller building or one closer to the receptor could give a larger δ; and Maekawa is not the ISO 9613-2 §7.4 screening method, which has different constants and caps (see the diffraction wiki). The 25 dB cap is an algorithmic limit, not a physical result.

The total level is the energetic sum over bands with the chosen weighting w(f) (A / C / 0 for Z):

acmap uses the Maekawa diffraction method (the module signature also offers ISO 9613-2 §7.4, used by the barrier tool, which also has lateral diffraction). The grid covers the configured extent bbox with radial expansion: receivers beyond the radius from the source are discarded.

The budget of terms, in numbers

The formula says which terms exist; it does not say how much they weigh. A concrete case, produced by the tool’s engine: a road source with L_w = 100 dB, a receiver at 200 m, source 1 m and receiver 4 m above ground, mixed ground (G = 0.5), 20 °C and 70 % relative humidity.

The two frequency-independent terms come to A_div = 57.0 dB and A_gr = 0.67 dB. At 1 kHz the total attenuation is 58.7 dB, of which 57.0 comes from divergence alone; at 8 kHz it is 73.2 dB, because air adds 15.5. Do not turn those ratios into percentages of energy: they are decibels, and taking off 57 dB means dividing the intensity by half a million, after which the other terms act on what is left. Everything else is spectrum:

Band L_w(f) A_atm L_p linear A weighting L_p in dB(A)
63 Hz 85.2 dB 0.02 dB 27.5 dB −26.2 1.3 dB(A)
125 Hz 89.2 dB 0.07 dB 31.4 dB −16.1 15.3 dB(A)
250 Hz 92.2 dB 0.22 dB 34.3 dB −8.6 25.7 dB(A)
500 Hz 93.2 dB 0.56 dB 34.9 dB −3.2 31.7 dB(A)
1000 Hz 94.2 dB 1.00 dB 35.5 dB 0.0 35.5 dB(A)
2000 Hz 92.2 dB 1.81 dB 32.7 dB +1.2 33.9 dB(A)
4000 Hz 88.2 dB 4.62 dB 25.9 dB +1.0 26.9 dB(A)
8000 Hz 83.2 dB 15.53 dB 10.0 dB −1.1 8.9 dB(A)

Energetic sum: 39.2 dB(A), 41.3 dB(Z), 41.2 dB(C).

Two things read off at a glance. The first is that at 200 m atmospheric absorption is still negligible below 500 Hz (fractions of a decibel) and already heavy at 8 kHz (15.5 dB). The second is that the 63 Hz band, starting from 85.2 dB of power, ends up contributing 1.3 dB(A): A weighting alone takes 26 dB off it. In dB(Z) that same band is worth 27.5.

Z, A and C at the same point

This is where the reason for offering three weightings instead of one becomes clear. At 500 m from the source, with the same L_w and three different spectra:

Source dB(Z) dB(A) dB(C) C − A
Road traffic 32.1 29.3 32.0 2.7 dB
Wind turbine 33.8 23.1 33.4 10.3 dB
Transformer 33.8 23.3 33.4 10.1 dB

The C − A column is a spectral indicator, not a regulatory one: it grows as the energy moves downwards, because C weighting attenuates the low end far less than A. Use it to see where the source’s content sits, not as a threshold: neither the DPCM 14/11/1997, nor DM 16/03/1998, nor ISO 9613-2 sets a C − A value beyond which a low-frequency problem is declared. And a high C − A does not by itself imply disturbance, which also depends on the absolute level, tonality, duration, residual noise and the receptor’s indoor environment. The turbine and the transformer have a higher dB(Z) level than the traffic and a dB(A) level six decibels lower: the same point, with the same physics, changes ranking with the metric. It is why, on a low-frequency source, dB(A) alone can close the analysis too early. With one reservation on the domain: acmap stops at 63 Hz, so 31.5 Hz and the infrasonic bands — often decisive precisely for turbines and transformers — fall outside the model.

Ground effect has a sign

A detail that surprises people reading the results: A_gr can be negative, that is act as a gain. On the same geometry, varying G:

G 50 m 100 m 200 m 500 m 1000 m
0 (reflective) −3.00 −3.00 −3.00 −3.00 −3.00 dB
0.5 (mixed) −0.25 +0.40 +0.67 +0.81 +0.86 dB
1 (absorbing) +2.50 +3.80 +4.34 +4.62 +4.71 dB

In the model, over perfectly reflective ground the level comes out 3 dB higher than free field at every distance: that is the choice of treating the reflection as a simple doubling of energy. Read it as a property of the model, not a law of hard ground: in reality direct and reflected waves interfere, and the result depends on phase, source and receptor heights, frequency and the surface’s real impedance — the ISO 9613-2 general method treats A_gr in a far more articulated way. That a water surface or an asphalt yard worsens propagation remains true as a tendency; the exact 3 dB belongs to the model. And you can see the absorbing-ground effect growing with distance and saturating: between 500 and 1000 m it gains nine hundredths of a decibel.

Bear in mind, though, that in this engine A_gr is frequency-independent, whereas the ISO 9613-2 A_gr is per band and has a pronounced shape, with maximum attenuation in the low-mid bands. That is the simplification declared among the assumptions: the order of magnitude is right, the spectral distribution is not.

Air as a low-pass filter

The A_atm term deserves a section of its own, because it is what decides the character of distant sound, not just its level. The ISO 9613-1 coefficient α comes to, at 20 °C and 70 % humidity:

Band 63 125 250 500 1000 2000 4000 8000 Hz
α [dB/km] 0.09 0.33 1.12 2.79 4.98 9.04 23.09 77.63

Between the two ends of the spectrum there is a factor of 860. Multiplied by distance:

Distance 63 Hz 500 Hz 1000 Hz 4000 Hz 8000 Hz
100 m 0.0 0.3 0.5 2.3 7.8 dB
500 m 0.0 1.4 2.5 11.5 38.8 dB
1000 m 0.1 2.8 5.0 23.1 77.6 dB
2000 m 0.2 5.6 10.0 46.2 155.3 dB

At 2 km the 8 kHz band has lost 155 dB to air alone, while the 63 Hz band has lost two tenths. A hundred and fifty-five decibels remain an attenuation, not an annihilation — what is left always depends on L_p = L_w − A — but they are enough for that band to end up below any background noise in practice. A note on the domain: the last two rows of the table lie beyond 1000 m, the distance within which ISO 9613-2 states an accuracy estimate; the atmospheric term extrapolates cleanly, the model’s overall accuracy does not. This is the physical reason a distant motorway sounds like a rumble rather than a hiss, and why remote thunder is a dull roll while close up it is a crack: air is a low-pass filter whose cutoff falls with distance.

0.1110100631252505001k2k4k8k20 °C, 30 % RH20 °C, 70 % RHoctave band [Hz]α [dB/km]
Atmospheric absorption coefficient per octave band, in dB/km on a log scale, at the same temperature and two different humidities. There are nearly three orders of magnitude between the ends of the spectrum; humidity shifts the high bands by a factor of two, and acts the other way in the mid bands. Values from the tool's engine, ISO 9613-1 coefficients.

Then there is the dependence on temperature and humidity, which is why the tool asks for them instead of fixing them. At the same temperature of 20 °C:

Condition 500 Hz 2000 Hz 4000 Hz 8000 Hz
70 % RH 2.79 9.04 23.09 77.63 dB/km
30 % RH 2.51 14.12 48.89 168.35 dB/km

Going from humid to dry air more than doubles the absorption at 8 kHz — and at 500 Hz slightly lowers it. The dependence is not monotonic: the molecular relaxation peak shifts in frequency with humidity, so “more humid air” does not mean “always more attenuation”. Below 250 Hz, in any case, the choice of T and RH moves almost nothing: at 200 m we are talking hundredths of a decibel. The practical consequence is that on a map dominated by low frequencies the two parameters can be left at their defaults without regret, while on a high-frequency source at kilometre distances they become a scenario choice, not a detail.

Model assumptions

  • 8 octave bands, 63 Hz – 8 kHz. Not third-octaves.
  • A single point source per computation, spherical radiation, no directivity.
  • Homogeneous atmosphere, constant T and RH: no temperature/wind gradients, no turbulence, no refraction. It should be stressed that the ISO 9613-2 method does not describe a generic atmosphere but conditions favourable to propagation (downwind, or an equivalent inversion), with a separate correction for long-term average levels: acmap asks for neither wind direction, climatology nor scenario, so its result is a simplified scenario, not an ISO level under defined conditions.
  • Topographically flat ground. No DTM or DEM: source, receptor and building heights all refer to a common plane. Embankments, cuttings, slopes and hollows — which change the line of sight, δ, the ground effect and the screening — are invisible to the model.
  • Horizontal distance. On the grid the propagation distance is the plan distance; source and receptor enter with their heights in the terms that need them, but the distance is not the slant distance. Negligible at long range, not at short range or with much-elevated sources.
  • Simplified diffraction: single-screen Maekawa over the first building intercepted by the line of sight, clamped at 25 dB. No multi-diffraction cascade, no lateral diffraction. The two omissions pull in opposite directions: ignoring the lateral path around a tall, narrow building overestimates the screening, ignoring subsequent buildings underestimates it. There is therefore no guaranteed conservative direction to the error.
  • No reflections off facades or ground.
  • Frequency-independent ground effect — a simplification vs the standard’s per-band Agr.
  • Building heights from OSM, often estimated (see Caveats).
  • Receivers with a negligible physical level (below the floor) are discarded from the grid — independently of the chosen weighting.

How to read the results

  • dB(A) vs linear dB (Z) vs dB(C). dB(A) is the regulatory metric, but it heavily compresses low frequencies (−26 dB at 63 Hz). To read the true spectral character of a low-frequency source (turbine, transformer) use dB(Z) or look at the linear series in the dual-series charts: in dB(A) even a low-frequency source appears mid-peaked.
  • The map extent does not depend on the weighting. Switching A/Z/C only changes colours; geometry, shadows and cells stay identical. This is intentional: weighting is a reading choice, not a physical one.
  • Spectrum tooltip. Hovering a receiver shows the octave-band spectrum in dual series (linear + weighted): it reveals which frequencies actually dominate at that point.
  • Acoustic shadows. With buildings in the calculation, the “receivers in shadow” statistic counts points where a building intercepts the line of sight: that is a geometric condition, not an acoustic shadow — sound still arrives by diffraction over the top, laterally and by reflection. A shadow is sharper at high frequencies than at low ones (low frequencies wrap around the obstacle).
  • “Mean Leq” = arithmetic mean of the sample in Measure mode. It is a statistic describing the loaded values, not a physical level: L_Aeq is already an energetic quantity referred to a time interval, and the arithmetic mean of 50 and 70 dB(A) measured in two different places gives 60 dB(A) without that number describing any field. It works as a summary of the sample; it has no regulatory meaning.
  • The “% of points above threshold” is a statistic of the cartographic sample, not a compliance indicator: the regulation checks levels at determined points under determined conditions, not fractions of a grid.
  • Far or deep-shadow cells appear faded or absent: below the model’s floor.

How to use it

Measure mode (loaded survey)

  1. Open the tool, select Measure in the top toggle.
  2. Load a CSV with three minimum columns: lat, lon, leq (header optional, comma separator, # comment lines ignored). Drag-and-drop or Load CSV button. If the CSV has a label/index first column, it is used as the point label (round-trip with the export).
  3. Points appear on the map labelled 1..N (number engraved in the disc); the sample statistics (point count, Mean Leq = arithmetic mean, min·max, % above the limit) show up in the Statistics panel, with technical sublabels.
  4. Pick a DPCM 14/11/1997 class (I–VI): points turn green (compliant, Leq ≤ limit) / red (above limit) and a sub-label under the menu confirms the active comparison (e.g. “CSV points compared with 55 dBA”).
  5. Optional: enable kernel-density heatmap or IDW isolines. Toggle theme and language in the header.
  6. Export: GeoJSON or CSV with a label column (the 1..N point index). The exported CSV is re-importable, keeping the labels.

Predict mode (propagation simulation)

  1. Switch to Predict in the top toggle.
  2. Click on the map to place a point source; the tool auto-fetches OSM buildings in a radius around it (Overpass API, ~5 s, with a status popup).
  3. Set the source parameters: Lw (sound power, dB), height, spectrum (9 presets; the ⓘ button opens a popover with description and a mini chart).
  4. Choose the weighting A / Z / C.
  5. Set the atmospheric parameters (T °C, RH %) and the ground effect (G-factor 0–1).
  6. Set the receiver grid (extent, step) and the receiver height.
  7. Click Compute: chunked async, does not block the UI, progress spinner.
  8. Result: coloured receiver grid + heatmap/isolines, aggregate statistics, and — if “Buildings participate in calculation” is on — a “receivers in acoustic shadow” statistic in the status bar.

Vertical cross-section, capture and graphic export

  • Click on any receiver in the grid → interactive SVG with source → building → receiver geometry, direct and diffracted paths, path-difference and attenuation values.
  • Spectrum tooltip on receiver mouseover → mini dual-series octave-band spectrum (eight bands, not an FFT).
  • Two map controls top-right: 📷 screen capture (Screen Capture API → PNG of the actually rendered pixels, identical to what is on screen) and 🖨 print/PDF (dedicated A4 landscape layout: map + legend + parameter footer, single page), for preliminary reports.

What it does not do

Multi-diffraction (multiple buildings in cascade), lateral diffraction (around edges), multiple/line/area sources, multiple reflections off facades, profiled meteorology, CNOSSOS-EU, NMPB-Routes-2008. All limitations are openly declared in the tool’s disclaimer and below.

Caveats and disclaimer

  • Demonstrative tool, not for forensic use. acmap is not certified for forensic/peritial use, regulatory-limit validation, or use as evidence in legal proceedings. Those uses require two distinct things, which do not substitute for one another: a calculation model adequate to the required methodology — CadnaA, SoundPLAN and NoiseModelling are common examples, but Italian regulation establishes no category of “certified software” and mandates no product: DM 29/11/2000 sets functional requirements the model must meet — and a competent acoustic technician on the ENTECA register, who is the professional responsible for the work. Software is a tool, not an alternative to the professional.
  • Single source. Predict mode handles ONE point source per computation. For scenarios with a noise barrier + line/area source see the companion tool noise-barrier-calc.
  • Simplified diffraction. Single Maekawa over the dominant intercepted building; no multi-diffraction cascade, no lateral diffraction, no reflections.
  • Simplified ground effect. Frequency-independent G-factor model, not the per-octave-band Agr of the ISO 9613-2 method (see Calculation method).
  • Geometry quality matters more than height quality. The estimated-heights statistic is useful but partial: a building missing from OSM, a wrong footprint or a displaced position weigh more than two metres of error on a height. And the 70 % warning threshold is an interface heuristic, not a validity criterion: a single badly estimated building, if it is the one screening the critical receptor, is enough to move the result.
  • OSM data. Building heights from OpenStreetMap are almost always inferred or assumed. The useful distinction is not between “real” and “estimated”: a height tag means a height is declared in OSM, not that it was measured, is current, or has a known precision. The resolution chain, from the most authoritative datum to the most conjectural, is: height → building:height → est_height → floor count (building:levels, plus roof:levels/roof:height where present) multiplied by a storey height that depends on the typology → per-typology default. Only the first group is a height declared in OSM: that does not mean measured, current or of known precision, but it is still the least conjectural datum. A height derived from a floor count is an inference, and the tool counts it as one. The per-typology default replaced the old single 9 m value, which gave the same height to a house, a warehouse and a church. The tool declares visually which buildings have estimated heights (dashed borders), shows the % estimated in the statistics, and emits a warning above 70 % estimated.
  • No backend. The CSV stays in the browser and is not uploaded to any server of ours. It is not true, though, that no data leaves: Overpass queries go from your browser to the public OSM mirrors (third parties) carrying the coordinates and the bounding box of the area, and the map tiles do the same.
  • Simplified atmospheric model. ISO 9613-1 with constant T/RH; no profiled meteorology.
  • “Mean Leq” stat = arithmetic mean. A descriptive statistic of the loaded sample, with no regulatory meaning; for an energy-averaged mean a different aggregation would be needed.

Tech stack

Vanilla JavaScript in a single HTML file, libraries vendored locally (Leaflet 1.9.4, leaflet.heat 0.2.0, papaparse 5.4.1, d3-contour 4.0.2). ISO 9613-2 physics engine shared with the barrier tool (@lib/physics/). No bundler, no runtime CDN dependency in the standalone repo.

Companion tool

acmap is also available as a runnable web tool at /en/tools/acoustic-map/, without needing to download anything. The GitHub repository is for those who want to inspect the code, contribute, or fork for their own use.

License

Apache-2.0 with patent grant. Authorship Stefano Fante personally, maintained as part of the Open Lab activities of ST-LINE (STLINE S.r.l.)

Last updated: · Spotted an error or stale figure? Let us know

← Back to the Wiki index

A similar project?

Acoustics, embedded, calculation tools: if you have a related use case, let’s talk.