diff --git a/CMakeLists.txt b/CMakeLists.txt index 6bd2947..b2ccc74 100644 --- a/CMakeLists.txt +++ b/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 diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index 89df8ef..f82a021 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -94,7 +94,7 @@ Desktop Qt 5.12.12 MinGW 64-bit Desktop Qt 5.12.12 MinGW 64-bit qt.qt5.51212.win64_mingw73_kit - 4 + 0 0 0 @@ -347,7 +347,7 @@ true false true - D:/workspace/nordic_wp/electrocardiograph_upper/build + D:/workspace/nordic_wp/build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-Release 1 diff --git a/ify_hrs_protocol b/ify_hrs_protocol index c5a8617..286f8bb 160000 --- a/ify_hrs_protocol +++ b/ify_hrs_protocol @@ -1 +1 @@ -Subproject commit c5a86174de8f27f4c8ab6c18dd131effa7b43ea5 +Subproject commit 286f8bbe136357e72b72f7d3e2a5b0ad64e99710 diff --git a/libzqt/widgetplot2d.ui b/libzqt/widgetplot2d.ui index 2c9d99b..74391b2 100644 --- a/libzqt/widgetplot2d.ui +++ b/libzqt/widgetplot2d.ui @@ -286,7 +286,7 @@ QPushButton#clearPBtn:pressed, #fullShowPBtn:pressed, #savePBtn:pressed, #openPB 暂停 - + :/image/pause.png:/image/pause.png @@ -344,8 +344,6 @@ QPushButton#clearPBtn:pressed, #fullShowPBtn:pressed, #savePBtn:pressed, #openPB 1 - - - + diff --git a/mainwindow.cpp b/mainwindow.cpp index cca4ac9..7d1f6c6 100644 --- a/mainwindow.cpp +++ b/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; diff --git a/mainwindow.ui b/mainwindow.ui index f26f1ec..1012a0d 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -2593,7 +2593,7 @@ p, li { white-space: pre-wrap; } - 心电上位机V3 + 心电上位机V6 diff --git a/src/filter_group/algo/iflytop_simple_filter_ext.cpp b/src/filter_group/algo/iflytop_simple_filter_ext.cpp new file mode 100644 index 0000000..9ee0e7b --- /dev/null +++ b/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; +} \ No newline at end of file diff --git a/src/filter_group/algo/iflytop_simple_filter_ext.h b/src/filter_group/algo/iflytop_simple_filter_ext.h new file mode 100644 index 0000000..ea7e4d7 --- /dev/null +++ b/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); + + + \ No newline at end of file diff --git a/src/filter_group/if/if_filter_group.hpp b/src/filter_group/if/if_filter_group.hpp index 27bceda..36f67d1 100644 --- a/src/filter_group/if/if_filter_group.hpp +++ b/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 diff --git a/src/filter_group/iir_filter_group.cpp b/src/filter_group/iir_filter_group.cpp index d486f75..0624a94 100644 --- a/src/filter_group/iir_filter_group.cpp +++ b/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 lock(lock_); diff --git a/src/version.h b/src/version.h index edd57ad..fe71995 100644 --- a/src/version.h +++ b/src/version.h @@ -1,4 +1,4 @@ #pragma once -#define VERSION 4 +#define VERSION 6 #define MAUFACTURER "iflytop" \ No newline at end of file