1、完善命名规范

This commit is contained in:
2025-05-08 23:03:31 +08:00
parent 6db90bee3f
commit 8eb3e48be3
4 changed files with 471 additions and 32 deletions

View File

@ -50,7 +50,7 @@ class ConfigParams:
}
}
PREPROCESS_INPUT_BCG_FILENAME: str = "orgBcg_Raw_"
PREPROCESS_INPUT_ECG_FILENAME: str = "ECG I_Raw_"
PREPROCESS_INPUT_ECG_FILENAME: str = "ECG II_Raw_"
PREPROCESS_SAVE_BCG_FILENAME: str = "BCG_Raw_"
PREPROCESS_SAVE_ECG_FILENAME: str = "ECG_Raw_"
PREPROCESS_SAVE_CHUNK_SIZE: int = 1000000
@ -151,6 +151,12 @@ class ConfigParams:
PRECISELY_ALIGN_SAVE_CHUNK_SIZE: int = 1000000
PRECISELY_ALIGN_SAVE_PEAK_CHUNK_SIZE: int = 100
# 冗余数据切割和标签映射
CUT_PSG_CHANNEL_LIST: list = ["Effort Abd_Raw_", "Effort Tho_Raw_", "Flow Patient_Raw_", "Snore_Raw_", "SpO2_Raw_"]
CUT_PST_LABEL_LIST: list = ["5_class_Raw_", "SA Label_Raw"]
CUT_PST_STARTTIME: list = ["StartTime_Raw"]
# 体动标注
# TODO弃用

View File

