ali*_*i_m 11

scipy.signal.spectrogram通过将信号分成(部分重叠)时间段,然后从每个段的快速傅立叶变换(FFT)计算功率谱来工作.可以使用nperseg参数控制这些段的长度,这样可以调整由于不确定性原理而产生的频率和时域中的分辨率之间的权衡.制作nperseg大让你在时域分辨率较低的成本在频域更高的分辨率.

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

nfft :int,可选

如果需要零填充FFT,则使用FFT的长度.如果为None,则FFT长度为nperseg.默认为.

默认情况下,nfft == nperseg意味着不使用零填充.

为什么要应用零填充?

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

  • "nperseg"与输出数组中的时间段数(即列数)之间的关系也取决于段之间的重叠程度.默认情况下,`noverlap = nperseg // 8`,所以对于长度为"n"的输入,你将得到`n //(nperseg - (nperseg // 8))`时间段.频率仓的数量将等于每个零填充段的实值DFT的长度(与`np.fft.rfft(zero_padded_segment)`的结果大小相同),等于`nfft// 2 + 1` (4认同)
  • 信号 FFT 中的频率范围始终在零和 [奈奎斯特频率](https://en.wikipedia.org/wiki/Nyquist_frequency) 之间,这等于采样率的一半。如果要增加频谱图中的最大频率,则需要增加采样率。如果您只对频带感兴趣,那么您可以剪掉您不关心的频谱图部分,但您不能*仅*为给定的频率范围计算它,因为 FFT 计算所有频率仓同时进行。 (2认同)