首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脑电信号谱图的理想参数是什么?

脑电信号谱图的理想参数是什么?
EN

Stack Overflow用户
提问于 2022-05-10 05:16:52
回答 1查看 322关注 0票数 0

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

我尝试了以下参数值来绘制光谱图:

代码语言:javascript
复制
#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()

给出了这样的情节:

有人能建议理想的参数设置来提高光谱图的分辨率吗?

编辑:以增强我的查询,我想知道如何确定参数的值,如npersegnpersegwindow_sizenoverlapE 213。如果我有采样率(Fs)、和信号长度,它们又有什么关系呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-10 07:03:52

我不知道你期望什么输出,但是out可以尝试改变pcolormesh的阴影。此外,您还可以添加一个窗口来计算光谱图。您还可以更改使用cmap表示光谱图所用的颜色。

代码语言:javascript
复制
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中获得。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72181057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档