当前位置: 首页 > news >正文

基于单片机的常规肺活量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&#xff08;Slow Vital Capacity&#xff09;是指尽力吸气后缓慢而又完全呼出的最大气量。 成年男性的肺活量通常在 3500-4000ml 之间&#xff0c;成年女性的肺活量通常在 2500-3000ml 之间。 单片机一般通过外接流量传感器&#xff0c;使用ADC高速采集的方式…...

【PostgreSQL】PG在windows下的安装

一、准备 通过官网下载安装文件&#xff0c;官方下载路径如下&#xff1a; https://www.postgresql.org/download/windows/ 二、安装 双击postgresql-17.3-1-windows-x64.exe文件&#xff0c;启动安装&#xff0c;进入安装步骤&#xff0c;点击Next 选择PG安装路径&#xff…...

电动汽车电池监测平台系统设计(论文+源码+图纸)

1总体设计 本次基于单片机的电池监测平台系统设计&#xff0c;其整个系统架构如图2.1所示&#xff0c;其采用STC89C52单片机作为控制器&#xff0c;结合ACS712电流传感器、TLC1543模数转换器、LCD液晶、DS18B20温度传感器构成整个系统&#xff0c;在功能上可以实现电压、电流、…...

基于和声搜索(Harmony Search, HS)的多中心点选址优化算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于和声搜索(Harmony Search, HS)的多中心点选址优化算法matlab仿真。可以设置多个不同的中心点。 2.测试软件版本以及运行结果展示 matlab2022a/matlab2024b版…...

单链表的概念,结构和优缺点

1. 概念 链表是一种物理存储结构上非连续&#xff0c;非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 2. 单链表的结构 单链表是由一系列节点组成的线性结构&#xff0c;每个结点包含两个域。&#xff1a;数据域和指针域。 数据域用来…...

SpringBoot+数据可视化的奶茶点单购物平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 本奶茶点单购物平台搭建在 Spring Boot 框架之上&#xff0c;充分利用其强大的依赖管理机…...

深入理解 Vue3 中 ref 与 reactive 的区别及应用

深入理解 Vue3 中 ref 与 reactive 的区别及应用 在 Vue3 的开发世界里&#xff0c;响应式编程是其核心特性之一&#xff0c;而ref与reactive作为实现响应式的关键 API&#xff0c;理解它们的区别和适用场景对于开发者来说至关重要。本文将带你深入剖析这两个 API&#xff0c;…...

TDengine 客户端连接工具 taos-Cli

简介工具获取运行命令行参数 基础参数高级参数 数据导出/导入 数据导出数据导入 执行 SQL 脚本使用小技巧 TAB 键自动补全设置字符列显示宽度其它 错误代码表 简介 TDengine 命令行工具&#xff08;以下简称 TDengine CLI&#xff09;是用户操作 TDengine 实例并与之交互最简…...

Linux(ubuntu)下载ollama速度慢解决办法

国内安装Ollama都很慢&#xff0c;因为一直卡在下载中&#xff0c;直接通过官网的链接地址下载方法&#xff1a; curl -fsSL https://ollama.com/install.sh | sh速度大概是10min下载1%&#xff0c;完全不能接受啊&#xff01; 其中很好的一个加速方式是通过使用github文件加速…...

Mac安装JD-GUI

Mac安装反编译工具步骤如下&#xff1a; 打开官网https://java-decompiler.github.io/ 选择下载mac的安装包解压下载好的压缩包&#xff0c;点击JD-GUI安装 有可能会遇到如下错误。请先检查是否安装JDK&#xff0c;通过java -version命令查看是否是1.8版本的jdk如果jdk没问题&…...

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件&#xff0c;请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…...

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南 一、前言 为了确保在 Docker 环境中顺利安装并高效运行 Ollama 以及 DeepSeek 离线模型&#xff0c;本文将详细介绍整个过程&#xff0c;涵盖从基础安装到优化配置等各个方面。通过对关键参数和配置的深入理解…...

Python 自然语言处理(NLP)和文本挖掘的常规操作过程

