dual op• Data kinds: signal × signal → measurement
• Call: import fullseye as fs; fs.ledger.gcc_delay(a, b, rate=1.0, weight='phat', band=None, interpolate=True) (implementation को सीधे call करना हो तो import acoustics; acoustics.gcc_delay(a, b, rate=1.0, weight='phat', band=None, interpolate=True), registry से लेना हो तो opsacoustics.get("gcc_delay"))
• Ledger के ज़रिए return value: fullseye.ledger.gcc_delay(...) केवल घोषित out type measurement का value लौटाता है (मूल function सहायक जानकारी भी लौटाता है)। जो हिस्सा छोड़ दिया गया है उसकी ज़रूरत हो तो fullseye.ledger.gcc_delay.raw(...) का उपयोग करें, या acoustics.gcc_delay को सीधे call करें।
2 channels के बीच arrival time का अंतर generalized cross-correlation (GCC) से मापता है। → (delay, table)।
leak localization, sound-source की दिशा, ultrasonic wall thickness, vibration propagation —— ये सभी इस अंतर से तय होते हैं कि "एक ही source 2 जगहों पर कब पहुँचा"। यह op उस अंतर को seconds में लौटाता है (rate default 1.0 हो तो samples में)। इसे position में बदलने के लिए, path length और propagation speed से गुणा करें (x = (L - c·delay) / 2 के रूप में)।
★speed की धारणा जैसी की तैसी position error बन जाती है। correlation कितना भी साफ़ हो, यदि गुणा की गई speed 10 % गलत है, तो position path केंद्र से दूरी के अनुपात में खिसकती है (poc_leak_localization में मापा गया:
केंद्र से 18 m दूर leak ने +1.798 m दिया, geometric अनुमान 1.800 m है)। correlation की quality और position की शुद्धता अलग-अलग मात्राएँ हैं, इसलिए reports में इन्हें अलग रखें।
Args:
a, b: समान लंबाई के 1-D records। यदि b a से पीछे है, तो delay धनात्मक है
(b(t) ≈ a(t - delay))।
rate: sampling frequency [Hz]। default 1.0 के साथ return की इकाई "samples" है।
weight: cross-spectrum का weighting।
"none" = सादा cross-correlation (SNR अधिक हो और reflections न हों तब सबसे अच्छा),
"phat" = phase transform (amplitude को whiten करता है; reverberation के प्रति robust कहा जाता है),
"roth" = 1/|A|², "scot" = 1/sqrt(|A|²|B|²)।
★PHAT हमेशा नहीं जीतता: असममित reflections वाले paths पर delay स्वयं
biased होता है, इसलिए कोई weighting उसे नहीं हटा सकता (मापा गया: reflection 0.8 के साथ, raw 0.134 m /
PHAT 0.114 m, केवल 1 दसवें का अंतर, और RMS लगभग पूरा bias है)।
band: (lo_hz, hi_hz) से band को सीमित करता है (rate जैसी इकाई; rate=1.0 के साथ,
cycles / sample में 0–0.5)। पूरे band के लिए None।
★weight="phat" (default) के साथ आवश्यक (2026-10-06, 0.5.0 में breaking change)।
PHAT सभी bins को समान weight तक whiten करता है, इसलिए band-limited signal में बिना signal वाले bins
(noise, leakage, rounding) signal जितने ही weight से correlation में आते हैं, और peak चूक जाता है
(low-frequency signal में band के बिना hit rate तेज़ी से गिरती है और band के साथ लौट आती है ——
tests/test_acoustics.py का regression test)। यदि आप जानते हैं कि signal पूरा band घेरता है,
तो band=(0.0, rate / 2) के रूप में इसे स्पष्ट लिखें। "none" / "roth" /
"scot" के साथ यह वैकल्पिक (optional) रहता है।
interpolate: peak के आसपास parabolic interpolation से sub-sample precision तक पढ़ता है (default True)।
बंद करने पर, quantization step scatter नहीं, bias के रूप में रह जाता है (position स्थिर होने पर,
यह हर बार एक ही दिशा में चूकता है; PIV में peak locking जैसा)।
★interpolation bias नहीं हटाता: correlation peak sinc जैसा होता है और parabola
उसे पूरी तरह approximate नहीं कर सकता। white noise, पूरे band और 0–1 samples के shifts वाली measurements में,
error अधिकतम 0.117 samples का S-curve है (integers के पास 0, 0.3 / 0.7 के आसपास अधिकतम,
दिशा integer की ओर खिंची हुई)। sub-sample accuracy की बात करते समय इस bias को शामिल करें।
Returns:
(delay, table): delay seconds में float है (rate=1.0 हो तो samples में)।
table {"lags": lags of shape (2N-1,), "r": correlation values, "peak": peak value, "snr_peak": ratio of peak / secondary peak} है।
★ledger (fullseye.ledger.gcc_delay) के ज़रिए केवल delay, घोषित out type,
लौटाया जाता है। correlation curve भी चाहिए तो fullseye.ledger.gcc_delay.raw(...) का उपयोग करें।
Raises:
ValueError: लंबाइयाँ अलग / 2 से कम / non-finite, weight अज्ञात, band
(lo, hi) नहीं, lo >= hi या rate के लिए अमान्य,
या weight="phat" के साथ band None है (fail-closed)।
सीमाएँ (ईमानदारी से): (1) reflections, dispersion और path अंतरों से बना bias हटाया नहीं जा सकता —— केवल noise के कारण होने वाला scatter हटाया जा सकता है। (2) चूँकि केवल 1 correlation peak चुना जाता है, multipath में secondary peak जीत जाए तो यह असतत रूप से (discontinuously) चूकता है (snr_peak जाँचें)।
(3) record length के आधे से अधिक delays wrap around हो जाते हैं।
संदर्भ (सार्वजनिक): 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 family guide
• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।
• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।
• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।
• acoustic_condition_monitoring — py -3.11 examples/acoustic_condition_monitoring.py
measurement को input के रूप में लेते हैं)—
dual)*Provenance: acoustics.py — ACOUSTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.