surface_synth_psd — ROUGHNESS synth op

Data kinds: nonedepth (an op determined by its arguments alone — it takes no image or data input)

Call: import roughness; roughness.surface_synth_psd(n, dx, hurst, lambda_lo, lambda_hi, sq, seed=0) (or opsroughness.get("surface_synth_psd"))

Usage

> This operator's description has not been translated yet. The original text follows as it is.

指定した 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 モードも入らない(格子が粗すぎる / 帯域が狭すぎる)。

Detailed usage guide

surface_roughness family guide

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

poc_surface_roughnesspy -3.11 examples/poc_surface_roughness.py

Ops the type connects to (they accept depth as input)

surface_form_remove · surface_filter · surface_params · surface_psd

Same category (synth)


*Provenance: roughness.py — ROUGHNESS operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.