librosa.salience(S, freqs, h_range, weights=None, aggregate=None, filter_peaks=True, fill_value=nan, kind='linear', axis=0)[source]

Harmonic salience function.

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.

h_rangelist-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.


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


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.


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


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


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


The axis along which to compute harmonics

S_salnp.ndarray, shape=(len(h_range), [x.shape])

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

See also



>>> y, sr = librosa.load(librosa.ex('trumpet'), duration=3)
>>> S = np.abs(librosa.stft(y))
>>> freqs = librosa.fft_frequencies(sr)
>>> harms = [1, 2, 3, 4]
>>> weights = [1.0, 0.5, 0.33, 0.25]
>>> S_sal = librosa.salience(S, freqs, harms, 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")