pytorch 简单运用Variable代码

图像处理小问题

  返回  

Python实现皮肤电(EDA)信号滤波(基于scipy函数)

2021/8/21 17:17:03 浏览:

目录

1.为什么滤波?

2.皮肤电介绍

2.2 皮肤电导水平(Skin Conductance Level,SCL)

2.3 皮肤电导反应(Skin Conductance Response,SCR)

2.4皮肤电的频率范围

3.皮肤电信号的滤波

3.1 滤波器的几个含义

4.函数介绍 


1.为什么滤波?

        在进行生理数据采集时候,设备容易受到电磁信号的干扰,这些信号都会对EDA信号产生一定的影响。这些信号都会在后期进行情绪识别时产生误差。

2.皮肤电介绍

        皮电反应:是一项情绪生理指标。它代表机体受到刺激时皮肤电传导的变化。皮肤电反应作为交感神经系统功能的直接指标,也可以作为脑唤醒、警觉水平的间接指标

 

        皮肤电信号主要由缓慢变化的基础(Tonic)活动——皮肤电导水平与快速变化的相位(Phasic)活动——皮肤电导反应组成。

2.2 皮肤电导水平(Skin Conductance Level,SCL)

        SCL是无任何环境激励下的皮肤电导基线,在几十秒至几分钟内变化缓慢、更替微小。SCL的上升与下降随着个体的反应、皮肤干燥程度或自主调节能力不同而持续变化(韩颖, 董玉琦, & 毕景刚,2018)。

        皮肤电导基础水平存在个体差异,并与个性特征相关,如向亦文,阎克乐,陆运青 (2000)的研究中测量了大学生皮电基础水平与MMPI量表之间的关系。

2.3 皮肤电导反应(Skin Conductance Response,SCR)

        相位反应在基础水平之上,变化幅度更高、速度更快,以“GSR突发”或“GSR峰值”的形式显示。

        SCR对特定的情绪刺激事件敏感,事件相关皮肤电导反应(ER-SCRs)会在情绪刺激发生后的1~5秒之间突发;非特异性皮肤电导反应(NS-SCRs)则在人体内以1~3分钟的速率自发发生,与任何刺激无关(韩颖, 董玉琦, & 毕景刚,2018)。

2.4皮肤电的频率范围

        人体皮肤电的有效频率范围在0.02Hz~~0.20Hz之间,低于大多数干扰信号的频率

3.皮肤电信号的滤波

3.1 滤波器的几个含义

1.低通滤波

       1. 这里假设采样频率为1000hz,信号本身最大的频率为500hz,要滤除400hz以上频率成分,即截至频率为400hz,则wn=2*400/1000=0.8。Wn=0.8(Wn:归一化截止频率。计算公式Wn=2*截止频率/采样频率。)

from   scipy  import   signal  #导入函数
 
b, a  =   signal.butter( 4 ,  0.8 ,  'lowpass' )    
#配置巴特沃斯滤波器 4 表示滤波器的阶数 MIT实验室用的一般都是4阶对EDA进行过滤
filt_data  = signal.filtfilt(b, a, data)   
#data为要过滤的信号,一般将EDA信号单独存储到一个一维的列表中,然后将列表传入data

2.高通滤波        

        这里假设采样频率为1000hz,信号本身最大的频率为500hz,要滤除100hz以下频率成分,即截至频率为100hz,则wn=2*100/1000=0.2。Wn=0.2

3.带通滤波

        这里假设采样频率为1000hz,信号本身最大的频率为500hz,要滤除100hz以下,400hz以上频率成分,即截至频率为100,400hz,则wn1=2*100/1000=0.2,Wn1=0.2; wn2=2*400/1000=0.8,Wn2=0.8。Wn=[0.02,0.8]

from   scipy  import   signal
 
b, a  =   signal.butter( 4 , [ 0.2 , 0.8 ],  'bandpass' )    #配置滤波器 4 表示滤波器的阶数
filtedData  =   signal.filtfilt(b, a, data)   #data为要过滤的信号

4.带阻滤波

        这里假设采样频率为1000hz,信号本身最大的频率为500hz,要滤除100hz以上,400hz以下频率成分,即截至频率为100,400hz,则wn1=2*100/1000=0.2,Wn1=0.2; wn2=2*400/1000=0.8,Wn2=0.8。Wn=[0.02,0.8],和带通相似,但是带通是保留中间,而带阻是去除。

from   scipy  import   signal
 
b, a  =   signal.butter( 4 , [ 0.2 , 0.8 ],  'bandstop' )    #配置滤波器 4 表示滤波器的阶数
filtedData  =   signal.filtfilt(b, a, data)   #data为要过滤的信号

4.函数介绍 

1.函数的介绍

(1).滤波函数

scipy.signal.filtfilt(b, a, x, axis=-1, padtype='odd', padlen=None, method='pad', irlen=None)

输入参数:

b: 滤波器的分子系数向量

a: 滤波器的分母系数向量

x: 要过滤的数据数组。(array型)

axis: 指定要过滤的数据数组x的轴

padtype: 必须是“奇数”、“偶数”、“常数”或“无”。这决定了用于过滤器应用的填充信号的扩展类型。{‘odd’, ‘even’, ‘constant’, None}

padlen:在应用滤波器之前在轴两端延伸X的元素数目。此值必须小于要滤波元素个数- 1。(int型或None)

method:确定处理信号边缘的方法。当method为“pad”时,填充信号;填充类型padtype和padlen决定,irlen被忽略。当method为“gust”时,使用古斯塔夫森方法,而忽略padtype和padlen。{“pad” ,“gust”}

irlen:当method为“gust”时,irlen指定滤波器的脉冲响应的长度。如果irlen是None,则脉冲响应的任何部分都被忽略。对于长信号,指定irlen可以显著改善滤波器的性能。(int型或None)

输出参数:

y:滤波后的数据数组

(2).滤波器构造函数(仅介绍Butterworth滤波器)

scipy.signal.butter(N, Wn, btype='low', analog=False, output='ba')

输入参数:

N:滤波器的阶数

Wn:归一化截止频率。计算公式Wn=2*截止频率/采样频率。(注意:根据采样定理,采样频率要大于两倍的信号本身最大的频率,才能还原信号。截止频率一定小于信号本身最大的频率,所以Wn一定在0和1之间)。当构造带通滤波器或者带阻滤波器时,Wn为长度为2的列表。

btype : 滤波器类型{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’},

output : 输出类型{‘ba’, ‘zpk’, ‘sos’},

输出参数:

b,a: IIR滤波器的分子(b)和分母(a)多项式系数向量。output='ba'

z,p,k: IIR滤波器传递函数的零点、极点和系统增益. output= 'zpk'

sos: IIR滤波器的二阶截面表示。output= 'sos'

参考:

https://blog.csdn.net/u014033218/article/details/97004609

https://zhuanlan.zhihu.com/p/137957593

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号