Тайм-ауты Librosa STFT не начинаются с 0 секунд - PullRequest
1 голос
/ 04 апреля 2020

При сравнении выходных данных STFT Сципи и STFT Librosa я обнаружил, что соответствующие временные интервалы в двумерных выходных массивах были отключены на единицу. Чтобы уточнить, Zxx Сципи привел к выводу (513, 341), а Stft Либроса дал мне (513, 340). Я распечатал временные сегменты каждого выхода и обнаружил, что времена Scipy начинаются с 0 секунд, а времена Librosa начинаются с первого прыжка. Я могу упустить что-то очень основательное c здесь, но я не могу понять, почему происходит это расхождение. Заранее спасибо за помощь!

Используемый аудиофайл: https://clyp.it/e3thsdpo

import numpy as np
from scipy import signal
import librosa
import librosa.display
import matplotlib.pyplot as plt

infile='fox_rain.wav'
print ('load wav', infile)
n_fft = 1024
hop_length = int(n_fft // 2)
data, samplerate = librosa.load(infile, sr=None, mono=True) #native samplerate
stft = librosa.stft(data, n_fft=n_fft, hop_length=hop_length)
stft_magnitude = np.abs(stft)
angle = np.angle(stft) #phase of the stft
b = np.exp(1.0j* angle) #phase info

f, t, Zxx = signal.stft(data, fs=samplerate, nperseg=1024)
frequency_bins = f
scipy_time_bins = t

librosa_time_bins = librosa.frames_to_time(range(0, stft.shape[1]), sr=samplerate, hop_length=(n_fft//2), n_fft=n_fft)


print(f"scipy_time_bins = {scipy_time_bins}")
print(f"librosa_time_bins = {librosa_time_bins}")

length = data.shape[0] / samplerate
time = np.linspace(0., length, data.shape[0])

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(13, 8))

ax[0].plot(time, data)
ax[0].set_xlabel("Time [s]")
ax[0].set_ylabel("Magnitude")

librosa.display.specshow(librosa.amplitude_to_db(stft_magnitude, ref=np.max), y_axis='log', x_axis='time', sr=samplerate)
plt.colorbar(format='%+2.0f dB')

fig.tight_layout()
plt.show()
...