Python 时频图

Python 时频图,python,scipy,signal-processing,spectrogram,time-frequency,Python,Scipy,Signal Processing,Spectrogram,Time Frequency,我在256Hz的频率下采集了64个通道的脑电图数据,我试图对每个通道进行时频分析,并绘制一个频谱图 数据存储在numpy 3d阵列中,其中一个维度的长度为256,每个元素包含所有采样时间点的微伏读数(每个数据通道的总长度为1秒) 需要说明的是:我的3D阵列是64*256*913(电极*电压*试用)。试验只是一个试验的一次试验。所以我想做的是从一次试验中取一个电极,整个1D电压向量,然后创建一个时频频谱图。例如,我想从数据[0,:,0]创建一个光谱图 对于每个电极,我想要一个图,其中y轴是频率,x

我在256Hz的频率下采集了64个通道的脑电图数据,我试图对每个通道进行时频分析,并绘制一个频谱图

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

需要说明的是:我的3D阵列是64*256*913(电极*电压*试用)。试验只是一个试验的一次试验。所以我想做的是从一次试验中取一个电极,整个1D电压向量,然后创建一个时频频谱图。例如,我想从数据[0,:,0]创建一个光谱图

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

我曾尝试在python中使用此功能:

from matplotlib.pyplot import specgram
#data = np.random.rand(256)
specgram(data, NFFT=256, Fs=256)
这给了我一些类似的东西:

这对我来说是不正确的,因为轴的范围不正确

此外,当我对所有EEG通道运行相同的代码时,在我所有的数据上,我得到了完全相同的图(尽管我已经验证了每个通道的数据不同)

我对信号处理相当陌生,在我的数据布局或我如何使用我的函数方面是否有什么地方出了问题?

对于
specgram
函数:

绘制光谱图

电话签名:

specgram(x,NFFT=256,Fs=2,Fc=0,detrend=mlab.detrend_无, window=mlab.window\u hanning,noverlap=128, cmap=None,xextent=None,pad_to=None,sides='default', scale\u by\u freq=None,mode='default',scale='default', **kwargs)

计算并绘制x轴数据的光谱图。数据分为NFFT长度段和每个段的频谱 是计算出来的。窗口功能窗口应用于每个段, 每个段的重叠量由noverlap指定。 光谱图绘制为彩色图(使用imshow)

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

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

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

你能告诉我更多关于数据的情况吗?我假设其中一个轴是电压,第二个轴是时间,第三个轴是通道-所以我想你们应该取一个通道,忘记时间,因为采样之间的周期是恒定的。对于specgram,您应该使用1-D数组或序列,所以我认为问题可能在这里。抱歉,不清楚。我已经更新了这个问题。基本上,我的3D阵列的3维是电极*电压*试验。我在一次试验中为一个电极取了一个一维阵列(电压),并希望从中得到一个光谱图。因此,是的,我正在绘制1D阵列,类似于
specgram(data,NFFT=64,noverlap=63,Fs=256)
如果您只有256个样本,并且您使用256个样本进行FFT,那么您将无法及时获得分辨率,谢谢!如果你把它作为一个答案发布,我可以接受。我很确定我传递的是一个1D数组。我在问题中发布的示例有些做作,但注释行是一维的,我正在从我的3D矩阵中提取1D数组以输入specgram(例如,数据[0,:,0],其中中间维度包含电压,是我传递的1D数组)