如何更改 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()
我已经用 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 torange(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()