基于集成經驗模態分解的心電信號降噪和基于希爾伯特變換的R峰檢測(MATLAB R2018)

近年來,心臟病已成為危害人類健康最常見的疾病。為了有效預防心臟疾病的發生,往往需要更加準確地采集與診斷心電信號,以便于更好地反映心臟情況。心電信號作為人體生理信號,對于識別心臟異常和心臟疾病具有重要的參考價值。心電信號,是由心臟的電活動引起心臟周圍的導電組織和體液反映到身體表面上而產生的電壓變化。正常心電信號主要由P波、QRS復合波、T波與U波組成。由于心電信號頻率與振幅較低,在采集心電信號時往往伴隨著不可避免的噪聲,因而降噪成為心電信號處理的核心。心電信號中存在多種低頻和高頻噪聲,常見的噪聲有加性高斯白噪聲(AdditiveWhiteGaussianNoise,AWGN)、基線漂移(BaselineWander,BW)、肌電干擾(MuscleArtefacts,MA)、運動偽影(ElectrodeMotion,EM)、工頻干擾(PowerLineInterference,PLI)。

基線漂移(BW):BW是一種低頻噪聲信號,主要是由呼吸、身體運動、電極接觸不良與皮膚電極阻抗所引起的。BW噪聲會使心電信號中的ST段與其他低頻成分失真。

工頻干擾(PLI):PLI主要是由供電設備產生的,它會扭曲低振幅心電信號波(P波或T波)的振幅與形狀。

肌電干擾(MA):MA作為最主要的心電噪聲信號之一,是由肌肉的收縮與顫動或身體突然運動而產生的電活動。肌電信號導致心電信號的局部波失真。

運動偽影(EM):由測量心電信號的電極與皮膚之間的阻抗隨著相對位移而發生改變所引起的,與P波、T波的頻譜幾乎完全重合。

ECG處理主要是從采集到有噪聲的信號中通過技術提取純信號,以便于更精確地分析與診斷心臟問題。因此,希望設計一種能夠完全消除噪聲而不影響信號的技術。然而事實上,這是不可能的。因為噪聲的頻率與信號的頻率在一個階段非常接近以至于重疊,會無法濾除噪聲或會使信號失真。因此,盡最大可能去除噪聲而不影響信號是目前最主要的技術。近年來,眾多學者采用不同學科不同領域方法來研究如何降噪,取得了較滿意效果。

鑒于此,提出一種基于集成經驗模態分解的心電信號降噪和基于希爾伯特變換的R峰檢測,運行環境為MATLAB 2018,主代碼如下:

%% Data Loading
ecg=load ('ecg1.mat');          % loading the signal 
ecg=struct2cell(ecg);
ecg=cell2mat(ecg);
ecg = (ecg - 1024)/200;     % you have to remove "base" and "gain"
ecg1=ecg(1,:);              %Noisy ecg
ecg2=ecg(2,:);              %filtered ecg
Fs =500;                    % sampling frequecy
t =linspace(0,length(ecg1)/Fs,length(ecg1)); %time vector%% ECG signal denoising
imf=eemd(ecg1,.2,70); %Apply the EEMD to the noisy signal .2->ratio of the standard deviation 70->ensemble number
imfs=imf';             %transpose the imf's matrix
reconstruction=imfs(4,:)+imfs(5,:)+imfs(6,:);  %We consider that these 3 imf's possess the important information%4 order Butterworth filter bandpass .05-230Hz. 
fclowpass=230; % Low pass cut-off frequency 230Hz
fchighpass=.05; % Low pass cut-off frequency .05Hz
filterorder=4;  %filter order[b,a]=butter(filterorder,[filterorder*fchighpass/Fs,2*fclowpass/Fs]);
filtered_ECG=filter(b,a,reconstruction);%% Emphasizing R peaks of the ECG
%Getting the maxima and minima of the ECG signal, to emphasize the R peaks
decg=(1/Fs)*(diff(filtered_ECG));  %derivative of the ecg
hecg=hilbert(decg); %hilbert transform of the derivative. 
envelope=abs(hecg);  %It returns the envelope of the ecg%% R peaks detection 
maximum=(max(envelope));
Threshold=.6*(maximum); 
[pks,locs] = findpeaks(envelope,'MinPeakHeight',Threshold);
time=(1/Fs)*length(ecg1);
timefactor=60/time;
cardiacFreq=round(timefactor*length(pks));
%% Plots
figure (1)
plot(t,ecg1); xlabel('time (s)'); ylabel('mV'); title('Raw ECG');
figure(2)
subplot(7,1,1);
plot(t,imfs(1,:)); xlabel('time (s)'); ylabel('mV'); title('Original ECG');
subplot(7,1,2);
plot(t,imfs(2,:)); xlabel('time (s)'); ylabel('mV'); title('1st IMF');
subplot(7,1,3);
plot(t,imfs(3,:)); xlabel('time (s)'); ylabel('mV'); title('2nd IMF');
subplot(7,1,4);
plot(t,imfs(4,:)); xlabel('time (s)'); ylabel('mV'); title('3rd IMF');
subplot(7,1,5);
plot(t,imfs(5,:)); xlabel('time (s)'); ylabel('mV'); title('4th IMF');
subplot(7,1,6);
plot(t,imfs(6,:)); xlabel('time (s)'); ylabel('mV'); title('5th IMF');
subplot(7,1,7);
plot(t,imfs(7,:)); xlabel('time (s)'); ylabel('mV'); title('6th IMF');
figure (3)
subplot(7,1,1);
plot(t,imfs(8,:)); xlabel('time (s)'); ylabel('mV'); title('7th IMF');
subplot(7,1,2);
plot(t,imfs(9,:)); xlabel('time (s)'); ylabel('mV'); title('8th IMF');
subplot(7,1,3);
plot(t,imfs(10,:)); xlabel('time (s)'); ylabel('mV'); title('9th IMF');
subplot(7,1,4);
plot(t,imfs(11,:)); xlabel('time (s)'); ylabel('mV'); title('10th IMF');
subplot(7,1,5);
plot(t,imfs(12,:)); xlabel('time (s)'); ylabel('mV'); title('11th IMF');
subplot(7,1,6);
plot(t,imfs(13,:)); xlabel('time (s)'); ylabel('mV'); title('12th IMF');
subplot(7,1,7);
plot(t,imfs(14,:)); xlabel('time (s)'); ylabel('mV'); title('13th IMF');
figure (4)
plot(t,reconstruction); xlabel('time (s)'); ylabel('mV'); title('IMFs reconstruction');
figure(5)
plot(t,filtered_ECG); xlabel('time (s)'); ylabel('mV'); title('Filtered ECG (IMF+bandPass)');
figure(6)
plot(t(1:9999),decg); xlabel('time (s)'); ylabel('d(ECG)/dt'); title('ECG derivative');
figure(7)
plot(t(1:9999),hecg); xlabel('time (s)'); ylabel('H(d(ECG)/dt)'); title('Hilbert Transform of derivate');
figure(8)
plot(t(1:9999),envelope); xlabel('time (s)'); ylabel('B(d(ECG)/dt)'); title('Envelope');
figure (9)
plot(t(1:9999),envelope,locs,pks,'or');
%完整代碼:mbd.pub/o/bread/mbd-ZJablZ5x
legend('ECG','R peaks','Location','NorthWest');

