octave_bands — ACOUSTICS level op

• Data kinds: none → table (an op determined by its arguments alone — it takes no image or data input)

• Call: import fullseye as fs; fs.ledger.octave_bands(fraction=3, f_min=22.0, f_max=22050.0, base=10) (to call the implementation directly, import acoustics; acoustics.octave_bands(fraction=3, f_min=22.0, f_max=22050.0, base=10); from the registry, opsacoustics.get("octave_bands"))

Usage

Fractional-octave band centres and edges, from the defining construction.

The band system is a geometric progression through 1 kHz:

f_c = 1000 * G**(x/b) for odd b and 1000 * G**((2x+1)/(2b)) for even b, with edges at f_c * G**(-+1/(2b)). base=10 uses G = 10**(3/10) (the base-ten system, in which ten third-octaves span almost exactly a decade); base=2 uses G = 2 exactly. No published table of centre frequencies is transcribed — the *exact* centres are computed, which is why centers reads 1000.0, 1258.925, 1584.893 rather than the 1000, 1250, 1600 a published series would give.

The parity of fraction changes where 1 kHz sits, and this surprises people. With an odd b (1/1, 1/3) there is a band *centred* on exactly 1000.0 Hz. With an even b (1/2, 1/6, 1/12, 1/24) the offset in the exponent means there is no 1 kHz band at all — instead 1000.0 Hz is exactly a band *edge*, shared by two bands. Measured across fraction = 1, 2, 3, 6, 12, 24: a centre lands on 1000.0 for 1 and 3, and a lower edge lands on it for 2, 6, 12 and 24, in every case to within rtol=1e-12. That is the defining construction, not an artefact, and it matters when a level is quoted "at 1 kHz": in an even system that number comes from one of two adjacent half-bands, not from a band on the tone.

nominal is the exact centre rounded to three significant figures, for labelling only. It is a rounding, not the published nominal series, and it differs from it: measured, the 1/1-octave centres round to 31.6, 63.1, 126.0, 251.0, 501.0, 1000.0, 2000.0, 3980.0, 7940.0, 15800.0, where the published series has 125 and 250 where this has 126 and 251. Do arithmetic with centers and supply your own labels if they have to match a report.

Returns a dict: centers, lower, upper, nominal, fraction, base, ratio (G**(1/b)), bandwidth (upper - lower), index (the integer x).

Exact identities, asserted in the tests: upper/lower = G**(1/b) for every band, center = sqrt(lower*upper) (the centre is the geometric mean of its edges, by construction), and successive centres are in the ratio G**(1/b). Measured for fraction=3, base=10 over 22 Hz - 22.05 kHz (30 bands): the band containing 1000 Hz has lower = 891.250938, center = 1000.000000, upper = 1122.018454; upper/lower - G**(1/3) = 2.2e-16; |center - sqrt(lower*upper)| <= 1.8e-12 over all bands; and successive centre ratios deviate from G**(1/3) by at most 6.7e-16. With base=2 the octave centres come out exactly 31.25, 62.5, 125, 250, 500, 1000, 2000, 4000, 8000, 16000 Hz.

Raises ValueError: fraction not an int in [1, 24], base not 2 or 10, non-positive or non-finite f_min / f_max, f_min >= f_max, and a request for more than MAX_BANDS bands.

Detailed usage guide

• acoustic_condition_monitoring family guide

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• acoustic_condition_monitoring — py -3.11 examples/acoustic_condition_monitoring.py

• poc_rail_corrugation — py -3.11 examples/poc_rail_corrugation.py

Ops the type connects to (they accept table as input)

istft

Same category (level)

octave_spectrum · weighting_response · apply_weighting · equivalent_level · percentile_level


*Provenance: acoustics.py — ACOUSTICS operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.