使用 matlab 心电数据捕获心率

心电数据采集到了,如何计算心率成了一个问题,不过这个问题很早就有人解决了,但是网上能查找到的资料少之又少,代码也很少公开。这里博主就提供一个使用matlab程序计算心率的方法,只是提供了一个简单的思路和程序,此方法和程序里面的参数可能只适合博主自己做的心电器,未必适合其他心电数据,具体情况具体分析,欢迎大家来讨论。


1、数据导入!

第一步就是数据导入了,博主这里有一个转换好的txt数据文件,直接用load指令就能导入了。

data=load('ecg.txt');
然后可以使用plot指令查看一下波形

plot(data)
有可能这个数据是反的,这时候则需要添加一个“-”号,放大数据如下图所示:


2、数据预处理

这一步很关键,观察心电波形,R波峰很明显,通常也是使用探测R波峰的方式捕获心率的,但是上图所测量到的T波也比较大,如果不处理的话很可能会因为基线漂移造成捕获失败,程序将R波和T波混淆。

从信号成分分析,R波的信号成分在20Hz以上,T波成分一般在10Hz以下,这样我们就可以使用滤波器,将T波的信号衰减,突出R波的信号。同时使用高通滤波,去除基线偏移。这样我们就需要设计一个带通滤波器了,带宽在20Hz-30Hz,20Hz是为了去除基线和衰减T波信号,30Hz是保证心电信号保留的状态下,去除一些抖动噪声,特别是50hz的工频干扰。由于博主的数据采样率是500Hz,所以设计滤波器的时候需要按照500hz采样率来设计。这里使用的是32阶FIR滤波器,使用hamming窗。

Fs = sampleRate;           % Sampling Frequency
N    = 32;          % Order
Fc1  = 20;           % First Cutoff Frequency
Fc2  = 30;          % Second Cutoff Frequency
flag = 'scale';     % Sampling Flag
win = hamming(N+1); % Create the window vector for the design algorithm.
b  = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag); % Calculate the coefficients using the FIR1 function.
filteredA = filtfilt(b,1,data);

滤波效果如下,是不是基线很平稳,R波很突出,T波基本衰减很小,这样捕获R波就很方便了。



3、设置捕获条件!

接下来就是捕获R波,博主使用的是matlab自带的 findpeaks 函数,该函数是寻找极大值,同时可以限定条件,比如峰值阈值,极大值间隔等等。这样就很方便了,在一段时间内(窗口为1分钟),各个R峰值的阈值一般在信号的70%(这个值可以自己调试,看你心电数据了)以上,通过获取某段时间(窗口为1分钟)的最小值和最大值,来设置 'MinPeakHeight 捕获条件阈值。其次就是极大值间隔,一般正常人的心率不会超过120次每分钟,findpeaks 里面的 'MinPeakDistance' 可以设置最小间隔就是0.5s了。

获取某分钟的心电数据(500指的是采样率):

time_watch =26;
RSF=filteredA(time_watch*60*500:(time_watch+1)*60*500);

幅度阈值设置(这里设置的是70%以上才可以捕获极大值):

Threshold = (max(RSF) - min(RSF))*0.7 + min(RSF);

接着是间隔设置(这里设置的是0.5s的最小间隔):

[R_pks,R_locs]=findpeaks(RSF,500,'MinPeakDistance',0.5,'MinPeakHeight',Threshold);

接着就是显示是否捕获到R峰了:

plot(RSF);
title(['第',num2str(time_watch),' 分钟 EEG'])
hold on
plot(R_locs*500,R_pks,'x')

运行效果如图,效果还是不错的:









  • 33
    点赞
  • 224
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
MATLAB是一个非常强大和流行的数据处理和分析工具。其可以用于处理心电数据并去除噪声。 要去除心电数据中的噪声,首先要了解心电数据的基本结构。心电数据通常包含三种类型的信号:心跳信号、肌肉电信号和环境噪声信号。心跳信号是我们最想保留的信号,而肌肉电信号和环境噪声信号则会干扰和影响信号质量。 以下是一些去除噪声的MATLAB代码: 1. 中值滤波 中值滤波是去除信号中的高频噪声的一种方法。它将信号中的每个数据点替换为一组数据中的中值。以下是中值滤波代码示例: % 读取心电数据 ecg_data = load('ecg.txt'); % 创建中值滤波对象并设置对象属性 medfilt1_object = medfilt1(ecg_data, 5); % 输出中值滤波处理后的心电数据 plot(medfilt1_object); 2. 快速傅里叶变换(FFT) 快速傅里叶变换(FFT)可以将信号转换为频域,以便更好地了解信号的特性。可以使用FFT来过滤信号中的高频噪声。下面的代码演示了如何使用FFT过滤高频噪声: % 读取心电数据 ecg_data = load('ecg.txt'); % 调用FFT函数并得到频域数据 fft_data = fft(ecg_data); % 根据实际需求对获取到的频域数据进行筛选去除噪声信号 % 例如,可阈值设为0.01,将幅度小于0.01的频率信号转换为0 fft_data(abs(fft_data) < 0.01) = 0; % 调用ifft函数将频域数据转换为时间域数据 filtered_data = ifft(fft_data); % 输出去噪后的心电数据 plot(filtered_data); 3. Wavelet去噪 Wavelet去噪是一种有效的去噪方法,因为它可以在时域和频域同时操作,并可以通过重新调整小波系数来去除噪声信号。下面的代码使用Wavelet去噪: % 读取心电数据 ecg_data = load('ecg.txt'); % 创建小波对象 w = modwt(ecg_data,'db4'); % 将每个尺度的小波系数乘以一定的权重,以便过滤掉幅度小于0.1的高频噪声信号 w_keep = w; for j = 1:4 w_keep(j,:) = w_keep(j,:) .* (abs(w(j,:)) > 0.1); end % 通过iMODWT函数重构去噪后的信号 denoised_ecg = imodwt(w_keep,'db4'); % 输出去噪后的心电数据 plot(denoised_ecg); 这是一些MATLAB去除心电数据中噪声的示例代码,具体的去噪方法取决于您的具体需求以及数据的特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值