Спектрограмма оси Y librosa не выравнивается должным образом

Как выровнять ось визуализации спектрограммы в 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)

Я хочу, чтобы полоса пропускания соответствовала тому же масштабу спектрограммы, из которой они были построены...

Вы не указываете sr для specshow, поэтому, скорее всего, это неверный график спектрограммы.

Jon Nordby 31.03.2023 20:45

Спасибо за комментарий, я отредактировал вопрос. еще не отработано. Каким-то образом эти два (спектрограмма и временной ряд), кажется, следуют разным временным шагам. Я не знаю, как настроить.

user305883 31.03.2023 21:49

Вы не указали hop_length для спецификации. В общем, все параметры для расчета спектрограммы должны быть переданы в спектрограмму, чтобы она была правильной.

Jon Nordby 01.04.2023 17:57

тоже не работает. Не могли бы вы опубликовать рабочий пример? массив данных находится по ссылке [1]

user305883 01.04.2023 18:13

Можете ли вы предоставить аудиофайл в стандартном аудиоформате? Как .wav или аналогичный

Jon Nordby 01.04.2023 18:20

Я обновил ссылку с файлом wav, @JonNordby. Спасибо.

user305883 01.04.2023 22:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нужно быть усердным в передаче всех соответствующих параметров. В вашем коде в обоих вызовах 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, в которой используется биоакустика, но не сосредоточена на производительности модели. Могу я воспользоваться возможностью связаться с вами, чтобы задать пару вопросов? У меня нет опыта в акустических свойствах, и я хотел бы перепроверить, имеют ли некоторые идеи смысл или нет, чтобы сгруппировать похожие звуки, но без ярлыков истинности.

user305883 02.04.2023 12:12

Лучше всего задавать вопросы здесь, в SO, или datascience.stackexchange.com, если они немного шире, чем рекомендации SO. Кроме того, спросите в сообществе Sound of AI Slack :)

Jon Nordby 03.04.2023 18:02

Другие вопросы по теме