Browse Source

update

master
zhaohe 1 year ago
parent
commit
731e95a38a
  1. 3
      .vscode/settings.json
  2. 8
      CMakeLists.txt.user
  3. 36
      mainwindow.cpp
  4. 1360
      mainwindow.ui
  5. 24
      src/filter_algo_mgr.cpp
  6. 6
      src/filter_algo_mgr.hpp
  7. 37
      src/filter_group/algo/iflytop_simple_filter.cpp
  8. 11
      src/filter_group/algo/iflytop_simple_filter.h
  9. 15
      src/filter_group/if/if_filter_group.hpp
  10. 7
      src/filter_group/iir_filter_group.cpp
  11. 1
      src/filter_group/iir_filter_group.hpp

3
.vscode/settings.json

@ -88,7 +88,8 @@
"qmessagebox": "cpp",
"qgridlayout": "cpp",
"qmenu": "cpp",
"qtconcurrent": "cpp"
"qtconcurrent": "cpp",
"ranges": "cpp"
},
"files.autoGuessEncoding": false,
}

8
CMakeLists.txt.user

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 5.0.2, 2024-05-14T14:39:56. -->
<!-- Written by QtCreator 5.0.2, 2024-05-31T15:10:33. -->
<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">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">4</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">
@ -106,7 +106,7 @@
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/workspace/nordic_wp/build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
@ -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/build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-Release</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/workspace/nordic_wp/electrocardiograph_upper/build</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>

36
mainwindow.cpp