@ -0,0 +1,188 @@
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'MainWindow_cut_PSG.ui'
##
## Created by: Qt User Interface Compiler version 6.8.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
QCursor, QFont, QFontDatabase, QGradient,
QIcon, QImage, QKeySequence, QLinearGradient,
QPainter, QPalette, QPixmap, QRadialGradient,
QTransform)
from PySide6.QtWidgets import (QApplication, QGridLayout, QGroupBox, QHBoxLayout,
QLabel, QMainWindow, QPlainTextEdit, QProgressBar,
QPushButton, QSizePolicy, QSpacerItem, QStatusBar,
QTextBrowser, QVBoxLayout, QWidget)
class Ui_MainWindow_cut_PSG(object):
def setupUi(self, MainWindow_cut_PSG):
if not MainWindow_cut_PSG.objectName():
MainWindow_cut_PSG.setObjectName(u"MainWindow_cut_PSG")
MainWindow_cut_PSG.setEnabled(True)
MainWindow_cut_PSG.resize(540, 720)
sizePolicy = QSizePolicy(QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow_cut_PSG.sizePolicy().hasHeightForWidth())
MainWindow_cut_PSG.setSizePolicy(sizePolicy)
font = QFont()
font.setPointSize(12)
MainWindow_cut_PSG.setFont(font)
self.action_selectPath = QAction(MainWindow_cut_PSG)
self.action_selectPath.setObjectName(u"action_selectPath")
font1 = QFont()
font1.setFamilies([u"\u9ed1\u4f53"])
font1.setPointSize(14)
self.action_selectPath.setFont(font1)
self.action = QAction(MainWindow_cut_PSG)
self.action.setObjectName(u"action")
self.action.setFont(font1)
self.centralwidget = QWidget(MainWindow_cut_PSG)
self.centralwidget.setObjectName(u"centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(u"gridLayout")
self.groupBox_3 = QGroupBox(self.centralwidget)
self.groupBox_3.setObjectName(u"groupBox_3")
font2 = QFont()
font2.setPointSize(10)
self.groupBox_3.setFont(font2)
self.gridLayout_2 = QGridLayout(self.groupBox_3)
self.gridLayout_2.setObjectName(u"gridLayout_2")
self.groupBox = QGroupBox(self.groupBox_3)
self.groupBox.setObjectName(u"groupBox")
self.verticalLayout_6 = QVBoxLayout(self.groupBox)
self.verticalLayout_6.setObjectName(u"verticalLayout_6")
self.textBrowser_info = QTextBrowser(self.groupBox)
self.textBrowser_info.setObjectName(u"textBrowser_info")
self.verticalLayout_6.addWidget(self.textBrowser_info)
self.gridLayout_2.addWidget(self.groupBox, 1, 0, 1, 1)
self.groupBox_2 = QGroupBox(self.groupBox_3)
self.groupBox_2.setObjectName(u"groupBox_2")
self.verticalLayout_5 = QVBoxLayout(self.groupBox_2)
self.verticalLayout_5.setObjectName(u"verticalLayout_5")
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.label_2 = QLabel(self.groupBox_2)
self.label_2.setObjectName(u"label_2")
self.label_2.setFont(font)
self.label_2.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
self.horizontalLayout.addWidget(self.label_2)
self.plainTextEdit_channel = QPlainTextEdit(self.groupBox_2)
self.plainTextEdit_channel.setObjectName(u"plainTextEdit_channel")
self.horizontalLayout.addWidget(self.plainTextEdit_channel)
self.horizontalLayout.setStretch(0, 1)
self.horizontalLayout.setStretch(1, 1)
self.verticalLayout_5.addLayout(self.horizontalLayout)
self.horizontalLayout_6 = QHBoxLayout()
self.horizontalLayout_6.setObjectName(u"horizontalLayout_6")
self.label_6 = QLabel(self.groupBox_2)
self.label_6.setObjectName(u"label_6")
self.label_6.setFont(font)
self.horizontalLayout_6.addWidget(self.label_6)
self.plainTextEdit_label = QPlainTextEdit(self.groupBox_2)
self.plainTextEdit_label.setObjectName(u"plainTextEdit_label")
self.horizontalLayout_6.addWidget(self.plainTextEdit_label)
self.horizontalLayout_6.setStretch(0, 1)
self.horizontalLayout_6.setStretch(1, 1)
self.verticalLayout_5.addLayout(self.horizontalLayout_6)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
self.verticalLayout_5.addItem(self.verticalSpacer)
self.horizontalLayout_2 = QHBoxLayout()
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
self.label_show = QLabel(self.groupBox_2)
self.label_show.setObjectName(u"label_show")
self.label_show.setFont(font)
self.label_show.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
self.horizontalLayout_2.addWidget(self.label_show)
self.verticalLayout_5.addLayout(self.horizontalLayout_2)
self.progressBar = QProgressBar(self.groupBox_2)
self.progressBar.setObjectName(u"progressBar")
sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0)
sizePolicy1.setHeightForWidth(self.progressBar.sizePolicy().hasHeightForWidth())
self.progressBar.setSizePolicy(sizePolicy1)
self.progressBar.setStyleSheet(u"")
self.progressBar.setValue(0)
self.verticalLayout_5.addWidget(self.progressBar)
self.verticalLayout_5.setStretch(0, 2)
self.verticalLayout_5.setStretch(1, 2)
self.verticalLayout_5.setStretch(2, 2)
self.verticalLayout_5.setStretch(3, 1)
self.verticalLayout_5.setStretch(4, 1)
self.gridLayout_2.addWidget(self.groupBox_2, 0, 0, 1, 2)
self.pushButton_execute = QPushButton(self.groupBox_3)
self.pushButton_execute.setObjectName(u"pushButton_execute")
sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred)
sizePolicy2.setHorizontalStretch(0)
sizePolicy2.setVerticalStretch(0)
sizePolicy2.setHeightForWidth(self.pushButton_execute.sizePolicy().hasHeightForWidth())
self.pushButton_execute.setSizePolicy(sizePolicy2)
self.pushButton_execute.setFont(font)
self.gridLayout_2.addWidget(self.pushButton_execute, 1, 1, 1, 1)
self.gridLayout_2.setRowStretch(0, 7)
self.gridLayout_2.setRowStretch(1, 3)
self.gridLayout_2.setColumnStretch(0, 4)
self.gridLayout_2.setColumnStretch(1, 1)
self.gridLayout.addWidget(self.groupBox_3, 0, 0, 1, 1)
self.gridLayout.setColumnStretch(0, 2)
MainWindow_cut_PSG.setCentralWidget(self.centralwidget)
self.statusbar = QStatusBar(MainWindow_cut_PSG)
self.statusbar.setObjectName(u"statusbar")
MainWindow_cut_PSG.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow_cut_PSG)
QMetaObject.connectSlotsByName(MainWindow_cut_PSG)
# setupUi
def retranslateUi(self, MainWindow_cut_PSG):
MainWindow_cut_PSG.setWindowTitle(QCoreApplication.translate("MainWindow_cut_PSG", u"BCG\u7684J\u5cf0\u7b97\u6cd5\u5b9a\u4f4d", None))
self.action_selectPath.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u6570\u636e\u8def\u5f84\u9009\u62e9", None))
self.action.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u52a0\u8f7d\u5b58\u6863", None))
self.groupBox_3.setTitle(QCoreApplication.translate("MainWindow_cut_PSG", u"\u5197\u4f59\u6570\u636e\u5207\u5272\u548c\u6807\u7b7e\u6620\u5c04", None))
self.groupBox.setTitle(QCoreApplication.translate("MainWindow_cut_PSG", u"\u65e5\u5fd7", None))
self.groupBox_2.setTitle(QCoreApplication.translate("MainWindow_cut_PSG", u"\u786e\u5b9a\u6570\u636e", None))
self.label_2.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u9700\u8981\u5207\u5272\u7684\u901a\u9053\u540d\uff1a", None))
self.label_6.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u9700\u8981\u6620\u5c04\u7684\u6807\u7b7e\uff1a", None))
self.label_show.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u70b9\u51fb\u6267\u884c\u4ee5\u5f00\u59cb...", None))
self.pushButton_execute.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u6267\u884c", None))
# retranslateUi

