Как выровнять ось визуализации спектрограммы в Librosa или Matplotlib?
Рассмотрим этот пример, из документации Librosa:
как вы можете видеть, спад выровнен со спектрограммой. Я не могу воспроизвести фигуру со своим звуком.
Ось Y никогда не выравнивается.
Пытаться:
sr = 250000
n_fft = 2048
hop_length=256
win_length = 1024
fmin = 220
S, phase = librosa.magphase(librosa.stft(filtered_audio))
sftf_spec = librosa.stft(filtered_audio, n_fft=n_fft, hop_length=hop_length)
S = np.abs(sftf_spec)
rolloff = librosa.feature.spectral_rolloff(S=S,
sr=sr,
n_fft=n_fft,
hop_length=hop_length,
win_length = win_length
)
amplitude_spec = librosa.amplitude_to_db(S,
ref=np.max)
rolloff_min = librosa.feature.spectral_rolloff(S=S, sr=sr, roll_percent=0.15)
fig, ax = plt.subplots()
librosa.display.specshow(amplitude_spec,
y_axis='log', x_axis='time', ax=ax)
ax.plot(librosa.times_like(rolloff), rolloff[0], label='Roll-off frequency (0.85)')
ax.plot(librosa.times_like(rolloff), rolloff_min[0], color='w',
label='Roll-off frequency (0.15)')
ax.legend(loc='lower right')
ax.set(title='log Power spectrogram')
Если вам нужно повторить, вы можете попробовать скачать аудио wav:
https://drive.google.com/file/d/1UCUWAaczzejTN9m_y-usjPbG8__1mWI1/view?usp=sharing
filtered_audio = np.array([[ #copy ]])
Я получил это:
и если я установил скорость в specshow, я получил это:
librosa.display.specshow(amplitude_spec,
sr=sr,
y_axis='log', x_axis='time', ax=ax)
Я хочу, чтобы полоса пропускания соответствовала тому же масштабу спектрограммы, из которой они были построены...
Спасибо за комментарий, я отредактировал вопрос. еще не отработано. Каким-то образом эти два (спектрограмма и временной ряд), кажется, следуют разным временным шагам. Я не знаю, как настроить.
Вы не указали hop_length для спецификации. В общем, все параметры для расчета спектрограммы должны быть переданы в спектрограмму, чтобы она была правильной.
тоже не работает. Не могли бы вы опубликовать рабочий пример? массив данных находится по ссылке [1]
Можете ли вы предоставить аудиофайл в стандартном аудиоформате? Как .wav или аналогичный
Я обновил ссылку с файлом wav, @JonNordby. Спасибо.
Нужно быть усердным в передаче всех соответствующих параметров. В вашем коде в обоих вызовах specshow
, times_like
и spectral_rolloff
отсутствовали ключевые аргументы, такие как sr
, hop_length
и т. д. Без них обе оси X и Y обычно будут отключены.
При обеспечении этого результаты выглядят правильными. См. полный код ниже.
import librosa
import numpy as np
import pandas
from matplotlib import pyplot as plt
import librosa.display
def plot_spectral(audio, sr, hop_length=256, win_length=1024, n_fft=2048):
# shared parameters
spec_params = dict(n_fft=n_fft, hop_length=hop_length, win_length=win_length)
# compute
sftf_spec = librosa.stft(audio, **spec_params)
S = np.abs(sftf_spec)
amplitude_spec = librosa.amplitude_to_db(S, ref=np.max)
up = librosa.feature.spectral_rolloff(S=S, sr=sr, **spec_params, roll_percent=0.85)
rolloff = pandas.DataFrame({
'upper': librosa.feature.spectral_rolloff(S=S, sr=sr, **spec_params, roll_percent=0.85)[0, :],
'lower': librosa.feature.spectral_rolloff(S=S, sr=sr, **spec_params, roll_percent=0.15)[0, :],
})
rolloff['time'] = librosa.times_like(rolloff['lower'], sr=sr, hop_length=hop_length)
fig, ax = plt.subplots()
librosa.display.specshow(amplitude_spec, sr=sr, **spec_params,
y_axis='log', x_axis='time', ax=ax, )
ax.plot(rolloff['time'], rolloff['upper'], color='blue', label='Roll-off frequency (0.85)')
ax.plot(rolloff['time'], rolloff['lower'], color='white', label='Roll-off frequency (0.15)')
ax.legend(loc='lower right')
ax.set(title='log Power spectrogram')
fig.savefig('spectral-rolloffs.png')
def load_data():
p = 'test_wav_segment.wav'
audio, sr = librosa.load(p, sr=None)
return audio, sr
audio, sr = load_data()
plot_spectral(audio, sr=sr)
Использование панд не критично. Однако он сохраняет связанные данные вместе и гарантирует, что массив времен имеет равную длину спадам, для которых они предназначены.
Ах, спасибо @Jon, проблема с передачей параметра в times_like. Я видел, что вы защитили диссертацию по науке о данных и биоакустике — я работаю над диссертацией по DS, в которой используется биоакустика, но не сосредоточена на производительности модели. Могу я воспользоваться возможностью связаться с вами, чтобы задать пару вопросов? У меня нет опыта в акустических свойствах, и я хотел бы перепроверить, имеют ли некоторые идеи смысл или нет, чтобы сгруппировать похожие звуки, но без ярлыков истинности.
Лучше всего задавать вопросы здесь, в SO, или datascience.stackexchange.com, если они немного шире, чем рекомендации SO. Кроме того, спросите в сообществе Sound of AI Slack :)
Вы не указываете sr для specshow, поэтому, скорее всего, это неверный график спектрограммы.