Compute the Speech Intelligibility Index (SII) described by ANSI specification S3.5-1997, including extensions for conductive hearing loss. Optionally apply interpolation obtain values for the required frequencies.
sii(speech = c("normal", "raised", "loud", "shout"),
noise, threshold, loss, freq,
method = c("critical", "equal-contributing",
"one-third octave", "octave"),
importance = c("SII", "NNS", "CID22", "NU6", "DRT",
"ShortPassage", "SPIN", "CST"),
interpolate=FALSE,
prescription=NULL,
desensitization=FALSE,
ldl=NULL,
gender="male",
experience="experienced",
config="bilateral",
coupling="custom_occluded",
module="standard",
transducer="inserts",
custom_gain=NULL,
measured_wrs=NULL,
wrs_level=NULL,
distortion_category=NULL,
nal_ldf=FALSE, ...)
# S3 method for SII
print(x, digits=3, ...)
# S3 method for SII
plot(x, clinical=FALSE, legend=TRUE, legend_only=FALSE, ...)
# S3 method for SII
summary(object, digits=2, ...)The return value is an object of class SII, containing the following components:
Function call used to generate the SII object
List containing original (pre-extrapolation) values for
freq, speech, noise, threshold, and
loss.
Values used in calculations (extrapolated if necessary)
Original speech array before applying any prescriptive gain
String representing the stated vocal effort
Insertion gain array added to speech and noise when a prescription is used
The fitting rationale used (if any)
Calculated SII value before applying the prescriptive gain (if a prescription was used)
SII calculation worksheet, containing columns corresponding to both Table C.1 and C.2 in Annex C of the standard. Table columns are
Center frequency of SII band, Hz
Spectrum level of equivalent speech, dB
Spectrum level of equivalent noise, dB
Equivalent hearing threshold level, dB
Spectrum level for self-speech masking, dB
Larger of the specrum levels for equivalent noise and self-speech masking, dB
Slope per octave (doubling of frequency) of the upward spread of masking, dB/octave
Spectrum level for equivalent masking, dB
Spectrum level of internal noise, dB
Spectrum level of equivalent internal noise, dB
Spectrum level for equivalent disturbance, dB
Spectrum level of standard speech for normal vocal effort, dB
Equivalent hearing threshold due to conductive hearing loss, dB
Speech level distortion factor, dB
Temporary variable used in the calculation of the band auditability function
Band auditability function
Band importance function
Product of the band importance function (Ii), and band auditability function(Ai)
Calculated SII value
Either a numeric vector providing \(E'_i\), the
equivalent speech spectrum level (in dB) at each frequency, or a
character string indicating the stated vocal effort corresponding to
one of the standard standard speech spectrum levels ("normal",
"raised", "loud", "shout"). Defaults to speech="normal"
correspoding to the normal level of stated vocal effort.
A numeric vector providing \(N'_i\), the equivalent noise spectrum level (in dB) at each frequency. If missing, defaults to -50 dB for each frequency.
A numeric vector providing \(T'_i\), the equivalent hearing threshold level (in dB) at each frequency. If missing, defaults to 0 dB for each frequency.
A numeric vector providing \(J'_i\), the conductive hearing loss level (in dB) at each frequency. If missing, defaults to 0 dB for each frequency.
Vector of frequencies for which speech,
noise, threshold, and/or loss are specified.
If interpolate=TRUE, freq must be specified.
Otherwise, it must either match the required value for SII
calculation method given by argument method, or be missing,
in which case it will default to the values required for the
specified method.
A character string specifying the SII calculation method ("critical", "one-third octave", "equal-contributing", "octave")
Either a numeric vector providing \(F_i\),
the transfer function (importance weights) at each frequency, or a
character string indicating which transfer function to employ
("SII", "NNS", "CID22", "NU6", "DRT", "ShortPassage", "SPIN",
"CST"). Defaults to the standard SII transfer function,
importance="SII".
Logical flag indicating whether to interpolate from the provide measurement values and frequencies to those required by the specified method via linear interpolation on the log scale.
A character string (e.g. "NAL-R", "Open-NL"). If provided, the function will automatically calculate hearing aid insertion gain based on the specified prescriptive fitting rationale and add it to the speech and noise spectrum, calculating an Aided SII.
Logical flag. If TRUE, applies the hearing loss desensitization factor (Ching et al., 2011; Johnson, 2013) to the calculation to account for suprathreshold distortion in impaired ears. Defaults to FALSE (Traditional ANSI S3.5 calculation).
Numeric vector specifying Loudness Discomfort Levels (LDL) in dB HL for each frequency. If NULL, limits are estimated based on hearing thresholds.
Character string specifying patient gender ("male" or "female"). Used for prescriptive algorithms. Defaults to "male".
Character string specifying user hearing aid experience ("experienced", "new"). Defaults to "experienced".
Character string for fitting configuration ("unilateral", "bilateral"). Bilateral fittings prescribe slightly less gain (~3 dB) to account for binaural loudness summation.
Character string specifying the acoustic coupling / vent ("custom_occluded", "double_dome", "tulip_dome", "open_dome", "vent_1mm_solid", "vent_2mm_solid", "vent_3mm_solid", "vent_1mm_hollow", "vent_2mm_hollow", "vent_3mm_hollow"). Modifies low-frequency leakage and insertion gain targets.
Character string for hearing aid module ("standard" or other specific module constraints).
Character string specifying the audiometric transducer used for testing ("inserts" or "supra_aural"). Determines RETSPL and RECD corrections for SPLogram plots.
Numeric vector specifying a custom insertion gain array (in dB) for each frequency. If provided along with prescription="Custom", this gain is explicitly applied.
Numeric value specifying the clinical Word Recognition Score (WRS) in percent (0-100). When provided, invokes the Margolis (2025) speech distortion model.
Numeric value specifying the presentation level (in dB HL or SPL) of the clinical WRS test.
Character string ("Mild", "Moderate", or "Severe") specifying the degree of speech distortion. If NULL, it is estimated based on measured_wrs and wrs_level.
Logical flag indicating whether to use NAL-NL2 loudness discomfort factors (optional).
SII object
SII object
Number of digits to display
Logical flag. If TRUE, plots a patient-friendly clinical SPLogram highlighting the audible speech area. If FALSE (the default), the behavior depends on whether the object is aided or unaided. For unaided objects, it plots a diagnostic interpolation graph. For aided objects (when a prescription was used), it automatically generates a 3-line Insertion Gain plot for 55, 65, and 75 dB SPL input levels (dynamically loading and scaling the true Normal and Loud LTASS spectra).
Logical flag. If TRUE (the default), draws a legend on the plot.
Logical flag. If TRUE, suppresses the main plot and only draws the legend in the center of the plotting window. Useful for multi-plot layouts.
Optional arguments to print, summary, and
plot methods
DISCLAIMER: Open-NL is an untested, experimental fitting rationale. It is designed to mimic aspects of other generic non-linear fitting rationales (such as NAL-NL2 and DSL v5.0) strictly to promote open research, algorithmic transparency, and rapid iteration within the audiology community. It is not intended for clinical use.
When prescription = "Open-NL" is selected, the function calculates and applies this WDRC-optimized rationale to maximize the aided Speech Intelligibility Index.
The mathematical algorithm consists of:
Minimal Hearing Loss (MHL) Bypass: If module == "mhl" and \(PTA_{.5,1,2,4k} \le 25\) dB HL, WDRC is bypassed. Applies flat linear gain interpolated from \((f, G) = \{(250,0), (500,0), (1k,3), (2k,5), (4k,5), (8k,5)\}\) dB, with a 1.5 compression ratio for loud inputs.
Base Anchor (65 dB SPL Input): \(g_{65} = \max(0, m \times HTL + C)\), where \(m \in \{0.40, 0.45, 0.50\}\) depending on experience, and \(C\) interpolates arrays such as \(\{-8, -1, +3, +1, 0, 0, 0, 0\}\) dB evaluated at standard audiometric frequencies.
Audiometric Profile Corrections:
Steep Slope Knee: For slopes \(>30\) dB/octave, penalizes the "knee" (500-1500 Hz) by up to 6 dB, and boosts frequencies \(\ge 2000\) Hz by up to 6 dB.
Severe-Loss Booster (SLB): Adds \(\min(15, \max(0, HTL - 60) \times 0.5)\) dB. Tapered heavily in mid-frequencies and disabled in dead regions.
High-Frequency Desensitization: To prevent distortion, excess gain above a limit is compressed at a 2:1 ratio.
Limit \(= 45 + 1.0 \times \max(0, HTL - 60)\)
Roll-offs and Dead Regions:
Bandwidth Roll-off: Multiplies \(g_{65}\). Interpolates \(\{(250Hz, 0.7), (500, 1.0), ..., (6k, 0.8), (8k, 0.5)\}\).
Dead Regions: Identifies HF Dead Regions (\(HTL \ge 90\) at \(f \ge 1k\)) and LF Dead Regions (\(HTL \ge 80\) at \(f \le 1k\)). Applies a 30 dB/octave penalty beyond viable boundaries (\(1.7 \times f_{e}\) for HF, \(0.57 \times f_{e}\) for LF).
Bi-directional WDRC:
Compression Ratio (CR): \(CR_{base} = 1 + \max(0, HTL - 20) / 40\). For \(HTL > 65\), CR reduces toward 1.0 in low frequencies. Overall bounded strictly to \(\le 1.5\) for low frequencies (\(\le 500\) Hz) and up to \(2.4\) for high frequencies (\(\ge 3000\) Hz).
Compression Threshold (CT): Interpolated from \((HTL, CT)\): \(\{(20HL, 30SPL), ..., (100, 45)\}\).
Aggressive MPO Defense: For steeply sloping losses (\(>15\) dB difference) with low LDLs (\(<100\) dB SPL), the formula proactively defends against MPO collision. The \(CT\) is aggressively lowered by up to 10 dB, and the \(CR\) is forced up by an additional 0.05 per dB of LDL penalty.
I/O Computation: Calculates gain at CT (\(G_{CT}\)) scaling back from 65 dB SPL pivot. Applies linear gain below CT, and WDRC above CT.
Empirical Adjustments and Smoothing:
Demographic Boosts: Gender: Female \(= -1.5\) dB. Config: Unilateral \(= +3.0\) dB. Experience: New users with \(PTA > 40\) get up to \(-6.0\) dB penalty.
LDL Dynamic Range Mapping: If ldl is provided, dynamic range is evaluated. For every 1 dB the measured LDL is lower than predicted, \(g_{65}\) is reduced by 0.2 dB and \(CR_{base}\) is increased by 0.02.
Acoustic Coupling: Subtracts vent leakage (e.g., Open Dome \(= \{-35, -28, -15, -2, 0, 0\}\) dB).
Applies a 3-point moving average to the final gain array.
SSPL90 MPO Limiting:
\(MPO_{heuristic} = 100 + 0.5 \times \max(0, HTL - 40)\).
\(MPO_{safe} = LDL_{spl} - 5\).
\(PTS_{safe\_limit} = 105 + 0.5 \times \max(0, HTL - 50)\).
\(MPO_{final} = \min(120, MPO_{heuristic}, MPO_{safe}, PTS_{safe\_limit})\).
Gregory R. Warnes greg@warnes.net
American National Standard ANSI/ASA S3.5-1997 (R2024) ("Methods for Calculation of the Speech Intelligibility Index") defines a method for computing a physical measure that is highly correlated with the intelligibility of speech as evaluated by speech perception tests given a group of talkers and listeners. This measure is called the Speech Intelligibility Index, or SII. The SII is calculated from acoustical measurements of speech and noise.
The sii function implements ANSI/ASA S3.5-1997 (R2024) as described in
the standard, without any attempt to optimize the performance. The
implementation does, however, include the extension for handling
conductive hearing loss from Annex A (utilizing the optional
loss argument), and for utilizing alternative band weights
(i.e. transfer function) appropriate for differing message contents
(e.g. types of speech) as described in Annex B or user-specified
band weights (utilizing the optional argument importance).
Further, this implementation provides a mechanism for
interpolating/extrapolating available measurements to those required
for the specified calculation procedure. When
interpolate=TRUE, required values for speech,
noise, threshold, and loss will be computed
using linear interpolation (of the log-scaled data). In this case,
missing values may be provided and will be appropriately
interpolated.
If the prescription argument is provided, the function will dynamically calculate a frequency-specific hearing aid insertion gain and apply it to the speech and noise spectrum, calculating an Aided SII. The following rationales are supported:
"NAL-R": A classic linear fitting rationale designed by the National Acoustic Laboratories to maximize speech intelligibility for mild-to-moderate losses. Gain is a linear function of the pure-tone average (PTA) and frequency-specific thresholds.
"Open-NL": A completely transparent, open-source non-linear fitting algorithm developed specifically for this package. It was designed to serve as an open-source alternative to proprietary modern non-linear clinical targets (such as NAL-NL2 and DSL v5.0). The algorithm calculates insertion gain using the following explicit mathematical steps:
Conductive Component Separation: If an Air-Bone Gap is present, the purely sensorineural component is isolated for WDRC compression. Linear gain representing 75% of the conductive loss is added at the end (consistent with NAL-NL2/Johnson).
Dynamic Base Gain: The base gain relies on a dynamic multiplier (ranging from 0.43 to 0.48) determined by user experience, combined with empirical NAL-R shaping constants. Severe losses receive a booster, while steep slopes receive a low-frequency penalty to avoid upward spread of masking.
Dead Region Roll-offs: High-frequency or low-frequency dead regions trigger a steep 30 dB/octave penalty beyond the viable boundaries to prevent acoustic distortion and feedback.
Wide Dynamic Range Compression (WDRC): A dynamic compression ratio (ranging from 1.0 to 3.0) is applied symmetrically around a 65 dB SPL pivot point. The ratio scales dynamically based on the sensorineural threshold and measured Loudness Discomfort Levels (LDLs).
Bandwidth Roll-off: Empirical bandwidth roll-offs are applied to limit unnecessary low/high frequency amplification, with separate curves for adults vs. infants.
Acoustic Coupling: Adjustments are applied to the low frequencies depending on the specified venting, dome type, and acoustic seal.
MPO Limits: Output is capped by predictive NAL-SSPL90 limits, adjusting for conductive attenuation, with an absolute safety hard cap at 120 dB SPL at the cochlea and a hardware output limit of 135 dB SPL.
ANSI/ASA S3.5-1997 (R2024), "American National Standard Methods for Calculation of the Speech Intelligibility Index" American National Standards Institute, New York.
Other software programs for calculating SII are available from https://sii.to/html/programs.html.
SII Constants: critical, and
sic.critical
## Example C.1 from ANSI/ASA S3.5-1997 (R2024) Annex C
sii.C1 <- sii(
speech = c(50.0, 40.0, 40.0, 30.0, 20.0, 0.0),
noise = c(70.0, 65.0, 45.0, 25.0, 1.0,-15.0),
threshold= c( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
method="octave"
)
sii.C1 # rounded to 2 digits by default
print(sii.C1$sii, digits=20) # full precision
summary(sii.C1) # full details
plot(sii.C1) # plot
plot(sii.C1, clinical=TRUE) # clinical SPLogram plot
## The value given in the Standard is $0.504$.
## Same calculation, but manually specify the frequencies
## and importance function, and use default for threshold
sii.C1 <- sii(
speech = c(50.0, 40.0, 40.0, 30.0, 20.0, 0.0),
noise = c(70.0, 65.0, 45.0, 25.0, 1.0,-15.0),
method="octave",
freq=c(250, 500, 1000, 2000, 4000, 8000),
importance=c(0.0617, 0.1671, 0.2373, 0.2648, 0.2142, 0.0549)
)
sii.C1
## Now perform the calculation using frequency weights for the Connected
## Speech Test (CST)
sii.CST <- sii(
speech = c(50.0, 40.0, 40.0, 30.0, 20.0, 0.0),
noise = c(70.0, 65.0, 45.0, 25.0, 1.0,-15.0),
method="octave",
importance="CST"
)
round(sii.CST$table[,-c(5:7,13)],2)
sii.CST$sii
## Example C.2 from ANSI/ASA S3.5-1997 (R2024) Annex C
sii.C2 <- sii(
speech = rep(54.0, 18),
noise = c(40.0, 30.0, 20.0, rep(0, 18-3) ),
threshold= rep(0.0, 18),
method="one-third"
)
sii.C2$table[1:3,1:8]
sii.C2
## Interpolation example, for 8 frequencies using NU6 importance
## weight, default values for noise.
sii.left <- sii(
speech="raised",
threshold=c(25,25,30,35,45,45,55,60),
freq=c(250, 500, 1000, 2000, 3000, 4000, 6000, 8000),
method="critical",
importance="NU6",
interpolate=TRUE
)
sii.left
Run the code above in your browser using DataLab