38 changed files with 0 additions and 728 deletions
-
BINdoc/SSD1312_Datasheet (1).pdf
-
BINdoc/TXW64128-41-TSWG13P096G-A-VER1.0.pdf
-
BINdoc/ads1293.pdf
-
BINdoc/m24m02-dr.pdf
-
BINscreen_res/font/PC2LCD2021.exe
-
3screen_res/font/data/config/FontsCfg.table
-
17screen_res/font/data/config/array2ImgFrom.table
-
6screen_res/font/data/config/arrayCfg.table
-
13screen_res/font/data/config/arrayCfgFrom.table
-
4screen_res/font/data/config/bottomFrom.table
-
BINscreen_res/font/字库生成配置.png
-
BINscreen_res/font/字库生成配置2.png
-
BINscreen_res/logo/Image2Lcd/Img2Lcd.exe
-
BINscreen_res/logo/Image2Lcd/Img2Lcd_chs.chm
-
BINscreen_res/logo/Image2Lcd/Img2Lcd_cht.chm
-
BINscreen_res/logo/Image2Lcd/emenu.dll
-
BINscreen_res/logo/Image2Lcd/sss.dll
-
BINscreen_res/logo/Image2Lcd/unins000.dat
-
BINscreen_res/logo/Image2Lcd/unins000.exe
-
BINscreen_res/logo/img2lcd_cfg.png
-
BINscreen_res/logo/logo_mono.bmp
-
66screen_res/logo_mono.c
-
88test/MedianFilter.c
-
38test/MedianFilter.h
-
1test/README.md
-
BINtest/a.exe
-
28test/test.c
-
129test/test.py
-
4tools/build.bat
-
BINtools/nrfutil.exe
-
121tools/one_lead_realtime_report_parser.cpp
-
BINtools/one_lead_realtime_report_parser.exe
-
102tools/one_lead_upload_packet_parser.cpp
-
BINtools/one_lead_upload_packet_parser.exe
-
54tools/sample_bin_parse.cpp
-
BINtools/sample_bin_parse.exe
-
54tools/text2bin.cpp
-
BINtools/text2bin.exe
@ -1,3 +0,0 @@ |
|||
{ |
|||
cfg={cutRight=0;cutDown=0;cutLeft=0;userImgPixClrN=4282994728;userImgPixClrP=4288471279;userImgMaxNum=223.22222222222;isRotate180FlipX=false;imgW=24;userImgPixSize="5";imgH=24;userImgDir="./data/fontimg/";offsetH="0";cwRotate90=0;font="仿宋";fontStyple=1;cutUp=0;fontH=24;offsetV="0";isRotate180FlipY=false;fontW=24} |
|||
} |
@ -1,17 +0,0 @@ |
|||
{ |
|||
edtOffset="0"; |
|||
cmbbxMode=1; |
|||
rdScanModeVH=1; |
|||
rdComVcc=0; |
|||
edtImgW="24"; |
|||
edtImgH="24"; |
|||
edtArray=' {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1C, 0x00, 0x00, 0x00,\r\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x82, 0xFF, 0x21, 0x21, 0x11, 0xF9, 0x01, 0x60, 0x1C,\r\n 0x63, 0x82, 0x62, 0x1F, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x10, 0x0C, 0x03, 0x10, 0x10, 0x70,\r\n 0x4F, 0x40, 0x20, 0x10, 0x08, 0x06, 0x01, 0x06, 0x08, 0x70, 0x60, 0x40, 0x40, 0x00, 0x00}'; |
|||
rdScanModeV=0; |
|||
rdComGnd=1; |
|||
rdScanModeH=0; |
|||
afterLoad=null; |
|||
beforeSave=null; |
|||
rdByteLsb=1; |
|||
rdByteMsb=0; |
|||
rdScanModeHV=0 |
|||
} |
@ -1,6 +0,0 @@ |
|||
{ |
|||
isByteMsb=0; |
|||
scanMode="VH"; |
|||
txtLineCharMaxNum=20; |
|||
isCommonGnd=1 |
|||
} |
@ -1,13 +0,0 @@ |
|||
{ |
|||
rdScanModeHV=0; |
|||
afterLoad=null; |
|||
rdScanModeVH=1; |
|||
rdByteLsb=1; |
|||
rdComVcc=0; |
|||
beforeSave=null; |
|||
rdScanModeH=0; |
|||
edtTxtRowByteNum="20"; |
|||
rdByteMsb=0; |
|||
rdScanModeV=0; |
|||
rdComGnd=1 |
|||
} |
@ -1,4 +0,0 @@ |
|||
{ |
|||
afterLoad=null; |
|||
beforeSave=null |
|||
} |
Before Width: 1532 | Height: 697 | Size: 456 KiB |
Before Width: 1526 | Height: 751 | Size: 73 KiB |
Before Width: 716 | Height: 524 | Size: 23 KiB |
@ -1,66 +0,0 @@ |
|||
const unsigned char gImage_logo_mono[1024] = { /* 0X22,0X01,0X80,0X00,0X40,0X00, */ |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0XE0, |
|||
0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XE0,0XE0,0XC0,0XC0,0X80,0X00,0X00,0X00,0X70,0XF8, |
|||
0XF0,0XF0,0XE0,0XC0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X80,0XC0,0X00,0X00,0X00,0X00,0XC0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0XC0,0XC0,0X00,0X00,0X00,0X80,0X80,0X80,0X80,0X80,0X80,0X80, |
|||
0X80,0X00,0X00,0X80,0X80,0X80,0X80,0X80,0X80,0X80,0X00,0XC0,0XC0,0X00,0X00,0X00, |
|||
0XC0,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7E,0XFF,0XFF,0XFF, |
|||
0XC3,0X81,0X00,0X30,0X78,0XF9,0XF1,0XF3,0XE7,0XC7,0XCF,0X8F,0X9F,0X3E,0X3C,0X3C, |
|||
0X01,0X01,0X03,0XCF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XE0,0XFC, |
|||
0XFF,0XFF,0X07,0XB7,0XB7,0XB7,0XB7,0XB7,0XB7,0XB7,0XB7,0XB7,0XB7,0X97,0X00,0X00, |
|||
0XFC,0XFC,0XFC,0XFE,0XFF,0XFE,0X01,0X1F,0XFF,0XF0,0X00,0X00,0X3E,0XFE,0XF0,0X00, |
|||
0X00,0X0C,0X9C,0XFC,0XFF,0XFF,0XEC,0X8C,0XFF,0XFF,0XFF,0X31,0X31,0X31,0X73,0XFF, |
|||
0XFF,0X00,0X01,0X01,0XFF,0XFF,0X39,0XFF,0XFF,0X01,0X86,0X8F,0X8F,0XFF,0XFE,0X8E, |
|||
0X8F,0X8F,0X8E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X07, |
|||
0X0F,0X0F,0X1F,0X3E,0X3E,0X7C,0XF8,0XF9,0XF3,0XE3,0XE7,0XCF,0X8F,0X9F,0X1E,0X1E, |
|||
0X1E,0X1E,0X1F,0X0F,0X0F,0X03,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0XFF, |
|||
0XFF,0XFF,0X00,0XFD,0XFD,0XCD,0X8D,0X8D,0X8D,0X8D,0X8D,0XFD,0XFD,0XF8,0X00,0X30, |
|||
0X3F,0X1F,0X01,0X3F,0XFF,0XFF,0XC0,0XC0,0XC3,0XC3,0XE0,0XFC,0X7C,0X1F,0X3F,0X3E, |
|||
0X00,0X0E,0X0F,0X07,0XFF,0XFF,0X01,0X01,0X7F,0XFF,0XFF,0XC6,0XC6,0XC6,0XC6,0XFF, |
|||
0XFF,0X00,0X60,0X60,0X7F,0X7F,0X33,0XFF,0XFF,0X98,0XC1,0XE1,0XF9,0X3F,0X0F,0X1F, |
|||
0X7D,0XF1,0XC1,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X03,0X07,0X07,0X0F,0X0F,0X06, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01, |
|||
0X01,0X00,0X00,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X01,0X01,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X01,0X01,0X00,0X00,0X00,0X00,0X01,0X01,0X01,0X01,0X01,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X00,0X01,0X01,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, |
|||
}; |
@ -1,88 +0,0 @@ |
|||
/* |
|||
* MedianFilter.c |
|||
* |
|||
* Created on: May 19, 2018 |
|||
* Author: alexandru.bogdan |
|||
*/ |
|||
|
|||
#include "MedianFilter.h" |
|||
|
|||
int MEDIANFILTER_Init(sMedianFilter_t *medianFilter) |
|||
{ |
|||
if(medianFilter && medianFilter->medianBuffer && |
|||
(medianFilter->numNodes % 2) && (medianFilter->numNodes > 1)) |
|||
{ |
|||
//initialize buffer nodes |
|||
for(unsigned int i = 0; i < medianFilter->numNodes; i++) |
|||
{ |
|||
medianFilter->medianBuffer[i].value = 0; |
|||
medianFilter->medianBuffer[i].nextAge = &medianFilter->medianBuffer[(i + 1) % medianFilter->numNodes]; |
|||
medianFilter->medianBuffer[i].nextValue = &medianFilter->medianBuffer[(i + 1) % medianFilter->numNodes]; |
|||
medianFilter->medianBuffer[(i + 1) % medianFilter->numNodes].prevValue = &medianFilter->medianBuffer[i]; |
|||
} |
|||
//initialize heads |
|||
medianFilter->ageHead = medianFilter->medianBuffer; |
|||
medianFilter->valueHead = medianFilter->medianBuffer; |
|||
medianFilter->medianHead = &medianFilter->medianBuffer[medianFilter->numNodes / 2]; |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
return -1; |
|||
} |
|||
|
|||
int MEDIANFILTER_Insert(sMedianFilter_t *medianFilter, int sample) |
|||
{ |
|||
unsigned int i; |
|||
sMedianNode_t *newNode, *it; |
|||
|
|||
if(medianFilter->ageHead == medianFilter->valueHead) |
|||
{ //if oldest node is also the smallest node, increment value head |
|||
medianFilter->valueHead = medianFilter->valueHead->nextValue; |
|||
} |
|||
|
|||
if((medianFilter->ageHead == medianFilter->medianHead) || |
|||
(medianFilter->ageHead->value > medianFilter->medianHead->value)) |
|||
{ //prepare for median correction |
|||
medianFilter->medianHead = medianFilter->medianHead->prevValue; |
|||
} |
|||
|
|||
//replace age head with new sample |
|||
newNode = medianFilter->ageHead; |
|||
newNode->value = sample; |
|||
|
|||
//remove age head from list |
|||
medianFilter->ageHead->nextValue->prevValue = medianFilter->ageHead->prevValue; |
|||
medianFilter->ageHead->prevValue->nextValue = medianFilter->ageHead->nextValue; |
|||
//increment age head |
|||
medianFilter->ageHead = medianFilter->ageHead->nextAge; |
|||
|
|||
//find new node position |
|||
it = medianFilter->valueHead; //set iterator as value head |
|||
for(i = 0; i < medianFilter->numNodes - 1; i++) |
|||
{ |
|||
if(sample < it->value) |
|||
{ |
|||
if(i == 0) |
|||
{ //replace value head if new node is the smallest |
|||
medianFilter->valueHead = newNode; |
|||
} |
|||
break; |
|||
} |
|||
it = it->nextValue; |
|||
} |
|||
|
|||
//insert new node in list |
|||
it->prevValue->nextValue = newNode; |
|||
newNode->prevValue = it->prevValue; |
|||
it->prevValue = newNode; |
|||
newNode->nextValue = it; |
|||
|
|||
//adjust median node |
|||
if(i >= (medianFilter->numNodes / 2)) |
|||
{ |
|||
medianFilter->medianHead = medianFilter->medianHead->nextValue; |
|||
} |
|||
|
|||
return medianFilter->medianHead->value; |
|||
} |
@ -1,38 +0,0 @@ |
|||
/* |
|||
* MedianFilter.h |
|||
* |
|||
* Created on: May 19, 2018 |
|||
* Author: alexandru.bogdan |
|||
*/ |
|||
|
|||
#ifndef MEDIANFILTER_H_ |
|||
#define MEDIANFILTER_H_ |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
typedef struct sMedianNode |
|||
{ |
|||
int value; //sample value |
|||
struct sMedianNode *nextAge; //pointer to next oldest value |
|||
struct sMedianNode *nextValue; //pointer to next smallest value |
|||
struct sMedianNode *prevValue; //pointer to previous smallest value |
|||
}sMedianNode_t; |
|||
|
|||
typedef struct |
|||
{ |
|||
unsigned int numNodes; //median node buffer length |
|||
sMedianNode_t *medianBuffer; //median node buffer |
|||
sMedianNode_t *ageHead; //pointer to oldest value |
|||
sMedianNode_t *valueHead; //pointer to smallest value |
|||
sMedianNode_t *medianHead; //pointer to median value |
|||
}sMedianFilter_t; |
|||
|
|||
int MEDIANFILTER_Init(sMedianFilter_t *medianFilter); |
|||
int MEDIANFILTER_Insert(sMedianFilter_t *medianFilter, int sample); |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
#endif |
@ -1 +0,0 @@ |
|||
pip install wfdb |
@ -1,28 +0,0 @@ |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <time.h> |
|||
#include <windows.h> |
|||
|
|||
#include "MedianFilter.h" |
|||
#define NUM_ELEMENTS 201 |
|||
|
|||
static sMedianFilter_t medianFilter; |
|||
static sMedianNode_t medianBuffer[NUM_ELEMENTS]; |
|||
|
|||
int main() { |
|||
medianFilter.numNodes = NUM_ELEMENTS; |
|||
medianFilter.medianBuffer = medianBuffer; |
|||
|
|||
MEDIANFILTER_Init(&medianFilter); |
|||
int newValue = 1; |
|||
|
|||
while (1) { |
|||
newValue++; |
|||
int medianValue = MEDIANFILTER_Insert(&medianFilter, newValue); |
|||
printf("New value: %d \tMedian value: %d\r\n", newValue, medianValue); |
|||
|
|||
Sleep(1); |
|||
} |
|||
|
|||
return 0; |
|||
} |
@ -1,129 +0,0 @@ |
|||
import csv |
|||
from datetime import datetime |
|||
|
|||
import wfdb |
|||
import matplotlib.pyplot as plt |
|||
import numpy as np |
|||
from scipy.signal import medfilt |
|||
import pywt |
|||
|
|||
fliter = int(0.8*500) |
|||
Initial_intercept_point = 0 |
|||
Final_intercept_point = 2000 |
|||
Give_up_size = int(fliter/2) |
|||
|
|||
# Get dates, high, and low temperatures from file. |
|||
filename = 'sunyan.csv' |
|||
with open(filename) as f: |
|||
reader = csv.reader(f) |
|||
header_row = next(reader) |
|||
|
|||
leaddatas= [] |
|||
for row in reader: |
|||
try: |
|||
leaddata = int(row[0]) |
|||
except ValueError: |
|||
print(leaddata, 'missing data') |
|||
else: |
|||
leaddatas.append(leaddata) |
|||
#读取文件结束 |
|||
|
|||
#bandpass filter |
|||
from scipy import signal |
|||
fs = 500 # 采样率为500 Hz |
|||
|
|||
# 设计低通滤波器 |
|||
cutoff_freq = 40 # 截止频率 |
|||
order = 1 # 滤波器阶数 |
|||
nyquist = 0.5 * fs |
|||
cutoff = cutoff_freq / nyquist |
|||
b, a = signal.butter(order, cutoff, btype='low') |
|||
|
|||
# 应用低通滤波器 |
|||
lowpass_ecg_leaddatas = signal.filtfilt(b, a, leaddatas) |
|||
|
|||
# 设计高通滤波器 |
|||
cutoff_freq_high = 0.5 # 截止频率 |
|||
order_high = 1 # 滤波器阶数 |
|||
#nyquist = 0.5 * fs |
|||
cutoff_high = cutoff_freq_high / nyquist |
|||
b, a = signal.butter(order_high, cutoff_high, btype='high') |
|||
|
|||
# 应用高通滤波器 |
|||
filtered_ecg_signal_leaddatas = signal.filtfilt(b, a, lowpass_ecg_leaddatas) |
|||
|
|||
''' |
|||
# 使用小波变换,效果不好 |
|||
wavelet = 'sym5' # 选择小波类型,sym5是一种对称小波,常用于ECG信号 |
|||
levels = 4 # 分解级数 |
|||
coeffs = pywt.wavedec(filtered_ecg_signal_leaddatas, wavelet, level=levels) |
|||
|
|||
# 对小波系数进行阈值处理,这有助于去噪 |
|||
threshold = 0.2 * np.max(coeffs[-1]) |
|||
coeffs = [pywt.threshold(c, threshold, mode='soft') for c in coeffs] |
|||
reconstructed_signal = pywt.waverec(coeffs, wavelet) |
|||
''' |
|||
|
|||
''' |
|||
# 小波分解 |
|||
wavelet = 'db4' |
|||
coeffs = pywt.wavedec(filtered_ecg_signal_leaddatas, wavelet, level=4) |
|||
|
|||
# 对高频系数进行阈值处理(软阈值) |
|||
sigma = np.median(np.abs(coeffs[-1])) / 0.6745 # 估计噪声标准差 |
|||
threshold = sigma * np.sqrt(2 * np.log(len(filtered_ecg_signal_leaddatas))) |
|||
|
|||
# 对各层系数进行阈值处理 |
|||
denoised_coeffs = [pywt.threshold(c, threshold, mode='soft') for c in coeffs] |
|||
|
|||
# 重建信号 |
|||
denoised_signal = pywt.waverec(denoised_coeffs, wavelet) |
|||
|
|||
''' |
|||
|
|||
# Define the window size for moving average (adjust as needed) |
|||
window_size = 2 |
|||
|
|||
# Perform moving average filtering |
|||
moving_avg_ecg1 = np.convolve(lowpass_ecg_leaddatas, np.ones(window_size)/window_size, mode='valid') |
|||
|
|||
|
|||
#record = wfdb.rdrecord('mit-bih-arrhythmia-database-1.0.0/100', sampfrom=0, sampto=25000, physical=True, channels=[0, ]) |
|||
#Original_ECG = record.p_signal[Initial_intercept_point:Final_intercept_point].flatten() |
|||
Original_ECG = moving_avg_ecg1 |
|||
ECG_baseline = medfilt(Original_ECG, fliter+1) |
|||
Totality_Bias = np.sum(ECG_baseline[Give_up_size:-Give_up_size])/(Final_intercept_point-Initial_intercept_point-fliter) |
|||
Filtered_ECG = Original_ECG - ECG_baseline |
|||
Final_Filtered_ECG = Filtered_ECG[Give_up_size:-Give_up_size]-Totality_Bias |
|||
|
|||
|
|||
|
|||
plt.figure(figsize=(100, 8)) |
|||
plt.subplot(2, 1, 1) |
|||
plt.ylabel("Original ECG signal") |
|||
plt.plot(leaddatas)#输出原图像leaddatas |
|||
|
|||
plt.subplot(2, 1, 2) |
|||
plt.ylabel("Filtered ECG signal") |
|||
plt.plot(Original_ECG)#基线滤波结果 |
|||
|
|||
plt.show() |
|||
|
|||
|
|||
#心率计算 |
|||
import biosppy.signals.ecg as ecg |
|||
|
|||
rpeaks = ecg.hamilton_segmenter(signal=Final_Filtered_ECG, sampling_rate=500) |
|||
|
|||
def calculate_heart_rate(r_peaks, sampling_rate): |
|||
# 计算相邻R波之间的时间间隔(单位:秒) |
|||
rr_intervals = np.diff(r_peaks) / sampling_rate |
|||
# 将时间间隔转换为每分钟的心跳数(bpm) |
|||
heart_rates = 60 / rr_intervals |
|||
return heart_rates |
|||
|
|||
|
|||
# 计算心率 |
|||
heart_rates = calculate_heart_rate(rpeaks, sampling_rate=500) |
|||
print("Heart rates (bpm):", heart_rates) |
|||
|
@ -1,4 +0,0 @@ |
|||
g++ -static -static-libgcc -static-libstdc++ -lwsock32 -lstdc++ .\sample_bin_parse.cpp -o sample_bin_parse.exe |
|||
g++ -static -static-libgcc -static-libstdc++ -lwsock32 -lstdc++ text2bin.cpp -o text2bin.exe |
|||
g++ -static -static-libgcc -static-libstdc++ -lwsock32 -lstdc++ one_lead_upload_packet_parser.cpp -o one_lead_upload_packet_parser.exe |
|||
g++ -static -static-libgcc -static-libstdc++ -lwsock32 -lstdc++ one_lead_realtime_report_parser.cpp -o one_lead_realtime_report_parser.exe |
@ -1,121 +0,0 @@ |
|||
|
|||
#include <fstream>
|
|||
#include <functional>
|
|||
#include <iostream>
|
|||
#include <list>
|
|||
#include <map>
|
|||
#include <memory>
|
|||
#include <set>
|
|||
#include <sstream>
|
|||
#include <string>
|
|||
#include <thread>
|
|||
#include <vector>
|
|||
//
|
|||
#include <winsock2.h>
|
|||
//
|
|||
#include <Windows.h>
|
|||
//
|
|||
#include <stdio.h>
|
|||
|
|||
#pragma comment(lib, "ws2_32.lib")
|
|||
#define PORT 8988
|
|||
|
|||
// #define EACH_FRAME_SIZE 180
|
|||
// #define DATA_NUM (EACH_FRAME_SIZE / 3)
|
|||
|
|||
// 5A A5
|
|||
// 03 00 65
|
|||
// 05 00 00 00
|
|||
// 77 07
|
|||
// 80 07
|
|||
// 7F 07
|
|||
// 88 07
|
|||
// 8D 07
|
|||
// 5B B5
|
|||
#pragma pack(1)
|
|||
typedef struct parse_packet_to_csv { |
|||
uint8_t h0; |
|||
uint8_t h1; |
|||
uint8_t header[3]; |
|||
uint8_t index[4]; |
|||
uint16_t data[5]; |
|||
uint8_t e0; |
|||
uint8_t e1; |
|||
}; |
|||
#pragma pack()
|
|||
|
|||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
|
|||
|
|||
uint16_t chdatacache[5]; |
|||
|
|||
void parse_chdatacache(parse_packet_to_csv *packet) { |
|||
chdatacache[0] = packet->data[0]; |
|||
chdatacache[1] = packet->data[1]; |
|||
chdatacache[2] = packet->data[2]; |
|||
chdatacache[3] = packet->data[3]; |
|||
chdatacache[4] = packet->data[4]; |
|||
} |
|||
|
|||
int main(int argc, char *argv[]) { |
|||
/**
|
|||
* @brief |
|||
* 打开raw.txt |
|||
* 读取raw.txt全部内容 |
|||
* 去掉换行,空格,回车 |
|||
* 将16进制字符串转换成二进制 |
|||
* 写入raw.bin |
|||
*/ |
|||
|
|||
std::ifstream ifs("Data.txt"); |
|||
std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); |
|||
ifs.close(); |
|||
|
|||
std::string str2; |
|||
for (auto &c : str) { |
|||
if (c == ' ' || c == '\n' || c == '\r') { |
|||
continue; |
|||
} |
|||
str2.push_back(c); |
|||
} |
|||
|
|||
std::ofstream ofs("Data.bin", std::ios::binary); |
|||
for (size_t i = 0; i < str2.size(); i += 2) { |
|||
std::string str3 = str2.substr(i, 2); |
|||
char c = (char)std::stoi(str3, nullptr, 16); |
|||
ofs.write(&c, 1); |
|||
} |
|||
ofs.close(); |
|||
|
|||
/**
|
|||
* @brief |
|||
* 解析上报文件 |
|||
*/ |
|||
|
|||
{ |
|||
std::ifstream ifs("Data.bin", std::ios::binary); |
|||
std::vector<char> buffer((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); |
|||
ifs.close(); |
|||
|
|||
printf("buffer.size() = %d\n", buffer.size()); |
|||
std::ofstream ofs("Data.csv"); |
|||
for (size_t i = 0; i < buffer.size();) { |
|||
parse_packet_to_csv *packet = (parse_packet_to_csv *)&buffer[i]; |
|||
|
|||
if (packet->h0 == 0x5A && packet->h1 == 0xA5 && packet->e0 == 0x5B && packet->e1 == 0xB5) { |
|||
parse_chdatacache(packet); |
|||
for (size_t i = 0; i < ARRAY_SIZE(chdatacache); i += 1) { |
|||
ofs << chdatacache[i] << "\n"; |
|||
} |
|||
i += sizeof(parse_packet_to_csv); |
|||
} else { |
|||
i++; |
|||
} |
|||
} |
|||
} |
|||
|
|||
printf("parse over\n"); |
|||
|
|||
while (true) { |
|||
std::this_thread::sleep_for(std::chrono::seconds(1)); |
|||
} |
|||
} |
@ -1,102 +0,0 @@ |
|||
|
|||
#include <fstream>
|
|||
#include <functional>
|
|||
#include <iostream>
|
|||
#include <list>
|
|||
#include <map>
|
|||
#include <memory>
|
|||
#include <set>
|
|||
#include <sstream>
|
|||
#include <string>
|
|||
#include <thread>
|
|||
#include <vector>
|
|||
//
|
|||
#include <winsock2.h>
|
|||
//
|
|||
#include <Windows.h>
|
|||
//
|
|||
#include <stdio.h>
|
|||
|
|||
#pragma comment(lib, "ws2_32.lib")
|
|||
#define PORT 8988
|
|||
|
|||
// #define EACH_FRAME_SIZE 180
|
|||
// #define DATA_NUM (EACH_FRAME_SIZE / 3)
|
|||
|
|||
typedef struct parse_packet_to_csv { |
|||
uint8_t h0; |
|||
uint8_t h1; |
|||
uint8_t data[128]; |
|||
uint8_t e0; |
|||
uint8_t e1; |
|||
}; |
|||
|
|||
uint32_t chdatacache[64]; |
|||
void parse_chdatacache(parse_packet_to_csv *packet) { |
|||
for (size_t i = 0; i < 64; i++) { |
|||
chdatacache[i] = (packet->data[i * 2]) | (packet->data[i * 2 + 1] << 8); |
|||
} |
|||
} |
|||
|
|||
int main(int argc, char *argv[]) { |
|||
/**
|
|||
* @brief |
|||
* 打开raw.txt |
|||
* 读取raw.txt全部内容 |
|||
* 去掉换行,空格,回车 |
|||
* 将16进制字符串转换成二进制 |
|||
* 写入raw.bin |
|||
*/ |
|||
|
|||
std::ifstream ifs("Data.txt"); |
|||
std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); |
|||
ifs.close(); |
|||
|
|||
std::string str2; |
|||
for (auto &c : str) { |
|||
if (c == ' ' || c == '\n' || c == '\r') { |
|||
continue; |
|||
} |
|||
str2.push_back(c); |
|||
} |
|||
|
|||
std::ofstream ofs("Data.bin", std::ios::binary); |
|||
for (size_t i = 0; i < str2.size(); i += 2) { |
|||
std::string str3 = str2.substr(i, 2); |
|||
char c = (char)std::stoi(str3, nullptr, 16); |
|||
ofs.write(&c, 1); |
|||
} |
|||
ofs.close(); |
|||
|
|||
/**
|
|||
* @brief |
|||
* 解析上报文件 |
|||
*/ |
|||
|
|||
{ |
|||
std::ifstream ifs("Data.bin", std::ios::binary); |
|||
std::vector<char> buffer((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); |
|||
ifs.close(); |
|||
|
|||
printf("buffer.size() = %d\n", buffer.size()); |
|||
std::ofstream ofs("Data.csv"); |
|||
for (size_t i = 0; i < buffer.size();) { |
|||
parse_packet_to_csv *packet = (parse_packet_to_csv *)&buffer[i]; |
|||
parse_chdatacache(packet); |
|||
if (packet->h0 == 0x4A && packet->h1 == 0xA4 && packet->e0 == 0x4B && packet->e1 == 0xB4) { |
|||
for (size_t i = 0; i < 64; i += 1) { |
|||
ofs << chdatacache[i] << "\n"; |
|||
} |
|||
i += sizeof(parse_packet_to_csv); |
|||
} else { |
|||
i++; |
|||
} |
|||
} |
|||
} |
|||
|
|||
printf("parse over\n"); |
|||
|
|||
while (true) { |
|||
std::this_thread::sleep_for(std::chrono::seconds(1)); |
|||
} |
|||
} |
@ -1,54 +0,0 @@ |
|||
|
|||
#include <fstream>
|
|||
#include <functional>
|
|||
#include <iostream>
|
|||
#include <list>
|
|||
#include <map>
|
|||
#include <memory>
|
|||
#include <set>
|
|||
#include <sstream>
|
|||
#include <string>
|
|||
#include <thread>
|
|||
#include <vector>
|
|||
//
|
|||
#include <winsock2.h>
|
|||
//
|
|||
#include <Windows.h>
|
|||
//
|
|||
#include <stdio.h>
|
|||
|
|||
#pragma comment(lib, "ws2_32.lib")
|
|||
#define PORT 8988
|
|||
|
|||
int main(int argc, char *argv[]) { |
|||
// 打开 0.bin
|
|||
// 读取 0.bin 到数组中
|
|||
// 每次读9byte
|
|||
// 3byte 3byte 3byte
|
|||
// 存放到0.csv中
|
|||
|
|||
std::ifstream ifs("0.bin", std::ios::binary); |
|||
if (!ifs) { |
|||
std::cerr << "open 0.bin failed" << std::endl; |
|||
return -1; |
|||
} |
|||
|
|||
std::ofstream ofs("0.csv", std::ios::binary | std::ios::trunc); |
|||
if (!ofs) { |
|||
std::cerr << "open 0.csv failed" << std::endl; |
|||
return -1; |
|||
} |
|||
|
|||
char buf[9]; |
|||
while (ifs.read(buf, 9)) { |
|||
unsigned int a = 0; |
|||
unsigned int b = 0; |
|||
unsigned int c = 0; |
|||
a = (unsigned char)buf[0] | (unsigned char)buf[1] << 8 | (unsigned char)buf[2] << 16; |
|||
b = (unsigned char)buf[3] | (unsigned char)buf[4] << 8 | (unsigned char)buf[5] << 16; |
|||
c = (unsigned char)buf[6] | (unsigned char)buf[7] << 8 | (unsigned char)buf[8] << 16; |
|||
ofs << a << "," << b << "," << c << std::endl; |
|||
} |
|||
|
|||
return 0; |
|||
} |
@ -1,54 +0,0 @@ |
|||
|
|||
#include <fstream>
|
|||
#include <functional>
|
|||
#include <iostream>
|
|||
#include <list>
|
|||
#include <map>
|
|||
#include <memory>
|
|||
#include <set>
|
|||
#include <sstream>
|
|||
#include <string>
|
|||
#include <thread>
|
|||
#include <vector>
|
|||
//
|
|||
#include <winsock2.h>
|
|||
//
|
|||
#include <Windows.h>
|
|||
//
|
|||
#include <stdio.h>
|
|||
|
|||
#pragma comment(lib, "ws2_32.lib")
|
|||
#define PORT 8988
|
|||
|
|||
int main(int argc, char *argv[]) { |
|||
/**
|
|||
* @brief |
|||
* 打开raw.txt |
|||
* 读取raw.txt全部内容 |
|||
* 去掉换行,空格,回车 |
|||
* 将16进制字符串转换成二进制 |
|||
* 写入raw.bin |
|||
*/ |
|||
|
|||
std::ifstream ifs("raw.txt"); |
|||
std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); |
|||
ifs.close(); |
|||
|
|||
std::string str2; |
|||
for (auto &c : str) { |
|||
if (c == ' ' || c == '\n' || c == '\r') { |
|||
continue; |
|||
} |
|||
str2.push_back(c); |
|||
} |
|||
|
|||
std::ofstream ofs("raw.bin", std::ios::binary); |
|||
for (size_t i = 0; i < str2.size(); i += 2) { |
|||
std::string str3 = str2.substr(i, 2); |
|||
char c = (char)std::stoi(str3, nullptr, 16); |
|||
ofs.write(&c, 1); |
|||
} |
|||
ofs.close(); |
|||
|
|||
return 0; |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue