简单的利用有限脉冲响应(FIR)滤波器对心电信号进行降噪(Python)

news/2024/9/23 22:30:31/

代码很简单。

import numpy as np
import matplotlib.pyplot as plt#------------------------Bandstop Filter Function------------------------
def bandstop(M,low,high,Fs):#50Hz removalk1 = int( (low/Fs)*M) # index 22k2 = int( (high/Fs)*M) # index 27#DC removalk0 = int( (1/Fs)*M) # index 0#Creating the desired frequency response X for the bandstop filterX = np.ones(M)  # Frequency response#DC removalX[0:k0+1]=0 # from index 0 to 0#50Hz removalX[k1:k2+1]=0 # from index 22 to 27#Mirror of the 50Hz removalX[M-k2:M-k1+1] = 0 # from index 492 to 477#Passing the created frequency response to ifft to get impulse response signalx = np.real(np.fft.ifft(X)) # signal x - impulse response of systemreturn x#-----------------------------FIR Filter Function---------------------------
def FIR_filter(ecg,h):M = len(ecg) # length of ecgN = len(h) #length of coefficients hfiltered = np.zeros( M + N - 1 ) # list of zeros of length M+N-1for n in range( M+N ): #iterates from 0 to M+Nfor k in range(N): #iterates from 0 to Nif 0 <= n-k <= M-1 :  #allows only possible index numbers for ecgfiltered[n] = filtered[n] + ecg[n-k]*h[k] # convolution formulafiltered = filtered[int(N/2):] #removing first 250 valuesfiltered = filtered[: int(len(filtered) - N/2)] #removing last 250 valuesreturn filtered #----------Importing and preparing the signal before filtering-----------       
data= np.loadtxt('ecg_data.dat')
xval = data[:,0]
ecg = data[:,1]ampGain = 500; # Amplitude Gain
Fs = 1000; # Sampling Frequency# Reducing the signal to remove amplitude gain 
ecg = ecg/ampGain #ecg amplitude in mVs
midval =  min(ecg) + (max(ecg)-min(ecg))/2
ecg = ecg-midval #normalising#---------------------------------Filtering-----------------------------
# Designing a FIR filter using Window method# Bandstop filter
M = 500 #length/order of filter
x = bandstop(M,45,55,Fs)# Positioning first half in second half and second half in first half
# making the 45-55hz removal around midpoint
# which accordingly denoise the signal
h = np.zeros(M)
h[0:int(M/2)] = x[int(M/2):M] # 250 to 499
h[int(M/2):M] = x[0:int(M/2)] # 0 to 249# Hamming window (Taper formed by weighted cosine)
# Maximum value normalised to one
h = np.hamming(M)*h #Filtering the whole signal
Filtered_signal = FIR_filter(ecg,h)#-------------------------------Plotting---------------------------------
plt.figure(1)
plt.plot(xval,ecg)
plt.title('Unfiltered ECG [time domain]')
plt.xlabel('Time [mS]')
plt.ylabel('Amplitude')
plt.grid()plt.figure(2) 
plt.plot(Filtered_signal)
plt.title("Filtered ECG [time domain]")
plt.xlabel("Time [ms]")
plt.ylabel("Amplitude")
plt.grid()plt.figure(3)
plt.plot(xval[5000:6000],ecg[5000:6000])
plt.xlabel("Time [ms]")
plt.ylabel("Amplitude")
plt.title("Unfiltered ECG [Momentary]")
plt.grid()plt.figure(4)
plt.plot(xval[5000:6000],Filtered_signal[5000:6000])
plt.xlabel("Time [ms]")
plt.ylabel("Amplitude")
plt.title("Filtered ECG [Momentary]")    
plt.grid()#Frequency response for the ECG
fftdata = np.fft.fft(ecg)
faxis = np.linspace(0,Fs, len(fftdata))plt.figure(5)
plt.plot(faxis, np.abs(fftdata))
plt.title("Unfiltered ECG [frequency domain]")
plt.xlabel("Frequency [Hz]")
plt.ylabel("Amplitude")
plt.grid()#Frequency response for the filtered ECG
fftdata1 = np.fft.fft(Filtered_signal)
faxis1 = np.linspace(0,Fs, len(fftdata1))plt.figure(6)
plt.plot(faxis1, np.abs(fftdata1))
plt.title('Filtered ECG [frequency domain]')
plt.xlabel("Frequency [Hz]")
plt.ylabel("Amplitude")
plt.grid()

图片

图片

图片

图片

图片

图片

工学博士,担任《Mechanical System and Signal Processing》《中国电机工程学报》《控制与决策》等期刊审稿专家,擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。


http://www.ppmy.cn/news/1463758.html

相关文章

python设计模式--观察者模式

观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;当主题对象状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新。 在 Python 中&#xff0c;观察者模式通…

前后端项目部署和解决跨域

文章目录 一.前端项目部署1.1 上传前端文件1.2 项目部署1.3 解决跨域1.3.1 什么是跨域1.3.2 配置文件 二.后端项目部署2.1 上传后端文件2.2 项目部署2.3 解决跨域 一.前端项目部署 1.1 上传前端文件 站点创建好了&#xff0c;进入到站点的目录。 然后把它默认的文件删掉。 你…

大数据开发面试题【Spark篇】

115、Spark的任务执行流程 driver和executor&#xff0c;结构式一主多从模式&#xff0c; driver&#xff1a;spark的驱动节点&#xff0c;用于执行spark任务中的main方法&#xff0c;负责实际代码的执行工作&#xff1b;主要负责&#xff1a;将代码逻辑转换为任务、在executo…

OSPF原理(1)

一、OSPF介绍 OSPF&#xff08;Open Shortest Path First&#xff0c;开放最短路径优先&#xff09;协议作为一种基于链路状态的路由协议&#xff0c;它为网络中的路由器提供了一种高效、可靠的方式来共享路由信息&#xff0c;并计算出最短路径。 特点&#xff1a; 收敛速度快…

推荐系统学习笔记(四)--基于向量的召回

离散特征处理 离散特征&#xff1a;性别&#xff0c;国籍&#xff0c;英文单词&#xff0c;物品id&#xff0c;用户id 处理&#xff1a; 建立字典&#xff1a;eg&#xff1a;china 1 向量化&#xff1a;eg&#xff1a;one-hot /embedding&#xff08;低维稠密向量&#xf…

【数据结构】数据结构中的隐藏玩法——栈与队列

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

在某云服务器上搭建公网kali linux2.0

前提&#xff1a; 可用的 CVM 实例 挂载一个系统盘之外的盘&#xff0c;安装完成后可卸载&#xff01; 创建实例&#xff0c;安装centos7系统&#xff01; 然后执行fdisk -l看磁盘的情况 在这里我将把镜像写入vdb这块数据盘 非 root 的情况下记得sudo执行以下命令 注意&…

质量评估门户:您AI内容的质量守护者

在当今这个内容饥渴和内容疯狂的世界里&#xff0c;AI驱动的内容创作既是一种流行趋势&#xff0c;有时也是一个改变游戏规则的存在。但强大的能力伴随着巨大的责任……即确保质量的责任。 想象一下&#xff1a;你拥有一个AI[和创意团队]&#xff0c;他们以闪电般的速度输出博…