心电信号的小波分析方法

之前写了基于小波时间散射网络的ECG 信号分类方面的文章

基于小波时间散射网络的ECG 信号分类 - 哥廷根数学学派的文章 - 知乎 https://zhuanlan.zhihu.com/p/539001673

这篇文章主要使用小波变换来分析心电信号,心电信号通常是非平稳的,即频率随时间而变化,由于心电信号的特征通常在时间和频率上局部化,因此在使用诸如小波变换等稀疏表示时会更简单。首先加载并绘制一个心电图波形,其中QRS复合波的R峰已由多名心脏病专家标注,ECG数据和标注取自MIT-BIH心律失常数据库,采样频率为360 Hz。

load mit200
figure
plot(tm,ecgsig)
hold on
plot(tm(ann),ecgsig(ann),'ro')
xlabel('Seconds')
ylabel('Amplitude')
title('Subject - MIT-BIH 200')

小波变换将心电信号分解为不同频带的分量,从而实现信号的稀疏表示。由于'sym4' 小波类似于 QRS 复合波,因此选择'sym4' 小波作为分析小波。为了更清楚地说明这一点,提取一个QRS复合波,并用伸缩和平移后的 'sym4' 小波进行比较

使用最大重叠离散小波变换增强 ECG 波形中的 R峰值,最大重叠离散小波变换相对于离散小波变换是一个未抽取的小波变换,因此可处理任意样本大小,关于最大重叠离散小波变换,我后面会详细的讲解,包括一些改进方法。首先使用默认的'sym4'小波 ECG 波形分解为5层,然后,仅使用第4和第5层的小波系数重建ECG信号,其中

第4层小波系数频率范围为[11.25, 22.5) Hz

第5层小波系数频率范围为[5.625, 11.25) Hz

从小波系数中构建信号近似的平方绝对值,并采用峰值查找算法识别R峰值,因此可以使用matlab自带的findpeaks函数定位波峰

y = abs(y).^2;
[qrspeaks,locs] = findpeaks(y,tm,'MinPeakHeight',0.35,...
    'MinPeakDistance',0.150);
figure
plot(tm,y)
hold on
plot(locs,qrspeaks,'ro')
xlabel('Seconds')
title('R Peaks Localized by Wavelet Transform with Automatic Annotations')

添加专家标注

plot(tm(ann),y(ann),'k*')
title('R peaks Localized by Wavelet Transform with Expert Annotations')

用小波变换计算的心率为88.60 次/分钟,而标注波形为88.72次/分钟。如果使用原始数据幅值的平方,就会发现小波变换分离R峰的能力:

figure
plot(tm,ecgsig,'k--')
hold on
plot(tm,y,'r','linewidth',1.5)
plot(tm,abs(ecgsig).^2,'b')
plot(tm(ann),ecgsig(ann),'ro','markerfacecolor',[1 0 0])
set(gca,'xlim',[10.2 12])
legend('Raw Data','Wavelet Reconstruction','Raw Data Squared', ...
    'Location','SouthEast')
xlabel('Seconds')

下面看下带噪声的ECG信号

load mit203
figure
plot(tm,ecgsig)
hold on
plot(tm(ann),ecgsig(ann),'ro')
xlabel('Seconds')
ylabel('Amplitude')
title('Subject - MIT-BIH 203 with Expert Annotations')

同样使用5层最大重叠离散小波变换分离R峰,使用findpeaks函数来确定峰位的置

看一下第4层和第5层小波系数幅度的平方值以及专家标注的R峰值时间

可以看到 4 层和 5 层小波细节系数的峰值往往同时出现

看完了心电信号,再看一下脑动力学的时变小波相干分析,反正都是生理信号。关于小波相干分析的资料也比较多,大家可自行查阅

有两个受试者的近红外光谱 (NIRS) 数据,NIRS 通过利用含氧血红蛋白和脱氧血红蛋白的不同吸收特性来测量大脑活动,记录部位是两个受试者的上额叶皮层。 数据采样频率为10Hz。在实验中,受试者在一项任务上交替进行合作和竞争,任务周期是七秒。

load NIRSData
figure
plot(tm,[NIRSData(:,1) NIRSData(:,2)])
legend('Subject 1','Subject 2','Location','NorthWest')
xlabel('Seconds')
title('NIRS Data')
grid on

时域数据中,不清楚时间序列中存在哪些振荡,使用连续小波变换看一下

从CWT中可以看出2个数据集在1 Hz 左右的强调频振荡,这些是由于 2个 受试者的心动周期所致。此外,在 0.15 Hz左右,2个数据集都有较弱的振荡。小波相干性可以增强对两个时间序列中共同存在的微弱振荡的检测。

在小波相干性谱图中,在 0.15 Hz 附近有很强的相关性,这代表了2个受试者中与任务相关的大脑活动 的相干振荡。添加绘图时间标记,指示2个任务周期,任务之间的时间段是休息时间段

详细代码如下

🍞正在为您运送作品详情

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哥廷根数学学派

码字不易,且行且珍惜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值