圖片

圖片

圖片

圖片

圖片

圖片

圖片

工學博士,擔任《Mechanical System and Signal Processing》《中國電機工程學報》《控制與決策》等期刊審稿專家,擅長領域:現代信號處理,機器學習,深度學習,數字孿生,時間序列分析,設備缺陷檢測、設備異常檢測、設備智能故障診斷與健康管理PHM等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16563.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16563.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16563.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu如何安裝gitlab runner

一、什么是GitLab Runner GitLab Runner 是 GitLab 提供的一個開源工具,用于在構建、測試和部署過程中執行作業。它是 GitLab 持續集成和持續部署(CI/CD)工作流的核心組件之一。 GitLab Runner 有以下主要功能: 作業執行:GitLab Runner 會接收來自 GitLab 的作業請求,并在指定…

ROS基礎學習-ROS通信機制研究

研究ROS通信機制 研究ROS通信機制 0.前言1.話題通信1.1 理論模型1.2 話題通訊的基本操作1.2.1 C++1.2.2 Python0.前言 機器人是一種高度復雜的系統性實現,在機器人上可能集成各種傳感器(雷達、攝像頭、GPS…)以及運動控制實現,為了解耦合,在ROS中每一個功能點都是一個單獨的…

從File類開始,學習Java文件操作

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云;歡迎大家常來逛逛 今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一…

windows安裝SQL Server

1、下載 下載網頁:SQL Server 下載 | Microsoft 2022版下載地址:https://go.microsoft.com/fwlink/p/?linkid2215158&clcid0x404&culturezh-tw&countrytw 下載結果:SQL2022-SSEI-Dev.exe 打開選第三個,下載介質&…

自定義Linux命令,顯示docker鏡像、容器信息

1、修改環境變量(僅對當前用戶有效) vim ~/.bashrc2、給命令取別名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}" alias disdocker images#保存并退出 :wq3、讓配置重新生效 source ~/.bashrc4、測試&…

ChatGPT技術演進簡介

chatGPT(chat generative pre-train transformer, 可以對話的預訓練trasformer模型),討論點: 1、chatGPT為什么突然火了 2、GPT 1.0、2.0、3.0、3.5 、4和4o區別和特性,在不同應用場景中如何選對模型 3、未…

基于ESP8266的無線通信系統設計

本文介紹了一種基于ESP8266的無線通信系統設計方案。ESP8266是一款功能強大且成本低廉的WiFi模塊,非常適合用于構建無線通信系統。本設計主要圍繞ESP8266模塊的功能特點,闡述了系統的硬件組成、軟件設計以及實際應用示例。 關鍵詞:ESP8266&a…

【docker】倉庫harbor的部署

