运动想象MI:带通滤波的Python实现

news2024/11/17 16:03:23

运动想象MI:带通滤波的Python实现

  • 0. 引言
  • 1. 代码介绍
    • 1.1 实现方法(1)
    • 1.2 实现方法(2)
  • 2. 函数介绍
  • 3. 滤波函数介绍
  • 4. 总结

0. 引言

在执行运动想象任务时,由于实际采集实验不是在完全屏蔽的环境中进行的,受试者所处的环境复杂容易受到多种外界干扰,因此在对数据集进行处理之前,需要对采集的数据进行8-40Hz带通滤波,保留与运动想象有关的频率带。
除此之外,在对运动想象任务分类时,当前的诸多先进模型一般将采集得到的带通滤波数据根据频率带的不同分为不同组数据,一般以4Hz为一个频率带进行区分,此时也需要带通滤波当前诸多模型大多是多通道、多尺度的CNN模型!!!

然而,网上查找了诸多文献,但是却没有带通滤波的准确的实现。因此,写了这篇文章来介绍如何使用Python实现带通滤波。

实验环境

Python  3.9
scipy   1.11.1

这里给出一个scipy代码的介绍文档:
Scipy介绍文档:https://scipy-cookbook.readthedocs.io/items/ButterworthBandpass.html

1. 代码介绍

为了防止浪费大家的时间,这里先写出了带通滤波的Python实现,后面会进行细致的介绍。

1.1 实现方法(1)

# 例:实现4-32Hz的带通滤波 采样频率为200Hz
from scipy import signal

# 设置需要采样的数据
data = np.ndarray([200, 20, 3840]) 

# 设置采样频率
Fs = 200
# 其中第一个4表示阶数  []里面的分别表示滤波的下限和上限
b, a = signal.butter(4, [4, 32], 'bandpass',fs=Fs) 

# 对上述数据进行带通滤波
data = signal.filtfilt(b, a, data, axis=-1)

通过以上代码,即可实现一个完整的带通滤波程序。大家需要相关操作的可以自行模仿!!!没兴趣往下看的到这里也就可以结束了,下面介绍些相关的内容。

1.2 实现方法(2)

如果不再后面设置fs=Fs,需要按照下面的代码实现带通滤波4-32Hz的功能。

# 例:实现4-32Hz的带通滤波 采样频率为200Hz
from scipy import signal

# 设置需要采样的数据
data = np.ndarray([200, 20, 3840]) 

# 设置采样频率
Fs = 200
# 其中第一个4表示阶数  []里面的分别表示滤波的下限和上限
b, a = signal.butter(4, [4/(Fs/2), 32/(Fs/2)], 'bandpass') 

# 对上述数据进行带通滤波
data = signal.filtfilt(b, a, data, axis=-1)

2. 函数介绍

在上述代码中,引起争议的函数往往是signal.butter()函数,有很多作者直接在[]里面写上4和32,但是最后不给fs赋值!!,这是完全错误的做法! 为了明白为什么会错误,以下对signal.butter()函数进行简单介绍:

signal.butter(N, Wn, btype='low', analog=False, output='ba', fs=None)
# 设计N阶数字或模拟巴特沃斯滤波器并且返回滤波器系数向量,在求出系数后对信号进行滤波时需要用scipy.signal.filtfilt()。
---------------------------------------------------------------------
# 参数
 - N: 滤波器的阶数。对于“bandpass”和“bandstop”滤波器,最终二阶部分(“os”)矩阵的最终阶为“2*N”,其中“N”是所需系统的二阶部分的数量。
 - Wn: array数组。 临界频率。对于低通和高通滤波器,Wn是标量;对于带通滤波器和带阻滤波器,Wn是长度为2的序列, 例如:[4,32]。
     对于Butterworth 滤波器,这是增益下降到通带增益的1/sqrt(2)的点(“-3dB点”)。
     对于数字滤波器,如果没有指定“fs”,则“Wn”单元从0归一化为1,其中1是奈奎斯特频率(因此“Wn“处于半周期/样本,并被定义为2*临界频率/“fs”)。
     对于模拟滤波器,“Wn”是一个角频率(例如rad/s)。
 - btype:'lowpass', 'highpass', 'bandpass', 'bandstop'},可选。滤波器的类型。默认值为“lowpass”。
 - analog: bool,可选。当为True时,返回模拟滤波器,否则返回数字滤波器。
 - output: 'ba''zpk''sos'},可选。
     输出类型:分子/分母('ba')、零点('zpk')或二阶部分('sos')。默认为“ba”表示向后兼容性,但“sos”应用于通用筛选。
 - fs: float, optional。
     数字系统的采样频率。

