8.2 KiB
8.2 KiB
DSP Bode Plot 專案進度總結 (2026-05-15)
1. 核心功能優化 (DSP & 定點數運算)
- 細部微調 (Fine-tuning):實施了基於
\delta(Delta) 與r(Radius) 的參數化微調。 - 定點數精確度修正:採用「兩倍值整數運算」邏輯,解決了
0.5步階在浮點數圓整時產生的「按鍵沒反應」Bug。 - 防止漂移 (Oscillation Logic):針對數位微調,實施了奇偶震盪平衡邏輯。當調整
\delta導致r必須隨動時,採用震盪補償防止r產生單向累積誤差。 - 參數連動策略:在
0.5步階時,採取「優先滿足目標變動」原則。若調整 $\delta$,則r隨動;反之亦然。
2. UI/UX 介面調整
- 側邊欄優化:
- 將
r與\delta的調整區域改為垂直堆疊,適應 21rem 的窄邊欄。 - 移除冗餘的
a1, a2預覽方塊,僅保留帶有數學公式標籤的r, \delta預覽。
- 將
- 步階序列:數位微調步階改為自訂序列:
[0.5, 1, 2, 4, 8, 32, 256, 1024, 4096, 16384, 65536]。 - 微調量顯示:統一使用
±符號並帶空格(例如± 0.5)。 - 智能禁用:當數位步階為
0.5時,自動禁用r的控制項,確保以\delta為主導。
3. 繪圖系統 (Bode Plot)
- 幅值圖 (Magnitude):
- 初始範圍:基於 $systemGain \times 3$,涵蓋 $70 \text{ dB}$。
- 保留手動彈性:設定為
fixedrange: false,支援滑鼠縮放與 Auto Scale。 - 狀態保持:使用
uirevision,確保微調參數時不會跳回初始縮放。
- 相位圖 (Phase):
- 絕對鎖死:固定範圍為 $[-180^\circ, 180^\circ]$。
- 禁止縮放:設定為
fixedrange: true,提供穩定的絕對參考。
- 座標軸連動:幅值圖與相位圖的 X 軸(頻率)已完全同步。不論在哪一張圖進行橫向縮放,兩者都會連動。
4. 數學公式參考
- 理想空間:
a1 = -1 - r + \deltaa2 = r + \delta
- 定點數空間 (Q14 為例):
a0 = 2^{14} = 16384a1 = -a0 - r + \deltaa2 = r + \delta2\delta = a1 + a2 + a02r = a2 - a1 - a0
5. 目前 Git 狀態
- 當前分支:
dev-v2-rounding-fix-20260517(已推送到 origin)。 - 同步說明:此版本包含了 Rounding 功能、Vite proxy 修復與 production build。
- 同事試用指令:
git fetch git checkout dev-v2-rounding-fix-20260517
Last Updated: 2026-05-15 17:47
DSP Bode Plot 專案進度更新 (2026-05-17)
6. 定點數 Rounding 模擬 (V2 Feature)
- Round (+0.5 補償) 功能:在
integer_lfilter()中實作了硬體級四捨五入模擬,使用(acc + (1 << (shift - 1))) >> shift取代傳統的acc >> shift(Floor)。 - UI 控制:於「定點數模擬設定」區塊新增 Floor (SRA) / Round (+0.5) 互斥按鈕(與「階數 Order」相同風格),放置於 Q_in / Q_out 同列。預設為 Round。
- API 參數:
/api/filter與/api/filter/download端點已支援use_round參數。 - 高精度狀態變數架構:前饋 (Feed-forward) 不右移,保留完整
Q_{in+b}精度;僅回授 (Feedback) 與最終輸出做位移縮放。
7. Vite Proxy 修正
- Bug 修正:
vite.config.js的 proxy target 從https://修正為http://,與 uvicorn 的實際 HTTP 協議一致。
⚠️ 踩雷紀錄 (Lessons Learned)
🔴 Production Build 未同步 (2026-05-17)
症狀:修改了 src/app-options.js 與 src/App.vue 後,UI 按鈕有出現但功能完全不生效(Round/Floor 切換後濾波器輸出完全沒變化)。花了大量時間除錯。
根因:使用者透過 http://localhost:8000/ui/ 存取系統。FastAPI 直接 serve static/build/app.js,而該檔案停留在 5 月 15 日的舊版(距今超過一天)。所有前端修改都只存在於 src/ 原始碼,從未被 npm run build 編譯輸出。
解法:修改 src/ 後務必執行 npm run build,再 Ctrl+Shift+R 硬重新整理瀏覽器。
預防措施:
- 開發時優先使用
http://localhost:5173/(Vite dev server,自動 HMR)。 - 若使用 port 8000,每次修改前端程式碼後必須 build。
- 詳見
ARCHITECTURE.md的「Development Environment Notes」章節。
🟡 Vite Proxy https/http 不匹配 (2026-05-17)
症狀:Vite dev server 的 API 轉發全部失敗 (502),uvicorn 日誌大量出現 Invalid HTTP request received.。
根因:vite.config.js 設定了 target: 'https://127.0.0.1:8000',但 uvicorn 以 HTTP 模式啟動。Vite proxy 嘗試發送 TLS 握手封包到純 HTTP 伺服器。
解法:將 proxy target 改為 http://127.0.0.1:8000,移除 secure: false。
Last Updated: 2026-05-17 00:43
DSP Bode Plot 專案進度更新 (2026-05-17 - 第二階段重構與優化)
8. 回授變數命名重構與物理意義釐清
- 變數命名精確化:為消除舊版回授項以
fb_開頭容易讓工程師誤解為b係數的命名混淆,將dea/csv_processing.py的變數全面更名:fb_sum\rightarrowsum_a(回授 a 累加項)fb_shifted\rightarrowsum_a_scaled(已除以A_0歸一化後的回授項)acc運算直接更新為直觀的acc = sum_b - sum_a_scaled,完全與數學公式鏡像對齊。
- 明確白話文檔指引:在根目錄與 bodeplot 目錄下的
INTEGER_FILTER_IMPLEMENTATION.md文件中,新增了兩項白話物理意義說明:- 為什麼回授部分除以 $A_0$?(假設 $A_0 = 1$,放大後即為 $2^{Q_a}$,除以
A_0等同於算術右移shift_a,旨在消去Q_a放大的效應以防數值爆炸)。 - 為什麼輸入訊號
x與前饋b不用中間歸一化?(說明為了防止小數精度因中間右移而被截斷丟棄,故意將高精度一路鎖在歷史狀態變數中,延遲至最終輸出時才進行一次性對齊,藉此獲得最大 SNR 與最佳效能)。 - 加註 Floor 模式的警告:加註
(無條件捨去,非常不建議),指引工程師優先使用 Round 補償。
- 為什麼回授部分除以 $A_0$?(假設 $A_0 = 1$,放大後即為 $2^{Q_a}$,除以
9. 韌體 C 語言實作最佳化 (32-bit MCU Optimization)
- 32位元整數重構:為避免 64 位元除法/乘法在 32 位元微處理器(如 ARM Cortex-M 或是 RISC-V RV32I)上引發昂貴的軟體模擬消耗,將
INTEGER_FILTER_IMPLEMENTATION.md中提供的 C 語言 Process 範例全部改為由int32_t為核心的高效能版本。
10. Vite HTTPS Proxy & SSL 完全對齊
- HTTPS 代理修復:為同時支援 Web Serial API(瀏覽器實體連接埠,要求 HTTPS 協議)與 Vite 5173 的自動熱更新開發,將
vite.config.js的 proxy target 更新為https://127.0.0.1:8000,並加上secure: false(允許繞過自簽憑證限制),徹底解決了前端對代理伺服器發送明文請求所導致的Failed to execute 'json' on 'Response': Unexpected end of JSON input報錯。
11. 目前 Git 狀態與 GitLab 同步
- 當前分支:
dev-v2-integretimedomain - 提交與推送:已經將最新的變數重構、32-bit C 代碼優化、Vite HTTPS Proxy 更新成功 commit 並 Push 至 GitLab 遠端儲存庫,分支版控狀態極其乾淨。
Last Updated: 2026-05-17 14:26
DSP Bode Plot 專案進度更新 (2026-05-21 - 多級串聯濾波器支援)
12. 實作多級串聯濾波器 (Cascade of Biquads / SOS)
- UI/UX 升級:前端新增多階段 (Stages) 濾波器管理介面,支援動態新增、刪除、上下排序以及單一 Stage 的啟用與禁用。
- API 擴充:後端新增
/api/bode/compare_cascade支援串聯頻率響應計算,並修改/api/filter與/api/filter/download以支援時域訊號的串聯處理。 - 工程對齊:徹底落實
INTEGER_FILTER_IMPLEMENTATION.md第 7 節強調的「二階級聯黃金法則」,避免了直接將高階濾波器展開成 Direct Form 所帶來的極點靈敏度暴增及數值不穩定問題。
13. 目前 Git 狀態與 GitLab 同步
- 當前分支:
cascadedfilters - 提交與推送:已將多級串聯 (Cascade) 的完整實作獨立建立為
cascadedfilters分支,並推送至 GitLab 以供後續檢視與整合。
Last Updated: 2026-05-21 14:19