dual op• 데이터 종류: signal × signal → measurement
• 호출: import fullseye as fs; fs.ledger.gcc_delay(a, b, rate=1.0, weight='phat', band=None, interpolate=True)(구현을 직접 호출하려면 import acoustics; acoustics.gcc_delay(a, b, rate=1.0, weight='phat', band=None, interpolate=True), 원장에서 가져오려면 opsacoustics.get("gcc_delay"))
• 원장 경유의 반환값: fullseye.ledger.gcc_delay(...) 는 선언된 out 형 measurement 의 값만 반환합니다(실제 함수는 보조 정보도 반환). 버려진 쪽이 필요하면 fullseye.ledger.gcc_delay.raw(...) 를 쓰거나 acoustics.gcc_delay 를 직접 호출하세요.
2채널의 도달 시간차를 일반화 상호상관(GCC)으로 측정한다. → (delay, table).
누수 위치 결정, 음원 방향, 초음파 두께, 진동 전파 —— 모두 "같은 원천이 2곳에언제 도착했는가"의 차이로 정해진다. 이 op는 그 차이를 초(rate가 기본값 1.0이면 표본)로반환한다. 위치로 바꾸려면 경로 길이와 전파 속도를 곱한다(x = (L - c·delay) / 2의 형태).
★속도의 가정이 그대로 위치의 오차가 된다. 상관이 아무리 깨끗해도 곱하는 속도가 10 % 다르면 위치는 경로 중심으로부터의 거리에 비례하여 어긋난다(poc_leak_localization의
실측: 중심에서 18 m의 누수로 +1.798 m, 기하의 예측 1.800 m). 상관의 질과 위치의정확성은 별개의 양이므로 보고에서는 나눌 것.
Args:
a, b: 같은 길이의 1-D 기록. b가 a보다 늦으면 delay는 양수
(b(t) ≈ a(t - delay)).
rate: 표본화 주파수 [Hz]. 기본값 1.0일 때는 반환 단위가 "표본".
weight: 상호 스펙트럼의 가중치.
"none" = 그대로의 상호상관(SNR이 높고 반사가 없으면 최선),
"phat" = 위상 변환(진폭을 백색화. 잔향에 강하다고 한다),
"roth" = 1/|A|², "scot" = 1/sqrt(|A|²|B|²).
★PHAT가 항상 이기는 것은 아니다: 반사가 비대칭인 경로에서는 지연 자체가
치우치므로 어떤 가중치로도 제거할 수 없다(실측: 반사 0.8에서 raw 0.134 m /
PHAT 0.114 m로 1할밖에 다르지 않고, RMS는 거의 전부가 치우침).
band: (lo_hz, hi_hz)로 대역을 좁힌다(rate와 같은 단위. rate=1.0이면
cycles / 표본으로 0〜0.5). None이면 전 대역.
★weight="phat"(기본값)에서는 필수(2026-10-06, 0.5.0의 파괴적 변경).
PHAT는 모든 빈을 같은 가중치로 백색화하므로, 대역이 제한된 신호에서는 신호가 없는
빈(잡음·누설·반올림)이 신호와 같은 가중치로 상관에 들어가 피크가 빗나간다
(저역 신호에서 band를 넘기지 않으면 적중이 크게 떨어지고, 대역을 넘기면 돌아온다 ——
tests/test_acoustics.py의 회귀 테스트). 신호가 전 대역을 차지한다고 알고
있다면 band=(0.0, rate / 2)로 명시한다. "none" / "roth" /
"scot"에서는 선택 사항 그대로.
interpolate: 피크 주변의 포물선 보간으로 서브 표본까지 읽는다(기본값 True).
끄면 양자화의 스텝이 흩어짐이 아니라 치우침으로 남는다(위치를 고정하면
매번 같은 방향으로 빗나간다. PIV의 피크 로킹과 같다).
★보간해도 치우침은 사라지지 않는다: 상관의 피크는 sinc 형태여서 포물선으로는
다 근사할 수 없다. 백색 잡음·전 대역에서 0〜1 표본을 움직인 실측에서는
오차가 최대 0.117 표본의 S자(정수 근처에서 0, 0.3 / 0.7 부근에서 최대,
방향은 정수 쪽으로 당긴다). 서브 표본의 정밀도를 말할 때는 이 치우침을 포함할 것.
Returns:
(delay, table): delay는 초(rate=1.0이면 표본) 단위의 float.
table은 {"lags": (2N-1,)의 지연, "r": 상관값, "peak": 피크값, "snr_peak": 피크 / 부차 피크의 비}.
★대장 경유(fullseye.ledger.gcc_delay)는 선언된 out 형인 delay만을
반환한다. 상관 곡선도 필요할 때는 fullseye.ledger.gcc_delay.raw(...).
Raises:
ValueError: 길이가 다름 / 2 미만 / 비유한, weight가 미지, band가
(lo, hi)가 아님·lo >= hi·rate에 대해 무효일 때,
weight="phat"에서 band가 None일 때(fail-closed(실패 시 거부)).
한계(honest): (1) 반사·분산·경로 차가 만드는 치우침은 제거할 수 없다 —— 제거할 수 있는 것은 잡음에 의한 흩어짐뿐이다. (2) 상관의 피크를 1개 고르므로, 다중 경로에서 부차 피크가 이기면 불연속적으로 빗나간다(snr_peak를 볼 것).
(3) 지연이 기록 길이의 절반을 넘으면 되접힌다.
Reference (public): C. H. Knapp, G. C. Carter, "The Generalized Correlation Method for Estimation of Time Delay", IEEE Trans. ASSP 24(4), 1976, 320-327.
• acoustic_condition_monitoring 패밀리 가이드
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• acoustic_condition_monitoring — py -3.11 examples/acoustic_condition_monitoring.py
measurement 를 입력으로 받는 것)—
dual)*Provenance: acoustics.py — ACOUSTICS 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.