Python 自然语言处理&#xff08;NLP&#xff09;和文本挖掘 自然语言处理&#xff08;NLP&#xff09;和文本挖掘是数据科学中的重要领域&#xff0c;涉及对文本数据的分析和处理。Python 提供了丰富的库和工具&#xff0c;用于执行各种 NLP 和文本挖掘任务。以下是一些常见的…...

传统数组 vs vector和list

传统的数组&#xff1a; int arr[10]&#xff1b; 传统的数组有以下的缺点&#xff1a; 1&#xff09;长度不可修改 2)内存分配 局部数组:把数组定在函数内&#xff0c; 数组便是局部变量&#xff0c;故会被分配在栈上 但栈的大小是有限制的 &#xff0c;故其在内存中不能超…...

CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程

一.介绍 crmeb多商户是一套B2B2C商家入驻模式的平台多商户商城系统&#xff0c;系统支持平台自营、联营、招商等多种运营模式&#xff0c;可满足企业新零售、批发、分销、预售、O2O、多店、商铺入驻等各种业务需求。 后端全开源、uniapp多端可编译&#xff01; 二、搭建教程…...

【ESP32】ESP-IDF开发 | WiFi开发 | HTTPS服务器 + 搭建例程

1. 简介 1.1 HTTPS HTTPS&#xff08;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;全称安全套接字层超文本传输协议&#xff0c;一般理解为HTTPSSL/TLS&#xff0c;通过SSL证书来验证服务器的身份&#xff0c;并为浏览器和服务器之间的通信…...

Vue2 中使用 UniApp 时,生命周期钩子函数总结

在 Vue2 中使用 UniApp 时&#xff0c;生命周期钩子函数是一个重要的概念。它允许开发者在特定的时间点运行代码&#xff0c;管理组件的生命周期。以下是 Vue2 中 UniApp 常用的生命周期钩子函数总结&#xff1a; 1. beforeCreate 说明: 组件实例刚被创建&#xff0c;此时数据…...

如何在 Vue 3 中使用 Vue Router 和 Vuex

在 Vue 3 中使用 Vue Router 1. 安装 Vue Router 在项目根目录下&#xff0c;通过 npm 或 yarn 安装 Vue Router 4&#xff08;适用于 Vue 3&#xff09;&#xff1a; npm install vue-router4 # 或者使用 yarn yarn add vue-router42. 创建路由配置文件 在 src 目录下创建…...

Fiori APP配置中的Semantic object 小bug

在配置自开发程序的Fiori Tile时&#xff0c;需要填入Semantic Object。正常来说&#xff0c;是需要通过事务代码/N/UI2/SEMOBJ来提前新建的。 但是在S4 2022中&#xff0c;似乎存在一个bug&#xff0c;即无需新建也能输入自定义的Semantic Object。 如下&#xff0c;当我们任…...

【触想智能】工业显示器和普通显示器的区别以及工业显示器的主要应用领域分析

在现代工业中&#xff0c;工业显示器被广泛应用于各种场景&#xff0c;从监控系统到生产控制&#xff0c;它们在实时数据显示、操作界面和信息传递方面发挥着重要作用。与普通显示器相比&#xff0c;工业显示器在耐用性、可靠性和适应特殊环境的能力上有着显著的差异。 触想工业…...

OpenCode Telegram Bot:打造本地化AI编码伴侣,实现远程异步开发

1. 项目概述&#xff1a;一个本地化的AI编码伴侣 如果你和我一样&#xff0c;经常在命令行里用 opencode 这个AI编码工具&#xff0c;那你肯定遇到过这样的场景&#xff1a;正坐在沙发上用手机刷着消息&#xff0c;突然灵光一现&#xff0c;想到一个代码优化点或者一个需要调…...

用STM32CubeMX+WS2812B做个智能床头灯:从硬件接线到手机App调光调色