harbor介紹 Harbor 是一個用于存儲和管理 Docker 鏡像的開源倉庫。它提供了一系列的功能,比如用戶管理、訪問控制、鏡像管理、日志審計和安全掃描等。Harbor 可以作為私有倉庫來使用,也可以與公有倉庫(如 Docker Hub)集成使用。 …

python數據分析——apply 1

參考資料:活用pandas庫 apply是指把函數同時作用于DataFrame的每一行或每一列。類似于編寫一些跨每行或每列的for循環,并同時調用apply函數。 1、函數 函數是對python代碼進行分組和復用的一種方法。如果某段代碼會被多次使用,并且使用時是需…

JS Lab

如何用 JavaScript 在瀏覽器中彈窗如何在 JavaScript 中制作鼠標滑過按鈕改變背景顏色如何在 JS 中點擊按鈕使數字增加如何在 JS 中循環打印多少次 HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title…

優化FPGA SelectIO接口VREF生成電路

引言&#xff1a;FPGA設計中使用了各種PCB SelectIO?接口VREF生成電路。有時即使在以前的設計中已經成功的在電路板上設計了VREF生成電路&#xff0c;也會在VREF引腳上發現大量噪聲&#xff08;200–400mV&#xff09;。大量VREF噪聲的存在可能導致高性能SelectIO接口&#xf…

瑞昱半導體AMB82 MINI(RTL8735B)Arduino 方法介紹

介紹瑞昱半導體&#xff08;Realtek &#xff09;AMB82-Mini 物聯網 AI開發板 Ameba是一個易于編程的平臺&#xff0c;用于開發各種物聯網應用程序。AMB82 MINI配備了各種外設接口&#xff0c;包括WiFi、BLE、GPIO INT、I2C、UART、SPI、PWM、ADC。通過這些接口&#xff0c;AM…

找出只出現一次的數字

輸入一些數字&#xff0c;每個數字以逗號分隔&#xff0c;其中有一個數字出現1次&#xff0c;其余數字均會出現2次。請找出那個只出現一次的數字! 提示&#xff1a;使用字典的方式實現 # 輸入一些數字&#xff0c;每個數字以逗號分隔 input_nums input("請輸入一些數字…

從0開始學統計-秩和檢驗

1.什么是秩和檢驗&#xff1f; 秩和檢驗&#xff0c;也稱為Wilcoxon 秩和檢驗&#xff0c;是一種非參數統計檢驗方法&#xff0c;用于比較兩個獨立樣本的中位數是否有顯著差異。它不要求數據滿足正態分布假設&#xff0c;因此適用于小樣本或者數據不滿足正態分布假設的情況。 …

51單片機-實機演示(單個數碼管)

仿真單個數碼管鏈接&#xff1a;http://t.csdnimg.cn/BLMut 一。插線 注意P00連接到A 測試代碼為 #include <reg52.h> //此文件中定義了單片機的一些特殊功能寄存器// sbit KEY2 P3^2; // 獨立按鍵2void main() {P0 0x00;while (1) {}…

Spring AOP實現Mapper層查詢返回重新賦值

需求&#xff1a; 針對查詢返回的數據&#xff0c;在數據庫層處理可能會影響到性能&#xff0c;在考慮性能及維護方便的情況下&#xff0c;采用AOP實現 1&#xff0c;自定義注解 import java.lang.annotation.*;/*** 針對 mapper層返回值 按照一定規則進行特殊處理后返回*/ Ta…

Vue學習JSON.parse()與JSON.stringify()對象與字符串互轉

Vue學習JSON.parse(&#xff09;與JSON.stringify(&#xff09;對象與字符串互轉 一、前言1、代碼 一、前言 JSON.parse() 和 JSON.stringify() 是 JavaScript 中用于處理 JSON 數據的兩個方法。 JSON.parse() 方法將一個 JSON 字符串解析為對應的 JavaScript 對象或數組。例…

kaggle競賽實戰3

接前文&#xff0c;本文主要做以下幾件事&#xff1a; 1、把前面處理完的幾個表拼成一個大表 2、做特征衍生&#xff08;把離散特征和連續特征兩兩組合得出&#xff09; # In[89]: #開始拼接表 transaction pd.concat([new_transaction, history_transaction], axis0, ignor…

JAVA實現圖書管理系統(初階)

一.抽象出對象: 1.要有書架&#xff0c;圖書&#xff0c;用戶&#xff08;包括普通用戶&#xff0c;管理員用戶&#xff09;。根據這些我們可以建立幾個包&#xff0c;來把繁雜的代碼分開&#xff0c;再通過一個類來把這些&#xff0c;對象整合起來實現系統。說到整合&#xf…

[數組查找]2.圖解二分查找及其代碼實現

二分查找 二分查找也是一種在數組中查找數據的算法。和線性查找不同&#xff0c;它只能查找已經排好序的數據。二分查找通過比較數組中間的數據與目標數據的大小&#xff0c;可以得知目標數據是在數組的左邊還是右邊。因此&#xff0c;比較一次就可以把查找范圍縮小一半。重復執…