【问题标题】:Why does librosa STFT show wrong frequencies?为什么 librosa STFT 显示错误的频率?
【发布时间】:2020-07-25 11:47:40
【问题描述】:

我使用 numpy 生成了 200 Hz 正弦波,然后使用 librosas stft()specshow() 函数显示频谱图。但是,它显示的频率不是 200 Hz。当我使用 matplotlibs magnitude_spectrum() 函数时,它正好显示 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()

【问题讨论】:

    标签: python-3.x audio signal-processing librosa spectrogram


    【解决方案1】:

    仅将结果传递给specshow 是不够的。您还需要告诉它这些结果的规模。您可以像这样传递采样率参数sr

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

    如果你不这样做,defaultssr=22050, hop_length=512,这在你的情况下肯定是不正确的。

    这类似于here给出的答案。

    【讨论】:

    • 哦,即使经过这么长时间,我还是设法错过了这些参数。非常感谢!
    • 不客气。坦率地说,这很容易被忽略,因为 D 没有像(可能)在面向对象的世界中那样描述包括元数据在内的整个事物,这并不完全直观。
    • 我想了解该元数据(如果这意味着频率数据)。类似 numpy 的 fft.fftfreq(),使用起来相当麻烦且直观。
    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2016-09-06
    相关资源
    最近更新 更多