View File

@ -0,0 +1,202 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow_cut_PSG</class>
<widget class="QMainWindow" name="MainWindow_cut_PSG">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>540</width>
<height>720</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="windowTitle">
<string>BCG的J峰算法定位</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout" columnstretch="2">
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_3">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="title">
<string>冗余数据切割和标签映射</string>
</property>
<layout class="QGridLayout" name="gridLayout_2" rowstretch="7,3" columnstretch="4,1">
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>日志</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QTextBrowser" name="textBrowser_info"/>
</item>
</layout>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>确定数据</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5" stretch="2,2,2,1,1">
<item>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>需要切割的通道名:</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPlainTextEdit" name="plainTextEdit_channel"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6" stretch="1,1">
<item>
<widget class="QLabel" name="label_6">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>需要映射的标签:</string>
</property>
</widget>
</item>
<item>
<widget class="QPlainTextEdit" name="plainTextEdit_label"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_show">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>点击执行以开始...</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QProgressBar" name="progressBar">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pushButton_execute">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>执行</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="action_selectPath">
<property name="text">
<string>数据路径选择</string>
</property>
<property name="font">
<font>
<family>黑体</family>
<pointsize>14</pointsize>
</font>
</property>
</action>
<action name="action">
<property name="text">
<string>加载存档</string>
</property>
<property name="font">
<font>
<family>黑体</family>
<pointsize>14</pointsize>
</font>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,5 +1,62 @@
# 文件命名规范
### 当一份数据被完整走完标注流程后,数据文件夹目录结构将会是:
```
.../Label/<sampID>
|-Artifact_a.txt
|-Artifact_b.txt
|-Artifact_c.csv
|-SQ_label_10s.csv
|-SQ_label_30s.csv
|-Resp_quality_label.txt
|-Tho_peak.txt
|-SA Label_corrected.csv
|-SA Label_add.csv`
.../OrgBCG_Aligned/<sampID>
|-Align_info.txt
|-BCG_Sync_采样率.txt
|-orgBcg_Sync_采样率.txt
|-Jpeak_Sync.txt
.../OrgBCG_Text/<sampID>
|-orgBcg_Raw_采样率.txt
|-BCG_Raw_采样率.txt
|-JPeak_revise.txt
|-JPeak_revise_corrected.txt
.../OrgBCG_Origin/<sampID>
|-...
.../PSG_Aligned/<sampID>
|-Align_info.txt
|-ECG_Sync_采样率.txt
|-Rpeak_Sync.txt
|-5_class_Sync_1.txt
|-SA Label_Sync.csv
|-Effort Abd_Sync_采样率.txt
|-Effort Tho_Sync_采样率.txt
|-Flow Patient_Sync_采样率.txt
|-Snore_Sync_采样率.txt
|-SpO2_Sync_采样率.txt
.../PSG_Text/<sampID>
|-Axxxxxxx.edf
|-ECG II_Raw_采样率.txt
|-ECG_Raw_采样率.txt
|-Rpeak_final.txt
|-Rpeak_final_corrected.txt
|-5_class_Raw_1.txt
|-SA Label_Raw.csv
|-Effort Abd_Raw_采样率.txt
|-Effort Tho_Raw_采样率.txt
|-Flow Patient_Raw_采样率.txt
|-Snore_Raw_采样率.txt
|-SpO2_Raw_采样率.txt
.../PSG_Origin/<sampID>
|-...
.../Receive_Origin
|-...
.../Report
|-...
```
### 1 数据粗同步
输入:
@ -16,7 +73,7 @@
输入:
原始orgBcg信号`./OrgBCG_Text/<sampID>/orgBcg_Raw_采样率.txt`
原始ECG信号`./PSG_Text/<sampID>/ECG I_Raw_采样率.txt`
原始ECG信号`./PSG_Text/<sampID>/ECG II_Raw_采样率.txt`
输出:
@ -25,22 +82,6 @@
### 3 数据精同步
输入:
带通滤波BCG信号`./OrgBCG_Text/<sampID>/BCG_Raw_采样率.txt`
滤波后的ECG信号`./PSG_Text/<sampID>/ECG_Raw_采样率.txt`
输出:
PSG的对齐信息`./PSG_Aligned/<sampID>/Align_info.txt`
同步后的ECG信号`./PSG_Aligned/<sampID>/ECG_Sync_采样率.txt`
同步后的R峰坐标`./PSG_Aligned/<sampID>/Rpeaks_Sync.txt`
同步后的其他PSG通道信号`./PSG_Aligned/<sampID>/通道名_Sync_采样率.txt`
BCG的对齐信息`./OrgBCG_Aligned/<sampID>/Align_info.txt`
同步后的BCG信号`./OrgBCG_Aligned/<sampID>/BCG_Sync_采样率.txt`
同步后的orgBcg信号`./OrgBCG_Aligned/<sampID>/orgBcg_Sync_采样率.txt`
同步后的J峰坐标`./OrgBCG_Aligned/<sampID>/Jpeaks_Sync.txt`
#### 3.1 算法定位
#### 3.1.1 R峰算法定位
@ -95,6 +136,7 @@ BCG的对齐信息`./OrgBCG_Aligned/<sampID>/Align_info.txt`
人工纠正后的R峰坐标`./PSG_Text/<sampID>/Rpeak_final_corrected.txt`
带通滤波BCG信号`./OrgBCG_Text/<sampID>/BCG_Raw_采样率.txt`
人工纠正后的J峰坐标`./OrgBCG_Text/<sampID>/JPeak_revise_corrected.txt`
原始orgBcg信号`./OrgBCG_Text/<sampID>/orgBcg_Raw_采样率.txt`
输出:
@ -112,10 +154,15 @@ BCG的对齐信息`./OrgBCG_Aligned/<sampID>/Align_info.txt`
PSG的对齐信息`./PSG_Aligned/<sampID>/Align_info.txt`
BCG的对齐信息`./OrgBCG_Aligned/<sampID>/Align_info.txt`
原始的其他PSG通道信号`./PSG_Text/<sampID>/通道名_Raw_采样率.txt`通道名包括Effort Abd, Effort Tho, Flow Patient, Snore, SpO2
原始的睡眠分期标签:`./PSG_Text/<sampID>/5_class_Raw_1.txt`
原始的睡眠呼吸暂停事件标签:`./PSG_Text/<sampID>/SA Label_Raw.csv`
输出:
同步后的其他PSG通道信号`./PSG_Aligned/<sampID>/通道名_Sync_采样率.txt`
同步后的其他PSG通道信号`./PSG_Aligned/<sampID>/通道名_Sync_采样率.txt`通道名包括Effort Abd, Effort Tho, Flow Patient, Snore, SpO2
同步后的睡眠分期标签:`./PSG_Aligned/<sampID>/5_class_Sync_1.txt`
同步后的睡眠呼吸暂停事件标签:`./PSG_Aligned/<sampID>/SA Label_Sync.csv`
### 4 体动标记
@ -145,12 +192,7 @@ txt格式的体动标签`./Label/<sampID>/Artifact_a.txt`
输入:
同步后的ECG信号`./PSG_Aligned/<sampID>/ECG_Sync_采样率.txt`
同步后的BCG信号`./OrgBCG_Aligned/<sampID>/BCG_Sync_采样率.txt`
同步后的R峰坐标`./PSG_Aligned/<sampID>/Rpeak_Sync.txt`
同步后的J峰坐标`./OrgBCG_Aligned/<sampID>/Jpeak_Sync.txt`
txt格式的体动标签`./Label/<sampID>/Artifact_a.txt`
质量标签:`./Label/<sampID>/SQ_label_10s.csv``./Label/<sampID>/SQ_label_30s.csv`
输出:
@ -161,7 +203,7 @@ txt格式的体动标签`./Label/<sampID>/Artifact_a.txt`
输入:
同步后的orgBcg信号`./OrgBCG_Aligned/<sampID>/orgBcg_Sync_采样率.txt`
同步后的THO信号`./PSG_Aligned/<sampID>/Effort_Tho_Sync_采样率.txt`
同步后的THO信号`./PSG_Aligned/<sampID>/Effort Tho_Sync_采样率.txt`
txt格式的体动标签`./Label/<sampID>/Artifact_a.txt`
输出:
@ -175,13 +217,14 @@ THO信号呼吸间期标签`./Label/<sampID>/Tho_peak.txt`
同步后的orgBcg信号`./OrgBCG_Aligned/<sampID>/orgBcg_Sync_采样率.txt`
txt格式的体动标签`./Label/<sampID>/Artifact_a.txt`
同步后的FlowT信号`./PSG_Aligned/<sampID>/Effort_Tho_Sync_采样率.txt`
同步后的FlowP信号`./PSG_Aligned/<sampID>/Effort_Tho_Sync_采样率.txt`
同步后的THO信号`./PSG_Aligned/<sampID>/Effort_Tho_Sync_采样率.txt`
同步后的ABD信号`./PSG_Aligned/<sampID>/Effort_Abd_Sync_采样率.txt`
同步后的FlowT信号`./PSG_Aligned/<sampID>/Effort Tho_Sync_采样率.txt`
同步后的FlowP信号`./PSG_Aligned/<sampID>/Effort Tho_Sync_采样率.txt`
同步后的THO信号`./PSG_Aligned/<sampID>/Effort Tho_Sync_采样率.txt`
同步后的ABD信号`./PSG_Aligned/<sampID>/Effort Abd_Sync_采样率.txt`
同步后的SpO2信号`./PSG_Aligned/<sampID>/SpO2_Sync_采样率.txt`
原始呼吸暂停标签:`./PSG_`
同步后的呼吸暂停标签:`./PSG_Aligned/<sampID>/SA Label_Sync.csv`
输出:
修正后的呼吸暂停标签:`./Label/<sampID>/SA Label_corrected.csv`
新增的呼吸暂停标签:`./Label/<sampID>/SA Label_add.csv`