implemented ignorance of incomplete datafiles. Now files with lower than 100 F0 -- points are rejected
This commit is contained in:
71
main.py
71
main.py
@ -42,6 +42,9 @@ STANDARD_FOURIER_COLS = 100
|
|||||||
MAX_PROCESSING_TIME_MS = 250
|
MAX_PROCESSING_TIME_MS = 250
|
||||||
FILES_STORED_N_MAX = 100
|
FILES_STORED_N_MAX = 100
|
||||||
|
|
||||||
|
# Минимально допустимое число точек F0 для принятия данных
|
||||||
|
MIN_F0_POINTS = 100
|
||||||
|
|
||||||
# ПЕРЕЧИСЛЕНИЕ ТИПОВ ДАННЫХ
|
# ПЕРЕЧИСЛЕНИЕ ТИПОВ ДАННЫХ
|
||||||
DATA_TYPE_RAW = "RAW"
|
DATA_TYPE_RAW = "RAW"
|
||||||
DATA_TYPE_SYNC_DET = "SYNC_DET"
|
DATA_TYPE_SYNC_DET = "SYNC_DET"
|
||||||
@ -123,6 +126,14 @@ def resize_2d_interpolate(data, target_rows, target_cols):
|
|||||||
return data_resampled
|
return data_resampled
|
||||||
|
|
||||||
|
|
||||||
|
def is_all_zero(arr: np.ndarray, eps: float = 0.0) -> bool:
|
||||||
|
"""Возвращает True, если все значения массива близки к нулю."""
|
||||||
|
try:
|
||||||
|
return not np.any(np.abs(arr) > eps)
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def BF_fft_postprocessor(spectrum: np.ndarray) -> np.ndarray:
|
def BF_fft_postprocessor(spectrum: np.ndarray) -> np.ndarray:
|
||||||
"""Болванка постобработки FFT-данных, полученных из файла (F4).
|
"""Болванка постобработки FFT-данных, полученных из файла (F4).
|
||||||
@ -201,6 +212,20 @@ def parse_hex_file(filename):
|
|||||||
seg_sync = []
|
seg_sync = []
|
||||||
seg_fourier = []
|
seg_fourier = []
|
||||||
|
|
||||||
|
def _is_all_zero_local(arr_like) -> bool:
|
||||||
|
try:
|
||||||
|
arr = np.asarray(arr_like, dtype=float)
|
||||||
|
return not np.any(np.abs(arr) > 0)
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _f0_is_valid_local(f0_like) -> bool:
|
||||||
|
try:
|
||||||
|
arr = np.asarray(f0_like, dtype=float)
|
||||||
|
return arr.size >= MIN_F0_POINTS and (not _is_all_zero_local(arr))
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
|
||||||
def finalize_segment():
|
def finalize_segment():
|
||||||
nonlocal cur
|
nonlocal cur
|
||||||
# Приоритет выбора сегмента:
|
# Приоритет выбора сегмента:
|
||||||
@ -213,7 +238,7 @@ def parse_hex_file(filename):
|
|||||||
# FOURIER данные получены напрямую из файла (F4)
|
# FOURIER данные получены напрямую из файла (F4)
|
||||||
col = np.asarray(cur["F4"], dtype=float)
|
col = np.asarray(cur["F4"], dtype=float)
|
||||||
col = BF_fft_postprocessor(col)
|
col = BF_fft_postprocessor(col)
|
||||||
if cur["F0"]:
|
if cur["F0"] and _f0_is_valid_local(cur["F0"]):
|
||||||
# Сохраняем F0 рядом с F4 для отображения (без расчёта FFT)
|
# Сохраняем F0 рядом с F4 для отображения (без расчёта FFT)
|
||||||
f0 = np.asarray(cur["F0"], dtype=float)
|
f0 = np.asarray(cur["F0"], dtype=float)
|
||||||
seg_fourier.append((col, f0))
|
seg_fourier.append((col, f0))
|
||||||
@ -227,7 +252,8 @@ def parse_hex_file(filename):
|
|||||||
arr = np.asarray(cur["F3"], dtype=float)
|
arr = np.asarray(cur["F3"], dtype=float)
|
||||||
seg_fourier.append(np.sqrt(np.maximum(0.0, arr)))
|
seg_fourier.append(np.sqrt(np.maximum(0.0, arr)))
|
||||||
elif cur["F0"]:
|
elif cur["F0"]:
|
||||||
seg_sync.append(np.asarray(cur["F0"], dtype=float))
|
if _f0_is_valid_local(cur["F0"]):
|
||||||
|
seg_sync.append(np.asarray(cur["F0"], dtype=float))
|
||||||
elif cur["D0"]:
|
elif cur["D0"]:
|
||||||
seg_raw.append(np.asarray(cur["D0"], dtype=float))
|
seg_raw.append(np.asarray(cur["D0"], dtype=float))
|
||||||
# Сброс
|
# Сброс
|
||||||
@ -1300,6 +1326,47 @@ class DataAnalyzerApp:
|
|||||||
else:
|
else:
|
||||||
original_size = 0
|
original_size = 0
|
||||||
|
|
||||||
|
# Фильтрация неполных/нулевых данных
|
||||||
|
if data_type == DATA_TYPE_SYNC_DET:
|
||||||
|
# SYNC_DET соответствует F0; проверяем минимальную длину и ненулевость
|
||||||
|
if isinstance(A, np.ndarray):
|
||||||
|
arr = A.ravel()
|
||||||
|
if arr.size < MIN_F0_POINTS or is_all_zero(arr):
|
||||||
|
timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
|
||||||
|
reason = f"len={arr.size} < {MIN_F0_POINTS}" if arr.size < MIN_F0_POINTS else "all zeros"
|
||||||
|
print(f"[{timestamp}] ⏭️ SKIP {fname} (SYNC_DET invalid: {reason})")
|
||||||
|
self.skipped_count += 1
|
||||||
|
self.processed_files.add(fname)
|
||||||
|
continue
|
||||||
|
elif isinstance(A, list):
|
||||||
|
filtered = []
|
||||||
|
for seg in A:
|
||||||
|
try:
|
||||||
|
arr = np.asarray(seg, dtype=float).ravel()
|
||||||
|
if arr.size >= MIN_F0_POINTS and (not is_all_zero(arr)):
|
||||||
|
filtered.append(arr)
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
if not filtered:
|
||||||
|
timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
|
||||||
|
print(f"[{timestamp}] ⏭️ SKIP {fname} (SYNC_DET segments invalid)")
|
||||||
|
self.skipped_count += 1
|
||||||
|
self.processed_files.add(fname)
|
||||||
|
continue
|
||||||
|
A = filtered
|
||||||
|
original_size = len(A[0]) if len(A) > 0 else 0
|
||||||
|
|
||||||
|
if data_type == DATA_TYPE_FOURIER:
|
||||||
|
# Для FOURIER: пропускаем полностью пустые/нулевые массивы
|
||||||
|
if isinstance(A, np.ndarray):
|
||||||
|
arr = A.ravel()
|
||||||
|
if arr.size == 0 or is_all_zero(arr):
|
||||||
|
timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
|
||||||
|
print(f"[{timestamp}] ⏭️ SKIP {fname} (FOURIER empty or all zeros)")
|
||||||
|
self.skipped_count += 1
|
||||||
|
self.processed_files.add(fname)
|
||||||
|
continue
|
||||||
|
|
||||||
# Если после парсинга данных нет — пропускаем файл
|
# Если после парсинга данных нет — пропускаем файл
|
||||||
if (isinstance(A, list) and len(A) == 0) or (isinstance(A, np.ndarray) and A.size == 0):
|
if (isinstance(A, list) and len(A) == 0) or (isinstance(A, np.ndarray) and A.size == 0):
|
||||||
timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
|
timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
|
||||||
|
|||||||
Reference in New Issue
Block a user