gcc_delay — ACOUSTICS dual op

• Datenarten: signal × signal → measurement

• Aufruf: import fullseye as fs; fs.ledger.gcc_delay(a, b, rate=1.0, weight='phat', band=None, interpolate=True) (die Implementierung direkt: import acoustics; acoustics.gcc_delay(a, b, rate=1.0, weight='phat', band=None, interpolate=True); aus dem Register: opsacoustics.get("gcc_delay"))

• Rückgabewert über das Register: fullseye.ledger.gcc_delay(...) liefert nur den Wert des deklarierten Out-Typs measurement (die zugrunde liegende Funktion gibt zusätzlich Hilfsinformationen zurück). Wird das Verworfene gebraucht, nutze fullseye.ledger.gcc_delay.raw(...) oder rufe acoustics.gcc_delay direkt auf.

Verwendung

Misst die Laufzeitdifferenz zwischen 2 Kanälen mit der verallgemeinerten Kreuzkorrelation (GCC). → (delay, table).

Leckortung, Schallquellenrichtung, Ultraschall-Wanddicke, Schwingungsausbreitung —— alles wird durch die Differenz bestimmt, "wann dieselbe Quelle an 2 Orten ankam". Dieses op gibt diese Differenz in Sekunden zurück (in Abtastwerten, wenn rate den Default 1.0 hat). Für eine Position multipliziert man mit Pfadlänge und Ausbreitungsgeschwindigkeit (in der Form x = (L - c·delay) / 2).

★Die Annahme über die Geschwindigkeit wird unmittelbar zum Positionsfehler. Wie sauber die Korrelation auch ist, weicht die eingesetzte Geschwindigkeit um 10 % ab, verschiebt sich die Position proportional zum Abstand von der Pfadmitte (gemessen in poc_leak_localization:

ein Leck 18 m von der Mitte ergab +1.798 m, die geometrische Vorhersage ist 1.800 m). Korrelationsqualität und Korrektheit der Position sind getrennte Größen, daher im Bericht auseinanderhalten.

Args:

a, b: 1-D-Aufzeichnungen gleicher Länge. Liegt b hinter a zurück, ist delay positiv

(b(t) ≈ a(t - delay)).

rate: Abtastfrequenz [Hz]. Beim Default 1.0 ist die Einheit der Rückgabe "Abtastwerte".

weight: Gewichtung des Kreuzspektrums.

"none" = reine Kreuzkorrelation (am besten bei hohem SNR und ohne Reflexionen),

"phat" = Phasentransformation (weißt die Amplitude; gilt als robust gegen Nachhall),

"roth" = 1/|A|², "scot" = 1/sqrt(|A|²|B|²).

★PHAT gewinnt nicht immer: Auf Pfaden mit asymmetrischen Reflexionen ist die Verzögerung selbst

verzerrt, sodass keine Gewichtung das beseitigt (gemessen: bei Reflexion 0.8 raw 0.134 m /

PHAT 0.114 m, nur 1 Zehntel Unterschied, und der RMS ist fast vollständig Bias).

band: grenzt das Band mit (lo_hz, hi_hz) ein (gleiche Einheit wie rate; bei rate=1.0

0–0.5 in cycles / Abtastwert). None für das volle Band.

★Pflicht bei weight="phat" (Default) (2026-10-06, Breaking Change in 0.5.0).

PHAT weißt alle Bins auf dasselbe Gewicht, daher gehen bei einem bandbegrenzten Signal die Bins ohne Signal

(Rauschen, Leckage, Rundung) mit demselben Gewicht wie das Signal in die Korrelation ein, und der Peak liegt daneben

(bei einem tieffrequenten Signal sinkt die Trefferquote ohne band stark und erholt sich mit Band ——

der Regressionstest in tests/test_acoustics.py). Weiß man, dass das Signal das volle Band belegt,

gibt man band=(0.0, rate / 2) explizit an. Bei "none" / "roth" /

"scot" bleibt es optional.

interpolate: liest per Parabelinterpolation um den Peak bis auf Sub-Sample-Genauigkeit (Default True).

Ausgeschaltet bleibt der Quantisierungsschritt als Bias statt Streuung (bei fester Position

jedes Mal Abweichung in dieselbe Richtung; wie das Peak-Locking bei PIV).

★Auch Interpolation beseitigt den Bias nicht: Der Korrelationspeak ist sinc-förmig, eine Parabel

kann ihn nicht vollständig annähern. In Messungen mit weißem Rauschen, vollem Band und Verschiebungen um 0–1 Abtastwerte

ist der Fehler eine S-Kurve von höchstens 0.117 Abtastwerten (0 nahe ganzen Zahlen, maximal um 0.3 / 0.7,

Richtung zur ganzen Zahl hin gezogen). Bei Aussagen zur Sub-Sample-Genauigkeit diesen Bias einbeziehen.

Returns:

(delay, table): delay ist ein float in Sekunden (in Abtastwerten bei rate=1.0).

table ist {"lags": Verzögerungen der Form (2N-1,), "r": Korrelationswerte, "peak": Peakwert, "snr_peak": Verhältnis Peak / Nebenpeak}.

★Über das Register (fullseye.ledger.gcc_delay) wird nur delay, der deklarierte out-Typ,

zurückgegeben. Wird auch die Korrelationskurve gebraucht: fullseye.ledger.gcc_delay.raw(...).

Raises:

ValueError: Längen verschieden / kleiner als 2 / nicht endlich, weight unbekannt, band

nicht (lo, hi), lo >= hi oder ungültig für rate,

oder band ist None bei weight="phat" (fail-closed).

Grenzen (honest): (1) Der durch Reflexion, Dispersion und Pfaddifferenzen erzeugte Bias lässt sich nicht entfernen —— entfernen lässt sich nur die Streuung durch Rauschen. (2) Da nur 1 Korrelationspeak gewählt wird, liegt es bei Mehrwegeausbreitung sprunghaft daneben, wenn ein Nebenpeak gewinnt (snr_peak prüfen).

(3) Verzögerungen über der halben Aufzeichnungslänge werden zurückgefaltet.

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.

Ausführlicher Anwendungsleitfaden

• Leitfaden zur Familie acoustic_condition_monitoring

Referenzen (Beispieldaten, Literatur)

• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).

• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.

• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• acoustic_condition_monitoring — py -3.11 examples/acoustic_condition_monitoring.py

Typkompatible Folge-Operatoren (nehmen measurement als Eingabe)

—

Gleiche Kategorie (dual)

coherence · transfer_function


*Provenance: acoustics.py — ACOUSTICS Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*

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