Spatial impression (ISO 3382-1)
Standards: ISO 3382Key references: Barron & Marshall 1981Bradley & Soulodre 1995Hidaka et al. 1995
Two halls can have the same reverberation time, the same clarity and the same sound strength and still sound nothing alike, because those quantities do not care where the sound comes from. A narrow hall throws early reflections at the listener’s ears from the side; a wide one throws them from above and in front. The first sounds broad and enveloping, the second sounds flat, and no omnidirectional microphone can tell them apart.
ISO 3382-1 measures the difference with a second microphone. Annex A.2.4 and A.2.5 use a figure-of-eight pattern alongside the omnidirectional one, and Annex B uses a head with a microphone at each ear canal.
The second and third cells are this page: the lateral fractions need a figure of eight aimed a particular way, and the correlation needs two ears.
1. Two weightings for one reflection
Section titled “1. Two weightings for one reflection”The figure-of-eight microphone is aimed with its null at the source, so the direct sound weighs nothing and its output follows the cosine of the angle each reflection arrives at. Squaring the pressure, as Equation (A.14) does, weights that reflection by :
Multiplying it by the omnidirectional response instead, as Equation (A.15) does, weights it by the cosine itself, which A.2.4 calls subjectively more accurate:
The two weightings, both fractions band by band, and the window the interaural coefficient is the maximum over.
import numpy as npfrom phonometry import room
fs = 48000# One reflection of half the direct amplitude, 20 ms late, arriving at 45# degrees from the microphone axis. The figure-of-eight microphone sees it at# 0.5 cos(45); the omnidirectional one at 0.5, on top of the unit direct.n = int(0.3 * fs)omni, lateral = np.zeros(n), np.zeros(n)omni[100] = 1.0omni[100 + int(0.020 * fs)] = 0.5lateral[100 + int(0.020 * fs)] = 0.5 * np.cos(np.deg2rad(45.0))
squared = room.early_lateral_energy_fraction(omni, lateral, fs, limits=None)cosine = room.early_lateral_energy_fraction( omni, lateral, fs, weighting="cosine", limits=None)print(squared.energy_fraction.round(4)) # [0.1] = 0.25 cos^2(45) / 1.25print(cosine.energy_fraction.round(4)) # [0.1414] = 0.25 cos(45) / 1.25The two lower limits differ, and that is printed. The numerator starts at 5 ms and the denominator at 0: the direct sound belongs to the total early energy but not to the lateral share, and the 5 ms keeps whatever leaks through the microphone’s null out of the numerator.
Time zero comes from the omnidirectional response. A figure-of-eight microphone aimed as A.2.4 asks has no direct sound to trigger on, so its own onset detector lands on the first strong reflection and shifts both integration limits by that much. Both functions here take their time zero from the response you pass first.
2. The modulus that a text layer deletes
Section titled “2. The modulus that a text layer deletes”Equation (A.15) prints a modulus around . It is easy to
lose, because pdftotext renders the same numerator without it, and losing
it inverts the meaning of the quantity: a figure-of-eight microphone
responds with opposite sign to the two sides, so two mirror-image
reflections cancel to exactly zero instead of adding.
import numpy as npfrom phonometry import room
fs = 48000n = int(0.3 * fs)omni, lateral = np.zeros(n), np.zeros(n)omni[100] = 1.0for time, side in ((0.020, +1.0), (0.030, -1.0)): omni[100 + int(time * fs)] = 0.5 lateral[100 + int(time * fs)] = side * 0.5 * np.cos(np.deg2rad(45.0))
result = room.early_lateral_energy_fraction( omni, lateral, fs, weighting="cosine", limits=None)print(result.energy_fraction.round(4)) # [0.2357], twice one reflection
signed = (0.25 * np.cos(np.deg2rad(45.0)) - 0.25 * np.cos(np.deg2rad(45.0))) / 1.5print(round(signed, 12)) # 0.0, the misreadingTwo rooms, one with mirror-image reflections from both sides and one with no lateral reflections at all, would come out identical and zero. The library reads the page.
3. Envelopment: the level of what arrives late
Section titled “3. Envelopment: the level of what arrives late”is a fraction, so it cancels its own calibration. The late lateral sound level of Equation (A.16) is a level and does not: it is the lateral energy after the early window against the free-field reference at 10 m, the same reference the sound strength uses.
Equation (A.17) averages it over the 125 Hz, 250 Hz, 500 Hz and 1 kHz octave bands with a factor of 0,25, which is one quarter, so it is an energy mean:
Footnote a of Table A.1 makes this the one exception in the whole table: every other quantity in it is averaged arithmetically over its bands, and only is averaged over energy. The two are not close when the bands disagree.
import numpy as npfrom phonometry import room
print(round(room.late_lateral_average([-8.0] * 4), 4)) # -8.0, unchangedprint(round(room.late_lateral_average([0.0, 0.0, 0.0, 6.0206]), 4)) # 2.4304
bands = [-14.0, -8.0, -5.0, 1.0]print(round(room.late_lateral_average(bands), 4)) # -3.5324, energyprint(round(float(np.mean(bands)), 4)) # -6.5, arithmeticNearly 3 dB apart, and Table A.1 does not print a just-noticeable difference for at all: it says “Not known”.
4. Two ears, one coefficient
Section titled “4. Two ears, one coefficient”Annex B measures the same aspect with a dummy head. Equation (B.1) is the normalised cross correlation of the two ear responses,
and Equation (B.2) takes its largest magnitude within a millisecond of coincidence, which is about the interaural delay of a head:
Both the square root and the modulus are printed, and both are lost by a text layer. The root is what bounds the function by one; without it the result is not a correlation at all and scales with the gain of either ear. The modulus is what makes two anti-phase ears score 1: they are as dissimilar as two signals can be in sign alone, and 0 would be the wrong answer for them.
import numpy as npfrom phonometry import room
fs = 48000t = np.arange(int(1.5 * fs)) / fsrng = np.random.default_rng(3382)ear = rng.standard_normal(t.size) * np.exp(-3.0 * np.log(10.0) * t / 2.0)
print(room.interaural_cross_correlation(ear, ear, fs, limits=None).coefficient)# [1.] the square root is what makes this exactly oneprint(room.interaural_cross_correlation(-ear, ear, fs, limits=None).coefficient)# [1.] the modulus is what makes this one and not zero
delayed = np.concatenate([np.zeros(int(0.0005 * fs)), ear])[: ear.size]found = room.interaural_cross_correlation(ear, delayed, fs, limits=None)print(found.delay * 1000.0) # [0.5] ms, the right ear lagsB.4 prints three windows: the general one from the direct sound to a time of
the order of the reverberation time, which is the default; the early one,
IACC_EARLY_WINDOW_S, from 0 to 80 ms; and the reverberant one from
IACC_LATE_START_S onwards. It puts the range at the 125 Hz to 4 kHz
octave bands and assumes a just-noticeable difference of 0,075.
A broadband correlation is a spike and says very little. Measure in bands, which is what the default does and what the right-hand panel above draws.
5. What the second microphone has to be
Section titled “5. What the second microphone has to be”Both lateral measures need the two microphones to record one event at one point, so the library refuses two responses of different lengths. additionally needs their relative sensitivity to have been calibrated in a free field (A.3.2), because it is a level and the figure-of-eight response carries its own gain into it. does not: a common factor on both cancels in the ratio, and a factor on the figure-of-eight alone shows up as a straight scaling of the fraction.
The 80 ms windows are the printed ones, and a response that stops before them raises rather than shortening itself: an 80 ms integral taken over the 48 ms that were recorded is not the printed quantity, because the 32 ms that were never recorded are missing from the numerator and from the denominator alike, and which way the fraction then moves depends on how lateral the part that was lost was.
What this guide covers
Section titled “What this guide covers”Covered
The spatial measures of ISO 3382-1:2009: the early lateral energy fraction of Equation (A.14) and its cosine-weighted variant of Equation (A.15), with the modulus the second prints; the late lateral sound level of Equation (A.16) against the free-field reference at 10 m, and its energy average over four octave bands of Equation (A.17); and the normalised interaural cross correlation function of Equation (B.1) with the coefficient of Equation (B.2), with the square root and the modulus both prints, over any of the three time windows B.4 names.
Not covered yet
The equipment and the geometry the measurement asks for: the dummy-head geometry of B.3, the source directivity limits of Table 1, the stage support of Annex C, and the measurement uncertainty of Clause 7.
References
Section titled “References”- Barron, M., & Marshall, A. H. (1981). Spatial impression due to early lateral reflections in concert halls: The derivation of a physical measure. Journal of Sound and Vibration, 77(2), 211-232. https://doi.org/10.1016/S0022-460X(81)80020-XWhere the early lateral energy fraction comes from, and the subjective experiments that fixed its 80 ms window.
- Bradley, J. S., & Soulodre, G. A. (1995). Objective measures of listener envelopment. The Journal of the Acoustical Society of America, 98(5), 2590-2597. https://doi.org/10.1121/1.413225The experiments behind the late lateral sound level and its 80 ms boundary.
- Hidaka, T., Beranek, L. L., & Okano, T. (1995). Interaural cross-correlation, lateral fraction, and low- and high-frequency sound levels as measures of acoustical quality in concert halls. The Journal of the Acoustical Society of America, 98(2), 988-1007. https://doi.org/10.1121/1.414451The comparison of the interaural coefficient with the lateral fraction that Annex B's time windows follow.
- International Organization for Standardization. (2009). Acoustics — Measurement of room acoustic parameters — Part 1: Performance spaces (ISO 3382-1:2009). A.2.4, A.2.5 and Annex B: the lateral energy measures, the late lateral sound level and the interaural cross correlation coefficient.