注意:如果没有指定“fs”,即:如果fs=None,则对于Wn=[low, high],实际带通为 [low*1/2, high*1/2] ,如果指定了fs,即fs=Fs,则对于Wn=[low, high],实际带通为[low/fs, high/fs]
而对于我们要实现的带通滤波而言,一定要带上频率!!!即;最终带通的频率应为频率/采样频率。

3. 滤波函数介绍

在上述代码中,最终实现了Butterworth 带通滤波器。下面简单介绍下Butterworth 带通滤波器。关于Butterworth 带通滤波器更细致的东西大家可以观看博客:什么是巴特沃斯滤波器。

巴特沃斯(Butterworth)滤波器是是电子滤波器的一种,一种具有最大平坦幅度响应低通滤波器,它在通信领域里已有广泛应用,在电测中也具有广泛的用途,可以作检测信号的滤波器。
Butterworth 的传递函数:
在这里插入图片描述
Butterworth 的设计:
在这里插入图片描述
Butterworth 的算法:

Butterworth 滤波器的幅值响应在通带内具有最大平坦度,并在整体上呈现单调性。这种平滑是以降低滚降陡度为代价的。对于给定滤波器阶数,椭圆和 Chebyshev 滤波器通常提供更陡的滚降

butter 使用一个五步算法:

  1. 它使用函数 buttap 查找低通模拟原型的极点、零点和增益。
  2. 它将极点、零点和增益转换为状态空间形式。
  3. 如果需要,它使用状态空间变换将低通滤波器转换为具有所需频率约束的带通、高通或带阻滤波器。
  4. 对于数字滤波器设计,它使用 bilinear通过具有频率预修正的双线性变换将模拟滤波器转换为数字滤波器。经过仔细调整频率,模拟滤波器和数字滤波器在 Wn 或 w1 和 w2处可具有相同的频率响应幅值。
  5. 根据需要,它将状态空间滤波器转换回其传递函数或零极点增益形式。

4. 总结

到此,有关带通滤波的Python实现就基本讲完了。如果有什么疑问欢迎在评论区提出,对于共性问题可能会后续添加到文章介绍中。

如果觉得这篇文章对你有用,记得点赞、收藏并分享给你的小伙伴们哦😄。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机体系结构基础知识介绍之高级分支预测(一)

由于需要通过分支危险和停顿来强制控制依赖,分支会损害管道性能。 循环展开是减少分支危险数量的一种方法; 我们还可以通过预测分支的行为来减少分支的性能损失。 分支预测是一种计算机技术,它的目的是在执行分支指令之前,预测分支…

人工智能三要素:算法、算力、数据

1 人工智能介绍 人工智能(Artificial Intelligence,简称AI)是指计算机系统模拟、模仿和执行人类智能的能力。它是一门研究如何使计算机能够像人类一样思考、学习、推理和解决问题的科学和技术领域。 人工智能通过利用大量的数据和强大的计算…

ACL访问控制、Squid 反向代理

ACL访问控制、Squid 反向代理 一、ACL访问控制1、定义访问控制列表2、配置步骤 二、Squid 反向代理1、工作机制2、配置步骤 一、ACL访问控制 在配置文件 squid.conf 中,ACL 访问控制通过以下两个步骤来实现: (1)使用 acl 配置项定…

【我们一起60天准备考研算法面试(大全)-第八天 8/60】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

路径规划算法:基于混沌博弈优化的路径规划算法- 附代码

路径规划算法:基于混沌博弈优化的路径规划算法- 附代码 文章目录 路径规划算法:基于混沌博弈优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

Vue3的使用--002

Vue3包含vue2的语法,学习vue3就行。 前提要求, 安装大于node.js15.0。 创建Vue 项目 : npm init Vuelastest : 这一执行将会安装并执行create-vue, 他是Vue 官方的脚手架工具。你将会看到一些Typescript 和测试支持之类的可选功能提示&…

在VSCode里使用Jupyter?Notebook调试Java代码的详细过程

目录 什么是Jupyter Notebook?Jupyter Notebook主要优点环境准备下载 IJava创建conda虚拟环境搭建运行环境测试 之前使用的那台电脑有点旧了,稍微跑一下程序就报内存不够。本来想考虑入手一台带GPU的新电脑,在商品浏览里的时候,…

DynaSLAM代码详解(1) — RGBD模式DynaSLAM运行流程

