feat: implement dynamic time-domain LOD zoom, locked axis multipliers, and clean 4-column CSV export

This commit is contained in:
pchang718
2026-05-26 14:48:04 +08:00
parent 0140b0495c
commit 8caa8918d0
7 changed files with 499267 additions and 44 deletions
+19 -9
View File
@@ -59,15 +59,25 @@ A reactive "Single Page Application" (SPA) approach.
- **API `/api/filter`**: 接收檔案 ID 與係數參數,返回兩組數列(Float / Fixed)。
- **UI 圖表**: 同時繪製兩條曲線,讓開發者直觀判斷量化是否導致不穩定 (Instability) 或顯著失真。
### 3. 高效能資料處理架構 (High-Performance Data Processing)
- **檔案快取與防呆**:
- 支援高達 **300 MB** 的 CSV 檔案上傳
- 當檔案被選擇後,立即背景上傳至後端暫存區 (`temp_csv/`),避免重複傳輸
- 嚴格限制時域運算最多處理 **1,200,000 筆** 資料點,保護伺服器不因 O(N) 的純 Python 整數運算而死當。
- **精準記憶體讀取**:
- 利用 Pandas 的 `usecols` 參數,僅載入使用者選定的單一訊號欄位,極大幅度降低記憶體佔用。
- **即時預覽 (Live Preview)**:
- 透過前端的 Debounce 機制 (500ms),當使用者點擊 +/- 按鈕微調 Q-format 參數或係數時,系統會自動使用快取的檔案呼叫 API 並重繪圖表,達成無縫且直覺的實驗體驗。
### 3. 高效能資料處理與區域高畫質重取樣架構 (Adaptive LOD & Resampling)
- **區域高畫質重取樣 (LOD Zoom Resampling)**:
- 當使用者在前端圖表進行 Zoom / Pan 縮放時,系統會捕捉可視的時序區間,轉換成數列 Index,向後端發送包含 `start_idx``end_idx` 的 Form 參數
- 後端保持**全時域 IIR 濾波器狀態暫存與記憶運算**(保證濾波響應的物理與數學狀態 100% 正確),但僅針對該可視區間進行切片 (Slice) 並降採樣至 5,000 點傳回,在大幅減少頻寬的同時,讓使用者在 Zoom In 後依然能看到最高精度的時域微小细節(如量化雜訊與過渡漣波)
- **時序比例鎖定 (Stable Time Scaling)**:
- 將時間軸單位與 multiplier 在波形**首次全載入時進行計算與鎖定**(如 `ms``μs``s`),避免了 Plotly `uirevision` 狀態因 Zoom In 觸發單位動態改變所引發的座標軸錯位(Clashing)。
- **重繪遞迴鎖定旗標 (Redraw Loop Lock)**:
- 實作了 `isRedrawingTimePlot` 狀態鎖。在前端執行 `Plotly.react()` 佈局重繪時,自動遮蔽並忽略所引發的同步 `plotly_relayout` 佈局回呼,完全消除了繪圖重繪與 API 請求之間的 recursive 無窮迴圈,保證在 50 萬筆大資料下縮放依然流暢。
### 4. 限縮數據全新 CSV 匯出與多長度支援 (Restructured Export & NaN-Dropping)
- **精簡 4 欄 CSV 結構**:
- 匯出下載功能不再沿用並污染原本包含無數無關欄位的上傳 CSV 檔案,而是主動為使用者建構並匯出一個**全新、精簡的 4 欄式專屬 CSV 檔案**:
1. `Time (s)`:由前端傳送取樣率 `fs`,後端根據實際數據點 Index 精確計算之秒數時間軸。
2. `[原輸入欄位]`:去除無效欄位與尾部 NaN 的原始時域輸入。
3. `[原輸入欄位]_filtered_ideal`:理想浮點數二階級聯濾波器輸出。
4. `[原輸入欄位]_filtered_fixed`:定點數硬體級 Round/Floor 濾波器模擬輸出。
- **不同訊號長度支援 (NaN-Dropping)**:
- 後端 CSV 處理器支援每一訊號欄位擁有**獨立的實體有效長度**。當資料讀入時,後端會自動套用 `.dropna()` 拋棄尾部空白 `NaN`,並將系統點數 `total_points` 動態截斷為實際有效長度(例如 Step 預設訊號自動截斷為 `100 ms` 的 10,001 行,McDonald's Wave 自動截斷為 `200 ms` 的 20,001 行),極大提升了模擬運算速度與匯出精準度。
- 同時實施了索引遮罩比對 `(numeric_nans & ~original_nans)`,能精準區分「因長度不足產生的尾部空白」與「因 CSV 資料損毀產生的非數值字串 (如 bad)」,確保上傳檔案的安全驗證防線不被破壞。
---