Browse Source

update

master
zhaohe 1 year ago
parent
commit
ea1aa9c4aa
  1. 1
      CMakeLists.txt
  2. 6
      CMakeLists.txt.user
  3. 2
      ify_hrs_protocol
  4. 6
      libzqt/widgetplot2d.ui
  5. 34
      mainwindow.cpp
  6. 2
      mainwindow.ui
  7. 57
      src/filter_group/algo/iflytop_simple_filter_ext.cpp
  8. 31
      src/filter_group/algo/iflytop_simple_filter_ext.h
  9. 10
      src/filter_group/if/if_filter_group.hpp
  10. 2
      src/filter_group/iir_filter_group.cpp
  11. 2
      src/version.h

1
CMakeLists.txt

@ -42,6 +42,7 @@ set(PROJECT_SOURCES
src/filter_algo_mgr.cpp
src/filter_group/algo/iflytop_simple_filter.cpp
src/filter_group/algo/iflytop_simple_filter_ext.cpp
src/filter_group/iir_filter_group.cpp
src/filter_group/fir_filter_group.cpp
src/filter_group/algo/fir_filter.cpp

6
CMakeLists.txt.user

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 5.0.2, 2024-05-11T19:35:35. -->
<!-- Written by QtCreator 5.0.2, 2024-05-14T14:39:56. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@ -94,7 +94,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.12.12 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.12.12 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.51212.win64_mingw73_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">4</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
@ -347,7 +347,7 @@
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/workspace/nordic_wp/electrocardiograph_upper/build</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/workspace/nordic_wp/build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-Release</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>

2
ify_hrs_protocol

@ -1 +1 @@
Subproject commit c5a86174de8f27f4c8ab6c18dd131effa7b43ea5
Subproject commit 286f8bbe136357e72b72f7d3e2a5b0ad64e99710

6
libzqt/widgetplot2d.ui

@ -286,7 +286,7 @@ QPushButton#clearPBtn:pressed, #fullShowPBtn:pressed, #savePBtn:pressed, #openPB
<string>暂停</string>
</property>
<property name="icon">
<iconset resource="image.qrc">
<iconset>
<normaloff>:/image/pause.png</normaloff>:/image/pause.png</iconset>
</property>
</widget>
@ -344,8 +344,6 @@ QPushButton#clearPBtn:pressed, #fullShowPBtn:pressed, #savePBtn:pressed, #openPB
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="image.qrc"/>
</resources>
<resources/>
<connections/>
</ui>

34
mainwindow.cpp

@ -10,6 +10,7 @@
#include "ads129x/ads129x_type.h"
#include "electrocardiograph_tester.hpp"
#include "filter_algo_mgr.hpp"
#include "filter_group/algo/iflytop_simple_filter_ext.h"
#include "logger.hpp"
#include "qt_serial_datachannel.hpp"
#include "widgetplot2d.h"
@ -168,7 +169,11 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction)));
// qInstallMessageHandler(log_output);
wp2d = new WidgetPlot2D();
wp2d->initGraphName(QStringList() << "心电");
QStringList lines;
lines.push_back("心电");
lines.push_back("心电2");
wp2d->initGraphName(lines);
FilterAlgoMgr::ins()->addFilter("心电");
/*******************************************************************************
@ -309,7 +314,8 @@ void MainWindow::constructUI() {
if (!checkok) return;
m1003_heartrate_report_packet_t *heartrate_report = (m1003_heartrate_report_packet_t *)report_packet;
static uint32_t lostpacket = 0;
static uint32_t lostpacket = 0;
{
static uint32_t lastpacket_index = 0;
if ((lastpacket_index + heartrate_report->sample_data_num) != (heartrate_report->sample_data_index)) {
@ -317,13 +323,29 @@ void MainWindow::constructUI() {
}
lastpacket_index = heartrate_report->sample_data_index;
}
reportPreviewShow("[preview data ] lost:%d index %d leadoff 0x%x", //
lostpacket, heartrate_report->sample_data_index, heartrate_report->leadoff_state);
// static LPFilterExt_t lp;
// static bool lpenable = false;
// if (!lpenable) {
// LPFilterExt_init(&lp, 40, 0.002, 14, true);
// lpenable = true;
// }
for (int i = 0; i < heartrate_report->sample_data_num; i++) {
int16_t data = heartrate_report->frame[i];
int32_t frameIndex = heartrate_report->sample_data_index + i;
data = FilterAlgoMgr::ins()->processData("心电", data);
emit doinui_signal(QFunction([this, data, i]() { wp2d->addData("心电", data, i * 2); }));
// {
// int32_t data = heartrate_report->frame[i] ;
// data = LPFilterExt_update(&lp, data);
// emit doinui_signal(QFunction([this, data, i]() { wp2d->addData("心电2", data, i * 2); }));
// }
{
int32_t data = heartrate_report->frame[i];
data = FilterAlgoMgr::ins()->processData("心电", data);
emit doinui_signal(QFunction([this, data, i]() { wp2d->addData("心电", data, i * 2); }));
}
}
}
break;

2
mainwindow.ui

@ -2593,7 +2593,7 @@ p, li { white-space: pre-wrap; }
</property>
<widget class="QMenu" name="menu123">
<property name="title">
<string>心电上位机V3</string>
<string>心电上位机V6</string>
</property>
</widget>
<addaction name="menu123"/>

57
src/filter_group/algo/iflytop_simple_filter_ext.cpp

@ -0,0 +1,57 @@
#include "iflytop_simple_filter_ext.h"
void LPFilterExt_init(LPFilterExt_t *filter, float cutoffFreqHz, float sampleTimeS, int order, bool enable) {
if (order > FILTER_MAX_ORDER) {
order = FILTER_MAX_ORDER;
}
filter->order = order;
for (int i = 0; i < order; i++) {
LPFilter_Init(&filter->lp_filter[i], cutoffFreqHz, sampleTimeS, enable);
}
}
float LPFilterExt_update(LPFilterExt_t *filter, float v_in) {
float v_out = v_in;
for (int i = 0; i < filter->order; i++) {
v_out = LPFilter_Update(&filter->lp_filter[i], v_out);
}
return v_out;
}
void HPFilterExt_init(HPFilterExt_t *filter, float cutoffFreqHz, float sampleTimeS, int order, bool enable) {
if (order > FILTER_MAX_ORDER) {
order = FILTER_MAX_ORDER;
}
filter->order = order;
for (int i = 0; i < order; i++) {
HPFilter_Init(&filter->hp_filter[i], cutoffFreqHz, sampleTimeS, enable);
}
}
float HPFilterExt_update(HPFilterExt_t *filter, float v_in) {
float v_out = v_in;
for (int i = 0; i < filter->order; i++) {
v_out = HPFilter_Update(&filter->hp_filter[i], v_out);
}
return v_out;
}
void NOTCHFilterExt_init(NOTCHFilterExt_t *filter, float centerFreqHz, float notchWidthHz, float sampleTimeS, int order, bool enable) {
if (order > FILTER_MAX_ORDER) {
order = FILTER_MAX_ORDER;
}
filter->order = order;
for (int i = 0; i < order; i++) {
NOTCHFilter_Init(&filter->notch_filter[i], centerFreqHz, notchWidthHz, sampleTimeS, enable);
}
}
float NOTCHFilterExt_update(NOTCHFilterExt_t *filter, float v_in) {
float v_out = v_in;
for (int i = 0; i < filter->order; i++) {
v_out = NOTCHFilter_Update(&filter->notch_filter[i], v_out);
}
return v_out;
}

31
src/filter_group/algo/iflytop_simple_filter_ext.h

@ -0,0 +1,31 @@
#pragma once
#include "iflytop_simple_filter.h"
#define FILTER_MAX_ORDER 20
typedef struct {
LPFilter_t lp_filter[FILTER_MAX_ORDER];
int order;
} LPFilterExt_t;
void LPFilterExt_init(LPFilterExt_t *filter, float cutoffFreqHz, float sampleTimeS, int order, bool enable);
float LPFilterExt_update(LPFilterExt_t *filter, float v_in);
typedef struct {
HPFilter_t hp_filter[FILTER_MAX_ORDER];
int order;
} HPFilterExt_t;
void HPFilterExt_init(HPFilterExt_t *filter, float cutoffFreqHz, float sampleTimeS, int order, bool enable);
float HPFilterExt_update(HPFilterExt_t *filter, float v_in);
typedef struct {
NOTCHFilter_t notch_filter[FILTER_MAX_ORDER];
int order;
} NOTCHFilterExt_t;
void NOTCHFilterExt_init(NOTCHFilterExt_t *filter, float centerFreqHz, float notchWidthHz, float sampleTimeS, int order, bool enable);
float NOTCHFilterExt_update(NOTCHFilterExt_t *filter, float v_in);

10
src/filter_group/if/if_filter_group.hpp

@ -17,16 +17,16 @@ using namespace std;
class IF_FilterGroup {
protected:
float _sampleTimeMs;
float _sampleTimeMs= 2;
int _windows_size = 500;
string _windowType = "hamming";
bool _LPFilter_Enable = false;
float _LPFilter_CutoffFreqHz = 0;
float _LPFilter_Order = 1;
float _LPFilter_CutoffFreqHz = 40;
float _LPFilter_Order = 14;
bool _HPFilter_Enable = false;
float _HPFilter_CutoffFreqHz = 0;
float _HPFilter_CutoffFreqHz = 1;
float _HPFilter_Order = 1;
bool _NOTCHFilter_Enable = false;
@ -37,7 +37,7 @@ class IF_FilterGroup {
bool _SmoothingFilter_Enable = false;
int _SmoothingFilter_WindowsSize = 100;
int _BaselineDriftRemoval_WindowsSize = 500;
int _BaselineDriftRemoval_WindowsSize = 170;
bool _BaselineDriftRemoval_Enable = false;
// BaselineDriftRemoval_Enable

2
src/filter_group/iir_filter_group.cpp

@ -29,11 +29,11 @@ int32_t IIRFilterGroup::processData(int32_t data) { //
}
v0 = BaselineDriftRemoval_Update(&baselineDriftRemoval, v0);
v0 = SmoothingFilter_Update(&smoothingFilter, v0);
return (int32_t)v0;
}
void IIRFilterGroup::updateParameter() {
std::lock_guard<std::recursive_mutex> lock(lock_);

2
src/version.h

@ -1,4 +1,4 @@
#pragma once
#define VERSION 4
#define VERSION 6
#define MAUFACTURER "iflytop"
Loading…
Cancel
Save