Skip to content

Features | latest | spectral-variance

Spectral variance

Spectral variance, also known as spectral spread, quantifies the dispersion or spread of the spectral content around its center of mass, the spectral centroid fcentroid.

The spectral variance is computed from the power spectrum Xp=|X|2RM using the following formula:

SpectralVariance=m=0M1(f(m)fcentroid)2p(m),

where:

  • f(m) is the frequency corresponding to bin m:

    f(m)=mfs2(M1),
  • p(m) is the normalized power at bin m:

    p(m)=Xp[m]m=0M1Xp[m].

References

Code

INFO

The following snippet is written in a generic and unoptimized manner. The code aims to be comprehensible to programmers familiar with various programming languages and may not represent the most efficient or idiomatic Python practices. Please refer to implementations for optimized implementations in different programming languages.

py
import numpy as np


def _spectral_centroid(spectrum: np.ndarray, samplerate: float):
    ps = np.abs(spectrum) ** 2
    ps_sum = 0.0
    ps_sum_weighted = 0.0
    for i, magnitude in enumerate(ps):
        ps_sum += magnitude
        ps_sum_weighted += magnitude * i
    return 0.5 * samplerate / (len(ps) - 1) * (ps_sum_weighted / ps_sum)


def spectral_variance(spectrum: np.ndarray, samplerate: float):
    f_centroid = _spectral_centroid(spectrum, samplerate)
    ps = np.abs(spectrum) ** 2
    ps_sum = 0.0
    ps_sum_weighted = 0.0
    for i, magnitude in enumerate(ps):
        f = 0.5 * samplerate / (len(ps) - 1) * i
        ps_sum += magnitude
        ps_sum_weighted += magnitude * (f - f_centroid) ** 2
    return ps_sum_weighted / ps_sum
Run in playground