@ -316,14 +316,38 @@ void MainWindow::constructUI() {
heartrate_report_packet_t *heartrate_report = (heartrate_report_packet_t *)report_packet;
static uint32_t lastpacket_index = 0;
static uint32_t lostpacket = 0;
if ((lastpacket_index + 5) != (heartrate_report->sample_data_index)) {
int packetFrameNum = (len - sizeof(heartrate_report_packet_t)) / 9;
if ((lastpacket_index + packetFrameNum) != (heartrate_report->sample_data_index)) {
lostpacket++;
}
lastpacket_index = heartrate_report->sample_data_index;
reportPreviewShow("[preview data ] lost:%d index %d", lostpacket, heartrate_report->sample_data_index);
{
// 解析心电数据
int32_t val[3];
for (size_t i = 0; i < packetFrameNum; i++) {
uint8_t *val0p = heartrate_report->data + i * 9;
uint8_t *val1p = val0p + 3;
uint8_t *val2p = val1p + 3;
val[0] = (int32_t)(val0p[0]) + ((int32_t)val0p[1] << 8) + ((int32_t)val0p[2] << 16);
val[1] = (int32_t)(val1p[0]) + ((int32_t)val1p[1] << 8) + ((int32_t)val1p[2] << 16);
val[2] = (int32_t)(val2p[0]) + ((int32_t)val2p[1] << 8) + ((int32_t)val2p[2] << 16);
emit doinui_signal(QFunction([this, val, i]() { //
int32_t data0 = FilterAlgoMgr::ins()->processData("心电1", val[0]);
int32_t data1 = FilterAlgoMgr::ins()->processData("心电2", val[1]);
int32_t data2 = FilterAlgoMgr::ins()->processData("心电3", val[2]);
wp2d->addData("心电1", data0, 0);
wp2d->addData("心电2", data1, 0);
wp2d->addData("心电3", data2, 0);
}));
}
}
} else if (m_devicetype == kone_lead_ecg_v2) {
if (!checkok) return;
@ -761,6 +785,9 @@ void MainWindow::on_FilterUpdateParameter_clicked() {
FilterAlgoMgr::ins()->BaselineDriftRemoval_setEnable(ui->BaselineDriftRemoval_Enable->isChecked());
FilterAlgoMgr::ins()->BaselineDriftRemoval_setWindowsSize(ui->BaselineDriftRemoval_WindowsSize->text().toInt());
FilterAlgoMgr::ins()->MedianFilter_setEnable(ui->MedianFilter_Enable->isChecked());
FilterAlgoMgr::ins()->MedianFilter_setWindowsSize(ui->MedianFilter_WindowsSize->text().toInt());
FilterAlgoMgr::ins()->updateParameter();
on_buttonTabWidget_currentChanged(0);
@ -790,6 +817,9 @@ void MainWindow::on_buttonTabWidget_currentChanged(int index) {
ui->BaselineDriftRemoval_Enable->setChecked(FilterAlgoMgr::ins()->BaselineDriftRemoval_getEnable());
ui->BaselineDriftRemoval_WindowsSize->setText(QString::number(FilterAlgoMgr::ins()->BaselineDriftRemoval_getWindowsSize()));
ui->MedianFilter_Enable->setChecked(FilterAlgoMgr::ins()->MedianFilter_getEnable());
ui->MedianFilter_WindowsSize->setText(QString::number(FilterAlgoMgr::ins()->MedianFilter_getWindowsSize()));
}
void MainWindow::on_TestCmd_writeSubICAllReg_clicked() {

1360
mainwindow.ui
File diff suppressed because it is too large
View File

24
src/filter_algo_mgr.cpp

@ -257,4 +257,28 @@ bool FilterAlgoMgr::BaselineDriftRemoval_getEnable() {
return it.second->BaselineDriftRemoval_getEnable();
}
return 0;
}
void FilterAlgoMgr::MedianFilter_setWindowsSize(int windows_size) {
for (auto& it : m_filter_map) {
it.second->MedianFilter_setWindowsSize(windows_size);
}
}
void FilterAlgoMgr::MedianFilter_setEnable(bool enable) {
for (auto& it : m_filter_map) {
it.second->MedianFilter_setEnable(enable);
}
}
int FilterAlgoMgr::MedianFilter_getWindowsSize() {
for (auto& it : m_filter_map) {
return it.second->MedianFilter_getWindowsSize();
}
return 0;
}
bool FilterAlgoMgr::MedianFilter_getEnable() {
for (auto& it : m_filter_map) {
return it.second->MedianFilter_getEnable();
}
return 0;
}

6
src/filter_algo_mgr.hpp

@ -90,6 +90,12 @@ class FilterAlgoMgr {
int BaselineDriftRemoval_getWindowsSize();
bool BaselineDriftRemoval_getEnable();
void MedianFilter_setWindowsSize(int windows_size);
void MedianFilter_setEnable(bool enable);
int MedianFilter_getWindowsSize();
bool MedianFilter_getEnable();
};
} // namespace iflytop

37
src/filter_group/algo/iflytop_simple_filter.cpp

@ -205,3 +205,40 @@ float BaselineDriftRemoval_Update(BaselineDriftRemoval_t *filter, float vin) {
return min_data_in_fifo - mid;
}
void MedianFilter_Init(MedianFilter_t *filter, int windows_size, bool enable) {
if (windows_size > MAX_MEDIAN_FILTER_SIZE) {
windows_size = MAX_MEDIAN_FILTER_SIZE;
}
filter->windows_size = windows_size;
filter->datanum = 0;
filter->enable = enable;
}
float MedianFilter_Update(MedianFilter_t *filter, float vin) {
if (!filter->enable) return vin;
memmove(filter->datawindows, filter->datawindows + 1, (filter->windows_size - 1) * sizeof(float));
filter->datawindows[filter->windows_size - 1] = vin;
filter->datanum++;
float datacache[MAX_MEDIAN_FILTER_SIZE];
memcpy(datacache, filter->datawindows, filter->windows_size * sizeof(float));
for (int i = 0; i < filter->windows_size; i++) {
for (int j = i + 1; j < filter->windows_size; j++) {
if (datacache[i] > datacache[j]) {
float temp = datacache[i];
datacache[i] = datacache[j];
datacache[j] = temp;
}
}
}
if (filter->datanum < filter->windows_size) {
return vin;
} else {
return datacache[filter->windows_size / 2];
}
}

11
src/filter_group/algo/iflytop_simple_filter.h

@ -93,4 +93,15 @@ float BaselineDriftRemoval_Update(BaselineDriftRemoval_t *filter, float vin);
// }
// #endif
#define MAX_MEDIAN_FILTER_SIZE 100
typedef struct {
float datawindows[MAX_MEDIAN_FILTER_SIZE];
int windows_size;
int datanum;
bool enable;
} MedianFilter_t;
void MedianFilter_Init(MedianFilter_t *filter, int windows_size, bool enable);
float MedianFilter_Update(MedianFilter_t *filter, float vin);
#endif

15
src/filter_group/if/if_filter_group.hpp

@ -17,7 +17,7 @@ using namespace std;
class IF_FilterGroup {
protected:
float _sampleTimeMs= 2;
float _sampleTimeMs = 2;
int _windows_size = 500;
string _windowType = "hamming";
@ -40,6 +40,9 @@ class IF_FilterGroup {
int _BaselineDriftRemoval_WindowsSize = 170;
bool _BaselineDriftRemoval_Enable = false;
int _MedianFilter_WindowsSize = 15;
bool _MedianFilter_Enable = false;
// BaselineDriftRemoval_Enable
const string kwindow_type_hamming = "hamming";
@ -122,5 +125,15 @@ class IF_FilterGroup {
virtual int BaselineDriftRemoval_getWindowsSize() { return _BaselineDriftRemoval_WindowsSize; }
virtual bool BaselineDriftRemoval_getEnable() { return _BaselineDriftRemoval_Enable; }
/***********************************************************************************************************************
* MedianFilter *
***********************************************************************************************************************/
virtual void MedianFilter_setWindowsSize(int windows_size) { _MedianFilter_WindowsSize = windows_size; }
virtual void MedianFilter_setEnable(bool enable) { _MedianFilter_Enable = enable; }
virtual int MedianFilter_getWindowsSize() { return _MedianFilter_WindowsSize; }
virtual bool MedianFilter_getEnable() { return _MedianFilter_Enable; }
};
} // namespace iflytop

7
src/filter_group/iir_filter_group.cpp

@ -30,10 +30,13 @@ int32_t IIRFilterGroup::processData(int32_t data) { //
v0 = BaselineDriftRemoval_Update(&baselineDriftRemoval, v0);
v0 = SmoothingFilter_Update(&smoothingFilter, v0);
v0 = MedianFilter_Update(&medianFilter, v0);
return (int32_t)v0;
}
void IIRFilterGroup::updateParameter() {
std::lock_guard<std::recursive_mutex> lock(lock_);
@ -53,4 +56,6 @@ void IIRFilterGroup::updateParameter() {
SmoothingFilter_Init(&smoothingFilter, _SmoothingFilter_WindowsSize, _SmoothingFilter_Enable);
BaselineDriftRemoval_Init(&baselineDriftRemoval, _BaselineDriftRemoval_WindowsSize, _BaselineDriftRemoval_Enable);
MedianFilter_Init(&medianFilter, _MedianFilter_WindowsSize, _MedianFilter_Enable);
}

1
src/filter_group/iir_filter_group.hpp

@ -27,6 +27,7 @@ class IIRFilterGroup : public IF_FilterGroup {
SmoothingFilter_t smoothingFilter;
BaselineDriftRemoval_t baselineDriftRemoval;
MedianFilter_t medianFilter;
int __lpfilter_order = 1;
int __hpfilter_order = 1;

Loading…
Cancel
Save