如何更改x轴以从python中的幅度谱中找到峰值

问题描述

我已经用 librosa 加载了一个音频文件来绘制它的幅度谱

signal,sr = librosa.load(audio_file,sr=44100)

signal_fft = np.fft.fft(signal)
magnitude = np.abs(signal_fft)
frequency = np.linspace(0,sr,len(magnitude))

plt.plot(frequency[:30000],magnitude[:30000]) # cutting the plot at the Nyquist frequency
plt.xlabel("Frequency (Hz)")
plt.ylabel("Magnitude")
plt.title("Magnitude spectrum")
plt.show()

这是幅度谱:

magnitude spectrum

然后我尝试用 scipy.signal.find_peaks

找到光谱的峰值
peaks,_ = find_peaks(magnitude[:30000],height=350)
plt.plot(magnitude[:30000])
plt.plot(peaks,magnitude[peaks],"x")
plt.show()

然后我想知道是否可以在频率标度上绘制峰值? 我在定义 x 轴时遇到了麻烦,因为在绘制时它会以另一个比例出现。

magnitude spectrum with peaks

解决方法

matplotlib.pyplot.plot's documentation所示:

x 值是可选的,默认为 range(len(y))

因此,您的第二个绘图使用 x 轴的索引而不是频率。 要获得以 Hz 为单位的值,您需要每个绘制幅度的频率,幸运的是您通过 frequency 变量获得了该频率。因此,您可以使用以下内容生成与第一个图具有相同比例的第二个图:

peaks,_ = find_peaks(magnitude[:30000],height=350)
plt.plot(frequency[:30000],magnitude[:30000])
plt.plot(frequency[peaks],magnitude[peaks],"x")
plt.show()