synth op• 資料種類:無 → depth(僅由參數決定的運算子 —— 不接受影像或資料輸入)
• 呼叫: import fullseye as fs; fs.ledger.surface_synth_psd(n, dx, hurst, lambda_lo, lambda_hi, sq, seed=0)(要直接呼叫實作,import roughness; roughness.surface_synth_psd(n, dx, hurst, lambda_lo, lambda_hi, sq, seed=0);從台帳取用則 opsroughness.get("surface_synth_psd"))
• 經台帳呼叫的回傳值: fullseye.ledger.surface_synth_psd(...) 只回傳宣告的 out 型別 depth 的值(底層函式還會回傳輔助資訊)。需要被捨棄的部分時,請用 fullseye.ledger.surface_synth_psd.raw(...),或直接呼叫 roughness.surface_synth_psd。
• 底層回傳: (z, sq_analytic)
由指定的 PSD 合成高度場。回傳 (z, sq_analytic)。
在頻帶 lambda_lo <= λ <= lambda_hi 內的每個模態上放置振幅 A(q) ∝ q^-(H+1)(= 面 PSD C(q) ∝ q^-2(H+1),自仿射),只讓相位隨機。整體正規化到 sq 後回傳。
參數
n 網格大小。整數時為 n x n,也可為 (ny, nx)。
dx 取樣間隔(正方形像素)。
hurst Hurst 指數 H(0 < H < 1)。越大越平滑。
lambda_lo 頻帶短波一側的波長。
lambda_hi 頻帶長波一側的波長。
sq 目標 Sq(頻帶內的 rms 高度)。
seed 相位的亂數種子。
★ 同時回傳解析 Sq 是關鍵
因為振幅固定、只改變相位,由 Parseval 可知
<h²> = (1/(ny nx))² Σ_k A_k² 與相位的抽取方式無關地確定。
也就是說 Sq 的真值不依賴亂數。實測:z.std() 與
sq_analytic 的相對差,即使改變 seed、H、頻帶、尺寸,
最大也只有 2.2e-16(下表)。若這裡用「改變亂數再測 rms」來
應付,真值本身就會隨每次實現而波動,與後級的誤差混在一起。
n H λ頻帶 sq |std/analytic-1| 峰度 PTV/rms
128 0.30 4-32 0.5000 2.2e-16 3.084 7.97
256 0.50 4-64 0.0800 0.0e+00 3.005 7.85
256 0.80 2-64 0.0800 2.2e-16 2.893 6.92
512 0.80 2-64 0.0800 0.0e+00 3.113 8.25
512 0.95 8-256 2.0000 0.0e+00 2.542 5.69
★ PoC 踩過的坑已封裝在實作內部
為了讓係數滿足厄米對稱而用 phi = (u - u[-k]) / 2 把相位
反對稱化時,確實會變成反對稱,但相位不再均勻
(變成三角分布,向 0 附近集中)。於是所有模態在原點以同相位
疊加,高度場上豎起 1 根尖峰。用相同種子、相同頻帶測得的實測
(512², H=0.8, 頻帶 2-64):
相位的產生方式 PTV/rms 峰度 |std/analytic-1|
用 (u - u[-k])/2 反對稱化 55.00 71.81 0.0e+00
僅對共軛對的一方取均勻亂數 8.47 2.95 0.0e+00 ← 正確
兩者的 Sq 都與解析值嚴格一致。 只看變異數就
察覺不到這種損壞,因此本函式固定為只對共軛對的一方取均勻亂數的
實作,測試中也檢查峰度和 PTV/rms。自共軛模態
(k = -k,4 個點)的係數必須為實數,所以不隨機相位,而是
隨機符號 ±1(若把相位固定為 0,則全部偏向 +A)。
fail-closed(失敗即拒絕)
• n 小於 8 / dx 非正 / hurst 在 (0, 1) 之外。
• lambda_lo >= lambda_hi。
• lambda_lo 小於 Nyquist 波長 2*dx(無法實現的頻帶)。
• lambda_hi 超過評定長度(連 1 個週期都放不下)。
• sq 非正。
• 頻帶內連 1 個模態都沒有(網格太粗 / 頻帶太窄)。
• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。
• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。
• 演算法的正典(作者、年份)與用途見上面的族使用指南。
• poc_polish_wipe_measure — py -3.11 examples/poc_polish_wipe_measure.py
• poc_surface_roughness — py -3.11 examples/poc_surface_roughness.py
depth 作為輸入)surface_form_remove · surface_filter · surface_params · surface_psd
synth)—
*Provenance: roughness.py — ROUGHNESS 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.