scipy.signal.spectrogram 频率分辨率

5

scipy.signal.spectrogram函数能够计算信号的谱图,但是我无法找到一个选项来增加谱图的频率分辨率。根据文档提供的代码,如何实现这一目标?

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个回答

17

频谱分辨率由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点,但不增加每个段的输入点数(即对每个段进行零填充)。这将基本上产生一个频谱图,在其中插值了额外的频率点。它不会增加分辨率(即两个频率非常相似的音调不会变得更容易区分),但额外的点会使结果看起来更加平滑。


1
感谢您抽出时间回答我的问题。您的解释帮助我更好地理解函数调用参数的影响。 - NicolasBourbaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接