【发布时间】:2019-10-10 16:47:22
【问题描述】:
Librosa 和 Scipy 都有 fft 函数,但是,即使输入相同的信号,它们也会给我不同的频谱图输出。
Scipy
>我正在尝试使用以下代码获取频谱图
import numpy as np # fast vectors and matrices
import matplotlib.pyplot as plt # plotting
from scipy import fft
X = np.sin(np.linspace(0,1e10,5*44100))
fs = 44100 # assumed sample frequency in Hz
window_size = 2048 # 2048-sample fourier windows
stride = 512 # 512 samples between windows
wps = fs/float(512) # ~86 windows/second
Xs = np.empty([int(2*wps),2048])
for i in range(Xs.shape[0]):
Xs[i] = np.abs(fft(X[i*stride:i*stride+window_size]))
fig = plt.figure(figsize=(20,7))
plt.imshow(Xs.T[0:150],aspect='auto')
plt.gca().invert_yaxis()
fig.axes[0].set_xlabel('windows (~86Hz)')
fig.axes[0].set_ylabel('frequency')
plt.show()
利布罗萨
现在我尝试使用 Librosa 获得相同的频谱图
from librosa import stft
X_libs = stft(X, n_fft=window_size, hop_length=stride)
X_libs = np.abs(X_libs)[:,:int(2*wps)]
fig = plt.figure(figsize=(20,7))
plt.imshow(X_libs[0:150],aspect='auto')
plt.gca().invert_yaxis()
fig.axes[0].set_xlabel('windows (~86Hz)')
fig.axes[0].set_ylabel('frequency')
plt.show()
问题
两个谱图明显不同,具体来说,Librosa版本一开始就有攻击。 造成差异的原因是什么?在 Scipy 和 Librosa 的文档中,我没有看到很多可以调整的参数。
【问题讨论】:
-
您使用的是 librosa 的 STFT,而不是 FFT。有区别,因为 STFT 通常包括窗口和填充。请参阅下面的答案。
标签: python python-3.x scipy spectrogram librosa