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 모드도 들어가지 않는다(격자가 너무 거칠다 / 대역이 너무 좁다).
• 샘플 데이터 카탈로그(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.