更新相关计算方法,拆分错误提示

This commit is contained in:
marques
2025-05-14 21:26:26 +08:00
parent 517ad55517
commit 2b5cc322d7

View File

@ -7,12 +7,11 @@ from PySide6.QtWidgets import QMessageBox, QMainWindow, QApplication
from matplotlib.backends.backend_qt import NavigationToolbar2QT from matplotlib.backends.backend_qt import NavigationToolbar2QT
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure from matplotlib.figure import Figure
from numba import prange, njit
from numpy import repeat, convolve, ones, mean, std, empty, int64, sum as np_sum, pad, zeros, array, argmax, linspace, \ from numpy import repeat, convolve, ones, mean, std, empty, int64, sum as np_sum, pad, zeros, array, argmax, linspace, \
diff diff
from overrides import overrides from overrides import overrides
from pandas import read_csv, DataFrame from pandas import read_csv, DataFrame
from scipy.signal import find_peaks, resample, butter, sosfiltfilt from scipy.signal import find_peaks, resample, butter, sosfiltfilt, correlate
from yaml import dump, load, FullLoader from yaml import dump, load, FullLoader
from func.utils.PublicFunc import PublicFunc from func.utils.PublicFunc import PublicFunc
@ -856,10 +855,19 @@ class Data:
self.processed_Abd = None self.processed_Abd = None
def open_file(self): def open_file(self):
if ((not Path(Config["Path"]["Input_orgBcg"]).exists())
or (not Path(Config["Path"]["Input_Tho"]).exists()) if not Path(Config["Path"]["Input_orgBcg"]).exists():
or (not Path(Config["Path"]["Input_Abd"]).exists())): return Result().failure(
return Result().failure(info=Constants.INPUT_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Data_Path_Not_Exist"]) info=Constants.INPUT_FAILURE + "orgBcg: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
"Data_Path_Not_Exist"])
if not Path(Config["Path"]["Input_Tho"]).exists():
return Result().failure(
info=Constants.INPUT_FAILURE + "Tho: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
"Data_Path_Not_Exist"])
if not Path(Config["Path"]["Input_Abd"]).exists():
return Result().failure(
info=Constants.INPUT_FAILURE + "Abd: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
"Data_Path_Not_Exist"])
try: try:
self.raw_orgBcg = read_csv(Config["Path"]["Input_orgBcg"], self.raw_orgBcg = read_csv(Config["Path"]["Input_orgBcg"],
@ -1008,20 +1016,16 @@ class Data:
def calculate_correlation1(self): def calculate_correlation1(self):
# 计算互相关1/2 # 计算互相关1/2
try: try:
# 计算因子
MULTIPLE_FACTOER = ConfigParams.APPROXIMATELY_ALIGN_CONFIG_NEW_CONTENT["Multiple_Factor"]
a = self.processed_Tho[Config["PSGConfig"]["PreCut"]:len(self.processed_Tho) - Config["PSGConfig"]["PostCut"]].copy() a = self.processed_Tho[Config["PSGConfig"]["PreCut"]:len(self.processed_Tho) - Config["PSGConfig"]["PostCut"]].copy()
v = self.processed_orgBcg[Config["orgBcgConfig"]["PreCut"]:len(self.processed_orgBcg) - Config["orgBcgConfig"]["PostCut"]].copy() v = self.processed_orgBcg[Config["orgBcgConfig"]["PreCut"]:len(self.processed_orgBcg) - Config["orgBcgConfig"]["PostCut"]].copy()
a *= 100 a *= MULTIPLE_FACTOER
v *= 100 v *= MULTIPLE_FACTOER
a = a.astype(int64) a = a.astype(int64)
v = v.astype(int64) v = v.astype(int64)
a = pad(a, (len(v) - 1, len(v) - 1), mode='constant') tho_relate = correlate(a, v, mode='full')
tho_relate = zeros(len(a) - len(v) - 1, dtype=int64) tho_relate = tho_relate / (MULTIPLE_FACTOER ** 2)
len_calc = len(a) - len(v) - 1
# 将序列分成一百份来计算
for i in range(100):
tho_relate[i * len_calc // 100:(i + 1) * len_calc // 100] = Data.get_Correlate(a, v, array(
[i * len_calc // 100, (i + 1) * len_calc // 100], dtype=int64))
tho_relate = tho_relate / 10000
tho_relate2 = - tho_relate tho_relate2 = - tho_relate
result = {"tho_relate": tho_relate, "tho_relate2": tho_relate2} result = {"tho_relate": tho_relate, "tho_relate2": tho_relate2}
@ -1039,14 +1043,7 @@ class Data:
v *= 100 v *= 100
a = a.astype(int64) a = a.astype(int64)
v = v.astype(int64) v = v.astype(int64)
a = pad(a, (len(v) - 1, len(v) - 1), mode='constant') abd_relate = correlate(a, v, mode='full')
abd_relate = zeros(len(a) - len(v) - 1, dtype=int64)
len_calc = len(a) - len(v) - 1
# 将序列分成一百份来计算
for i in range(100):
abd_relate[i * len_calc // 100:(i + 1) * len_calc // 100] = Data.get_Correlate(a, v, array(
[i * len_calc // 100, (i + 1) * len_calc // 100], dtype=int64))
abd_relate = abd_relate / 10000 abd_relate = abd_relate / 10000
abd_relate2 = - abd_relate abd_relate2 = - abd_relate
@ -1086,13 +1083,3 @@ class Data:
return Result().success(info=Constants.APPROXIMATELY_EPOCH_GET_FINISHED, data=result) return Result().success(info=Constants.APPROXIMATELY_EPOCH_GET_FINISHED, data=result)
@staticmethod
@njit("int64[:](int64[:],int64[:], int64[:])", nogil=True, parallel=True)
def get_Correlate(a, v, between):
begin, end = between
if end == 0:
end = len(a) - len(v) - 1
result = empty(end - begin, dtype=int64)
for i in prange(end - begin):
result[i] = np_sum(a[begin + i: begin + i + len(v)] * v)
return result