Есть ли способ использовать волновой график librosa для хранения координат графика, а не для отображения изображения волнового графика? - PullRequest
0 голосов
/ 09 июля 2020

Я работаю над аудиопроектом, в котором я использую Librosa, и у меня есть следующий код из примера в Интернете. Вместо того, чтобы открывать изображение с графиком зависимости амплитуды от времени, я хочу иметь возможность хранить координаты, составляющие график, в массиве. Я пробовал много разных примеров, найденных в stackoverflow, а также на других веб-сайтах, но безуспешно. Я относительно новичок в python, и это мой первый вопрос по stackoverflow, поэтому будьте добры.

import librosa.display
import matplotlib.pyplot as plt
from IPython.display import display, Audio
filename = 'queen2.mp3'
samples, sampleRate = librosa.load(filename)
display(Audio(filename))
plt.figure(figsize=(12, 4))
librosa.display.waveplot(y, sr=None, max_points=200)
plt.show()

1 Ответ

0 голосов
/ 09 июля 2020

librosa имеет открытый исходный код (под лицензией IS C ), поэтому вы можете посмотреть в коде, чтобы увидеть, как это делается. В документации по функциям есть удобная ссылка [source], по которой вы можете написать код. Для librosa.display.waveplot вы увидите, что он вызывает функцию __envelope() для вычисления конверта. Предположительно, именно эти координаты вам и нужны.

hop_length = 1
y = __envelope(y, hop_length)

y_top = y[0]
y_bottom = -y[-1]
import numpy as np

def __envelope(x, hop):
    '''Compute the max-envelope of non-overlapping frames of x at length hop

    x is assumed to be multi-channel, of shape (n_channels, n_samples).
    '''
    x_frame = np.abs(util.frame(x, frame_length=hop, hop_length=hop))
    return x_frame.max(axis=1)
...