From 5568651cc319e2a13cf307bd47b38d55185adf52 Mon Sep 17 00:00:00 2001 From: ws50529 Date: Tue, 5 May 2026 16:16:34 +0800 Subject: [PATCH] Initial commit --- .gitignore | 38 +++ README.md | 71 +++++ dea.service | 14 + dea_api.py | 203 ++++++++++++++ dea_legacy.py | 691 ++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 6 + static/app.js | 392 ++++++++++++++++++++++++++ static/index.html | 503 +++++++++++++++++++++++++++++++++ static/logo.png | Bin 0 -> 153804 bytes static/style.css | 149 ++++++++++ 10 files changed, 2067 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 dea.service create mode 100755 dea_api.py create mode 100755 dea_legacy.py create mode 100644 requirements.txt create mode 100644 static/app.js create mode 100644 static/index.html create mode 100644 static/logo.png create mode 100644 static/style.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5d990fa --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +.venv/ +venv/ +ENV/ +env/ +.env + +# Distribution / packaging +dist/ +build/ +*.egg-info/ + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Jupyter Notebook +.ipynb_checkpoints + +# OS generated files +.DS_Store +.DS_Store? +._* +Thumbs.db +ehthumbs.db +Desktop.ini + +# Agent Skills +.agent/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8f4ad57 --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# Difference Equation Analyzer 專案維護指引 + +本文件提供 `diff-eq-analyzer` 專案的日常維護、環境更新與故障排除指南。 + +## 1. 系統服務管理 (Systemd) + +本專案的後端 API (FastAPI) 以 systemd 服務 (`dea.service`) 的形式在背景執行。 + +### 常用指令 + +* **查看服務狀態:** + ```bash + sudo systemctl status dea.service + ``` +* **啟動服務:** + ```bash + sudo systemctl start dea.service + ``` +* **停止服務:** + ```bash + sudo systemctl stop dea.service + ``` +* **重新啟動服務(更新程式碼後必備):** + ```bash + sudo systemctl restart dea.service + ``` +* **查看即時日誌 (Logs):** + ```bash + sudo journalctl -u dea.service -f + ``` + +## 2. 虛擬環境與套件管理 + +專案使用 Python 虛擬環境 (`.venv`) 隔離依賴套件。若您需要更新套件或是因移動專案路徑導致環境異常,請依下列步驟重建虛擬環境: + +1. **進入專案目錄:** + ```bash + cd /home/wisetop/diff-eq-analyzer + ``` +2. **刪除舊的虛擬環境並重建:** + ```bash + rm -rf .venv + python3 -m venv .venv + ``` +3. **安裝必要套件:** + ```bash + .venv/bin/pip install -r requirements.txt + ``` +4. **重新啟動系統服務以套用新環境:** + ```bash + sudo systemctl restart dea.service + ``` + +## 3. 常見問題排除 + +### 3.1 服務無法啟動 (status=203/EXEC) +* **原因:** 通常是因為 Python 虛擬環境的路徑錯誤,或是啟動腳本 (`uvicorn`) 內部寫死的絕對路徑與實際位置不符(例如專案資料夾被重新命名)。 +* **解法:** 參考上方的「虛擬環境與套件管理」,將 `.venv` 刪除並重新安裝,然後重啟 `dea.service` 即可。 + +### 3.2 網頁無法連線 +* **檢查後端狀態:** 執行 `sudo systemctl status dea.service` 確認 FastAPI 伺服器是否正常運作中(應顯示 `Active: active (running)`)。 +* **檢查防火牆設定:** 預設使用的 Port 為 `8000`,請確認防火牆或安全群組允許 `8000` 埠的入站連線。 +* **檢查綁定 IP:** 服務預設綁定於 `0.0.0.0`,代表接受所有網路介面的連線。如需限制,請修改 `dea.service` 內的 `ExecStart` 參數。 + +## 4. 變更專案設定檔 +若您修改了 `dea.service`(位於專案目錄內或 `/etc/systemd/system/dea.service`),請務必執行下列指令讓系統重新載入設定: + +```bash +sudo systemctl daemon-reload +sudo systemctl restart dea.service +``` diff --git a/dea.service b/dea.service new file mode 100644 index 0000000..e890e84 --- /dev/null +++ b/dea.service @@ -0,0 +1,14 @@ +[Unit] +Description=Difference Equation Analyzer FastAPI Server +After=network.target + +[Service] +User=wisetop +WorkingDirectory=/home/wisetop/diff-eq-analyzer +Environment="PATH=/home/wisetop/diff-eq-analyzer/.venv/bin" +ExecStart=/home/wisetop/diff-eq-analyzer/.venv/bin/uvicorn dea_api:app --host 0.0.0.0 --port 8000 +Restart=always +RestartSec=3 + +[Install] +WantedBy=multi-user.target diff --git a/dea_api.py b/dea_api.py new file mode 100755 index 0000000..dd0b549 --- /dev/null +++ b/dea_api.py @@ -0,0 +1,203 @@ +import numpy as np +import pandas as pd +from scipy import signal +from fastapi import FastAPI, File, UploadFile, Form, HTTPException, Request +from fastapi.staticfiles import StaticFiles +from pydantic import BaseModel +from typing import List, Optional +import io +from fastapi.responses import StreamingResponse, RedirectResponse, JSONResponse +import ipaddress + +app = FastAPI(title="Difference Equation Analyzer API") + +@app.middleware("http") +async def restrict_to_lan(request: Request, call_next): + client_ip = request.client.host + if client_ip: + try: + ip_obj = ipaddress.ip_address(client_ip) + if not (ip_obj.is_private or ip_obj.is_loopback): + return JSONResponse(status_code=403, content={"detail": "Access Denied: Only LAN connections are allowed."}) + except ValueError: + pass + return await call_next(request) + +# 掛載靜態網頁檔案,將預設首頁導向到 /ui/ +app.mount("/ui", StaticFiles(directory="static", html=True), name="static") + +@app.get("/") +def redirect_to_ui(): + return RedirectResponse(url="/ui/") + +class DesignParams(BaseModel): + filter_type: str + fs: float + lp_fc: float = 1000.0 + lp_order: int = 1 + hp_fc: float = 1000.0 + hp_order: int = 1 + bp_f_low: float = 500.0 + bp_f_high: float = 2000.0 + bp_order: int = 1 + notch_f0: float = 120.0 + notch_q: float = 1.0 + opoz_fz: float = 15000.0 + opoz_fp: float = 10.0 + tptz_fz1: float = 200.0 + tptz_fz2: float = 25000.0 + tptz_fp1: float = 10.0 + tptz_fp2: float = 5000.0 + pid_kp: float = 0.003 + pid_ki: float = 10.0 + pid_kd: float = 0.000016 + sogi_f0: float = 60.0 + sogi_k: float = 1.414 + +class BodeParams(BaseModel): + b: List[float] + a: List[float] + fs: float + +@app.post("/api/design") +def design_filter(params: DesignParams): + fs_val = params.fs + f_type = params.filter_type + b_new, a_new = [], [] + + try: + if f_type == "Lowpass (低通)": + b_new, a_new = signal.butter(params.lp_order, params.lp_fc, btype='low', fs=fs_val) + elif f_type == "Highpass (高通)": + b_new, a_new = signal.butter(params.hp_order, params.hp_fc, btype='high', fs=fs_val) + elif f_type == "Bandpass (帶通)": + f_low, f_high = params.bp_f_low, params.bp_f_high + if f_low >= f_high: f_low = f_high * 0.99 + b_new, a_new = signal.butter(params.bp_order, [f_low, f_high], btype='bandpass', fs=fs_val) + elif f_type == "Notch (陷波器)": + b_new, a_new = signal.iirnotch(params.notch_f0, params.notch_q, fs=fs_val) + elif f_type == "1P1Z (一極一零)": + b_s = [1.0, 2 * np.pi * params.opoz_fz] + a_s = [1.0, 2 * np.pi * params.opoz_fp] + b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val) + dc_gain = np.sum(b_new) / np.sum(a_new) + b_new = b_new / dc_gain + elif f_type == "2P2Z (二極二零)": + w_p1, w_p2 = 2 * np.pi * params.tptz_fp1, 2 * np.pi * params.tptz_fp2 + w_z1, w_z2 = 2 * np.pi * params.tptz_fz1, 2 * np.pi * params.tptz_fz2 + b_s = [1.0, w_z1 + w_z2, w_z1 * w_z2] + a_s = [1.0, w_p1 + w_p2, w_p1 * w_p2] + b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val) + dc_gain = np.sum(b_new) / np.sum(a_new) + b_new = b_new / dc_gain + elif f_type == "PID 控制器": + ki_term = params.pid_ki / (2.0 * fs_val) + kd_term = params.pid_kd * fs_val + b0 = params.pid_kp + ki_term + kd_term + b1 = -params.pid_kp + ki_term - 2.0 * kd_term + b2 = kd_term + b_new = [b0, b1, b2] + a_new = [1.0, -1.0, 0.0] + elif f_type == "SOGI-Alpha (帶通)": + w0 = 2 * np.pi * params.sogi_f0 + b_s = [params.sogi_k * w0, 0.0] + a_s = [1.0, params.sogi_k * w0, w0**2] + b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val) + elif f_type == "SOGI-Beta (低通)": + w0 = 2 * np.pi * params.sogi_f0 + b_s = [params.sogi_k * (w0**2)] + a_s = [1.0, params.sogi_k * w0, w0**2] + b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val) + + return {"b": b_new.tolist() if isinstance(b_new, np.ndarray) else b_new, + "a": a_new.tolist() if isinstance(a_new, np.ndarray) else a_new} + except Exception as e: + raise HTTPException(status_code=400, detail=str(e)) + +@app.post("/api/bode") +def calculate_bode(params: BodeParams): + try: + f_min = params.fs / 50000.0 + f_max = params.fs * 3.162 + f_eval = np.logspace(np.log10(f_min), np.log10(f_max), 500) + + # WorN determines frequencies to evaluate at + w, h = signal.freqz(params.b, params.a, worN=f_eval, fs=params.fs) + + mag = 20 * np.log10(np.abs(h) + 1e-12) + phase = np.angle(h, deg=True) + + return { + "freq": f_eval.tolist(), + "mag": mag.tolist(), + "phase": phase.tolist() + } + except Exception as e: + raise HTTPException(status_code=400, detail=str(e)) + +@app.post("/api/filter") +async def filter_csv( + file: UploadFile = File(...), + b: str = Form(...), + a: str = Form(...), + col_idx: int = Form(0) +): + try: + b_vals = [float(x.strip()) for x in b.split(',') if x.strip()] + a_vals = [float(x.strip()) for x in a.split(',') if x.strip()] + + contents = await file.read() + df = pd.read_csv(io.BytesIO(contents)) + + if len(df.columns) <= col_idx: + raise HTTPException(status_code=400, detail="欄位索引超出範圍") + + col_to_filter = df.columns[col_idx] + x_signal = df[col_to_filter].values + + # 套用濾波 + y_signal = signal.lfilter(b_vals, a_vals, x_signal) + + # 準備資料回傳前端進行繪圖 (為了防止過大,可以在此決定是否 downsample,但目前保留原貌) + # 前端收到 JSON 後可自行繪製並產生 CSV + return { + "index": df.index.tolist(), + "original": x_signal.tolist(), + "filtered": y_signal.tolist(), + "col_name": col_to_filter + } + except Exception as e: + raise HTTPException(status_code=400, detail=f"CSV處理失敗: {str(e)}") + +@app.post("/api/filter/download") +async def filter_csv_download( + file: UploadFile = File(...), + b: str = Form(...), + a: str = Form(...), + col_idx: int = Form(0) +): + # 此端點專為產生包含輸出結果的 CSV 檔供下載 + try: + b_vals = [float(x.strip()) for x in b.split(',') if x.strip()] + a_vals = [float(x.strip()) for x in a.split(',') if x.strip()] + + contents = await file.read() + df = pd.read_csv(io.BytesIO(contents)) + + col_to_filter = df.columns[col_idx] + x_signal = df[col_to_filter].values + y_signal = signal.lfilter(b_vals, a_vals, x_signal) + + output_col_name = f"{col_to_filter}_filtered" + df[output_col_name] = y_signal + + csv_buffer = io.StringIO() + df.to_csv(csv_buffer, index=False) + + return StreamingResponse( + iter([csv_buffer.getvalue()]), + media_type="text/csv", + headers={"Content-Disposition": "attachment; filename=filtered_output.csv"} + ) + except Exception as e: + raise HTTPException(status_code=400, detail=f"CSV處理失敗: {str(e)}") diff --git a/dea_legacy.py b/dea_legacy.py new file mode 100755 index 0000000..f4bc6e5 --- /dev/null +++ b/dea_legacy.py @@ -0,0 +1,691 @@ +import streamlit as st +import numpy as np +import pandas as pd +from scipy import signal +import plotly.graph_objects as go +from plotly.subplots import make_subplots +import io + +# 設定網頁標題與佈局 +st.set_page_config(page_title="Difference Equation Analyzer", layout="wide") + +# 透過 CSS 縮小頂部留白與標題大小 +st.markdown(""" + +""", unsafe_allow_html=True) + +st.markdown('
差分方程式 (Difference Equation) 試算與分析環境
', unsafe_allow_html=True) + +# --- 左側欄:濾波器參數設定 --- +st.sidebar.header("濾波器係數設定") +st.sidebar.markdown("
", unsafe_allow_html=True) +# st.sidebar.markdown("請輸入差分方程式的係數,以逗號分隔。") + +# 1. 初始化 Session State 與邊界條件 +if 'b_str' not in st.session_state: + st.session_state.b_str = "0.5, 0.5, 0.0, 0.0" +if 'a_str' not in st.session_state: + st.session_state.a_str = "1.0, 0.0, 0.0, 0.0" + +def apply_constraints(val): + # 放寬限制,回歸純數學運算的 Float64 本質 + # 真正的 Dynamic Range 與 Quantization Error 會在 v1 的 fixed-point 模組中處理 + return val + +def parse_to_padded_list(coeff_str, length=4): + try: + vals = [float(x.strip()) for x in coeff_str.split(',') if x.strip()] + except ValueError: + vals = [] + # 套用限制 + vals = [apply_constraints(v) for v in vals] + while len(vals) < length: + vals.append(0.0) + return vals[:length] + +def format_exact_val(x): + # 用於還原文字框或濾波器設計,提供 10 位有效數字確保數學精度 + return f"{x:.10g}" + +def format_slider_val(x): + # 用於拉桿微調時,只需顯示 6 位有效數字避免畫面過度冗長 + return f"{x:g}" + +def update_base_b(): + b_vals = parse_to_padded_list(st.session_state.b_str, length=7) + st.session_state.base_b = b_vals + for i in range(7): + st.session_state[f'b_slider_{i}'] = 0.0 + st.session_state.b_str = ", ".join(map(format_exact_val, b_vals)) + +def update_base_a(): + a_vals = parse_to_padded_list(st.session_state.a_str, length=7) + a_vals[0] = 1.0 + st.session_state.base_a = a_vals + for i in range(1, 7): + st.session_state[f'a_slider_{i}'] = 0.0 + st.session_state.a_str = ", ".join(map(format_exact_val, a_vals)) + +def update_base_from_text(): + update_base_b() + update_base_a() + +def reset_sliders_b(): + for i in range(7): + st.session_state[f'b_slider_{i}'] = 0.0 + st.session_state.b_str = ", ".join(map(format_exact_val, st.session_state.base_b)) + +def reset_sliders_a(): + for i in range(1, 7): + st.session_state[f'a_slider_{i}'] = 0.0 + st.session_state.a_str = ", ".join(map(format_exact_val, st.session_state.base_a)) + +def update_text_from_sliders(): + current_b = [] + current_a = [1.0] # a0 固定為 1.0 + + for i in range(7): + log_val = st.session_state.get(f'b_slider_{i}', 0.0) + m_b = 10.0 ** log_val + val_b = apply_constraints(st.session_state.base_b[i] * m_b) + current_b.append(val_b) + + for i in range(1, 7): + log_val = st.session_state.get(f'a_slider_{i}', 0.0) + m_a = 10.0 ** log_val + val_a = apply_constraints(st.session_state.base_a[i] * m_a) + current_a.append(val_a) + + st.session_state.b_str = ", ".join(map(format_slider_val, current_b)) + st.session_state.a_str = ", ".join(map(format_slider_val, current_a)) + +def apply_filter_design(): + f_type = st.session_state.get('filter_type', "(無) 手動自訂") + if f_type == "(無) 手動自訂": + return + + fs_val = st.session_state.get('sys_fs', 100000.0) + b_new, a_new = [], [] + + try: + if f_type == "Lowpass (低通)": + order = st.session_state.get('lp_order', 1) + fc = st.session_state.get('lp_fc', 1000.0) + b_new, a_new = signal.butter(order, fc, btype='low', fs=fs_val) + elif f_type == "Highpass (高通)": + order = st.session_state.get('hp_order', 1) + fc = st.session_state.get('hp_fc', 1000.0) + b_new, a_new = signal.butter(order, fc, btype='high', fs=fs_val) + elif f_type == "Bandpass (帶通)": + order = st.session_state.get('bp_order', 1) + f_low = st.session_state.get('bp_f_low', 500.0) + f_high = st.session_state.get('bp_f_high', 2000.0) + # 防呆:確保 f_low 必定小於 f_high + if f_low >= f_high: + f_low = f_high * 0.99 + b_new, a_new = signal.butter(order, [f_low, f_high], btype='bandpass', fs=fs_val) + elif f_type == "Notch (陷波器)": + f0 = st.session_state.get('notch_f0', 120.0) + q = st.session_state.get('notch_q', 1.0) + b_new, a_new = signal.iirnotch(f0, q, fs=fs_val) + elif f_type == "1P1Z (一極一零)": + fp = st.session_state.get('opoz_fp', 10.0) + fz = st.session_state.get('opoz_fz', 15000.0) + # s-domain: H(s) = (s + 2*pi*fz) / (s + 2*pi*fp) + b_s = [1.0, 2 * np.pi * fz] + a_s = [1.0, 2 * np.pi * fp] + b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val) + # 歸一化 DC Gain + dc_gain = np.sum(b_new) / np.sum(a_new) + b_new = b_new / dc_gain + elif f_type == "2P2Z (二極二零)": + fp1 = st.session_state.get('tptz_fp1', 10.0) + fp2 = st.session_state.get('tptz_fp2', 5000.0) + fz1 = st.session_state.get('tptz_fz1', 200.0) + fz2 = st.session_state.get('tptz_fz2', 25000.0) + w_p1, w_p2 = 2 * np.pi * fp1, 2 * np.pi * fp2 + w_z1, w_z2 = 2 * np.pi * fz1, 2 * np.pi * fz2 + b_s = [1.0, w_z1 + w_z2, w_z1 * w_z2] + a_s = [1.0, w_p1 + w_p2, w_p1 * w_p2] + b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val) + # 歸一化 DC Gain + dc_gain = np.sum(b_new) / np.sum(a_new) + b_new = b_new / dc_gain + elif f_type == "PID 控制器": + kp = st.session_state.get('pid_kp', 0.003) + ki = st.session_state.get('pid_ki', 10.0) + kd = st.session_state.get('pid_kd', 0.000016) + + # 工業界標準數位 PID 實作 (Position Form): + # 積分項採用 Tustin (Bilinear):Ki * (Ts/2) * (z+1)/(z-1) + # 微分項採用 後向歐拉 (Backward Euler) 以避免 Nyquist 震盪:Kd * (1/Ts) * (z-1)/z + # 為了得到整齊的差分方程式 y[n] = y[n-1] + ...,我們將分母通分為 (z-1) + # H(z) = Kp + Ki*(Ts/2)*(1+z^-1)/(1-z^-1) + Kd*fs*(1-z^-1) + + ki_term = ki / (2.0 * fs_val) + kd_term = kd * fs_val + + b0 = kp + ki_term + kd_term + b1 = -kp + ki_term - 2.0 * kd_term + b2 = kd_term + + b_new = [b0, b1, b2] + a_new = [1.0, -1.0, 0.0] # 分母為 1 - z^-1 (標準積分器 y[n] = y[n-1] + ...) + + elif f_type == "SOGI-Alpha (帶通)": + f0 = st.session_state.get('sogi_f0', 60.0) + k = st.session_state.get('sogi_k', 1.414) + w0 = 2 * np.pi * f0 + b_s = [k * w0, 0.0] + a_s = [1.0, k * w0, w0**2] + b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val) + + elif f_type == "SOGI-Beta (低通)": + f0 = st.session_state.get('sogi_f0', 60.0) + k = st.session_state.get('sogi_k', 1.414) + w0 = 2 * np.pi * f0 + b_s = [k * (w0**2)] + a_s = [1.0, k * w0, w0**2] + b_new, a_new = signal.bilinear(b_s, a_s, fs=fs_val) + + if len(b_new) > 0 and len(a_new) > 0: + st.session_state.b_str = ", ".join([f"{x:.10g}" for x in b_new]) + st.session_state.a_str = ", ".join([f"{x:.10g}" for x in a_new]) + update_base_from_text() + except Exception as e: + pass + +if 'base_b' not in st.session_state or len(st.session_state.base_b) < 7: + update_base_from_text() + +# b 係數區塊 +st.sidebar.text_input("前饋分子係數對應輸入訊號 (b0 ~ b6)", key='b_str', on_change=update_base_b) +with st.sidebar.expander("b 係數倍率微調", expanded=False): + col1, col2 = st.columns([3, 1]) + with col1: + sense_b = st.radio("靈敏度", options=["1%", "2x", "10x"], index=1, horizontal=True, label_visibility="collapsed", key="sense_b", on_change=update_base_b) + with col2: + st.button("重置", on_click=reset_sliders_b, key="btn_reset_b", use_container_width=True) + max_log_b = np.log10(1.01) if sense_b == "1%" else (np.log10(2.0) if sense_b == "2x" else 1.0) + + first_b = True + for i in range(7): + if st.session_state.base_b[i] == 0.0: + continue + label = f"b{i} (基準: {format_exact_val(st.session_state.base_b[i])})" + margin_top = "0px" if first_b else "15px" + first_b = False + st.markdown(f"
{label}
", unsafe_allow_html=True) + st.slider( + f"_{label}", + min_value=float(-max_log_b), max_value=float(max_log_b), step=float(max_log_b / 100.0), + key=f'b_slider_{i}', + on_change=update_text_from_sliders, + label_visibility="collapsed" + ) + +st.sidebar.markdown("---") + +# a 係數區塊 +st.sidebar.text_input("回饋分母係數對應輸出訊號 (a0=1, a1 ~ a6)", key='a_str', on_change=update_base_a) +with st.sidebar.expander("a 係數倍率微調", expanded=False): + col1, col2 = st.columns([3, 1]) + with col1: + sense_a = st.radio("靈敏度", options=["1%", "2x", "10x"], index=1, horizontal=True, label_visibility="collapsed", key="sense_a", on_change=update_base_a) + with col2: + st.button("重置", on_click=reset_sliders_a, key="btn_reset_a", use_container_width=True) + max_log_a = np.log10(1.01) if sense_a == "1%" else (np.log10(2.0) if sense_a == "2x" else 1.0) + + first_a = True + for i in range(1, 7): + if st.session_state.base_a[i] == 0.0: + continue + label = f"a{i} (基準: {format_exact_val(st.session_state.base_a[i])})" + margin_top = "0px" if first_a else "15px" + first_a = False + st.markdown(f"
{label}
", unsafe_allow_html=True) + st.slider( + f"_{label}", + min_value=float(-max_log_a), max_value=float(max_log_a), step=float(max_log_a / 100.0), + key=f'a_slider_{i}', + on_change=update_text_from_sliders, + label_visibility="collapsed" + ) + +# --- 輔助函式:動態轉換為 k 單位標示 --- +def format_k_notation(val): + if val >= 1000: + k_val = val / 1000.0 + # 保留一位小數,若是 .0 則安全去除 (如 100.0k -> 100k) + formatted = f"{k_val:.1f}".rstrip('0').rstrip('.') + return f" (~{formatted}k)" + return "" + +# --- 左側欄:系統參數 --- +st.sidebar.markdown("---") +st.sidebar.header("系統參數") +fs_val = st.session_state.get('sys_fs', 100000.0) +st.sidebar.markdown(f"
取樣頻率 fs (Hz){format_k_notation(fs_val)}
", unsafe_allow_html=True) +fs = st.sidebar.number_input("_fs", min_value=1.0, value=100000.0, step=1000.0, format="%g", key='sys_fs', on_change=apply_filter_design, label_visibility="collapsed") + +# --- 輔助函式:對數滑桿 + 數值輸入框 (微調模式) --- +# 拉桿作為微調工具,範圍固定為當前錨點值的 1/2x ~ 2x (對數等距) +# 滿右 = 錨點 × 2, 中央 = 錨點 × 1, 滿左 = 錨點 × 0.5 +# 拉桿滑動 → 數字框即時更新;數字框 Enter → 拉桿歸中並更新錨點 +def log_slider_input(label, min_val, max_val, default_val, key, on_change=None): + if key not in st.session_state: + st.session_state[key] = default_val + + # 邊界保護 + current_val = st.session_state[key] + if current_val < min_val: current_val = min_val + if current_val > max_val: current_val = max_val + st.session_state[key] = current_val + + # base_log:拉桿中心錨點,只在數字框確認時更新,拉桿滑動時維持不動 + base_log_key = key + '_base_log' + if base_log_key not in st.session_state: + st.session_state[base_log_key] = float(np.log10(current_val)) + base_log = st.session_state[base_log_key] + + # 固定微調範圍 ±log10(2):右滿 = ×2, 左滿 = ×0.5 + FINE_RANGE = np.log10(2.0) # ≈ 0.30103 + slider_min = base_log - FINE_RANGE + slider_max = base_log + FINE_RANGE + + slider_key = key + '_slider' + if slider_key not in st.session_state: + st.session_state[slider_key] = base_log + # 夾回邊界(base_log 更新後保護) + sv = st.session_state[slider_key] + if sv < slider_min: st.session_state[slider_key] = slider_min + if sv > slider_max: st.session_state[slider_key] = slider_max + + def update_from_slider(): + raw_val = 10.0 ** st.session_state[slider_key] + raw_val = max(min_val, min(max_val, raw_val)) + st.session_state[key] = float(f"{raw_val:.6g}") + # 拉桿滑動時不更新 base_log,讓拉桿能真實偏離中心 + if on_change: on_change() + + def update_from_num(): + val = st.session_state[key + '_num'] + if val < min_val: val = min_val + if val > max_val: val = max_val + st.session_state[key] = val + # 數字框確認後:更新錨點,拉桿歸中 + new_log = float(np.log10(val)) if val > 0 else base_log + st.session_state[base_log_key] = new_log + st.session_state[slider_key] = new_log + if on_change: on_change() + + dynamic_step = 10.0 ** (np.floor(np.log10(current_val)) - 1) if current_val > 0 else 0.1 + + k_label = format_k_notation(current_val) + st.sidebar.markdown(f"
{label}{k_label}
", unsafe_allow_html=True) + col1, col2 = st.sidebar.columns([5, 3]) + with col1: + st.slider( + f"_{label}_slider", + min_value=float(slider_min), max_value=float(slider_max), + step=float(FINE_RANGE / 100.0), + key=slider_key, on_change=update_from_slider, + label_visibility="collapsed" + ) + with col2: + st.number_input( + f"_{label}_num", + min_value=float(min_val), max_value=float(max_val), value=float(current_val), + step=float(dynamic_step), + format="%g", key=key + '_num', on_change=update_from_num, + label_visibility="collapsed" + ) + return st.session_state[key] + +# --- 濾波器設計工具 --- +st.sidebar.markdown("---") +st.sidebar.header("濾波器設計工具") +st.sidebar.selectbox("選擇設計範本", ["(無) 手動自訂", "Lowpass (低通)", "Highpass (高通)", "Bandpass (帶通)", "Notch (陷波器)", "1P1Z (一極一零)", "2P2Z (二極二零)", "PID 控制器", "SOGI-Alpha (帶通)", "SOGI-Beta (低通)"], key='filter_type', on_change=apply_filter_design) + +f_type = st.session_state.get('filter_type', "(無) 手動自訂") +nyq = fs / 2.0 +f_min_limit = max(1e-6, fs * 1e-6) +nyq_limit = nyq * 0.999 + +if 'lp_order' not in st.session_state: st.session_state['lp_order'] = 1 +if 'hp_order' not in st.session_state: st.session_state['hp_order'] = 1 +if 'bp_order' not in st.session_state: st.session_state['bp_order'] = 1 + +if f_type == "Lowpass (低通)": + log_slider_input("截止頻率 f_c (Hz)", min_val=f_min_limit, max_val=nyq_limit, default_val=min(1000.0, nyq_limit), key='lp_fc', on_change=apply_filter_design) + st.sidebar.radio("階數 Order", options=[1, 2, 3], horizontal=True, key='lp_order', on_change=apply_filter_design) +elif f_type == "Highpass (高通)": + log_slider_input("截止頻率 f_c (Hz)", min_val=f_min_limit, max_val=nyq_limit, default_val=min(1000.0, nyq_limit), key='hp_fc', on_change=apply_filter_design) + st.sidebar.radio("階數 Order", options=[1, 2, 3], horizontal=True, key='hp_order', on_change=apply_filter_design) +elif f_type == "Bandpass (帶通)": + log_slider_input("下截止頻率 f_low (Hz)", min_val=f_min_limit, max_val=nyq_limit, default_val=min(500.0, nyq_limit), key='bp_f_low', on_change=apply_filter_design) + log_slider_input("上截止頻率 f_high (Hz)", min_val=f_min_limit, max_val=nyq_limit, default_val=min(2000.0, nyq_limit), key='bp_f_high', on_change=apply_filter_design) + st.sidebar.radio("階數 Order", options=[1, 2, 3], horizontal=True, key='bp_order', on_change=apply_filter_design) +elif f_type == "Notch (陷波器)": + log_slider_input("中心頻率 f_0 (Hz)", min_val=f_min_limit, max_val=nyq_limit, default_val=min(120.0, nyq_limit), key='notch_f0', on_change=apply_filter_design) + log_slider_input("品質因數 Q", min_val=0.01, max_val=100.0, default_val=1.0, key='notch_q', on_change=apply_filter_design) +elif f_type == "1P1Z (一極一零)": + log_slider_input("零點頻率 Freq_z (Hz)", min_val=f_min_limit, max_val=fs, default_val=min(15000.0, fs), key='opoz_fz', on_change=apply_filter_design) + log_slider_input("極點頻率 Freq_p (Hz)", min_val=f_min_limit, max_val=fs, default_val=min(10.0, fs), key='opoz_fp', on_change=apply_filter_design) +elif f_type == "2P2Z (二極二零)": + log_slider_input("零點頻率 1 Freq_z1 (Hz)", min_val=f_min_limit, max_val=fs, default_val=min(200.0, fs), key='tptz_fz1', on_change=apply_filter_design) + log_slider_input("零點頻率 2 Freq_z2 (Hz)", min_val=f_min_limit, max_val=fs, default_val=min(25000.0, fs), key='tptz_fz2', on_change=apply_filter_design) + log_slider_input("極點頻率 1 Freq_p1 (Hz)", min_val=f_min_limit, max_val=fs, default_val=min(10.0, fs), key='tptz_fp1', on_change=apply_filter_design) + log_slider_input("極點頻率 2 Freq_p2 (Hz)", min_val=f_min_limit, max_val=fs, default_val=min(5000.0, fs), key='tptz_fp2', on_change=apply_filter_design) +elif f_type == "PID 控制器": + log_slider_input("比例增益 K_p", min_val=1e-6, max_val=1e3, default_val=0.003, key='pid_kp', on_change=apply_filter_design) + log_slider_input("積分增益 K_i", min_val=1e-6, max_val=1e3, default_val=10.0, key='pid_ki', on_change=apply_filter_design) + log_slider_input("微分增益 K_d", min_val=1e-6, max_val=1e3, default_val=0.000016, key='pid_kd', on_change=apply_filter_design) +elif f_type in ["SOGI-Alpha (帶通)", "SOGI-Beta (低通)"]: + log_slider_input("中心頻率 f_0 (Hz)", min_val=f_min_limit, max_val=nyq_limit, default_val=min(60.0, nyq_limit), key='sogi_f0', on_change=apply_filter_design) + log_slider_input("阻尼因數 k", min_val=0.01, max_val=10.0, default_val=1.414, key='sogi_k', on_change=apply_filter_design) + +if f_type != "(無) 手動自訂": + st.sidebar.info("💡 調整上方參數會自動覆寫 a, b 係數。你也可以隨時上去手動修改係數拉桿進行微調!") + +# 解析文字框內最後確認的數值供後續計算使用 +def parse_coeffs(coeff_str, force_a0_one=False): + try: + vals = [float(x.strip()) for x in coeff_str.split(',') if x.strip()] + vals = [apply_constraints(v) for v in vals] + if force_a0_one and len(vals) > 0: + vals[0] = 1.0 + return vals + except ValueError: + return [] + +b = parse_coeffs(st.session_state.b_str) +a = parse_coeffs(st.session_state.a_str, force_a0_one=True) + +if not b: + b = [1.0] +if not a: + a = [1.0] + +# --- 主畫面區塊一:Bode Plot --- +st.header("1. 頻率響應 (Frequency Response)") + +if b and a: + try: + # 依據取樣頻率動態決定 X 軸範圍 (下限: fs/50000, 上限: fs*3.162) + f_min = fs / 50000.0 + f_max = fs * 3.162 + f_eval = np.logspace(np.log10(f_min), np.log10(f_max), 500) + + # 計算頻率響應 (直接給定頻率點 f_eval 與 fs) + w, h = signal.freqz(b, a, worN=f_eval, fs=fs) + + mag = 20 * np.log10(np.abs(h) + 1e-12) # 轉換為 dB + phase = np.angle(h, deg=True) # 計算相位 (度),自動 Wrap 至 [-180, 180] + + # 使用 Plotly 繪製可互動的圖表 (取消 shared_xaxes,讓上下圖都標示 X 軸) + fig_bode = make_subplots(rows=2, cols=1, shared_xaxes=False, + vertical_spacing=0.15, + subplot_titles=("Magnitude Response (大小響應)", "Phase Response (相位響應)")) + + fig_bode.add_trace(go.Scatter(x=f_eval, y=mag, name='Magnitude (dB)', line=dict(color='#1f77b4')), row=1, col=1) + fig_bode.add_trace(go.Scatter(x=f_eval, y=phase, name='Phase (deg)', line=dict(color='#ff7f0e')), row=2, col=1) + + fig_bode.update_layout(height=650, showlegend=False, template="plotly_dark") + + # 產生 1, 2, 5, 10 序列的刻度,動態適應 f_min 和 f_max + x_ticks = [] + x_texts = [] + p_start = int(np.floor(np.log10(f_min))) + p_end = int(np.ceil(np.log10(f_max))) + + for p in range(p_start, p_end + 1): + for m in [1, 2, 5]: + val = m * (10**p) + if val < f_min or val > f_max: + continue + x_ticks.append(val) + # 格式化標籤文字 + if val < 1: + x_texts.append(f"{val:.3g}") + elif val < 1000: + x_texts.append(f"{val:g}") + elif val < 1000000: + x_texts.append(f"{val/1000:g}k") + else: + x_texts.append(f"{val/1000000:g}M") + + # 設定 X 軸為對數座標與 1-2-5 刻度線 + for row in [1, 2]: + fig_bode.update_xaxes( + title_text="Frequency (Hz)", + type="log", + range=[np.log10(f_min), np.log10(f_max)], + tickvals=x_ticks, + ticktext=x_texts, + showgrid=True, + gridcolor="rgba(128,128,128,0.2)", + row=row, col=1 + ) + # 強化 10 的倍數 (1, 10, 100...) 刻度線顏色 (不加太寬以維持美觀) + for p in range(p_start, p_end + 1): + v_line = 10**p + if f_min <= v_line <= f_max: + fig_bode.add_vline(x=v_line, line_width=1.5, line_color="rgba(128,128,128,0.5)", layer="below", row=row, col=1) + + # 標示 Nyquist 頻率和 fs,方便觀察混疊現象 + fig_bode.add_vline(x=fs/2, line_dash="dash", line_color="rgba(255,0,0,0.5)", annotation_text="Nyquist", row=1, col=1) + fig_bode.add_vline(x=fs, line_dash="dash", line_color="rgba(255,0,0,0.5)", annotation_text="fs", row=1, col=1) + fig_bode.add_vline(x=fs/2, line_dash="dash", line_color="rgba(255,0,0,0.5)", row=2, col=1) + fig_bode.add_vline(x=fs, line_dash="dash", line_color="rgba(255,0,0,0.5)", row=2, col=1) + + # 設定 Y 軸 (固定幅度範圍為 -80dB ~ 0dB) + fig_bode.update_yaxes(title_text="Magnitude (dB)", range=[-60, 0], row=1, col=1) + fig_bode.update_yaxes(title_text="Phase (Degrees)", range=[-180, 180], tickvals=[-180, -90, 0, 90, 180], row=2, col=1) + + st.plotly_chart(fig_bode, use_container_width=True) + except Exception as e: + st.error(f"計算 Bode Plot 時發生錯誤,請檢查係數設定。錯誤訊息: {e}") + +# --- 主畫面區塊二:時域訊號探討 --- +st.header("2. 時域訊號探討") +st.markdown("請上傳包含時域訊號的 CSV 檔案,系統會套用上述設定的差分濾波器。") + +uploaded_file = st.file_uploader("上傳輸入訊號 (CSV)", type=["csv"]) + +if uploaded_file is not None: + try: + # 讀取 CSV 檔案 + df = pd.read_csv(uploaded_file) + + st.write("資料預覽 (前五筆):") + st.dataframe(df.head()) + + # 讓使用者選擇要濾波的欄位 (智慧預設:若第一欄看起來像時間戳記,則預設選第二欄) + default_idx = 0 + if len(df.columns) > 1: + first_col = str(df.columns[0]).lower() + if any(kw in first_col for kw in ['time', 't', 'sec', 'x', 'index', 'Unnamed']): + default_idx = 1 + col_to_filter = st.selectbox("請選擇要套用濾波器的訊號欄位:", df.columns, index=default_idx) + + x_signal = df[col_to_filter].values + + # 執行差分方程式濾波 + y_signal = signal.lfilter(b, a, x_signal) + + # 將結果合併回 DataFrame 以便下載 + df_out = df.copy() + output_col_name = f"{col_to_filter}_filtered" + df_out[output_col_name] = y_signal + + # 繪製時域訊號比較圖 + st.subheader("波形比較圖") + fig_time = go.Figure() + + x_axis = df.index + + fig_time.add_trace(go.Scatter(x=x_axis, y=x_signal, name='原始輸入訊號 (Input)', opacity=0.7, line=dict(color='#00cc96'))) + fig_time.add_trace(go.Scatter(x=x_axis, y=y_signal, name='濾波後輸出 (Output)', opacity=0.9, line=dict(color='#ef553b'))) + + fig_time.update_layout( + height=500, + xaxis_title="Sample Index", + yaxis_title="Amplitude", + template="plotly_dark", + legend=dict( + orientation="h", # 水平排列 + yanchor="bottom", + y=1.02, # 置於圖表正上方 + xanchor="right", + x=1 + ) + ) + st.plotly_chart(fig_time, use_container_width=True) + + # 提供下載按鈕 + st.subheader("匯出結果") + csv_buffer = io.StringIO() + df_out.to_csv(csv_buffer, index=False) + + st.download_button( + label="下載包含輸出訊號的 CSV", + data=csv_buffer.getvalue(), + file_name="filtered_output.csv", + mime="text/csv" + ) + + except Exception as e: + st.error(f"處理 CSV 檔案時發生錯誤: {e}") + +st.sidebar.markdown("
", unsafe_allow_html=True) +st.sidebar.markdown("---") +st.sidebar.markdown("
", unsafe_allow_html=True) +st.sidebar.image("WISETOP LOGO-FIN.png", width=150) +st.sidebar.caption("© 2026 喆富創新科技(股). All rights reserved.") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8783c78 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +fastapi>=0.100.0 +uvicorn>=0.23.0 +python-multipart>=0.0.6 +numpy>=1.24.0 +pandas>=2.0.0 +scipy>=1.10.0 diff --git a/static/app.js b/static/app.js new file mode 100644 index 0000000..5906843 --- /dev/null +++ b/static/app.js @@ -0,0 +1,392 @@ +const { createApp } = Vue; + +createApp({ + data() { + return { + fs: 100000.0, + b_str: "0.5, 0.5, 0.0, 0.0", + a_str: "1.0, 0.0, 0.0, 0.0", + filterType: "(無) 手動自訂", + filterOptions: [ + "(無) 手動自訂", "Lowpass (低通)", "Highpass (高通)", + "Bandpass (帶通)", "Notch (陷波器)", "1P1Z (一極一零)", + "2P2Z (二極二零)", "PID 控制器", "SOGI-Alpha (帶通)", "SOGI-Beta (低通)" + ], + params: { + fc: 1000.0, order: 1, + bp_f_low: 500.0, bp_f_high: 2000.0, bp_order: 1, + notch_f0: 120.0, notch_q: 1.0, + opoz_fz: 15000.0, opoz_fp: 10.0, + tptz_fz1: 200.0, tptz_fz2: 25000.0, tptz_fp1: 10.0, tptz_fp2: 5000.0, + kp: 0.003, ki: 10.0, kd: 0.000016, + sogi_f0: 60.0, sogi_k: 1.414, + }, + // 模式切換 + isDarkMode: true, + // 係數倍率微調 + baseB: [0.5, 0.5, 0, 0, 0, 0, 0], + baseA: [1, 0, 0, 0, 0, 0, 0], + bSliders: [0, 0, 0, 0, 0, 0, 0], + aSliders: [0, 0, 0, 0, 0, 0], // a1~a6 (index 0 unused for display but maps to a[1]~a[6]) + sense_b: '2x', sense_a: '2x', + + loadingBode: false, bodeTimeout: null, globalError: null, + csvFile: null, csvColumns: [], csvPreview: [], + selectedColumn: 0, loadingFilter: false, filterDone: false, timePlotData: null, + mobileTab: 'settings', // 手機版頁籤:'settings' | 'chart' + shiftBits: 12, + } + }, + computed: { + maxLogB() { + if (this.sense_b === '1%') return Math.log10(1.01); + if (this.sense_b === '2x') return Math.log10(2.0); + return 1.0; + }, + maxLogA() { + if (this.sense_a === '1%') return Math.log10(1.01); + if (this.sense_a === '2x') return Math.log10(2.0); + return 1.0; + }, + fixedPointCoeffs() { + const scale = Math.pow(2, this.shiftBits); + const b_raw = this.parseCoeffs(this.b_str); + const a_raw = this.parseCoeffs(this.a_str); + + const b = b_raw.map((x, i) => ({ label: `b${i}`, val: Math.round(x * scale) })); + const a = a_raw.map((x, i) => ({ label: `a${i}`, val: Math.round(x * scale) })); + + return { b, a }; + }, + floatingCoeffs() { + const b = this.parseCoeffs(this.b_str).map((x, i) => ({ label: `b${i}`, val: x })); + const a = this.parseCoeffs(this.a_str).map((x, i) => ({ label: `a${i}`, val: x })); + return { b, a }; + } + }, + mounted() { + const savedTheme = localStorage.getItem('theme'); + if (savedTheme) { + this.isDarkMode = savedTheme === 'dark'; + } + if (this.isDarkMode) { + document.documentElement.classList.add('dark'); + } else { + document.documentElement.classList.remove('dark'); + } + this.syncBaseFromText(); + this.updateBodePlot(); + }, + methods: { + toggleDarkMode() { + this.isDarkMode = !this.isDarkMode; + localStorage.setItem('theme', this.isDarkMode ? 'dark' : 'light'); + if (this.isDarkMode) { + document.documentElement.classList.add('dark'); + } else { + document.documentElement.classList.remove('dark'); + } + this.updateBodePlot(); + if (this.timePlotData) { + this.drawTimePlot(this.timePlotData); + } + }, + formatK(val) { + if (val >= 1000000) return `(~${(val / 1000000).toFixed(1).replace('.0', '')}M)`; + if (val >= 1000) return `(~${(val / 1000).toFixed(1).replace('.0', '')}k)`; + return ""; + }, + parseCoeffs(str) { + return str.split(',').map(x => parseFloat(x.trim())).filter(x => !isNaN(x)); + }, + padTo7(arr) { + const r = arr.slice(0, 7); + while (r.length < 7) r.push(0); + return r; + }, + syncBaseFromText() { + this.baseB = this.padTo7(this.parseCoeffs(this.b_str)); + this.baseA = this.padTo7(this.parseCoeffs(this.a_str)); + this.baseA[0] = 1.0; + this.bSliders = [0, 0, 0, 0, 0, 0, 0]; + this.aSliders = [0, 0, 0, 0, 0, 0]; + }, + resetSlidersB() { + this.bSliders = [0, 0, 0, 0, 0, 0, 0]; + this.b_str = this.baseB.map(x => parseFloat(x.toPrecision(10))).join(', '); + this.updateBodePlot(); + }, + resetSlidersA() { + this.aSliders = [0, 0, 0, 0, 0, 0]; + this.a_str = this.baseA.map(x => parseFloat(x.toPrecision(10))).join(', '); + this.updateBodePlot(); + }, + updateFromSliders() { + const currentB = this.baseB.map((base, i) => base * Math.pow(10, this.bSliders[i] || 0)); + const currentA = [1.0]; + for (let i = 1; i < 7; i++) { + currentA.push(this.baseA[i] * Math.pow(10, this.aSliders[i] || 0)); + } + this.b_str = currentB.map(x => parseFloat(x.toPrecision(6))).join(', '); + this.a_str = currentA.map(x => parseFloat(x.toPrecision(6))).join(', '); + this.debouncedUpdateBode(); + }, + updateFromText() { + this.syncBaseFromText(); + this.updateBodePlot(); + }, + onFsChange() { + if (this.filterType !== "(無) 手動自訂") { + this.applyFilterDesign(); + } else { + this.updateBodePlot(); + } + }, + debouncedApply() { + clearTimeout(this.bodeTimeout); + this.bodeTimeout = setTimeout(() => { + if (this.filterType !== "(無) 手動自訂") this.applyFilterDesign(); + else this.updateBodePlot(); + }, 300); + }, + debouncedUpdateBode() { + clearTimeout(this.bodeTimeout); + this.bodeTimeout = setTimeout(() => this.updateBodePlot(), 150); + }, + async applyFilterDesign() { + if (this.filterType === "(無) 手動自訂") return; + this.globalError = null; + try { + const payload = { + filter_type: this.filterType, fs: this.fs, + lp_fc: this.params.fc, lp_order: this.params.order, + hp_fc: this.params.fc, hp_order: this.params.order, + bp_f_low: this.params.bp_f_low, bp_f_high: this.params.bp_f_high, bp_order: this.params.bp_order, + notch_f0: this.params.notch_f0, notch_q: this.params.notch_q, + opoz_fz: this.params.opoz_fz, opoz_fp: this.params.opoz_fp, + tptz_fz1: this.params.tptz_fz1, tptz_fz2: this.params.tptz_fz2, + tptz_fp1: this.params.tptz_fp1, tptz_fp2: this.params.tptz_fp2, + pid_kp: this.params.kp, pid_ki: this.params.ki, pid_kd: this.params.kd, + sogi_f0: this.params.sogi_f0, sogi_k: this.params.sogi_k + }; + const res = await fetch('/api/design', { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload) + }); + if (!res.ok) { const err = await res.json(); throw new Error(err.detail || '設計濾波器失敗'); } + const data = await res.json(); + this.b_str = data.b.map(x => parseFloat(x.toPrecision(10))).join(', '); + this.a_str = data.a.map(x => parseFloat(x.toPrecision(10))).join(', '); + this.syncBaseFromText(); + this.updateBodePlot(); + } catch (e) { this.globalError = e.message; } + }, + async updateBodePlot() { + this.loadingBode = true; + this.globalError = null; + try { + let b = this.parseCoeffs(this.b_str); + let a = this.parseCoeffs(this.a_str); + if (b.length === 0) b = [1.0]; + if (a.length === 0) a = [1.0]; + const res = await fetch('/api/bode', { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ b, a, fs: this.fs }) + }); + if (!res.ok) throw new Error('無法計算頻率響應'); + const data = await res.json(); + this.drawBodePlot(data.freq, data.mag, data.phase); + // 手機版:計算完成後自動切換到圖表頁籤 + if (window.innerWidth < 1024) this.mobileTab = 'chart'; + } catch (e) { this.globalError = e.message; } + finally { this.loadingBode = false; } + }, + drawBodePlot(freq, mag, phase) { + const fs = this.fs; + const fMin = freq[0], fMax = freq[freq.length - 1]; + const isDark = this.isDarkMode; + const isSmallScreen = window.innerWidth < 768; + + // 產生 1-2-5 刻度 + const xTicks = [], xTexts = []; + const pStart = Math.floor(Math.log10(fMin)); + const pEnd = Math.ceil(Math.log10(fMax)); + for (let p = pStart; p <= pEnd; p++) { + for (const m of [1, 2, 5]) { + const val = m * Math.pow(10, p); + if (val < fMin || val > fMax) continue; + xTicks.push(val); + if (val < 1) xTexts.push(val.toPrecision(3)); + else if (val < 1000) xTexts.push(String(val)); + else if (val < 1000000) xTexts.push((val / 1000) + 'k'); + else xTexts.push((val / 1000000) + 'M'); + } + } + + // Nyquist & fs 標線 (shapes) + const shapes = []; + const annotations = []; + const addVLine = (xVal, text, row) => { + const yref = row === 1 ? 'y' : 'y2'; + shapes.push({ + type: 'line', x0: xVal, x1: xVal, y0: 0, y1: 1, + xref: row === 1 ? 'x' : 'x2', yref: yref + ' domain', + line: { color: isDark ? 'rgba(255,0,0,0.5)' : 'rgba(220,0,0,0.6)', width: 1.5, dash: 'dash' } + }); + if (text) { + annotations.push({ + x: Math.log10(xVal), y: 1, text: text, + xref: row === 1 ? 'x' : 'x2', yref: yref + ' domain', + showarrow: false, font: { color: isDark ? 'rgba(255,100,100,0.8)' : 'rgba(180,50,50,1)', size: isSmallScreen ? 10 : 12 }, + yshift: isSmallScreen ? 15 : 12, + xanchor: 'center', + yanchor: isSmallScreen ? 'middle' : 'bottom', + textangle: isSmallScreen ? -90 : 0 + }); + } + }; + addVLine(fs / 2, 'Nyquist', 1); + addVLine(fs, 'fs', 1); + addVLine(fs / 2, null, 2); + addVLine(fs, null, 2); + + // 10 的倍數強化線 + for (let p = pStart; p <= pEnd; p++) { + const v = Math.pow(10, p); + if (v >= fMin && v <= fMax) { + const gridColor = isDark ? 'rgba(128,128,128,0.5)' : 'rgba(100,100,100,0.3)'; + shapes.push( + { type: 'line', x0: v, x1: v, y0: 0, y1: 1, xref: 'x', yref: 'y domain', line: { color: gridColor, width: 1.5 } }, + { type: 'line', x0: v, x1: v, y0: 0, y1: 1, xref: 'x2', yref: 'y2 domain', line: { color: gridColor, width: 1.5 } } + ); + } + } + + const gridColor = isDark ? 'rgba(128,128,128,0.2)' : 'rgba(0,0,0,0.1)'; + const zeroLineColor = isDark ? '#4b5563' : '#cbd5e1'; + const textColor = isDark ? '#9ca3af' : '#475569'; + const titleColor = isDark ? '#d1d5db' : '#1e293b'; + + const xAxisCommon = { + type: 'log', title: { text: 'Freq (Hz)', font: { size: isSmallScreen ? 12 : 14 } }, + range: [Math.log10(fMin), Math.log10(fMax)], + tickvals: xTicks, ticktext: xTexts, + showgrid: true, gridcolor: gridColor, + tickfont: { color: textColor, size: isSmallScreen ? 11 : 12 }, + nticks: isSmallScreen ? 6 : 10 + }; + + const layout = { + paper_bgcolor: 'transparent', plot_bgcolor: 'transparent', + margin: isSmallScreen ? { t: 80, b: 70, l: 55, r: 15 } : { t: 70, b: 60, l: 70, r: 30 }, + showlegend: false, + grid: { rows: 2, columns: 1, pattern: 'independent', roworder: 'top to bottom', ygap: isSmallScreen ? 0.35 : 0.35 }, + font: { color: textColor, family: 'Inter, sans-serif' }, + annotations: [ + { text: 'Magnitude Response (dB)', xref: 'x domain', yref: 'y domain', x: 0.5, y: isSmallScreen ? 1.22 : 1.18, showarrow: false, font: { size: isSmallScreen ? 14 : 16, color: titleColor, weight: 'bold' } }, + { text: 'Phase Response (Deg)', xref: 'x2 domain', yref: 'y2 domain', x: 0.5, y: isSmallScreen ? 1.22 : 1.18, showarrow: false, font: { size: isSmallScreen ? 14 : 16, color: titleColor, weight: 'bold' } }, + ...annotations + ], + xaxis: { ...xAxisCommon }, + yaxis: { title: { text: 'Mag (dB)', font: { size: isSmallScreen ? 12 : 14 } }, range: [-60, 0], gridcolor: gridColor, zerolinecolor: zeroLineColor, tickfont: { color: textColor, size: isSmallScreen ? 11 : 12 } }, + xaxis2: { ...xAxisCommon }, + yaxis2: { title: { text: 'Phase (°)', font: { size: isSmallScreen ? 12 : 14 } }, range: [-180, 180], tickvals: [-180, -90, 0, 90, 180], gridcolor: gridColor, zerolinecolor: zeroLineColor, tickfont: { color: textColor, size: isSmallScreen ? 11 : 12 } }, + shapes: shapes + }; + + const traceMag = { x: freq, y: mag, name: 'Magnitude (dB)', type: 'scatter', line: { color: isDark ? '#3b82f6' : '#2563eb', width: 2.5 } }; + const tracePhase = { x: freq, y: phase, name: 'Phase (deg)', type: 'scatter', line: { color: isDark ? '#f97316' : '#ea580c', width: 2.5 }, xaxis: 'x2', yaxis: 'y2' }; + + Plotly.react('bodePlot', [traceMag, tracePhase], layout, { responsive: true }); + }, + + handleFileUpload(event) { + const file = event.target.files[0]; + if (!file) return; + this.csvFile = file; + this.filterDone = false; + this.csvPreview = []; + + const reader = new FileReader(); + reader.onload = (e) => { + const text = e.target.result; + const lines = text.split('\n').filter(l => l.trim()); + if (lines.length === 0) return; + this.csvColumns = lines[0].split(',').map(s => s.trim()); + this.selectedColumn = 0; + if (this.csvColumns.length > 1) { + const first = this.csvColumns[0].toLowerCase(); + if (['time', 't', 'sec', 'x', 'index', 'unnamed'].some(kw => first.includes(kw))) { + this.selectedColumn = 1; + } + } + const preview = []; + for (let i = 1; i < Math.min(lines.length, 6); i++) { + preview.push(lines[i].split(',').map(s => s.trim())); + } + this.csvPreview = preview; + }; + reader.readAsText(file); + }, + + async processFilter() { + if (!this.csvFile) return; + this.loadingFilter = true; + this.globalError = null; + const formData = new FormData(); + formData.append('file', this.csvFile); + formData.append('b', this.b_str); + formData.append('a', this.a_str); + formData.append('col_idx', this.selectedColumn); + try { + const res = await fetch('/api/filter', { method: 'POST', body: formData }); + if (!res.ok) { const err = await res.json(); throw new Error(err.detail || '濾波處理失敗'); } + const data = await res.json(); + this.timePlotData = data; + this.drawTimePlot(data); + this.filterDone = true; + } catch (e) { this.globalError = e.message; } + finally { this.loadingFilter = false; } + }, + + drawTimePlot(data) { + const isDark = this.isDarkMode; + const isSmallScreen = window.innerWidth < 768; + const gridColor = isDark ? 'rgba(128,128,128,0.2)' : 'rgba(0,0,0,0.1)'; + const zeroLineColor = isDark ? '#4b5563' : '#cbd5e1'; + const textColor = isDark ? '#9ca3af' : '#475569'; + + const layout = { + paper_bgcolor: 'transparent', plot_bgcolor: 'transparent', + margin: isSmallScreen ? { t: 60, b: 60, l: 45, r: 15 } : { t: 40, b: 55, l: 60, r: 20 }, + font: { color: textColor, family: 'Inter, sans-serif' }, + xaxis: { title: { text: 'Sample Index', font: { size: isSmallScreen ? 10 : 11 } }, gridcolor: gridColor, zerolinecolor: zeroLineColor, tickfont: { color: textColor, size: isSmallScreen ? 9 : 11 } }, + yaxis: { title: { text: 'Amplitude', font: { size: isSmallScreen ? 10 : 11 } }, gridcolor: gridColor, zerolinecolor: zeroLineColor, tickfont: { color: textColor, size: isSmallScreen ? 9 : 11 } }, + legend: { orientation: 'h', y: 1.02, yanchor: 'bottom', x: 1, xanchor: 'right', font: { color: textColor, size: isSmallScreen ? 9 : 10 } } + }; + Plotly.react('timePlot', [ + { x: data.index, y: data.original, name: '原始輸入訊號 (Input)', type: 'scatter', line: { color: isDark ? '#00cc96' : '#059669' }, opacity: 0.7 }, + { x: data.index, y: data.filtered, name: '濾波後輸出 (Output)', type: 'scatter', line: { color: isDark ? '#ef553b' : '#dc2626' }, opacity: 0.9 } + ], layout, { responsive: true }); + }, + + async downloadCsv() { + if (!this.csvFile) return; + const formData = new FormData(); + formData.append('file', this.csvFile); + formData.append('b', this.b_str); + formData.append('a', this.a_str); + formData.append('col_idx', this.selectedColumn); + try { + const res = await fetch('/api/filter/download', { method: 'POST', body: formData }); + if (!res.ok) throw new Error('下載失敗'); + const blob = await res.blob(); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; a.download = 'filtered_output.csv'; + document.body.appendChild(a); a.click(); + window.URL.revokeObjectURL(url); + } catch (e) { this.globalError = e.message; } + } + } +}).mount('#app') diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..ef36148 --- /dev/null +++ b/static/index.html @@ -0,0 +1,503 @@ + + + + + + + 差分方程式分析 (Difference Equation Analyzer) + + + + + + + + +
+ +
+