目录 1.1 DynaSLAM和ORB-SLAM2文件对比 1.2 RGBD模式运行流程 论文翻译地址:动态SLAM论文(2) — DynaSLAM: Tracking, Mapping and Inpainting in Dynamic Scenes_几度春风里的博客-CSDN博客 1.1 DynaSLAM和ORB-SLAM2文件对比 DynaSLAM是一个建立在ORB-SLAM2基础上…

【Leetcode】707. 设计链表

单向链表 class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextclass MyLinkedList:def __init__(self):self.dummy_head ListNode()self.size 0def get(self, index):if index < 0 or index > self.size:return -1current self.dummy_h…

【简单认识LVS+Keepalived负载均衡高可用群集】

文章目录 一、Keepalived高可用详解1、简介2、原理3、Keepalived体系主要模块及其作用&#xff1a; 二、LVSKeepalived 高可用群集部署实例1.配置NFS共享存储器2.配置节点web服务&#xff08;两台的配置相同&#xff09;&#xff08;1&#xff09;配置虚拟 IP 地址&#xff08;…

飞桨黑客松 OpenVINO™ 任务获奖者经验分享 | 基于OpenVINO™ 与PaddleOCR的结构化输出Pipeline...

点击蓝字 关注我们,让开发变得更有趣 作者 | 张一乔 排版 | 李擎 OpenVINO™ 1. 黑客松活动介绍 01 第四季飞桨黑客松(PaddlePaddle Hackathon Season 4)是由百度联合合作伙伴共同举办的开源深度学习框架类黑客松活动。本次活动旨在为全球开发者提供一个交流、合作和创新的机会…

Django_模型类详解(七)

目录 一、定义属性 字段类型 选项 二、查询集 两大特性 查询集的缓存 限制查询集 三、条件查询 条件运算符 1) 查询相等 2) 模糊查询 3) 空查询 4) 范围查询 5) 比较查询 6) 日期查询 F对象 Q对象 聚合函数 四、关联查询 通过对象执行关联查询 通过模型类执…

线程池介绍

1、什么是线程池 例子&#xff1a; 10年前单核CPU电脑&#xff0c;假的多线程&#xff0c;像马戏团小丑玩多个球&#xff0c;CPU需要来回切换。 现在是多核电脑&#xff0c;多个线程各自跑在独立的CPU上&#xff0c;不用切换效率高。 线程池的优势&#xff1a; 线程池做的工作…

七、VPN技术之密码学基础(密码体制、对称加密算法、非对称加密算法)

更多网络基础内容可见: 网络基础学习目录及各章节指引 7.1 密码学基础 7.1.1 基础概念 密码:对文本进行编码,使偷窥者无法识别的算法。是一套编码方案,一种特殊的报文编码和相应的解码方式的结合体。 加密之前的原始报文称为明文,使用密码之后的报文叫密文。一个简单的例…

elk高并发架构

1.前言 普通的elk架构只适合数据量小的情景&#xff0c;而且也不安全&#xff0c;在瞬时数据量大的情况下可能会导致logstash崩溃&#xff0c;从而导致数据的丢失&#xff0c;对于数据安全有较高要求&#xff0c;可以在架构中加入消息队列&#xff0c;既可以防止瞬时的大流量并…

有过JVM调优经验吗【面试题】

写作目的 JVM其实比较偏理论的&#xff0c;日常工作中很少遇到。但是面试他问&#xff0c;所以需要自己mock一下场景进行准备这个问题的回复。 本次分析的场景的元空间太小导致频繁FGC的问题。 源码&启动参数 gitee下载源码 启动-调优前 nohup java -XX:MetaspaceS…

【MySQL】SQL索引失效的几种场景及优化

MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法&#xff0c;并且加快查询的速度&#xff0c; 因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录&#xff0c;从而提高数据库查询的速度&#xff0c;…

C++之函数模板高级用法(一百五十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

两个好用到爆的Python模块,建议收藏!

在日常开发工作中&#xff0c;经常会遇到这样的一个问题&#xff1a;要对数据中的某个字段进行匹配&#xff0c;但这个字段有可能会有微小的差异。比如同样是招聘岗位的数据&#xff0c;里面省份一栏有的写“广西”&#xff0c;有的写“广西壮族自治区”&#xff0c;甚至还有写…

基于单片机的智能鞋柜的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;通过DHT11温湿度采集&#xff1b;通过按键设置逻辑处理&#xff1b;通过LED紫外线消毒&#xff1b;通过继电器控制风扇进行换气除湿&#xff1b;通过继电器控制加热片进行加热&#xff1b;整个电路以5v供电; 电路图 PCB 源代码 #i…