从信号频谱中提取峰值

时间:2017-12-12 10:44:24

标签: python matplotlib audio scipy signal-processing

我正在制作一个音频文件,用于从audio.wav文件中绘制一个频谱图。我浏览了scipy文档中的代码。

from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
fs = 10e3
N = 1e5
amp = 2 * np.sqrt(2)
noise_power = 0.01 * fs / 2
time = np.arange(N) / float(fs)
mod = 500*np.cos(2*np.pi*0.25*time)
carrier = amp * np.sin(2*np.pi*3e3*time + mod)
noise = np.random.normal(scale=np.sqrt(noise_po wer), size=time.shape)
noise *= np.exp(-time/5)
x = carrier + noise
f, t, Sxx = signal.spectrogram(x, fs)
plt.pcolormesh(t, f, Sxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

现在情节看起来有点像这样。 plot 1

现在这个图是频率与时间的关系。我想在峰值点(或最大值)提取y值。有什么办法可以吗?

请记住,此情节基于我们手动创建的功能。如果是音频文件,所有内容都将随机化。

1 个答案:

答案 0 :(得分:0)

最大信号的频率可以通过

找到
f[np.argmax(Sxx, axis=0)]

您可以将其绘制为

m = np.argmax(Sxx, axis=0)
plt.plot(t,f[m], color="crimson")

enter image description here