基于单片机的常规肺活量SVC简单计算
常规肺活量 SVC(Slow Vital Capacity)是指尽力吸气后缓慢而又完全呼出的最大气量。
成年男性的肺活量通常在 3500-4000ml 之间,成年女性的肺活量通常在 2500-3000ml 之间。
单片机一般通过外接流量传感器,使用ADC高速采集的方式来获取当前流速数据。
肺活量吹气检查流程大致为 : 呼气 --> 吸气 --> 呼气 --> 深吸气到头 --> 深呼气到头 --> 深吸气 --> 深呼气 --> 深吸气 --> 深呼气。。。
#define nFLOW_SAMPLE (10)//ms
#define qAbs(x) (((x) > 0.0f) ? (x) : -(x))
#define qFuzzyIsNull(x) (qAbs(x) <= 0.00001f)
#define qMax(x,y) ((x) > (y) ? (x) : (y))
#define qMin(x,y) ((x) < (y) ? (x) : (y))#define STAGE_MAX_SIZE (1000)static float vecdStage_1[STAGE_MAX_SIZE] = {0};
static float vecdStage_2[STAGE_MAX_SIZE] = {0};
static float vecdStage_3[STAGE_MAX_SIZE] = {0};
static float vecdStage_4[STAGE_MAX_SIZE] = {0}; //SVC(slow VC)常规肺活量指标
typedef struct {int bIsIntact; // 源头数据完整性float dVT; // 潮气量 静息呼吸时每次吸入或呼出的气体容积float dIRV; // 补吸气量 平静吸气末用力吸气所能吸入的最大气容积float dERV; // 补呼气量 平静呼气末用力呼气所能呼出的最大气容积float dIC; // 深吸气量 平静呼气末用力吸气所能吸入的最大气容积 IC = VT + IRVfloat dVC; // 慢肺活量 尽力深吸气后作深慢呼气所能呼出的最大气容积 VC = IC + ERVfloat dDvVC; // 肺活量差值(3次中的最大差值)
}LungVolExamParam;/**
过零点位置如下:
呼气 --> (1)吸气 --> (2)呼气 --> (3)深吸气到头 --> (4)深呼气到头 --> (5)深吸气 --> (6)深呼气 --> (7) 深吸气 --> (8) 深呼气 (9)
*/
LungVolExamParam __calc_svc_test(float*dFlowData,int nSumCnt)
{LungVolExamParam tLungVolExamParam = {0}; tLungVolExamParam.bIsIntact = true;int vecdStage_1_count = 0;int vecdStage_2_count = 0; int vecdStage_3_count = 0;int vecdStage_4_count = 0; //流速零点 int nZeroPoint = 0; //开始引索int nStartIdx = 0; float dMaxVal, dMinVal;float dTmpCapatity = 0;float dTmpVC_1, dTmpVC_2, dTmpVC_3;int real_start_idx = 1;//分段for (int i = real_start_idx; i < nSumCnt; i++) {//两点间经过零点if (dFlowData[i - 1] * dFlowData[i] <= 0 && !qFuzzyIsNull(dFlowData[i]))nZeroPoint++;if(i == nSumCnt - 1) nZeroPoint++;//第一段数据采集if (3 == nZeroPoint && !vecdStage_1_count) { memcpy(vecdStage_1,dFlowData + nStartIdx,(i - nStartIdx) * sizeof(float));vecdStage_1_count = i - nStartIdx;nStartIdx = i;}//第二段数据采集else if (5 == nZeroPoint && !vecdStage_2_count) {memcpy(vecdStage_2,dFlowData + nStartIdx,(i - nStartIdx) * sizeof(float));vecdStage_2_count = i - nStartIdx;nStartIdx = i;}//第三段数据采集else if (7 == nZeroPoint && !vecdStage_3_count) {memcpy(vecdStage_3,dFlowData + nStartIdx,(i - nStartIdx) * sizeof(float));vecdStage_3_count = i - nStartIdx;nStartIdx = i;}//第四段数据采集else if (9 == nZeroPoint && !vecdStage_4_count) {memcpy(vecdStage_4,dFlowData + nStartIdx,(i - nStartIdx) * sizeof(float));vecdStage_4_count = i - nStartIdx;//算上最后一个数据nStartIdx = i + 1; }//达到8后的第一个零点if(8 == nZeroPoint &&dFlowData[i - 1] * dFlowData[i] <= 0 &&!qFuzzyIsNull(dFlowData[i - 1]))nZeroPoint++;}//验证分段数据完整性if(!(vecdStage_1_count > 0 && vecdStage_2_count > 0 && vecdStage_3_count > 0 && vecdStage_4_count > 0)) tLungVolExamParam.bIsIntact = false;//第一段数据计算dMaxVal = dMinVal = dTmpCapatity;for (int i = 0; i < vecdStage_1_count; i++) { //流速为L/min,累计流量为当前流速乘以时间dTmpCapatity += vecdStage_1[i] * (nFLOW_SAMPLE / 1000.0 / 60.0); if (dMaxVal < dTmpCapatity) dMaxVal = dTmpCapatity;if (dMinVal > dTmpCapatity) dMinVal = dTmpCapatity; }//潮气量tLungVolExamParam.dVT = dMaxVal - dMinVal; //第二段数据计算dMaxVal = dMinVal = dTmpCapatity;float dTmpVal = dTmpCapatity; // 记录阶段开始时的气容量for (int i = 0; i < vecdStage_2_count; i++) { //流速为L/min,累计流量为当前流速乘以时间dTmpCapatity += vecdStage_2[i] * (nFLOW_SAMPLE / 1000.0 / 60); if (dMaxVal < dTmpCapatity) dMaxVal = dTmpCapatity;if (dMinVal > dTmpCapatity) dMinVal = dTmpCapatity;}// 深吸气量tLungVolExamParam.dIC = dTmpVal - dMinVal; tLungVolExamParam.dIRV = tLungVolExamParam.dIC - dTmpVal; // 补吸气量tLungVolExamParam.dERV = dMaxVal - dTmpVal; // 补呼气量dTmpVC_1 = dMaxVal - dMinVal; // 第一轮的肺活量//第三段数据计算dMaxVal = dMinVal = dTmpCapatity;for (int i = 0; i < vecdStage_3_count; i++) { //流速为L/min,累计流量为当前流速乘以时间dTmpCapatity += vecdStage_3[i] * (nFLOW_SAMPLE / 1000.0 / 60); if (dMaxVal < dTmpCapatity) dMaxVal = dTmpCapatity;if (dMinVal > dTmpCapatity) dMinVal = dTmpCapatity;}dTmpVC_2 = dMaxVal - dMinVal; // 第二轮的肺活量//第四段数据计算dMaxVal = dMinVal = dTmpCapatity;for (int i = 0; i < vecdStage_4_count; i++) {//流速为L/min,累计流量为当前流速乘以时间dTmpCapatity += vecdStage_4[i] * (nFLOW_SAMPLE / 1000.0 / 60); if (dMaxVal < dTmpCapatity) dMaxVal = dTmpCapatity;if (dMinVal > dTmpCapatity) dMinVal = dTmpCapatity;}dTmpVC_3 = dMaxVal - dMinVal; // 第三轮的肺活量// 慢肺活量 - 取三次均值tLungVolExamParam.dVC = (dTmpVC_1 + dTmpVC_2 + dTmpVC_3) / 3;dMaxVal = qMax(dTmpVC_1, dTmpVC_2);dMaxVal = qMax(dMaxVal, dTmpVC_3);dMinVal = qMin(dTmpVC_1, dTmpVC_2);dMinVal = qMin(dMinVal, dTmpVC_3);// 最大差值tLungVolExamParam.dDvVC = dMaxVal - dMinVal; return tLungVolExamParam;
}
相关文章:
基于单片机的常规肺活量SVC简单计算
常规肺活量 SVC(Slow Vital Capacity)是指尽力吸气后缓慢而又完全呼出的最大气量。 成年男性的肺活量通常在 3500-4000ml 之间,成年女性的肺活量通常在 2500-3000ml 之间。 单片机一般通过外接流量传感器,使用ADC高速采集的方式…...
【PostgreSQL】PG在windows下的安装
一、准备 通过官网下载安装文件,官方下载路径如下: https://www.postgresql.org/download/windows/ 二、安装 双击postgresql-17.3-1-windows-x64.exe文件,启动安装,进入安装步骤,点击Next 选择PG安装路径ÿ…...
电动汽车电池监测平台系统设计(论文+源码+图纸)
1总体设计 本次基于单片机的电池监测平台系统设计,其整个系统架构如图2.1所示,其采用STC89C52单片机作为控制器,结合ACS712电流传感器、TLC1543模数转换器、LCD液晶、DS18B20温度传感器构成整个系统,在功能上可以实现电压、电流、…...
基于和声搜索(Harmony Search, HS)的多中心点选址优化算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于和声搜索(Harmony Search, HS)的多中心点选址优化算法matlab仿真。可以设置多个不同的中心点。 2.测试软件版本以及运行结果展示 matlab2022a/matlab2024b版…...
单链表的概念,结构和优缺点
1. 概念 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 2. 单链表的结构 单链表是由一系列节点组成的线性结构,每个结点包含两个域。:数据域和指针域。 数据域用来…...
SpringBoot+数据可视化的奶茶点单购物平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 本奶茶点单购物平台搭建在 Spring Boot 框架之上,充分利用其强大的依赖管理机…...
深入理解 Vue3 中 ref 与 reactive 的区别及应用
深入理解 Vue3 中 ref 与 reactive 的区别及应用 在 Vue3 的开发世界里,响应式编程是其核心特性之一,而ref与reactive作为实现响应式的关键 API,理解它们的区别和适用场景对于开发者来说至关重要。本文将带你深入剖析这两个 API,…...
TDengine 客户端连接工具 taos-Cli
简介工具获取运行命令行参数 基础参数高级参数 数据导出/导入 数据导出数据导入 执行 SQL 脚本使用小技巧 TAB 键自动补全设置字符列显示宽度其它 错误代码表 简介 TDengine 命令行工具(以下简称 TDengine CLI)是用户操作 TDengine 实例并与之交互最简…...
Linux(ubuntu)下载ollama速度慢解决办法
国内安装Ollama都很慢,因为一直卡在下载中,直接通过官网的链接地址下载方法: curl -fsSL https://ollama.com/install.sh | sh速度大概是10min下载1%,完全不能接受啊! 其中很好的一个加速方式是通过使用github文件加速…...
Mac安装JD-GUI
Mac安装反编译工具步骤如下: 打开官网https://java-decompiler.github.io/ 选择下载mac的安装包解压下载好的压缩包,点击JD-GUI安装 有可能会遇到如下错误。请先检查是否安装JDK,通过java -version命令查看是否是1.8版本的jdk如果jdk没问题&…...
Jenkins 配置 Git Parameter 四
Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件,请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…...
【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南
【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南 一、前言 为了确保在 Docker 环境中顺利安装并高效运行 Ollama 以及 DeepSeek 离线模型,本文将详细介绍整个过程,涵盖从基础安装到优化配置等各个方面。通过对关键参数和配置的深入理解…...
Python 自然语言处理(NLP)和文本挖掘的常规操作过程
Python 自然语言处理(NLP)和文本挖掘 自然语言处理(NLP)和文本挖掘是数据科学中的重要领域,涉及对文本数据的分析和处理。Python 提供了丰富的库和工具,用于执行各种 NLP 和文本挖掘任务。以下是一些常见的…...
传统数组 vs vector和list
传统的数组: int arr[10]; 传统的数组有以下的缺点: 1)长度不可修改 2)内存分配 局部数组:把数组定在函数内, 数组便是局部变量,故会被分配在栈上 但栈的大小是有限制的 ,故其在内存中不能超…...
CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程
一.介绍 crmeb多商户是一套B2B2C商家入驻模式的平台多商户商城系统,系统支持平台自营、联营、招商等多种运营模式,可满足企业新零售、批发、分销、预售、O2O、多店、商铺入驻等各种业务需求。 后端全开源、uniapp多端可编译! 二、搭建教程…...
【ESP32】ESP-IDF开发 | WiFi开发 | HTTPS服务器 + 搭建例程
1. 简介 1.1 HTTPS HTTPS(HyperText Transfer Protocol over Secure Socket Layer),全称安全套接字层超文本传输协议,一般理解为HTTPSSL/TLS,通过SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信…...
Vue2 中使用 UniApp 时,生命周期钩子函数总结
在 Vue2 中使用 UniApp 时,生命周期钩子函数是一个重要的概念。它允许开发者在特定的时间点运行代码,管理组件的生命周期。以下是 Vue2 中 UniApp 常用的生命周期钩子函数总结: 1. beforeCreate 说明: 组件实例刚被创建,此时数据…...
如何在 Vue 3 中使用 Vue Router 和 Vuex
在 Vue 3 中使用 Vue Router 1. 安装 Vue Router 在项目根目录下,通过 npm 或 yarn 安装 Vue Router 4(适用于 Vue 3): npm install vue-router4 # 或者使用 yarn yarn add vue-router42. 创建路由配置文件 在 src 目录下创建…...
Fiori APP配置中的Semantic object 小bug
在配置自开发程序的Fiori Tile时,需要填入Semantic Object。正常来说,是需要通过事务代码/N/UI2/SEMOBJ来提前新建的。 但是在S4 2022中,似乎存在一个bug,即无需新建也能输入自定义的Semantic Object。 如下,当我们任…...
【触想智能】工业显示器和普通显示器的区别以及工业显示器的主要应用领域分析
在现代工业中,工业显示器被广泛应用于各种场景,从监控系统到生产控制,它们在实时数据显示、操作界面和信息传递方面发挥着重要作用。与普通显示器相比,工业显示器在耐用性、可靠性和适应特殊环境的能力上有着显著的差异。 触想工业…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
