Content is user-generated and unverified.

PA Driver 3D Die 優化器 — 學習心得


一、軟體工程:為什麼程式會當掉?

1.1 PSO 粒子被算了兩次

問題比喻: 期末考交卷,老師改了一次,然後又把同一份考卷從頭改一遍——浪費時間,結果也不對。
實際問題: 每個粒子在主迴圈算一次適應值,進入 stepPSO() 又算一次,CPU 做了兩倍的無用功。
修正: 每個粒子每輪只評估一次:先移動位置,再算一次適應值,結束。

1.2 Pareto 篩選太慢(O(n²) 問題)

問題比喻: 班上50個同學互相比較成績,每個人都要跟其他49人比——人數越多,比較次數爆炸性成長。
實際問題: 每隔80毫秒,程式就對多達500個解做「誰支配誰」的兩兩比較,瀏覽器因此卡頓。
修正: 解的歷史記錄上限設為150筆,且每5輪才重算一次 Pareto 前緣,大幅降低運算量。

1.3 每幀都在掃描 3D 物件

問題比喻: 每次想換一個燈泡的顏色,卻把整棟大樓的電路圖重新翻一遍,才找到那顆燈泡。
實際問題: applyOptFeedback() 每80毫秒就用 traverse() 掃描所有 Three.js 網格子物件,非常耗時。
修正: 場景建立時,一次性把所有需要變色的材質存進陣列。之後每幀只更新一個 0~1 的數字(emissiveTarget),渲染迴圈負責平滑插值,完全不需要重新掃描。

1.4 React 重新渲染太頻繁

問題比喻: 每次黑板上的數字變動,老師就把整個班級重新點名一次——根本不需要這樣做。
實際問題: 優化迴圈每80毫秒觸發8個以上的 setState(),每個都造成 React 重新渲染整個畫面。
修正: 優化器所有的「計算狀態」改存在 useRef(不觸發渲染)。只有畫面需要更新時,每4輪才呼叫一次 setSnap() 批次更新 UI。

1.5 計算太密集,畫面跟不上

問題比喻: 一邊跑百米,一邊做數學題——兩件事都做不好。
實際問題: 80毫秒的間隔對 GA / Adam 梯度計算來說太短,佔用了 Three.js 的渲染時間,畫面因此卡頓。
修正: 間隔放寬到140毫秒;PSO 粒子數 20→12,GA 族群數 24→16,運算和渲染兩者都順暢了。

1.6 螢幕解析度沒有上限

問題比喻: 印一張 A4 傳單,卻用印刷雜誌的600 DPI 解析度——眼睛看不出差異,但印表機累死了。
實際問題: 在高解析度螢幕(Retina)上,devicePixelRatio 可能是2或3,導致 GPU 渲染3倍像素量。
修正: 上限設為1.5,視覺上仍然清晰,GPU 負擔大幅減少。


二、射頻電路:物理模型的錯誤

2.1 PAE 88%——理論值 ≠ 實際值

PAE(功率附加效率) 是指「輸出的 RF 功率」除以「從電源消耗的總功率」,數值越高代表電路越省電。

效率等級說明
88%Class F 理論極限,現實中不可能達到
55–62%世界頂尖的 GaN Doherty 設計
40–55%優良的商業產品水準
< 38%偏壓或匹配網路出了問題

比喻: 就像說「汽油引擎熱效率100%」——卡諾定理告訴我們這不可能,總有損失。
修正: PAE 上限從88%降到62%,反映真實 GaN 製程的物理極限。

2.2 Gain 38 dB——單一級放大器不該這麼高

增益(Gain) 表示訊號被放大了多少倍。38 dB 代表功率放大了 6300倍以上

問題在哪裡?
一個 38 dB 增益的放大器,只要有任何微小的寄生回授(例如:bonding wire 的電感、基板耦合),就會自激振盪——變成一個震盪器,不再是放大器。

電路級別典型增益設計優先考量
LNA(低雜訊放大器)15–22 dB盡量高增益,壓低雜訊指數
PA Driver(單級)10–14 dB線性度、PAE、穩定性優先
PA Driver(兩級串接)18–22 dB 合計每級仍需穩定性分析

LNA vs PA Driver 的根本差異:

  • LNA:增益越高越好,因為第一級增益高,後級的雜訊對系統影響小(Friis 公式)。
  • PA Driver:增益故意壓低,因為增益太高會讓電路不穩定,而且高增益通常意味著低 PAE。

修正: Gain 上限從38 dB降到16 dB,符合單一級 GaN PA driver 的實際設計範圍。


三、使用者介面:讓數據更容易讀懂

3.1 文字對比度不夠

問題: 深色背景配上幾乎是黑色的文字(#334455),在螢幕上幾乎看不清楚。
修正: 建立一個統一的顏色常數物件 C

  • C.label = "#9bbccc" → 主要標籤(亮)
  • C.sublbl = "#6a9ab0" → 次要說明、單位(中等亮度)

3.2 PASS / MARG / FAIL 規格標示

光看數字不夠——要知道這個數字「好不好」。系統根據實際 PA driver 規格自動上色:

指標PASS(綠)MARG(黃)FAIL(紅)
PAE≥ 48%≥ 38%< 38%
EVM≤ 2.5%≤ 4.5%> 4.5%
ACPR≤ −45 dBc≤ −38 dBc> −38 dBc
Gain≥ 12 dB≥ 10 dB< 10 dB
Pout≥ 40 dBm≥ 36 dBm< 36 dBm

設計哲學: 把規格書「燒進」介面裡,工程師不需要每次對照 datasheet,一眼就能判斷設計是否達標。


四、總結:五個重要觀念

  1. 模型要符合物理現實
    程式可以算出 PAE = 88%,但那是沒有意義的數字。好的模擬必須反映真實的物理限制,否則優化的結果只是「數學上的最優解」,不是「工程上能實現的解」。
  2. 相同名稱,不同邏輯
    LNA 和 PA driver 都是「放大器」,但設計目標完全相反——一個追求高增益低雜訊,一個刻意限制增益來保持穩定與效率。理解電路的「角色」比記住公式更重要。
  3. React 的 setState 不是免費的
    每次呼叫 setState 都會觸發 Virtual DOM 比較與重新渲染。在高頻迴圈中,應該用 useRef 存計算中間值,只在需要更新畫面時才呼叫 setState。
  4. 效能問題會疊加
    每一個小問題(多算一次、掃描太頻繁、解析度沒上限)單獨看都不嚴重,但三個加在一起就足以讓程式崩潰。找到效能瓶頸需要系統性地逐一排查。
  5. 好的 UI 會說話
    數字本身是中性的,PASS / MARG / FAIL 讓數字有了意義。設計介面時,盡量讓系統幫使用者做判斷,而不是把判斷的工作留給使用者。
Content is user-generated and unverified.
    PA Driver 優化器學習心得:工程設計與程式優化指南 | Claude