当前位置: 首页 > news >正文

心电信号降噪前处理(MATLAB R2018)

心电信号降噪方法分析

(1)基线漂移的常用滤除法是拟合基线抵消法,此法先估计或提取信号基线,然后进行减法运算去掉信号中漂移成分,达到滤波的目的。抑制基线漂移的另一种方法是采用线性相位滤波器,因为基线漂移的频带通常处于低频段。所以采用高通滤波器消除基线漂移,值得注意的是选择滤波器的阶数,阶次较高时,计算量较大,此外还有用基于神经网络设计的非线性自适应滤波器去除基线漂移影响的方法,这种滤波器容易受 QRS 组合波形变异的影响,算法复杂,计算工作量大。近年来,随着小波变换及其在心电信号的数字化滤波中应用新技术的兴起,将小波分解与重构法应用到心电信号滤波去噪技术可以较好抑制信号中的基线漂移,可以认为基线漂移相对集中,其主要成分在某子空间存在,如果抑制其能量,就能很好的去除基线漂移。

(2)对工频干扰抑制方法较多,主要有平滑滤波、简单整系数带阻滤波器、Levkov 滤波、自适应滤波器等。平滑滤波是较早人们所采用的数字化滤波方法,优点是算法简单,处理速度快,滤波效果较好,但其滤波通带窄,造成心电信号中的 QRS 波群削峰严重,信号衰减较大,因此使用该方法有局限性。简单整系数带阻滤波器填补了 IIR 滤波器计算量较大和 FIR 滤波器不能实现严格线性相位的缺点,它用 IIR 结构实现 FIR 滤波器功能,既保证计算量较少,又具有严格的线性相位特性。同时用较少次数递归运算实现非递归 FIR 滤波,减少运算需要的计算机,滤波效果较好,常用于信号实时处理。但滤波有很大延时,滤除的信号频率是固定的,在干扰产生波动时滤波效果下降明显。Levkov滤波法基本原理是先提取一个线性段,滤波后的值为这个线性段原始数据平均值,再算出工频干扰的幅度作为非线性段的噪声模板。对非线性段处理即用原始数据减去临近线性段得出的噪声模板值为真值。此方法算法简单,参数可调,运算量小,能适应干扰频率和幅度变化,滤波效果较好。自适应滤波器是一种能够根据输入信号自动调整自身性能并进行数字信号处理的数字滤波器,具有自学习和自调整能力。如果工频干扰的频率比较稳定,可以采用具有固定中心频率的窄带带阻滤波器(陷波器)来消除。在很多情况下,不易准确知道工频干扰的频率,同时工频干扰会存在一定的频率漂移,所以在心电信号分析处理中常采用自适应噪声抵消原理。在工频电源上取参考信号经降压变压器送入自适应滤波器,调节工频正弦信号的幅度和相位,使之与心电放大器输出的信号的误差信号达到最小,从而保证心电放大器输出中的工频干扰被抵消,而纯净心电信号保留下来。该方法运算速度快,算法也相对比较简单,但需要自学习过程估计噪声,不能跟踪干扰幅度变化。

鉴于此,采用小波分析等信号处理方法对心点信号进行降噪,运行环境为MATLAB 2018。


clc
clear all;
close all;folderType = 'AF';
fileName = strcat('JS02677');
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);

图片

图片

完整数据和代码通过知乎学术咨询获得:https://www.zhihu.com/consult/people/792359672131756032?isMe=1
擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

相关文章:

  • swift开发用Alamofire的post发送proto序列化消息
  • LLM 研究方向(一): LLM Prompts--p-tuning、LoRA
  • NLP - 基于bert预训练模型的文本多分类示例
  • 盲盒抽卡机小程序:抽卡机的多样化发展
  • OpenCV中使用Canny算法在图像中查找边缘
  • C++中的多重继承和虚继承:横向继承、纵向继承和联合继承;虚继承
  • 后端工作之一:CrapApi —— API接口管理系统部署
  • 【服务器】在Linux查看运行的Python程序,并找到特定的Python程序
  • HW期间——应急响应
  • 什么是边缘计算?创造一个更快、更智慧、更互联的世界
  • Selenium 等待
  • 图像类别生成数字标签
  • C++基础篇(1)
  • 在ROS (Robot Operating System) 中,查看话题(topics)
  • 从0构建一款appium-inspector工具
  • 自己简单写的 事件订阅机制
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 07.Android之多媒体问题
  • Create React App 使用
  • miaov-React 最佳入门
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Mysql优化
  • Python学习笔记 字符串拼接
  • Service Worker
  • springboot_database项目介绍
  • 基于webpack 的 vue 多页架构
  • 前端攻城师
  • 优秀架构师必须掌握的架构思维
  • 在weex里面使用chart图表
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (Note)C++中的继承方式
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (二)linux使用docker容器运行mysql
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .Net的DataSet直接与SQL2005交互
  • .NET框架
  • .php文件都打不开,打不开php文件怎么办
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @EnableAsync和@Async开始异步任务支持
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ SNOI 2013 ] Quare
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [AIGC] Java List接口详解
  • [BZOJ] 2044: 三维导弹拦截
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [Firefly-Linux] RK3568 pca9555芯片驱动详解
  • [GHCTF 2024 新生赛]ezzz_unserialize