心电信号降噪方法(滤波器/移动平均/小波等,MATLAB环境)

2024-05-28 02:20

本文主要是介绍心电信号降噪方法(滤波器/移动平均/小波等,MATLAB环境),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于一个正常的、完整的心动周期,对应的心电图波形如下图所示,各个波形都对应着心脏兴奋活动的生理过程,包含P波,PR段,QRS波群,ST段,T波,U波。

(1)P波心电图中,起始的P波对应心房的兴奋过程,一个完整的心动周期起始于窦房结,P波的起始,代表窦房结将心脏兴奋传递至心房使得心房全部受到激励的过程。P波的方向及形态与兴奋在心房内的传播途径密切相关,在各个导联中,P波形态不尽一致,一般来说,P波顶部圆钝,其幅值不高于0.25mV,时限宽度在0.11s以内。

(2)QRS复合波在心电图中,QRS复合波也称为QRS波群,表征着心室除极的心脏电位变化状态,由于心室各部位受到激励顺序有先后,因此QRS复合波是代表心室几个部分兴奋过程的综合波形,是由方向向下的Q波,波形宽大且幅值较高的R波,以及波形方向向下的S波组合形成的。QRS复合波在心电图中波形最为明显,有波形宽,斜率大的特点,因此最容易被识别,常作为心电信号研究的基础,应用广泛。一般正常情况下,QRS波的时限宽度在0.06-0.10s。而在不同的导联中,Q波,R波,S波的振幅、方向不尽一致,致使QRS波形态各异。一般来说Q波振幅小于同一导联中R波的1/4~1/2。在双极肢体导联I、II、III中,R波的振幅一般不超过1.5mV,2.5mV,2.0mV。在标准导联中,S波的振幅的变化量不超过0.6mV。

(3)S-T段在QRS波群的终点到与之相继出现的T波起点中间的水平连线是S-T段,表征着从心室除极结束至缓慢复极的心电活动状态。一般来说,S-T段正常情况下其时限宽度在0.10-0.14s,接近于基线,偏移量较小,一般下移量在0.05mV以内,ST段的抬高量在不同导联中有不同范围,例如在V3导联中抬高量在0.5mV内,ST段的偏移量超过正常范围针对心肌类疾病诊断意义重大。

(4)T波在QRS波群之后出现的顶部圆钝的波形是T波,表征心室复极的状态,通常T波与其同一心动周期的QRS主波方向统一,但也存在T波倒置,双向等情况,其所占时限较长,一般为0.05-0.250s,在不同导联中其幅值也不尽相同,一般应大于与其相邻的R波幅值的1/10。

(5)Q-T间期Q-T间期是从Q波的起始点到T波的终点之间的距离,表征的是心室除极开始到复极完成的心脏活动过程。此段间期与心搏速率相关联,心率越慢,间期越长,相反则越短。一般情况下,若心率在70次/分左右,那么Q-T间期在0.32-0.44s左右,超过正常Q-T间期最高值0.03s被称为Q-T间期显著延长。

(6)U波U波出现在T波之后,是因心室复极化而形成,波形宽而低平,振幅较小,一般不超过0.05mV,时限宽度在0.02~0.04s。U波一般与T波方向相同,其振幅约在0.03mV左右,U波不一定出现在所有导联中,在胸导联中其波形较为明显。

鉴于此,采用滤波器/移动平均/小波等方法进行心电信号降噪,运行环境为MATLAB,运行代码如下:

clc
clear all;
close all;folderType = 'AVRT';
fileName = strcat('JS10493');
% folderType = 'AF';
% fileName = strcat('JS10361');
matFileName = strcat(fileName, '.mat');
heaFileName = strcat(fileName, '.hea');data_path = fullfile('data/raw/', folderType, matFileName);data = load(data_path);ecg_orig = data.val(1, :);
ecg_orig(isinf(ecg_orig)|isnan(ecg_orig)) = 0;fs = 125;
N = length(ecg_orig);
t = (0:N-1) / fs;
f = (0:N-1) * (fs / N);
frequencies = f(1:N/2+1);%RESAMPLE SIGNAL To 125Hz
% [ecg, t] = resample_signal_125(ecg_orig, t_orig);%Assigning new parameter
% fs = 125;
% N = length(ecg);
% f = (0:N-1) * (fs / N);%Applying high pass and low pass filters
hl_filter = hpf_lpf(ecg_orig, fs);
pl_filter = powerline_removal(hl_filter, fs);
movSignal = moving_avg(pl_filter, 5);
waveletSignal = wavelet_denoise(movSignal, 5);% Create a single figure with subplots for each signal
figure;% Original ECG
subplot(5, 1, 1);
plot(t, ecg_orig);
xlabel('Time (s)');
ylabel('Amplitude (mV)');
title('Original Signal');% HPF + LPF Filtered
subplot(5, 1, 2);
plot(t, hl_filter);
xlabel('Time (s)');
ylabel('Amplitude (mV)');
title('HPF + LPF Signal');% Powerline Removal
subplot(5, 1, 3);
plot(t, pl_filter);
xlabel('Time (s)');
ylabel('Amplitude (mV)');
title('Powerline Removal');% Moving Average applied
subplot(5, 1, 4);
plot(t, movSignal);
xlabel('Time (s)');
ylabel('Amplitude (mV)');
title('Moving Average Applied');% Wavelet Denoised
subplot(5, 1, 5);
plot(t, waveletSignal);
xlabel('Time (s)');
ylabel('Amplitude (mV)');
title('Wavelet Denoised');out = waveletSignal;figure
subplot(4, 1, 1);[Pxx,F] = periodogram(ecg_orig,[],length(ecg_orig),fs);
plot(F,10*log10(Pxx))title('Original Signal Spectrum');
xlabel('Frequency');subplot(4, 1, 2);[Pxx_out,F_out] = periodogram(out,[],length(out),fs);   
plot(F,10*log10(Pxx_out))title('Output Signal Spectrum');
xlabel('Frequency');subplot(4, 1, 3)
input_fft = fft(ecg_orig)/N;
input_fft = 2 * abs(input_fft(1:N/2+1));
plot(frequencies, input_fft)title('Original Signal FFT');
xlabel('Frequency');subplot(4, 1, 4)
output_fft = fft(out)/N;
output_fft = 2 * abs(output_fft(1:N/2+1));
plot(frequencies, output_fft)title('Output Signal FFT');
xlabel('Frequency');output_folder_path = fullfile('data/processed/', folderType);
if ~exist(output_folder_path, 'dir')mkdir(output_folder_path);
endoutput_path = fullfile('data/processed/', folderType, matFileName);
save(output_path, 'out');source_file_path_hea = fullfile('data/raw/', folderType, heaFileName);
destination_file_path_hea = fullfile("data/processed/", folderType, heaFileName);copyfile(source_file_path_hea, destination_file_path_hea);%完整代码:https://mbd.pub/o/bread/mbd-ZZiUmJhw%assess_signals(ecg, out, fs)

图片

图片

图片

图片

图片

图片

图片

图片

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

这篇关于心电信号降噪方法(滤波器/移动平均/小波等,MATLAB环境)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009276

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据