measure op• 데이터 종류: depth → pairs
• 호출: import fullseye as fs; fs.ledger.surface_psd(z, dx, kind='areal', dy=None)(구현을 직접 호출하려면 import roughness; roughness.surface_psd(z, dx, kind='areal', dy=None), 원장에서 가져오려면 opsroughness.get("surface_psd"))
• 원장 경유의 반환값: fullseye.ledger.surface_psd(...) 는 선언된 out 형 pairs 의 값만 반환합니다(실제 함수는 보조 정보도 반환). 버려진 쪽이 필요하면 fullseye.ledger.surface_psd.raw(...) 를 쓰거나 roughness.surface_psd 를 직접 호출하세요.
• 실제 반환: (q, C) -> (N,2)
높이장의 파워 스펙트럼 밀도. (q, C)를 반환한다. 규약은 인수로 명시한다.
인수
z 높이장(평균은 내부에서 뺀다. DC 빈은 반환하지 않는다).
dx, dy 샘플 간격. dy=None은 정사각 화소.
kind "areal" … 2차원 PSD C_2D(q)의 고리 평균.
"radial" … 1차원 동경 PSD C_1D(q) = 2π q C_2D(q).
규약(이것을 써 두지 않으면 캘리브레이션 없이는 읽을 수 없다 ―― 기존의 radial_power_spectrum은 이것이 docstring에 없다)
• q는 cycles / length(각주파수 2π/λ가 아니다). q = 1/λ.
• C_2D(q) = dx dy |F|² / (ny nx). 정규화는 Parseval에 맞춰 두었다: ∫ C_2D d²q = <h²> 그리고 ∫ C_1D dq = <h²>.
• 자기 아핀 면 H에 대한 기울기는 면 PSD에서 -2(H+1), 동경 PSD에서 -2H-1(정확히 1만큼 다르다).
★ 실측 —— 어느 규약이든 H는 캘리브레이션 없이 복원된다
surface_synth_psd로 H를 심고, q ∈ [2/λ_hi, 0.4/dx]에서 로그-로그
직선을 맞춰 H를 복원했다(512², 대역 2-64 µm):
심은 H 면 PSD 기울기 복원한 H 동경 기울기 복원한 H 기울기 차
0.30 -2.600 0.300 -1.600 0.300 1.0000
0.50 -3.000 0.500 -2.000 0.500 1.0000
0.80 -3.600 0.800 -2.600 0.800 1.0000
0.95 -3.901 0.950 -2.901 0.950 1.0000
오차는 4예 모두 ±0.0003 이내, 두 규약의 기울기 차는 어느 H에서도
엄밀히 1.0000. 캘리브레이션 없이 읽을 수 있다.
★ 여기는 PoC를 다시 측정해 결론이 바뀐 곳. PoC는 기존
radial_power_spectrum에서 일률적인 -0.013(H의 1.6 %)의 계통 오차를
발견하고, "고리 평균의 이산화에 의한 계통 오차"라고 결론지었다. 같은 검산을 이
구현으로 하면 오차가 사라진다. 원인을 분리해 보니, 고리의 대표 q로빈 번호 i·Δq를 쓰느냐, 고리 내 q의 평균을 쓰느냐의 차이였다
—— 빈 번호로는 -0.0007~-0.0010의 음의 어긋남이 나온다(실측, 같은 면, 같은
피팅 대역). 방향은 PoC의 관측과 같지만 크기는 1/15이므로,
-0.013의 나머지는 고리 평균의 이산화가 아니라 그 함수의 다른 구현 차이에서 유래한다.
이 함수는 고리 내 q의 평균을 반환한다.
★ 함정 —— Nyquist를 넘는 고리는 "모서리만"으로 이루어져 있다
정사각 격자의 최대 |q|는 √2/(2 dx)이지만, q > 1/(2 dx)의 고리는
주파수 평면의 네 모서리만 포함한다. 실측(512²): 전체 362빈 중 상위
107빈(29.6 %)이 Nyquist 초과. 고리 내 점 수가 이상값 2πq/Δq에 대해
얼마나 모자라는지는, Nyquist 이하에서도 최소 0.838배까지 떨어지지만
(격자의 이산화), Nyquist 초과에서는 0까지 떨어진다.
기울기 피팅에는 Nyquist 초과를 쓰지 말 것.
★ Parseval 검산을 어디까지 믿어도 되는가(실측, 512², Sq²=6.400e-03)
• 2차원 전체 격자에서 Σ C_2D Δqx Δqy를 취하면 +0.0000 %(엄밀).
• 반환한 동경 PSD를 사다리꼴 적분하면 -0.55 %. 고리마다 평균하여 1차원으로 뭉갠 시점에서 이만큼은 사라진다 —— 고리 평균은 요약이며가역이 아니다. 0.5 %를 넘는 정밀도가 필요한 용도에서는 2차원 C_2D를 직접 적분할 것.
• 이 면은 대역 상단이 Nyquist이므로, Nyquist에서 잘라도 -0.55 % 그대로 변하지 않는다(모서리 부분에 내용이 없다). 모서리에 내용이 있는 면(대역이 Nyquist를 넘는 면)에서는, 자르면 빠진다.
fail-closed(실패 시 거부)
• 2차원이 아님 / 8x8 미만 / NaN 또는 Inf를 포함 / dx, dy가 양수가 아님.
• kind가 "areal", "radial" 이외.
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• poc_surface_roughness — py -3.11 examples/poc_surface_roughness.py
pairs 를 입력으로 받는 것)—
measure)surface_params · profile_params
*Provenance: roughness.py — ROUGHNESS 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.