用STM32CubeMXWS2812B打造智能床头灯&#xff1a;从硬件到App的全栈开发指南 深夜伏案工作时&#xff0c;一盏能随心情变换色调的智能灯或许能缓解疲劳。本文将带你用STM32F103C8T6开发板、WS2812B灯带和蓝牙模块&#xff0c;从零构建支持手机App控制的RGB床头灯。不同于简单的…...

π0.7深度解析:为什么它不是“更大的机器人模型”,而是机器人基础模型的一次方法论转向

前言 2026 年 4 月 17 日&#xff0c;Physical Intelligence 发布了 π0.7。如果只看新闻稿、演示视频和社交平台上的几段转述&#xff0c;读者大概会得到一个直观印象&#xff1a;这又是一个更强的机器人模型&#xff0c;能做更多任务、能听更复杂的指令、还能迁移到没见过的…...

手把手教你用Livox Mid-360跑通LIO-SAM:从CustomMsg数据转换到完整配置流程

手把手教你用Livox Mid-360跑通LIO-SAM&#xff1a;从CustomMsg数据转换到完整配置流程 当固态激光雷达遇上传统SLAM框架&#xff0c;数据兼容性问题往往成为开发者的第一道门槛。Livox Mid-360作为一款非重复扫描式雷达&#xff0c;其点云分布特性与机械旋转雷达存在本质差异…...

用原神角色配色拯救你的SCI论文插图:手把手教你安装使用MGenshin配色包

用《原神》角色美学重构科研图表&#xff1a;MGenshin配色包的学术应用指南 科研图表的美学困境往往被学术界低估——那些本应传递重要发现的折线图、柱状图&#xff0c;却因单调的"红蓝绿"配色沦为视觉噪音。当我在Nature期刊上看到一组采用游戏《塞尔达传说》配色方…...

在Windows 11上用WSL2搞定自动驾驶仿真:Ubuntu 22.04 + Autoware.universe + CARLA 0.9.15 保姆级避坑指南

在Windows 11上用WSL2搞定自动驾驶仿真&#xff1a;Ubuntu 22.04 Autoware.universe CARLA 0.9.15 保姆级避坑指南 对于Windows平台的开发者来说&#xff0c;想要在本地搭建一套完整的自动驾驶仿真环境一直是个令人头疼的问题。双系统切换麻烦&#xff0c;虚拟机性能堪忧&…...

OpenClaw插件实战:基于Pub/Sub与Events API实现Google Chat AI智能体集成

1. 项目概述 最近在折腾一个挺有意思的东西&#xff0c;叫 teyou/openclaw-googlechatpubsub-plugin 。简单来说&#xff0c;这是一个为 OpenClaw 这个 AI 智能体平台开发的插件&#xff0c;它的核心功能是让 AI 智能体能够无缝接入 Google Chat&#xff08;谷歌聊天&#x…...

UE5 MediaPlayer播放视频黑屏?别慌,试试打开这个隐藏插件(Electra Player)

UE5 MediaPlayer播放视频黑屏&#xff1f;别慌&#xff0c;试试打开这个隐藏插件&#xff08;Electra Player&#xff09; 第一次在UE5中集成视频播放功能时&#xff0c;看到MediaPlayer顺利加载了视频流却只闻其声不见其影&#xff0c;这种体验确实让人抓狂。作为经历过这个过…...

Buck电路电感值、电容值计算

0. 结论当然&#xff0c;实际使用的电容计算值要考虑负载的波动&#xff0c;一般来说其电容值要远远大于此计算值1. Buck电路的伏秒平衡通常BUCK芯片的基本拓扑如下&#xff1a;内部集成了开关管以及其驱动器&#xff0c;外围电路包括输入、电感、二极管以及输出电容。图1 与 图…...

大模型求职必看:收藏这份三层准备路径,从小白到大厂Offer轻松拿捏!

文章指出许多大模型求职者陷入刷题和背概念的误区&#xff0c;忽视了真正能打动面试官的项目经历和思考深度。作者提出了大模型求职的三层准备路径&#xff1a;基础能力&#xff08;能跑通玩具项目&#xff09;、核心竞争力&#xff08;有能讲深的项目&#xff09;、差异化优势…...