信号分析框架
saff的Python项目详细描述
安全
为您提供信号分析框架
一个简单的信号分析框架,其目标是代码的清晰性和解决方案的重现性。插件架构 旨在鼓励科学家和数据分析师之间建立模块化代码。它提供了信号的基本结构 储存和分析管道。
安装
pip3 install saffy
源代码
建议使用Virtualenv!
将软件包下载到项目目录
git clone https://github.com/PPierzc/saffy.git
安装依赖项
pip3 install -r ./saffy/requirements.txt
用法
importsaffysig=saffy.SignalManager(generator=signal_data)
基本信号管理器实例结构
field | description |
---|---|
fs | sampling frequency |
num_channels | number of channels |
channel_names | name for each channel |
data | the signal in the structure of (epoch x channel x signal) |
t | time vector |
epochs | number of epochs |
tags | position of tags in signal |
spectrum | matrix of spectrum |
spectrum_freqs | vector of frequencies |
phase | matrix of phase |
信号管理器初始化函数
它接受一个标记参数:generator
或filename
。
发电机
结构词典
data = {
'fs': # float,
'num_channels': # integer,
'channel_names': # list of strings,
'epochs': # integer,
't': # time array,
'tags': # list,
'data': # Signal Matrix
}
saffy.SignalManager(generator=data)
文件名
由svarog生成的文件的名称。3个文件,例如data.raw
、data.xml
、data.tag
saffy.SignalManager(filename='data')
插件
插件是从插件管理器继承的类。它们扩展了基本信号管理器的功能。 有些插件是现成的
过滤器
添加基本筛选器
图形
添加显示信号数据的功能
韦尔奇计算韦尔奇谱
希尔伯特计算希尔伯特变换
创建自定义插件
您可能需要添加一些自定义功能。
插件开发的建议约定如下。 所有要额外存储的数据都应该以字典的形式存储,字典的形式分配给一个同名的变量 作为插件。
插件函数前面应该有插件名称。
importsaffyclassCustomPlugin(saffy.PluginManager):def__init__(self,*args,**kwargs):super().__init__(*args,**kwargs)self.custom={'param':'some value'}defcustom_function(self):# do somethingpasssaffy.SignalManager.register_plugin(CustomPlugin)sig=saffy.SignalManager(generator=signal_data)sig.custom_function()
示例
如何使用saffy进行脑电数据分析的一个简短示例。
defgenerate_signal():data={'fs':512,'num_channels':3,'channel_names':['C3','C4','d1'],'epochs':1}T=20t=np.arange(0,T,1/data['fs'])mu_freq=10beta_freq=23net_freq=50data['data']=np.zeros((data['epochs'],data['num_channels'],len(t)))forepochinrange(data['epochs']):data['data'][epoch][0]+=(0.1*t+0.1)*sin(t,mu_freq)data['data'][epoch][0]+=(0.1*t+0.1)*sin(t,beta_freq)data['data'][epoch][0]+=sin(t,net_freq)data['data'][epoch][0]+=0.3*noise(t)data['data'][epoch][1]+=(0.1*t+0.1)*sin(t,mu_freq)data['data'][epoch][1]+=(0.1*t+0.1)*sin(t,beta_freq)data['data'][epoch][1]+=sin(t,net_freq)data['data'][epoch][1]+=0.3*noise(t)data['data'][epoch][2][::5*data['fs']]=1data['data'][epoch][2][0]=0data['t']=tdata['tags']=[]returndataEEG=saffy.SignalManager(generator=generate_signal())EEG.set_tags_from_channel('d1')EEG.remove_channel('d1')PRE_EEG=EEG.copy('pre')PRE_EEG.set_epochs_from_tags(-4,-2)PRE_EEG.welch_spectrum()PRE_EEG.spectrum=np.mean(PRE_EEG.spectrum,axis=0)PRE_EEG.spectrum=np.reshape(PRE_EEG.spectrum,(1,*PRE_EEG.spectrum.shape))POST_EEG=EEG.copy('post')POST_EEG.set_epochs_from_tags(0.5,2.5)POST_EEG.welch_spectrum()POST_EEG.spectrum=np.mean(POST_EEG.spectrum,axis=0)POST_EEG.spectrum=np.reshape(POST_EEG.spectrum,(1,*POST_EEG.spectrum.shape))fig,ax=plt.subplots(nrows=max([PRE_EEG.num_channels,POST_EEG.num_channels]),ncols=1,sharex=True,sharey=True,figsize=(10,10))PRE_EEG.graphics_spectrum_plot(fig,ax,'Change',label='Pre')POST_EEG.graphics_spectrum_plot(fig,ax,color='#0000ff',label='Post')forainax:a.legend()plt.show()plt.close()
贡献
如果您喜欢这个项目并想添加一些内容,那么请创建一个拉取请求。
- 标题应该很快概括出您添加的目标
- 在描述中,深入了解您所做的更改及其原因。