scipy.signal.spectrogram频率分辨率

时间:2018-02-02 12:43:33

标签: python scipy signal-processing

scipy.signal.spectrogram计算信号的频谱图,但我看不到增加频谱图频率分辨率的选项。 鉴于documentation提供的代码,如何实现?

from scipy import signal
import numpy as np
import matplotlib.pyplot as plt

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_power), size=time.shape)
noise *= np.exp(-time/5)
x = carrier + noise

f, t, Sxx = signal.spectrogram(x, fs)
plt.pcolormesh(t, f[0:10], Sxx[0:10,])
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

1 个答案:

答案 0 :(得分:5)

光谱分辨率由FFT中使用的点数决定,由nperseg参数控制。要提高分辨率,可以增加每次FFT计算的输入点数。例如,将点数从默认值256增加到分辨率的两倍(即512点),您可以像这样调用scipy.signal.spectrogram

f, t, Sxx = signal.spectrogram(x, fs, nperseg=512)

请注意,您也可以使用:

f, t, Sxx = signal.spectrogram(x, fs, nfft=512)

在FFT中使用更多点,但每段不使用更多输入点(即每个段填充零点)。这基本上会产生频谱图,其中插入附加频率点。它不会增加分辨率(即具有非常相似频率的两个音调将不再具有可区分性),但附加点将使结果看起来更加平滑。