暑假干的活(大脑不是用来记东西的)

整体计算流程

  先打开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)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值