找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1998|回复: 9
打印 上一主题 下一主题
收起左侧

关于matlab频域心率计算

[复制链接]
跳转到指定楼层
#
本帖最后由 permanent 于 2022-12-23 19:11 编辑

现在要在频域用matlab做一个心率计算,我.m文件里是我在arduino滤波完以后的数据,我给这个数组存的变量名是DataFIR,然后我基本思路是先给这个数据去掉直流分量,然后用fft()这个函数给他做了一个傅里叶变换,然后找到最大值处对应的频率,乘以60就是我要的每分钟的心跳次数,但是运行结果差的太多了,竟然是327! ! !求助大佬看看我的程序是哪里有问题么! ! !改了好久了呜呜呜!!附件是心电数据,图片是代码截图和运行结果

clear;
fs=500;
L=fs;
load('DataFIR.mat')
x=DataFIR;
n=1:1:length(x);
y0=x(n)-mean(x);%去掉直流分量
y1=abs(fft(y0));
m = y1(1:length(y1)/2);
N= length(x);
% for i=1:length(m)
%     if m(i)==max(m)%找峰值
%         f=i*(L/N);
%     end
% end
f=find(m==max(m))*L/N;
xinlv=round(f*60)
m = y1(1:length(y1));
x= (0:N-1)*(L/N);
figure;
plot(y0)
figure;
plot(x,m)
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');title('Filter output');
text(200,2000,"心率"+num2str(xinlv)+"次");

幅频特性.png (12 KB, 下载次数: 55)

振幅图

振幅图

代码截图.png (22.69 KB, 下载次数: 59)

代码截图

代码截图

DataFIR.zip

588 Bytes, 下载次数: 3

心电数据

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

9#
ID:1058749 发表于 2022-12-23 18:54 | 只看该作者
Y97 发表于 2022-12-23 17:29
你把快速傅立叶分解振幅图谱打出来看一下,就知道怎么去处理了

您好,这是我的振幅图,但是显然最高点对应的频率乘以60并不是正确的计算结果,可不可以麻烦您帮我看一下程序是哪里出现了问题么,谢谢您了。

幅频特性.png (12 KB, 下载次数: 60)

振幅图

振幅图
回复

使用道具 举报

8#
ID:1058749 发表于 2022-12-23 18:42 | 只看该作者
glinfei 发表于 2022-12-23 16:57
它是周期对称的,而且你只要0到3Hz区间,放大,应该有四个峰值。我觉得是你频率区间取的太宽造成的误差。

您好,我这个程序是先做心电数据的傅里叶变换,然后因为做完后是左右对称的,所以我把幅度谱取了一半的长度,然后通过max函数找到那个最大值,find找对应频率,并不是看图自己找的,所以振幅图的区间应该并不影响计算结果,因为max找到的应该就是那个精确的最大值,而振幅图就是我的一个参考,那能不能麻烦您帮我看一下这到底是哪里的问题,谢谢您了
回复

使用道具 举报

7#
ID:1058749 发表于 2022-12-23 18:39 | 只看该作者
glinfei 发表于 2022-12-23 16:57
它是周期对称的,而且你只要0到3Hz区间,放大,应该有四个峰值。我觉得是你频率区间取的太宽造成的误差。

您好,我这个程序是先做心电数据的傅里叶变换,然后因为做完后是左右对称的,所以我把幅度谱取了一半的长度,然后通过max函数找到一个最大值,通过find函数找对应频率,并不是看图自己找的,所以振幅图的区间应该并不影响计算结果,因为find找到的应该就是那个精确的最大值,而振幅图就是我的一个参考,那能不能麻烦您帮我看一下这到底是哪里的问题,谢谢您了
回复

使用道具 举报

6#
ID:1058494 发表于 2022-12-23 17:29 | 只看该作者
你把快速傅立叶分解振幅图谱打出来看一下,就知道怎么去处理了
回复

使用道具 举报

5#
ID:844772 发表于 2022-12-23 16:57 来自手机 | 只看该作者
permanent 发表于 2022-12-23 09:13
您好,这是快速傅里叶变换后的幅频特性曲线,我把最高的频率分量点找到乘以60是不是就是每分钟的心跳次数 ...

它是周期对称的,而且你只要0到3Hz区间,放大,应该有四个峰值。我觉得是你频率区间取的太宽造成的误差。
回复

使用道具 举报

地板
ID:1058749 发表于 2022-12-23 09:13 | 只看该作者
glinfei 发表于 2022-12-23 07:22
采样频率大于一倍就行了,采样个数只是影响精度而已,你先把快速傅立叶分解振幅图谱打出来看看,就知道怎 ...

您好,这是快速傅里叶变换后的幅频特性曲线,我把最高的频率分量点找到乘以60是不是就是每分钟的心跳次数,可是我这个找到算出来是327,应该是60才对,是我的程序哪里出现问题了么还是我的精度不够呀?

幅频特性曲线.png (12 KB, 下载次数: 61)

您好,这个是快速傅里叶变换后画的图

您好,这个是快速傅里叶变换后画的图
回复

使用道具 举报

板凳
ID:844772 发表于 2022-12-23 07:22 来自手机 | 只看该作者
permanent 发表于 2022-12-22 22:42
您好,这个采样频率是题目要求固定的不能变,请问这个采样个数和采样频率会影响我的心率计算结果么

采样频率大于一倍就行了,采样个数只是影响精度而已,你先把快速傅立叶分解振幅图谱打出来看看,就知道怎么处理了
回复

使用道具 举报

沙发
ID:1058749 发表于 2022-12-22 22:42 | 只看该作者
glinfei 发表于 2022-12-22 21:37
先看看采样个数和频率,再直接看看分解图,再处理。另外,直流分量应该是0频率的值处理来的,不用管它啊

您好,这个采样频率是题目要求固定的不能变,请问这个采样个数和采样频率会影响我的心率计算结果么
回复

使用道具 举报

楼主
ID:844772 发表于 2022-12-22 21:37 来自手机 | 只看该作者
先看看采样个数和频率,再直接看看分解图,再处理。另外,直流分量应该是0频率的值处理来的,不用管它啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表