| Title: | Calculate ANSI/ASA S3.5-1997 (R2024) Speech Intelligibility Index |
|---|---|
| Description: | Calculates the American National Standards Institute (ANSI) S3.5-1997 Speech Intelligibility Index (SII) (ANSI, 1997), a standard method for computing the intelligibility of speech from acoustical measurements of speech, noise, and hearing thresholds. This package includes data frames corresponding to Tables 1 - 4 in the ANSI standard as well as functions utilizing these tables and user-provided hearing threshold and noise level measurements to compute the SII score. The methods implemented here extend the standard computations to allow calculation of SII when the measured frequencies do not match those required by the standard by applying interpolation. The package also includes a native C++ implementation of the 'AUDMOD' specific loudness model for impaired hearing (Bramslow, 2004), ported from the 'bramslow2004' implementation in the Auditory Modeling Toolbox (AMT), to calculate loudness in sones. It provides methods to predict aided SII under hearing aid prescriptive rationales, including Open-NL (Open Non-Linear), a theoretical optimization framework that uses a Nelder-Mead simplex search to maximize the SII (by default with the Johnson and Dillon (2011) desensitization correction), subject to loudness penalties and simulated Maximum Power Output (MPO) constraints. Further functions calculate real-ear insertion gains, estimate maximum power output (SSPL90), and prescribe dynamic range compression. Open-NL and the prescription functions are research tools for theoretical modeling and simulation; they have not been clinically validated and are not intended for fitting hearing aids to patients. Development of this package was originally funded by the Center for Bioscience Education and Technology (CBET) of the Rochester Institute of Technology (RIT). |
| Authors: | Gregory R. Warnes [aut, cph], Mark Shaver [cre, aut] |
| Maintainer: | Mark Shaver <[email protected]> |
| License: | GPL-3 | file LICENSE |
| Version: | 1.3.0 |
| Built: | 2026-10-09 12:19:26 UTC |
| Source: | https://github.com/cran/SII |
This package calculates ANSI/ASA S3.5-1997 (R2024) Speech Intelligibility Index (SII), a standard method for computing the intelligibility of speech from acoustical measurements of speech, noise, and hearing thresholds. This package includes data frames corresponding to Tables 1 - 4 in the ANSI standard as well as a function utilizing these tables and user-provided hearing threshold and noise level measurements to compute the SII score. The methods implemented here extend the standard computations to allow calculation of SII when the measured frequencies do not match those required by the standard by applying interpolation to obtain values for the required frequencies.
Gregory R. Warnes [email protected]
ANSI/ASA S3.5-1997 (R2024), "American National Standard Methods for Calculation of the Speech Intelligibility Index" American National Stan- dards Institute, New York.
Other software programs for calculating SII are available from https://sii.to/html/programs.html.
## 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 ## The value given in the Standard is $0.504$.## 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 ## The value given in the Standard is $0.504$.
Calculates the total perceived binaural loudness based on the Pieper et al. (2021) and Moore et al. (2016) binaural summation models.
calculate_binaural_loudness(x_left, x_right = NULL, alpha_b = -0.25)calculate_binaural_loudness(x_left, x_right = NULL, alpha_b = -0.25)
x_left |
An object of class 'SII' for the left ear. |
x_right |
Optional. An object of class 'SII' for the right ear. If NULL, assumes a perfectly symmetric bilateral fitting ('x_left == x_right'). |
alpha_b |
Numeric. The binaural inhibition factor. Default is -0.25, reflecting classical normal-hearing binaural inhibition. |
A numeric value representing the total binaural loudness in Sones.
Calculates the estimated loudness in sones for a given Speech Intelligibility Index (SII) object.
calculate_loudness(x)calculate_loudness(x)
x |
An object of class |
Returns a numeric value representing the total loudness in sones.
Mark Shaver
sii.res <- sii(speech=c(50, 40, 40, 30, 20, 0), threshold=rep(0,6), method="octave") calculate_loudness(sii.res)sii.res <- sii(speech=c(50, 40, 40, 30, 20, 0), threshold=rep(0,6), method="octave") calculate_loudness(sii.res)
This function computes the loudness of a signal using a faithful C++ port of the AMT 1.6.0 bramslow2004 model (Bramslow Nielsen 1993; Bramslow 2004, 2024).
calculate_loudness_audmod( freq, level_dB_per_Hz, audiogram_freq, audiogram_HL, ucl_HL = rep(120, 13), fs = 32000, N = 8192, Binaural = 0, ref = NULL )calculate_loudness_audmod( freq, level_dB_per_Hz, audiogram_freq, audiogram_HL, ucl_HL = rep(120, 13), fs = 32000, N = 8192, Binaural = 0, ref = NULL )
freq |
Frequencies of the signal spectrum. |
level_dB_per_Hz |
Signal spectrum levels in dB/Hz. |
audiogram_freq |
Audiogram frequencies (Hz). |
audiogram_HL |
Audiogram hearing loss (dB HL). |
ucl_HL |
Uncomfortable loudness levels (dB HL). Defaults to 120 dB HL at all frequencies. |
fs |
Sampling rate. Default is 32000. |
N |
FFT size. Default is 8192. |
Binaural |
0 for monaural, 1 for binaural. |
ref |
Optional reference object returned by a previous call. |
A list containing total loudness (Ldn), specific loudness (N_prime), fc, E_Vector, and the reference object (ref).
Native C++ port of the bramslow2004 canonical engine, corrected per AMToolbox 1.6.0 reference with noted simplifications.
calculate_loudness_cpp( inputF, inputLdB, HLcf, HLdB, NoChan = 30L, E_Beg = 3, E_End = 32, Binaural = 0L )calculate_loudness_cpp( inputF, inputLdB, HLcf, HLdB, NoChan = 30L, E_Beg = 3, E_End = 32, Binaural = 0L )
inputF |
Vector of input frequencies (Hz) |
inputLdB |
Vector of input spectrum levels (dB/Hz, free field) |
HLcf |
Audiogram frequencies (Hz) |
HLdB |
Total hearing loss at audiogram frequencies (dB HL) |
NoChan |
Number of ERB channels (default 30) |
E_Beg |
Lowest ERB rate (default 3.0) |
E_End |
Highest ERB rate (default 32.0) |
Binaural |
Integer indicating whether to compute binaural loudness (default 0L) |
A list containing Loudness (sones), Excitation, Cams, and CFs.
Tables of constants for ANSI/ASA S3.5-1997 (R2024) Speech Intelligibility Index (SII)
data(critical) data(equal) data(onethird) data(octave) data(overall.spl)data(critical) data(equal) data(onethird) data(octave) data(overall.spl)
Each data frames has 6-21 observations and a subset of the following variables:
fiCenter frequency of SII band, Hz
liLower limit of frequency band, Hz
hiUpper limit of frequency band, Hz
DeltaiBand width adjustment, dB
IiBand importance function
normal, raised, loud and
shout
Standard spectrum levels for vocal effort levels "normal", "raised", "loud", and "shout", respectively, dB
XiSpectrum level of internal noise, dB
FiBand importance function (weight)
These data objects provide constant tables 1 – 4 from the ANSI S3.5-1997.
criticalTable 1: Critical band SII procedure constants
equalTable 2:Equally contributing (17 band) critical band SII
onethirdTable 3: One-third octave band SII procedure constants
octaveTable 4: Octave band SII procedure constants
overall.splOverall sound pressure level (SPL) for the for vocal effort levels "normal", "raised", "loud", and "shout", in dB
ANSI/ASA S3.5-1997 (R2024), "American National Standard Methods for Calculation of the Speech Intelligibility Index" American National Standards Institute, New York.
ANSI/ASA S3.5-1997 (R2024), "American National Standard Methods for Calculation of the Speech Intelligibility Index" American National Standards Institute, New York.
data(critical) critical # show entire table data(equal) names(equal) equal$fi # extract just the frequency band centers data(onethird) barplot(onethird$Ii) # plot band importance function (weights) data(octave) round(octave, digits=2) # just 2 digits data(overall.spl) overall.spldata(critical) critical # show entire table data(equal) names(equal) equal$fi # extract just the frequency band centers data(onethird) barplot(onethird$Ii) # plot band importance function (weights) data(octave) round(octave, digits=2) # just 2 digits data(overall.spl) overall.spl
Export prescribed insertion gains for 50, 65, and 80 dB SPL input levels
export_gains(x)export_gains(x)
x |
An object of class 'SII' |
A data.frame containing frequency and the prescribed insertion gains
Calculates the total perceived loudness in Sones based on the specific speech spectrum and hearing thresholds of the patient.
get_specific_loudness(x)get_specific_loudness(x)
x |
An object of class |
The current implementation uses a first-order heuristic model of recruitment based on Stevens' Power Law, mapped over an estimated dynamic range. While it is computationally fast and demonstrates the restoration of loudness conceptually, it is not a full psychoacoustic model (like Moore-Glasberg / CAM2Q), as it does not calculate basilar membrane excitation patterns via RoEx filters.
Mathematical Formula:
1. Uncomfortable Loudness Level (UCL) is predicted from the threshold ($T_i$):
2. Dynamic Range (DR):
3. Sensation Level (SL) of speech peaks (RMS + 15 dB):
4. Loudness Level (Phons) modeling recruitment:
5. Specific Loudness (Sones) per band via Stevens' Power Law:
6. Total Loudness (Sones):
The calibration factor (0.25 for 21 critical bands) is scaled dynamically based on the number of frequency bands used in the underlying SII method (e.g., 21 for critical, 6 for octave) to ensure equivalent loudness summation across different resolutions.
A numeric value representing the total loudness in Sones.
Calculates experimental prescriptive insertion gain and SSPL90 targets for a given hearing loss, based on a rule-based WDRC heuristic.
open_nl( speech = 65, threshold, freq, cap_override = NULL, vent_floor = -10, ..., gender = "male", experience = "experienced", config = "bilateral", coupling = "custom_occluded", module = "standard", ldl = NULL, loss = NULL, distortion_category = NULL, user_cr = NULL, optimize = TRUE, seed_noise = NULL, optim_method = "Nelder-Mead", abg_fraction = 0.75, enable_severe_booster = FALSE, booster_onset = 70, disable_sdlfp = FALSE, cap_rule = c("normal", "legacy"), objective_sii = c("johnson2011_desensitized", "none") ) ## S3 method for class 'prescription_target' print(x, ...) ## S3 method for class 'prescription_target' summary(object, ...) ## S3 method for class 'prescription_target' plot(x, ...)open_nl( speech = 65, threshold, freq, cap_override = NULL, vent_floor = -10, ..., gender = "male", experience = "experienced", config = "bilateral", coupling = "custom_occluded", module = "standard", ldl = NULL, loss = NULL, distortion_category = NULL, user_cr = NULL, optimize = TRUE, seed_noise = NULL, optim_method = "Nelder-Mead", abg_fraction = 0.75, enable_severe_booster = FALSE, booster_onset = 70, disable_sdlfp = FALSE, cap_rule = c("normal", "legacy"), objective_sii = c("johnson2011_desensitized", "none") ) ## S3 method for class 'prescription_target' print(x, ...) ## S3 method for class 'prescription_target' summary(object, ...) ## S3 method for class 'prescription_target' plot(x, ...)
speech |
Input speech spectrum level at each frequency. If a single number is provided, it's assumed to be the overall broadband SPL. |
threshold |
Hearing threshold level at each frequency. |
freq |
Frequencies at which the thresholds are measured. |
cap_override |
Optional manual loudness cap override in sones. |
vent_floor |
Optional manual vent floor limit. |
... |
Additional arguments passed to methods. |
gender |
Gender of the patient ("male", "female"). |
experience |
Hearing aid experience ("new", "experienced"). |
config |
Fitting configuration ("unilateral", "bilateral"). |
coupling |
Acoustic coupling ("custom_occluded", "open_dome", "tulip_dome", "double_dome", "vent_1mm_solid", etc.). |
module |
Fitting module ("standard", "cin"). |
ldl |
Loudness Discomfort Levels (optional). |
loss |
Conductive hearing loss component (optional). |
distortion_category |
Distortion category ("Normal", "Low", "Moderate", "High"). |
user_cr |
User defined compression ratio (optional). |
optimize |
Optimization flag. |
seed_noise |
Random noise for optimizer seeding. |
optim_method |
Optimization method. |
abg_fraction |
Air-bone gap fraction to compensate. |
enable_severe_booster |
Logical flag to enable severe-loss booster. |
booster_onset |
Threshold for the severe-loss booster (default: 70). |
disable_sdlfp |
Logical flag to disable the Slope-Dependent Low-Frequency Penalty (SD-LFP). |
cap_rule |
Loudness cap rule. "normal" (default) uses the normal-hearing loudness of unaided speech. "legacy" uses the PTA-based knots. |
objective_sii |
SII version maximized by the optimizer: "johnson2011_desensitized" (default; the Johnson & Dillon (2011) desensitization correction) or "none" (ANSI S3.5 SII). |
x |
Object for S3 method. |
object |
Object for S3 method. |
This experimental function generates non-linear prescriptive targets for research and modeling purposes. It is not intended for clinical use.
An object of class prescription_target.
Mark Shaver
Provides recommendations for compression speed (fast vs slow acting) and compression ratio/release times based on the four-frequency Pure Tone Average (PTA4).
prescribe_compression(freq, threshold, module = "standard")prescribe_compression(freq, threshold, module = "standard")
freq |
A numeric vector of frequencies. |
threshold |
A numeric vector of hearing thresholds. |
module |
The operating module ("standard", "mhl"). |
A list containing compression recommendations.
Alternative ANSI/ASA S3.5-1997 (R2024) Speech Intelligibility Index (SII) transfer function weights for for various types of speech material.
data(sic.critical) data(sic.onethird) data(sic.octave)data(sic.critical) data(sic.onethird) data(sic.octave)
Each data frame contains the following 8 variables, each corresponding the the transfer function weights for a specific type of speech material:
fiCenter frequency, Hz
SIIStandard SII transfer function (weights)
NNSNNS (various nonsense syllable tests where most of the English phonems occur equally often)
CID22CID-W22 (PB-words)
NU6NU6 monosyllables
DRTDRT (Diagnostic Rhyme Test)
ShortPassageshort passages of easy reading material
SPINSPIN monosyllables
CSTConnected Speech Test
sic.criticalprovides alternative weights for the critical band SII procedure.
sic.onethirdprovides alternative weights for the one-third octave frequency band SII procedure.
octaveprovides alternative weights for the octave frequency band SII procedure.
There is no table of alternative weights for the equally-weighted SII band procedure as the weights for this method are (by definition) constant across all bands.
All values except the CST columns are from:
ANSI/ASA S3.5-1997 (R2024), "American National Standard Methods for Calculation of the Speech Intelligibility Index" American National Standards Institute, New York.
Values in the CST columns are from the original Connected Speech Test (CST) dataset.
ANSI/ASA S3.5-1997 (R2024), "American National Standard Methods for Calculation of the Speech Intelligibility Index" American National Standards Institute, New York.
## Load the alternative weights for the critical band method data(sic.critical) ## display the weights round(sic.critical,3) ## draw a comparison plot ngroup <- ncol(sic.critical) matplot(x=sic.critical[,1], y=sic.critical[,-1], type="o", xlab="Frequency, Hz", ylab="Weight", log="x", lty=1:ngroup, col=rainbow(ngroup) ) legend( "topright", legend=names(sic.critical)[-1], pch=as.character(1:ngroup), lty=1:ngroup, col=rainbow(ngroup) ) data(onethird) data(octave)## Load the alternative weights for the critical band method data(sic.critical) ## display the weights round(sic.critical,3) ## draw a comparison plot ngroup <- ncol(sic.critical) matplot(x=sic.critical[,1], y=sic.critical[,-1], type="o", xlab="Frequency, Hz", ylab="Weight", log="x", lty=1:ngroup, col=rainbow(ngroup) ) legend( "topright", legend=names(sic.critical)[-1], pch=as.character(1:ngroup), lty=1:ngroup, col=rainbow(ngroup) ) data(onethird) data(octave)
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 class 'SII' print(x, digits=3, ...) ## S3 method for class 'SII' plot(x, clinical=FALSE, legend=TRUE, legend_only=FALSE, ...) ## S3 method for class 'SII' summary(object, digits=2, ...)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 class 'SII' print(x, digits=3, ...) ## S3 method for class 'SII' plot(x, clinical=FALSE, legend=TRUE, legend_only=FALSE, ...) ## S3 method for class 'SII' summary(object, digits=2, ...)
speech |
Either a numeric vector providing |
noise |
A numeric vector providing |
threshold |
A numeric vector providing |
loss |
A numeric vector providing |
freq |
Vector of frequencies for which |
method |
A character string specifying the SII calculation method ("critical", "one-third octave", "equal-contributing", "octave") |
importance |
Either a numeric vector providing |
interpolate |
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. |
prescription |
A character string (e.g. |
desensitization |
Hearing loss desensitization applied to band audibility. One of |
ldl |
Numeric vector specifying Loudness Discomfort Levels (LDL) in dB HL for each frequency. If |
gender |
Character string specifying patient gender ("male" or "female"). Used for prescriptive algorithms. Defaults to "male". |
experience |
Character string specifying user hearing aid experience ("experienced", "new"). Defaults to "experienced". |
config |
Character string for fitting configuration ("unilateral", "bilateral"). Bilateral fittings prescribe slightly less gain (~3 dB) to account for binaural loudness summation. |
coupling |
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. |
module |
Character string for hearing aid module ("standard" or other specific module constraints). |
transducer |
Character string specifying the audiometric transducer used for testing ("inserts" or "supra_aural"). Determines RETSPL and RECD corrections for SPLogram plots. |
custom_gain |
Numeric vector specifying a custom insertion gain array (in dB) for each frequency. If provided along with |
measured_wrs |
Numeric value specifying the clinical Word Recognition Score (WRS) in percent (0-100). When provided, invokes the Margolis (2025) speech distortion model. |
wrs_level |
Numeric value specifying the presentation level (in dB HL or SPL) of the clinical WRS test. |
distortion_category |
Character string ("Mild", "Moderate", or "Severe") specifying the degree of speech distortion. If |
nal_ldf |
Logical flag indicating whether to use NAL-NL2 loudness discomfort factors (optional). |
object |
SII object |
x |
SII object |
digits |
Number of digits to display |
clinical |
Logical flag. If |
legend |
Logical flag. If |
legend_only |
Logical flag. If |
... |
Optional arguments to |
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.
The return value is an object of class SII, containing the following components:
call |
Function call used to generate the SII object |
orig |
List containing original (pre-extrapolation) values for
|
speech, noise, threshold, loss, and freq
|
Values used in calculations (extrapolated if necessary) |
unaided_speech |
Original speech array before applying any prescriptive gain |
vocal_effort |
String representing the stated vocal effort |
gain |
Insertion gain array added to speech and noise when a prescription is used |
prescription |
The fitting rationale used (if any) |
unaided_sii |
Calculated SII value before applying the prescriptive gain (if a prescription was used) |
table |
SII calculation worksheet, containing columns corresponding to both Table C.1 and C.2 in Annex C of the standard. Table columns are
|
sii |
Calculated SII value |
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 dB HL, WDRC is bypassed. Applies flat linear gain interpolated from dB, with a 1.5 compression ratio for loud inputs.
Base Anchor (65 dB SPL Input): , where depending on experience, and interpolates arrays such as dB evaluated at standard audiometric frequencies.
Audiometric Profile Corrections:
Steep Slope Knee: For slopes dB/octave, penalizes the "knee" (500-1500 Hz) by up to 6 dB, and boosts frequencies Hz by up to 6 dB.
Severe-Loss Booster (SLB): Adds 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
Roll-offs and Dead Regions:
Bandwidth Roll-off: Multiplies . Interpolates .
Dead Regions: Identifies HF Dead Regions ( at ) and LF Dead Regions ( at ). Applies a 30 dB/octave penalty beyond viable boundaries ( for HF, for LF).
Bi-directional WDRC:
Compression Ratio (CR): . For , CR reduces toward 1.0 in low frequencies. Overall bounded strictly to for low frequencies ( Hz) and up to for high frequencies ( Hz).
Compression Threshold (CT): Interpolated from : .
Aggressive MPO Defense: For steeply sloping losses ( dB difference) with low LDLs ( dB SPL), the formula proactively defends against MPO collision. The is aggressively lowered by up to 10 dB, and the is forced up by an additional 0.05 per dB of LDL penalty.
I/O Computation: Calculates gain at 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 dB. Config: Unilateral dB. Experience: New users with get up to 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, is reduced by 0.2 dB and is increased by 0.02.
Acoustic Coupling: Subtracts vent leakage (e.g., Open Dome dB).
Applies a 3-point moving average to the final gain array.
SSPL90 MPO Limiting:
.
.
.
.
Gregory R. Warnes [email protected]
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## 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