软件利用matlab计算胎心率和宫缩(怕我自己又双叒叕忘了)
整体计算流程
先打开zeromq_server.exe,等待cmd窗口中出现“fecg server is ready”,代表连接成功可以进行下一步传输;
然后打开fhrtest.exe可以使用可视化界面对打开数据并进行分析,在数据处理过程中server的cmd窗口会出现相应显示。
zeromq_server.exe的使用
原型是宾老师给的,我只是在他的基础上进行了修改
最新版的位置在家里电脑的D:\homeworking\Myshit\sortmyRMSUA\UaTool6.25\ys_fecg\for_testing\bin\Release
和学校电脑的G:\lqbzdwx\homeworking\Myshit\sortmyRMSUA\UaTool6.25\ys_fecg\for_testing\bin\Release
主要功能就是作为一个使软件可以使用matlab的…服务器?
其中起到传输作用的代码
主要更改是zeromq_server.c文件(加了宫缩的部分),zeromq_client.c未作修改
#include <zmq.h>
#include <stdio.h>
// #include <unistd.h>
#include <string.h>
#include <assert.h>
#include <stdio.h>
#include "ys_fecg.h"
mxArray *mxFs;
mxArray *mxEcg;
int fs0 = 250;
int nchan = 4;
int len = 15000;
int nsec = 60;
double data[60000];
typedef struct
{
int fHR_Array[60];
int mHR_Array[60];
double uac;
} fecg_result_t;
fecg_result_t fecg_result;
bool ys_fecg_init()
{
if (!mclInitializeApplication(NULL, 0))
{
printf("Could not initialize the application.\n");
return false;
}
if (!ys_fecgInitialize())
{
printf("Could not initialize the library.\n");
return false;
}
mxFs = mxCreateDoubleMatrix(1, 1, mxREAL);
mxGetPr(mxFs)[0] = fs0;
mxEcg = mxCreateDoubleMatrix(nchan, len, mxREAL);
return true;
}
void ys_fecg_release()
{
ys_fecgTerminate();
mclTerminateApplication();
}
/**
* @brief
*
* @param ecg
* @param hr
* @return int
*/
int fecg_proc(int *ecg)
{
for (int i = 0; i < nchan * len; i++)
{
mxGetPr(mxEcg)[i] = ecg[i];
}
mxArray *hr0;
mxArray *FQRSout;
mxArray *mhr;
mxArray *mQRS;
mxArray *UAcenter;
mlfYs_fecg(4, &hr0, &mhr, &FQRSout, &mQRS, mxEcg, mxFs);
mlfYs_ua(1, &UAcenter,mxEcg);
for (int i = 0; i < 60; i++)
{
fecg_result.fHR_Array[i] = mxGetPr(hr0)[i];
fecg_result.mHR_Array[i] = mxGetPr(mhr)[i];
}
double* uc = mxGetPr(UAcenter);
fecg_result.uac = *uc;
printf("%.4f \n",fecg_result.uac);
printf("%%%%%%%%%%%%%%%%%%%%\r\n");
if(fecg_result.uac == -1)
{
printf("%%%%%%%%%%%%%%%%%%%%\n %%%%% matlab计算出错了 %%%%%\n %%%%%%%%%%%%%%%%%%%%\n");
}
return 0;
}
int main(void)
{
// Socket to talk to clients
printf("Welcome the fecg servers \r\n");
if (!ys_fecg_init())
{
printf("ys_fecg_init error\r\n");
//return 0;
}
void *context = zmq_ctx_new();
void *responder = zmq_socket(context, ZMQ_REP);
int rc = zmq_bind(responder, "tcp://*:5555");
assert(rc == 0);
int buffer[60000];
printf("fecg server is ready \r\n");
while (1)
{
int len = zmq_recv(responder, buffer, 60000 * sizeof(int), 0);
printf("\n Received %d \n", len);
fecg_proc((int *)buffer);
// sleep(1); // Do some 'work'
int lenSend = zmq_send(responder, &fecg_result, sizeof(fecg_result_t), 0);
printf("send result %d %d %.4f \n", lenSend, sizeof(fecg_result_t), fecg_result.uac);
}
ys_fecg_release();
return 0;
}
生成该exe的方法
通过matlab导出dll
需要先通过matlab生成需要的dll,方法是在matlab的命令行输入“deploytool",在出现的弹窗中选择”Library Compiler“,然后在窗口中选择”C Shared Library“,在“+”中选择需要输出的函数功能,然后package打包输出,会得到一个matlab的prj文件,同目录下也会出现一个名为项目名的新文件夹,可以利用其中的for_testing子文件夹,它包含所需的.h,.dll,.lib文件。
(如果没有自动出现下方函数所需的required files,可以尝试把这些文件(或其所在的文件夹)添加入matlab的路径中,再打包
然后利用cmake编译
在for_testing文件夹中放入Cmakelist文件和server的.c文件,然后通过cmake(或者通过配好环境的vscode)去build。
用cmake的时候,在for_testing下新建一个build文件夹用于存放新生成的项目。
选择好文件地址后,依次点击【configure】、【generate】、【open project】(使用电脑里装载的vs(我用的是vs2019
(configure可以点两次,直到没有红色项出现
Cmakelist按照宾老师给的进行了修改,里面的路径对应的都是自己电脑上各文件的相应位置。(我用的是matlab2021b
Cmakelist.txt中放如下所示代码:
project(ysrun)
cmake_minimum_required(VERSION 3.11)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
include_directories( "F:/MATLAB/extern/include")
include_directories("C:/Program Files/MATLAB/MATLAB Runtime/v911/bin/win64")
include_directories("C:/Program Files/MATLAB/MATLAB Runtime/v911/runtime/win64")
include_directories("C:/Program Files/MATLAB/MATLAB Runtime/v911/extern/include")
include_directories(${CMAKE_SOURCE_DIR}/include)
LINK_DIRECTORIES(${CMAKE_SOURCE_DIR})
LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/lib)
LINK_DIRECTORIES("C:/Program Files/MATLAB/MATLAB Runtime/v911/extern/lib/win64/microsoft")
add_executable(ysrun ysrun.c)
TARGET_LINK_LIBRARIES(ysrun ys_fecg mclmcrrt)
add_executable(zeromq_server zeromq_server.c )
TARGET_LINK_LIBRARIES(zeromq_server libzmq-v141-mt-4_3_5 ys_fecg mclmcrrt )
add_executable(zeromq_client zeromq_client.c )
TARGET_LINK_LIBRARIES(zeromq_client libzmq-v141-mt-4_3_5 )
最后用vs生成exe
建议选release,然后生成解决方案
这些步骤也可以全部放在配好环境的vscode里执行
下好cmake和vs后,直接在vscode中打开for_testing这个文件夹,选择cmake和vs的设置。然后点击build就可以走到最后一步生成exe
(vs可能是选第二个 x64_x86的
(如果出现cmake error,让你“Re-run cmake with a different source directory”,可以删除执行cmake的文件夹中的CMakeCache.txt
fhrtest.exe的使用
这个是杨老师给的!
最新版的位置在家里电脑的D:\homeworking\Myshit\precious\ys_test3
是用来打开单个(.csv)数据并进行显示和处理的,点击【开始分析】后的结果会生成.csv文件存到同一文件夹下,后缀添加"_hrdata";点击【实时分析】后会每一秒输出
实时结果好差哦…(主要指宫缩(但是可以用
这个是点【开始分析】之后的结果(换了个人),胎心率和母亲心率很正常,但是宫缩不能通过这个得到。
还有一个UAView.exe
也是伟大的杨老师的软件!
最新的位置在家里电脑的D:\homeworking\Myshit\precious\UAVinew2\UAView
数据位置在硬盘里:H:\新的地狱\EHG DATA
可以查看本身就有的TOCO和利用EHG信号生成出的宫缩(UA)结果(文件格式需是.csv)