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

how to change x axis to find peaks from magnitude spectrum in 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()

这是幅度谱:

然后我尝试用 scipy.signal.find_peaks

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

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

matplotlib.pyplot.plot's documentation所示:

x values are optional and default to 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()