Python 3.x 为什么librosa STFT显示错误的频率?

Python 3.x 为什么librosa STFT显示错误的频率?,python-3.x,audio,signal-processing,librosa,spectrogram,Python 3.x,Audio,Signal Processing,Librosa,Spectrogram,我使用numpy生成了一个200 Hz的正弦波,然后使用librosas stft和specshow函数来显示一个频谱图。但是,它显示的频率不是200 Hz。当我使用matplotlibs幅值谱函数时,它正好显示200 Hz。有人知道为什么会这样吗?我做错什么了吗?任何帮助都将是非常感激的 下图显示了librosas谱图和matplotlibs频谱的结果 最简单的工作示例: import matplotlib.pyplot as plt from matplotlib import mlab %

我使用numpy生成了一个200 Hz的正弦波,然后使用librosas stft和specshow函数来显示一个频谱图。但是,它显示的频率不是200 Hz。当我使用matplotlibs幅值谱函数时,它正好显示200 Hz。有人知道为什么会这样吗?我做错什么了吗?任何帮助都将是非常感激的

下图显示了librosas谱图和matplotlibs频谱的结果

最简单的工作示例:

import matplotlib.pyplot as plt
from matplotlib import mlab
%matplotlib inline
import numpy as np
import librosa
import librosa.display

sr = 20000
freq1 = 200
n_fft=2000

x = np.linspace(0, 1, sr)
y = 0.5*np.sin(freq1 * 2 * np.pi * x)
no_window = np.linspace(1, 1, n_fft)
D = np.abs(librosa.stft(y, n_fft=n_fft, hop_length=int(n_fft/2), window=no_window, center=False,))

plt.figure(figsize=(9, 4))

librosa.display.specshow(D, y_axis='linear')

plt.xlabel('Time [s]')
plt.ylabel('Frequency [Hz]')
plt.ylim(0, 250)
plt.tight_layout()
plt.show()

plt.figure(figsize=(9, 4))

plt.magnitude_spectrum(y, Fs=sr, color='C1', window=mlab.window_none)
plt.xlim(0, 250)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Amplitude [-]')
plt.tight_layout()
plt.show()

仅仅将结果传递给specshow是不够的。您还需要告诉它这些结果的规模。您可以通过如下方式传递采样率参数sr来执行此操作:

librosa.display.specshow(D, y_axis='linear', sr=sr)
如果您不这样做,它将被设置为sr=22050,hop_length=512,这在您的情况下肯定是不正确的


这与给出的答案类似。

仅将结果传递给specshow是不够的。您还需要告诉它这些结果的规模。您可以通过如下方式传递采样率参数sr来执行此操作:

librosa.display.specshow(D, y_axis='linear', sr=sr)
如果您不这样做,它将被设置为sr=22050,hop_length=512,这在您的情况下肯定是不正确的


这与给出的答案类似。

哦,即使经过这么长时间,我还是设法忽略了这些参数。非常感谢你!不客气。坦率地说,这是一个容易忽略的问题,因为D没有像在面向对象的世界中那样描述包括元数据在内的整个事物并不完全直观。如果这意味着频率数据的话,我想得到元数据。类似于numpy的fft.fftfreq,使用起来相当麻烦和直观。哦,即使花了这么多时间,我还是忽略了这些参数。非常感谢你!不客气。坦率地说,这是一个容易忽略的问题,因为D没有像在面向对象的世界中那样描述包括元数据在内的整个事物并不完全直观。如果这意味着频率数据的话,我想得到元数据。类似于numpy的fft.fftfreq,使用起来相当麻烦和直观。