【问题标题】:Time frequency spectrogram in PythonPython - 时间频谱图
【发布时间】:2015-10-30 19:33:24
【问题描述】:

我有一些以 256Hz 采样的 64 通道脑电图数据,我正在尝试对每个通道进行时频分析并绘制频谱图。

数据存储在一个 numpy 3d 数组中,其中一个维度的长度为 256,每个元素包含所有采样时间点的微伏读数(每个数据通道的总长度为 1 秒)。

要明确:我的 3D 阵列是 64*256*913(电极 * 电压 * 试验)。试验只是一个实验的一次试验。所以我想做的是从一次试验中获取一个电极,以及整个一维电压矢量并创建一个时频频谱图。例如,我想从 data[0,:,0] 创建一个频谱图。

对于每个电极,我想要一个图,其中 y 轴是频率,x 轴是时间,颜色/强度是功率

我已经尝试在 python 中使用它:

from matplotlib.pyplot import specgram
#data = np.random.rand(256)
specgram(data, NFFT=256, Fs=256)

这给了我一些看起来像这样的东西:

这对我来说看起来不正确,因为轴范围不正确

此外,当我对所有 EEG 通道运行相同的代码时,我的所有数据都会得到完全相同的图(即使我已经验证每个通道的数据不同)

我对信号处理还很陌生,在我的数据布局或函数使用方式上是否有什么地方出错了?

【问题讨论】:

  • 您能多谈谈数据吗?我假设你的一个轴是电压,第二个是时间,第三个是通道 - 所以我想你应该选择一个通道,忘记时间,因为样本之间的周期是恒定的。对于specgram,您应该使用一维数组或序列,所以我认为问题可能就在这里。
  • 抱歉不清楚。我已经更新了这个问题。基本上我的 3D 阵列的 3 个维度是电极 * 电压 * 试验。我在一次试验中为单个电极采用一维阵列(电压),并希望从中获得频谱图。所以是的,我正在绘制一维数组
  • 尝试类似specgram(data, NFFT=64, noverlap=63, Fs=256) 如果您只有 256 个样本并且对 256 个样本进行 FFT,那么您将无法及时解决
  • 成功了,谢谢!如果您将其发布为答案,我可以接受它

标签: python scipy signal-processing spectrogram time-frequency


【解决方案1】:

来自documentationspecgram 函数:

绘制频谱图。

调用签名:

specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, 窗口=mlab.window_hanning,noverlap=128, cmap=无,xextent=无,pad_to=无,边='默认', scale_by_freq=None, mode='default', scale='default', **kwargs)

计算并绘制 x 中数据的频谱图。数据被分成NFFT长度段和每个段的频谱 被计算。对每个段应用加窗函数window, 每个段的重叠量用 noverlap 指定。 频谱图被绘制为颜色图(使用 imshow)。

x:一维数组或序列包含数据的数组或序列

看起来您的问题是您没有传递一维数据。试试:

from matplotlib.pyplot import specgram
specgram(data.flatten(), NFFT=256, Fs=256)

【讨论】:

  • 我很确定我正在传递一个一维数组。我在问题中发布的示例有些做作,但注释行是一维的,我正在从我的 3D 矩阵中提取 1D 数组以输入到谱图(例如 data[0,:,0] ,其中中间维度包含电压,是我​​传入的一维数组)
猜你喜欢
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2018-03-20
  • 2015-09-15
  • 2019-11-09
  • 2021-03-25
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多