Matlab信号提取、频谱分析、滤波、阈值设定、寻找极值点

转:http://blog.csdn.net/han____shuai/article/details/50700882

题目

Heart Beat Period Detection
背景交代
In clinic, it is frequently required to detect heart rate. Theheart rate is usually computed from RR-interval, which is obtainedfrom ECG.
However, while ECG measuring, noises are frequentlysuperposed.
任务
Process the noised signal to obtain ECG signal
Propose algorithm to acquire RR intervals
The Heart Rate is calculated from averaging 10RR-intervals
数据
The signal is given in the data file, ‘nNoiseECG.txt’, the samplingfrequency is 500Hz
要求
Finish the tasks individually and independently

Write a project report inEnglish. Give and explain the full processes with Matlabprograms

第一步,产生数据
由于原始数据过大不便粘贴,这里模拟出一组数据,在Matlab命令行输入:
t=[0:0.002:5.998]';      %时间轴
d =0:1/1.8:6;          % 尖峰信号
nNoiseECG=sin(2*pi*0.24*t)+2*pulstran(t,d,'tripuls',0.1,1)+0.1*randn(3000,1);% 叠加正弦漂移和尖峰信号以及随机白噪声
plot(t,nNoiseECG)
xlabel('t(s)')
ylabel('Voltage(v)')
title('Original Signal')

第二步,分析信号中的频率成分
命令行输入:

Y = fft(nNoiseECG,16384);
%进行16384个点的fft变换

Pyy = Y.* conj(Y) /16384;  
%功率谱转换

f = 500*(0:8192)/16384;
plot(f,Pyy(1:8193))
title('Frequency content of y')
xlabel('frequency (Hz)')
axis([0 10 0 1500]);
grid on;
得到功率谱图形,可知原始信号中的低频信号(可以理解为漂移)的频率构成,大约在4Hz以下

第三步,滤掉低频成分
调用fdatool设计高通滤波器(命令行输入fdatool),如图3所示,下限截止频率4Hz,上限20Hz(值越大,滤波后可用的尖峰越多)。

利用M语言进行滤波
在图3所示的fdatool中File->Export,导出到Workspace中。
在命令行输入:
a=filter(Num,1,nNoiseECG);%其中Num即为滤波器的极点参数,1为零点参数,a即滤波后的数据。

plot(t,a)% 滤波后画图
xlabel('t(s)')
ylabel('Voltage(v)')
title('Signal After Filtering'
)

第四步,阈值去噪
设定阈值为0.5,小于0.5的点设置为0
命令行输入:
for i=1:3000
if (a(i)<0.5)
a(i)=0;
end
end

b=find(diff(sign(diff(a)))<0)+1;%求解极值点序号
plot(t, a,t(b), a(b),'r*') %画出去噪声后的波形,由于滤波的关系,前一秒钟的信号异常,因此只画1s以后的数据
xlabel('t(s)')
ylabel('Voltage(v)')
axis([1 6 0 2]);
title('Final Signal')
grid on

第五步,调整阈值去噪
根据图6,可以看到在第5,6个波峰处出现了多个极值点,因此考虑调高阈值进行去噪。设定阈值为0.85,小于0.85的点设置为0
命令行输入:
for i=1:3000
if (a(i)<0.5)
a(i)=0;
end
end

b=find(diff(sign(diff(a)))<0)+1;%求解极值点序号
plot(t, a,t(b), a(b),'r*')%画出去噪声后的波形,由于滤波的关系,前一秒钟的信号异常,因此只画1s以后的数据
xlabel('t(s)')
ylabel('Voltage(v)')
axis([1 6 0 2]);
title('Final Signal')
grid on

第六步,确定RR时间间隔
取最后9个脉冲时间间隔取平均,得到RR时间间隔和频率
命令行输入:
(t(b(9))-t(b(1)))/10
10/(t(b(9))-t(b(1)))

MATLAB中,读取脉搏信号通常涉及到文件读取、信号处理以及数据分析。假设你已经有了一个包含生理信号数据的波形文件(如`.mat`、`.txt`或`.csv`等),可以按照以下步骤操作: 1. **打开文件**: 使用`load`函数如果数据存储在`.mat`文件中,或者`readmatrix`、`textscan`或`csvread`函数根据文件格式读取文本文件。 ```matlab % 读取.mat文件 data = load('pulse_signal.mat'); % 或者读取.txt或.csv文件 if strcmp(file ext, '.csv') data = csvread('pulse_signal.csv'); else fid = fopen('pulse_signal.txt', 'r'); C = textscan(fid, '%f', 'HeaderLines', 0); fclose(fid); data = C{1}; end ``` 2. **预处理信号**: - 分割信号:脉搏信号往往包含多个心率周期,需要将它们分开。可以使用MATLAB的`findpeaks`或自定义算法找到每个心动周期的位置(R-R间期)。 - 脉搏提取:选择每个周期内的峰值作为脉搏信号。 3. **滤波分析**: - 可能需要对信号进行滤波,去除噪声。可以使用`filter`函数或` butterworth`函数创建带通滤波器。 - 计算平均心率、心跳变异系数或其他相关指标。 4. **可视化**: 使用`plot`或`plotyy`展示原始信号和经过处理后的结果,以及心率变化图。 ```matlab % 示例代码片段 fs = 1000; % 假设采样频率 [peaks,locs] = findpeaks(data, 'MinPeakDistance', fs*0.75); % 寻找峰点位置 filtered_data = filter(butter(2, [0.5 4], 'bandpass'), 1, data); figure; subplot(2,1,1), plot(data), title('Original Signal'); subplot(2,1,2), plot(filtered_data), title('Filtered Signal'); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值