scipy.signal.spectrogram nfft 参数

scipy.signal.spectrogram nfft parameter

这个函数中的nfft参数是什么意思?请参阅此 link 以获取文档 https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.signal.spectrogram.html

scipy.signal.spectrogram works by splitting the signal into (partially overlapping) segments of time, and then computing the power spectrum from the Fast Fourier Transform (FFT) of each segment. The length of these segments can be controlled using the nperseg argument, which lets you adjust the trade-off between resolution in the frequency and time domains that arises due to the uncertainty principle。使 nperseg 变大可以让您在频域中获得更高的分辨率,但会降低时域中的分辨率。

除了改变进入每个片段的样本数量之外,有时还需要在进行 FFT 之前对每个片段应用零填充。这就是 nfft 参数的用途:

nfft : int, optional

Length of the FFT used, if a zero padded FFT is desired. If None, the FFT length is nperseg. Defaults to None.

默认情况下,nfft == nperseg,表示不使用零填充。

为什么要应用零填充?

  • 一个原因是这会使 FFT 结果更长,这意味着您最终会得到更多的频率区间和在频率维度上看起来“更平滑”的频谱图。但是,请注意,这实际上并没有在频域中为您提供更多 分辨率 - 它基本上是一种对 FFT 结果进行 sinc 插值的有效方法(参见 here更详细的解释)。
  • 从性能的角度来看,填充段使其长度为 2 的幂可能是有意义的,因为基数 2 FFT 比更通用的方法要快得多。