surface_synth_psd — ROUGHNESS 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 모드도 들어가지 않는다(격자가 너무 거칠다 / 대역이 너무 좁다).

자세한 사용 가이드

• surface_roughness 패밀리 가이드

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL 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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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