librosa.feature.spectral_bandwidth¶
-
librosa.feature.
spectral_bandwidth
(y=None, sr=22050, S=None, n_fft=2048, hop_length=512, freq=None, centroid=None, norm=True, p=2)[source]¶ Compute p’th-order spectral bandwidth:
(sum_k S[k] * (freq[k] - centroid)**p)**(1/p)Parameters: - y : np.ndarray [shape=(n,)] or None
audio time series
- sr : number > 0 [scalar]
audio sampling rate of y
- S : np.ndarray [shape=(d, t)] or None
(optional) spectrogram magnitude
- n_fft : int > 0 [scalar]
FFT window size
- hop_length : int > 0 [scalar]
hop length for STFT. See
librosa.core.stft
for details.- freq : None or np.ndarray [shape=(d,) or shape=(d, t)]
Center frequencies for spectrogram bins. If None, then FFT bin center frequencies are used. Otherwise, it can be a single array of d center frequencies, or a matrix of center frequencies as constructed by
librosa.core.ifgram
- centroid : None or np.ndarray [shape=(1, t)]
pre-computed centroid frequencies
- norm : bool
Normalize per-frame spectral energy (sum to one)
- p : float > 0
Power to raise deviation from spectral centroid.
Returns: - bandwidth : np.ndarray [shape=(1, t)]
frequency bandwidth for each frame
Examples
From time-series input
>>> y, sr = librosa.load(librosa.util.example_audio_file()) >>> spec_bw = librosa.feature.spectral_bandwidth(y=y, sr=sr) >>> spec_bw array([[ 3379.878, 1429.486, ..., 3235.214, 3080.148]])
From spectrogram input
>>> S, phase = librosa.magphase(librosa.stft(y=y)) >>> librosa.feature.spectral_bandwidth(S=S) array([[ 3379.878, 1429.486, ..., 3235.214, 3080.148]])
Using variable bin center frequencies
>>> if_gram, D = librosa.ifgram(y) >>> librosa.feature.spectral_bandwidth(S=np.abs(D), freq=if_gram) array([[ 3380.011, 1429.11 , ..., 3235.22 , 3080.148]])
Plot the result
>>> import matplotlib.pyplot as plt >>> plt.figure() >>> plt.subplot(2, 1, 1) >>> plt.semilogy(spec_bw.T, label='Spectral bandwidth') >>> plt.ylabel('Hz') >>> plt.xticks([]) >>> plt.xlim([0, spec_bw.shape[-1]]) >>> plt.legend() >>> plt.subplot(2, 1, 2) >>> librosa.display.specshow(librosa.amplitude_to_db(S, ref=np.max), ... y_axis='log', x_axis='time') >>> plt.title('log Power spectrogram') >>> plt.tight_layout()