librosa.salience

librosa.salience(S, *, freqs, harmonics, weights=None, aggregate=None, filter_peaks=True, fill_value=nan, kind='linear', axis=- 2)[source]

Harmonic salience function.

Parameters
Snp.ndarray [shape=(…, d, n)]

input time frequency magnitude representation (e.g. STFT or CQT magnitudes). Must be real-valued and non-negative.

freqsnp.ndarray, shape=(S.shape[axis])

The frequency values corresponding to S’s elements along the chosen axis.

harmonicslist-like, non-negative

Harmonics to include in salience computation. The first harmonic (1) corresponds to S itself. Values less than one (e.g., 1/2) correspond to sub-harmonics.

weightslist-like

The weight to apply to each harmonic in the summation. (default: uniform weights). Must be the same length as harmonics.

aggregatefunction

aggregation function (default: np.average)

If aggregate=np.average, then a weighted average is computed per-harmonic according to the specified weights. For all other aggregation functions, all harmonics are treated equally.

filter_peaksbool

If true, returns harmonic summation only on frequencies of peak magnitude. Otherwise returns harmonic summation over the full spectrum. Defaults to True.

fill_valuefloat

The value to fill non-peaks in the output representation. (default: np.nan) Only used if filter_peaks == True.

kindstr

Interpolation type for harmonic estimation. See scipy.interpolate.interp1d.

axisint

The axis along which to compute harmonics

Returns
S_salnp.ndarray

S_sal will have the same shape as S, and measure the overall harmonic energy at each frequency.

See also

interp_harmonics

Examples

>>> y, sr = librosa.load(librosa.ex('trumpet'), duration=3)
>>> S = np.abs(librosa.stft(y))
>>> freqs = librosa.fft_frequencies(sr=sr)
>>> harms = [1, 2, 3, 4]
>>> weights = [1.0, 0.5, 0.33, 0.25]
>>> S_sal = librosa.salience(S, freqs=freqs, harmonics=harms, weights=weights, fill_value=0)
>>> print(S_sal.shape)
(1025, 115)
>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots(nrows=2, sharex=True, sharey=True)
>>> librosa.display.specshow(librosa.amplitude_to_db(S, ref=np.max),
...                          sr=sr, y_axis='log', x_axis='time', ax=ax[0])
>>> ax[0].set(title='Magnitude spectrogram')
>>> ax[0].label_outer()
>>> img = librosa.display.specshow(librosa.amplitude_to_db(S_sal,
...                                                        ref=np.max),
...                                sr=sr, y_axis='log', x_axis='time', ax=ax[1])
>>> ax[1].set(title='Salience spectrogram')
>>> fig.colorbar(img, ax=ax, format="%+2.0f dB")
../_images/librosa-salience-1.png