+ 差分方程式分析 (Difference Equation Analyzer)

+
+ + +
+
+ +
+ + +
+
+ + + + +
+
+ + + + {{ globalError }} + +
+ + +
+ +
+

1. 頻率響應 (Frequency + Response)

+
+ + 重新計算中... +
+
+ +
+
+
+
+
+ + +
+
+

2. 時域訊號探討

+
+
+

請上傳包含時域訊號的 CSV 檔案,系統會套用上述設定的差分濾波器。 +

+
+ + {{ + csvFile.name }} + +
+ +
+ 訊號欄位: + +
+ + + + +
+ + +
+

+ 資料預覽 (前五筆):

+
+ + + + + + + + + + + +
{{ col + }}
{{ val }} +
+
+
+ + +

波形比較圖 +

+ +
+
+
+ +
+ + + + +

請上傳包含時間序列的 CSV 檔案進行測試

+
+
+
+
+
+ +
+

© 2026 喆富創新科技股份有限公司. All rights reserved.

+
+
+ + + + \ No newline at end of file diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..65714dbb908d7731beaa1f6be24a75cfb9795bcb GIT binary patch literal 153804 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 summary { + list-style: none; + user-select: none; +} +details > summary::-webkit-details-marker { + display: none; +} +details > div { + animation: slideDown 0.2s ease-out; + overflow: hidden; +} +@keyframes slideDown { + from { opacity: 0; transform: translateY(-6px); } + to { opacity: 1; transform: translateY(0); } +}