我试图绘制一个EEG信号的谱图,其采样率为1000 Hz,并用14-70 Hz的带通进行滤波,信号的长度为440 (而且不能增加信号的长度)。信号(数据链接这里)如下所示:

我尝试了以下参数值来绘制光谱图:
#plot spectrogram for a single channel
fs = 1000
nperseg = 200
plt.figure(figsize=(10,10))
f, t, Sxx = signal.spectrogram(Oz[0], fs, nperseg=nperseg, noverlap=nperseg-1)
plt.pcolormesh(t, f, Sxx, shading='gouraud')
plt.ylim([0,70])
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()给出了这样的情节:

有人能建议理想的参数设置来提高光谱图的分辨率吗?
编辑:以增强我的查询,我想知道如何确定参数的值,如nperseg、nperseg、window_size和noverlapE 213。如果我有采样率(Fs)、和信号的长度,它们又有什么关系呢?
发布于 2022-05-10 07:03:52
我不知道你期望什么输出,但是out可以尝试改变pcolormesh的阴影。此外,您还可以添加一个窗口来计算光谱图。您还可以更改使用cmap表示光谱图所用的颜色。
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
my_data = np.genfromtxt('signal_value_spectro.csv', delimiter=',',skip_header=0)
Oz=my_data[1:,0]
fs = 1000
t = np.arange(len(Oz))/fs
# nperseg = len(Oz[0])-1
nperseg=50
f50, t50, Sxx_50 = signal.spectrogram(Oz, fs, nperseg=nperseg , noverlap=nperseg-1,window=signal.get_window('hann',nperseg))
nperseg=150
f150, t150, Sxx_150 = signal.spectrogram(Oz, fs, nperseg=nperseg , noverlap=nperseg-1,window=signal.get_window('hann',nperseg))
nperseg=350
f350, t350, Sxx_350 = signal.spectrogram(Oz, fs, nperseg=nperseg , noverlap=nperseg-1,window=signal.get_window('hann',nperseg))
plt.figure(figsize=(10,10))
plt.subplot(211)
plt.plot(np.arange(len(Oz))/fs,Oz)
plt.subplot(234)
plt.pcolormesh(t50, f50, Sxx_50, shading='auto',cmap = 'inferno')
plt.ylim([0,70])
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec], nperseg = 50')
plt.subplot(235)
plt.pcolormesh(t150, f150, Sxx_150, shading='auto',cmap = 'inferno')
plt.ylim([0,70])
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec], nperseg = 150')
plt.subplot(236)
plt.pcolormesh(t350, f350, Sxx_350, shading='auto',cmap = 'inferno')
plt.ylim([0,70])
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec], nperseg = 350')
plt.show()但你最大的问题是信号的长度。你受到时间频率分辨率的限制。基本上,你将得到的频带数是nperseg的长度除以2,分布在间隔0,FS/2上。由于您的信号是440个样本,nperseg应该是情人。但是,如果你增加太多,你会失去时间分辨率。例如,如果nperseg = 50,则会有390个时间点,而id nperseg = 350只会有90个时间点。

信息可以在文档https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.spectrogram.html中获得。
https://stackoverflow.com/questions/72181057
复制相似问题