Alles addiert sich
Am Mikrofon kommt die Summe aller Schallquellen an. Wer eine davon verfolgen will, muss sie vorher aus dieser Summe heraustrennen.
Ein Ladegerät, ein Rauchmelder mit leerer Batterie, ein Kopfhörer-Etui, eine unterbrechungsfreie Stromversorgung im Keller. Man hört es und findet es nicht. BeepHunt hört mit, merkt sich genau dieses eine Geräusch und sagt beim Umhergehen, ob es wärmer oder kälter wird.
Ein Piepen alle zwei Sekunden ist laut genug, um wahnsinnig zu machen, und zu kurz, um ihm zu folgen. Bis man den Kopf gedreht hat, ist es vorbei. Kommt es aus einer Schublade, hinter einem Schrank oder von der Decke, klingt es überall ähnlich, weil der Raum es an jeder Wand spiegelt.
Die naheliegenden Werkzeuge helfen nicht weiter. Ein Schallpegelmesser misst alles gleichzeitig: Kühlschrank, Straße, das eigene Atmen und das Piepen ergeben eine einzige Zahl. Ein Spektrum-Analysator zeigt zwar Frequenzen an, überlässt aber die ganze Arbeit dem Betrachter.
Am Mikrofon kommt die Summe aller Schallquellen an. Wer eine davon verfolgen will, muss sie vorher aus dieser Summe heraustrennen.
In einem möblierten Zimmer bilden sich stehende Wellen. Zwei Zentimeter Unterschied können bei hohen Tönen über laut oder leise entscheiden.
Richtungshören braucht mindestens zwei getrennte Aufnahmekanäle. Viele Geräte melden zwei und liefern in Wahrheit einen.
Die App stellt eine Frage und bietet eine Schaltfläche. Alles Weitere läuft im Hintergrund; was sie kann, hängt danach am Gerät, aber der Weg bis zum Fund funktioniert mit einem einzigen Mikrofon.
Die App hört mit und hält die letzten 15 Sekunden im Arbeitsspeicher. Dieser Vorlauf ist nötig: Wenn man die Schaltfläche drückt, ist das Piepen längst vorbei.
Aus dem Gehörten wird eine kurze Liste. Jeder Eintrag ist so beschrieben, dass man ihn wiedererkennt: „8,12 kHz, 96 ms, alle 2,04 s, elfmal gehört“.
Ab jetzt zählt nur noch dieses eine Geräusch. Der Rest des Raums wird ignoriert. Beim Umhergehen meldet die App wärmer oder kälter und merkt sich den besten Punkt.
Wo die Hardware es hergibt: eine Drehung auf der Stelle für einen groben Sektor, zwei echte Mikrofone für eine Peilung, ein zweites Telefon für eine Ortung im Raum.
Der interessante Teil dieses Projekts ist nicht die Oberfläche, sondern die Frage, was sich aus einem Luftdruckverlauf überhaupt bestimmen lässt und was nicht. Die folgenden Abschnitte gehen den Weg der Reihe nach durch. Alle Zahlenwerte sind die, mit denen die App tatsächlich rechnet.
Um zu wissen, welche Frequenz gerade klingt, muss man ein Stück Signal betrachten. Je länger dieses Stück, desto genauer die Frequenz und desto ungenauer der Zeitpunkt. Das ist keine Frage des Aufwands, sondern eine Eigenschaft der Fourier-Transformation: Für ein Fenster der Länge N ist die Frequenzauflösung fest.
23,4 Hz sind mehr als der Unterschied zwischen zwei Exemplaren desselben Geräts. Ein Fenster reicht also nicht. BeepHunt rechnet deshalb drei Auflösungen gleichzeitig, jede für die Aufgabe, für die sie taugt.
| Strom | Fenster | Frequenzraster | Zeitauflösung | Aufgabe |
|---|---|---|---|---|
| Schnell | 1024 | 46,9 Hz | 5,3 ms | wann genau ein Ton anfängt |
| Haupt | 2048 | 23,4 Hz | 10,7 ms | Erkennung und Wiedererkennung |
| Fein | 4096 | 11,7 Hz | 21,3 ms | Frequenz genau bestimmen |
Selbst das feinste Raster wäre noch zu grob. Die tatsächliche Frequenz liegt fast nie genau auf einem Rasterpunkt, aber die Hauptkeule eines Sinustons ist im logarithmischen Maßstab beinahe eine Parabel. Legt man eine Parabel durch den größten Punkt und seine beiden Nachbarn, ergibt deren Scheitel die Frequenz auf etwa ein Prozent eines Rasterschritts genau.
Dieselbe Fensterlänge verfälscht auch die gemessene Dauer: Ein Fenster sieht den Ton bereits, sobald er hineinragt, und noch, wenn er fast heraus ist. Jedes Ereignis misst sich dadurch zu lang, und zwar um einen konstanten Betrag, unabhängig davon, wie lang es wirklich war. Für das verwendete Fenster sind das 19,1 % seiner Länge. Zieht man sie ab, werden aus gemessenen 108 ms wieder die 100 ms, die das Gerät tatsächlich piept.
Ein fester Schwellwert in Dezibel funktioniert nicht: In einer stillen Wohnung ist er zu hoch, neben einer Straße zu niedrig. BeepHunt misst deshalb nie absolut, sondern immer im Verhältnis zum Untergrund an derselben Stelle. Das Verfahren stammt aus der Radartechnik und heißt dort CFAR, nach der konstanten Falschalarmrate, die es sicherstellt.
Der Schutzabstand verhindert, dass der Ton, den man messen will, seinen eigenen Untergrund anhebt.
Drei Einzelheiten daran tragen das ganze Verfahren:
| Entscheidung | Warum |
|---|---|
| Leistung mitteln, nicht Dezibel | Dezibel zu mitteln bildet in Wahrheit das geometrische Mittel, und das liegt unter dem wahren Untergrund. Jeder Störabstand fällt dadurch zu gut aus. Diese eine Einzelheit war der Unterschied zwischen null und 1014 Fehlalarmen über zwölf Sekunden Rauschen. |
| Die größere Seite nehmen | Raumuntergrund ist rosa, er fällt zu hohen Frequenzen hin ab. Ein symmetrisches Fenster über einer schrägen Kurve mittelt die beiden Seiten und liegt auf der lauten Seite zu tief. Das erfindet in den unteren zwei Oktaven dauerhaft 12 bis 13 dB Störabstand, die es nicht gibt. |
| Über die Frequenz, nicht über die Zeit | Wer den Untergrund aus der Vergangenheit derselben Frequenz schätzt, verliert jeden Dauerton: Nach einer Minute ist die Vergangenheit dieser Ton, und er misst sich gegen sich selbst. Nur die Schätzung aus den Nachbarfrequenzen lässt ein Spulenfiepen dauerhaft herausragen. |
Die Leistung einer Rauschzelle ist exponentialverteilt. Damit lässt sich ausrechnen, wie oft ein reiner Zufall die Schwelle reißt:
Der Schalldruck einer Punktquelle nimmt mit dem Abstand ab. Wer von fünf Metern auf einen halben herangeht, ändert den Pegel um rund 20 dB. Ein Wiedererkennungsmerkmal, das sich mit der Lautstärke verschiebt, würde also ausgerechnet dann nicht mehr passen, wenn man am dichtesten dran ist.
Die Lösung steckt in einer Rechenregel: Eine Verstärkung ist im Amplitudenmaß eine Multiplikation, im Dezibelmaß eine Addition. Zieht man vom Spektrum in Dezibel seinen eigenen Mittelwert ab, verschwindet genau dieser konstante Summand, und damit die Lautstärke, ohne dass die Form verlorengeht.
Jedes andere Merkmal wird auf demselben Weg unabhängig gemacht: die Hüllkurve durch ihren eigenen Höchstwert, der Frequenzverlauf durch seinen Median, die Teiltöne relativ zum stärksten. Dauer und Harmonizität sind ohnehin pegelfrei.
Beim Vergleich zweier Aufnahmen wiegt die Frequenz am schwersten, denn der Schwinger, der die Tonhöhe eines Piepsers festlegt, ändert sich weder mit der Entfernung noch mit der Blickrichtung. Verglichen wird dabei die relative Abweichung: 30 Hz sind bei 12 kHz ein Rundungsfehler und bei 400 Hz ein anderer Ton. Hüllkurve und Dauer wiegen weniger, weil der Nachhall des Raums jedes Ereignis am Ende verschmiert. Dazu kommt, dass billige Piepser keine Uhr sind: Derselbe Wecker liefert 92 ms und Minuten später 104 ms, wenn sein Oszillator warm geworden ist.
Ein Gerät piept alle zwei Sekunden. Fährt ein Lastwagen vorbei, geht ein Piepen unter, und aus den Abständen wird 2,0 · 2,0 · 4,0 · 2,0. Der Median liegt weiterhin bei 2,0, aber die 4,0 treibt die Streuung so weit hoch, dass der Takt als unregelmäßig gilt und der Countdown abschaltet, und zwar genau dann, wenn man in einer lauten Umgebung steht und ihn am nötigsten braucht.
Deshalb werden Abstände gefaltet: Passt ein Abstand auf ein ganzzahliges Vielfaches der Grundperiode, wird er durch dieses Vielfache geteilt und wieder zugelassen. Aus 4,0 werden zwei Schläge von 2,0. Die Grundperiode selbst wird aus der kürzeren Hälfte der Abstände geschätzt, denn der Durchschnitt aller Abstände würde von jeder Lücke nach oben gezogen, und eine zu lange Grundperiode faltet nichts mehr richtig.
Im Freifeld wäre es einfach: Der Pegel fällt mit dem Abstand, aus dem Pegel ließe sich der Abstand ausrechnen. In einem Zimmer gilt das nicht. Der direkte Schall überlagert sich mit den Reflexionen der Wände, und bei einem reinen Ton entsteht daraus ein festes Muster aus Maxima und Minima im Raum. Ihr Abstand ist eine halbe Wellenlänge.
Die App rechnet deshalb nie einen Abstand aus der Lautstärke aus. Sie sagt nur wärmer oder kälter, hat dafür einen toten Bereich von 1,5 dB und bittet darum, in mehreren kleinen Schritten zu gehen statt in einem großen. Zusätzlich merkt sie sich den besten bisher erreichten Wert: Wer daran vorbeigelaufen ist, sieht es.
Zwei Mikrofone im Abstand d hören dieselbe Schallwelle nacheinander. Weil die Quelle weit genug entfernt ist, um die Wellenfront als eben anzunehmen, hängt der Laufzeitunterschied nur vom Winkel ab.
Bei 48 kHz Abtastrate entspricht ein einzelner Abtastwert 7,1 mm Wegunterschied. Deshalb wird der Höhepunkt der Kreuzkorrelation zwischen den Abtastwerten interpoliert; erreicht werden besser als 0,4 Abtastwerte.
Zwei Grenzen sind dabei hart. Erstens: |c·τ| ≤ d muss gelten. Ein größerer Unterschied kann kein direkter Weg sein, sondern nur eine Reflexion. Er wird verworfen statt auf ±90° gekappt, was sonst bei jedem Zweifel eine selbstbewusste Peilung genau nach vorn oder hinten ergäbe.
Zweitens: Eine reine Phasenmessung ist nur eindeutig, solange der Mikrofonabstand höchstens eine halbe Wellenlänge beträgt. Darüber wiederholt sich das Bild.
Ein schmalbandiger Ton erzeugt darum eine Korrelation, die im Takt seiner eigenen Frequenz schwingt und alle 1/f fast gleich hohe Gipfel hat. Den höchsten zu nehmen heißt, einen beliebigen zu nehmen. Das ergibt Peilungen, die um Dutzende Grad danebenliegen und dabei sehr überzeugt wirken. BeepHunt bildet deshalb zusätzlich die Einhüllende der Korrelation. Sie schwingt nicht mit, ihre Breite hängt an der Bandbreite statt an der Mittenfrequenz, und sie zeigt, welcher Gipfel der richtige ist. Erst innerhalb dieses Gipfels liefert die eigentliche Korrelation die Feinheit.
Was auch das nicht auflöst: Zwei kugelförmig empfangende Mikrofone messen genau eine Zahl, und eine Zahl kann keine Richtung im Raum festlegen. Jede Peilung ist in Wahrheit ein Kegel um die Verbindungslinie; in der Ebene bleibt davon eine Zweideutigkeit zwischen vorn und hinten. Die App nennt beide Möglichkeiten und schlägt zwei Schritte zur Seite vor, statt eine davon zu wählen und in der Hälfte der Fälle falsch zu liegen.
Und schließlich hängt alles an einer Größe, die kein Sensor misst:
Zwei Telefone hören dasselbe Piepen zu verschiedenen Zeitpunkten, und aus dem Unterschied ließe sich der Ort bestimmen. Vorher steht allerdings ein Problem, das größer ist als der zu messende Effekt: Die Audio-Uhren zweier Geräte haben nichts miteinander zu tun. Solange ihr Verhältnis nicht gemessen ist, ist ein Zeitunterschied zwischen ihnen nicht ungenau, sondern bedeutungslos.
Zwei nominell gleiche 48-kHz-Quarze weichen typischerweise um einige zehn Millionstel voneinander ab. 25 ppm sind nach zwei Minuten 3 ms, umgerechnet gut ein Meter Wegunterschied, bei einer Messung, deren gesamtes Nutzsignal einige hundert Mikrosekunden beträgt.
Gemessen wird mit Schall, nicht über das Netzwerk: WLAN-Laufzeiten schwanken im Millisekundenbereich und sind in beide Richtungen unterschiedlich. Sie würden das Ergebnis verschieben und nicht bloß streuen. Der Raum dagegen ist die einzige Uhr, die beide Geräte wirklich teilen. Jedes Telefon spielt einen kurzen Wischton ab, beide hören beide. Aus den zwei Richtungen folgen zwei Gleichungen:
Der Kalibrierton ist ein logarithmischer Wisch von 2 auf 10 kHz in 60 ms. Ein Knacks hätte die schärfste Autokorrelation, bräuchte dafür aber eine hohe Spitzenamplitude. Ein Tonstoß wäre leise und unauffällig, korreliert aber mit sich selbst um ganze Perioden verschoben, bei 4 kHz alle 0,25 ms, also alle 8 cm scheinbarer Entfernung. Ein Wisch verteilt seine Energie über die Zeit und bleibt dadurch leise, hat aber die Bandbreite, die eine scharfe Antwort braucht.
Erst danach beginnt die eigentliche Ortung. Der Zeitunterschied zwischen zwei Empfängern legt die Quelle auf eine Hyperbel fest: alle Punkte, deren Abstandsdifferenz gleich bleibt. Mit zwei Geräten ist das das ehrliche Ergebnis, und die App zeichnet die Kurve, statt einen Punkt zu behaupten. Erst ein drittes Mikrofon liefert eine zweite Hyperbel und damit einen Schnittpunkt.
Die Unsicherheit entsteht nicht aus einer Formel, sondern indem jede Messung 160-mal im Rahmen ihrer eigenen Streuung verwürfelt und neu gelöst wird. Stehen die Geräte fast auf einer Linie, wird daraus eine lange dünne Sichel, und diese Form ist zugleich die Anweisung, ein Telefon zu versetzen.
Der wertvollste Teil einer Messung ist die Angabe, wo sie aufhört. Diese Liste steht so auch in der Projektdokumentation.
| Nicht behauptet | Weil |
|---|---|
| Abstand aus der Lautstärke | Stehende Wellen machen den Pegel im Raum nicht monoton mit der Entfernung. |
| Vorn oder hinten aus zwei Mikrofonen | Ein Laufzeitunterschied ist eine Zahl und kann keine Richtung im Raum festlegen. |
| Ein Punkt aus zwei Geräten | Ein Zeitunterschied ergibt eine Hyperbel, keinen Ort. |
| Eine Ortung aus Geräten in einer Reihe | Die Aufstellung ist schlecht konditioniert; der Fehler rutscht entlang der Linie davon. |
| Eine Peilung aus einer halben Drehung | Nicht besuchte Sektoren bleiben leer, statt dazwischen ergänzt zu werden. |
| Welches Gerät da piept | Ein Ton ist ein Ton. Aus ihm ein Fabrikat abzuleiten wäre geraten. Die App beschreibt die Wellenform, etwa „kurzer hoher elektronischer Ton“. |
| Dass ein Signal harmlos ist | Niemals. Klingt ein Geräusch nach einem Warngerät, weist die App neutral darauf hin und sagt sonst nichts. Eine falsche Beruhigung über einen Rauch- oder CO-Melder träfe den Nutzer, nicht mich. |
Android-Audiohardware ist sehr verschieden, und kein Datenblatt beschreibt sie zuverlässig. Statt eine Mindestausstattung zu verlangen, ist die App als Leiter gebaut: Die unterste Stufe braucht ein Mikrofon und trägt für sich allein. Jede weitere kommt hinzu, wenn die Voraussetzung wirklich erfüllt ist.
Die Regel darüber lautet: Keine Stufe darf eine tiefere verschlechtern. Stellt sich das Stereosignal als Mischung eines einzigen Mikrofons heraus, bleibt wärmer und kälter genau so gut wie vorher. Bricht die Verbindung zum zweiten Telefon mitten in der Suche ab, läuft die Einzelgerätesuche weiter, ohne dass ein Fenster aufgeht.
Diese Prüfung ist kein Formalismus. Hersteller liefern Stereoaufnahmen aus, bei denen beide Kanäle aus derselben Aufbereitung stammen. So ein Signal korreliert bei jedem Ereignis perfekt bei null Verzögerung, und eine gutgläubige Auswertung macht daraus eine bombenfeste Peilung von 0°, immer geradeaus, egal wo die Quelle steht. Entscheidend ist deshalb nicht die Höhe der Korrelation, sondern die Streuung der gemessenen Verzögerungen: Zwei echte Mikrofone in einem echten Raum sehen Werte, die sich bewegen. Zwei Kanäle aus einer Quelle nicht.
Kotlin, Compose für die Oberfläche, sonst nichts Fremdes im Rechenkern. Die Signalverarbeitung liegt bewusst in einem eigenen Baustein ohne jeden Android-Bezug.
| Baustein | Inhalt |
|---|---|
| Rechenkern | Reines Java-Modul: Fourier-Transformation, Untergrundschätzung, Fingerabdrücke, Korrelation, Geometrie, Ausgleichsrechnung. Kein Android, kein Compose. Dadurch ist er in Millisekunden testbar, und die Schichtregel wird vom Bauwerkzeug erzwungen statt von der Disziplin. |
| Aufnahme | Mikrofonzugriff, Ringspeicher, Prüfung der Gerätefähigkeiten. |
| Plattform | Sensoren, Abstandsmessung, Verbindung zum zweiten Telefon über den Namensdienst und eine einfache Verbindung im eigenen Netz. Kein Fremddienst, damit die Funktion nicht an einem Dienst hängt, den nicht jedes Gerät hat. |
| Ablauf | Die Suche lebt in der Anwendung, nicht in einem Bildschirm: Eine Jagd auf ein Piepen, das einmal pro Minute kommt, muss ein Drehen des Geräts überleben. |
Der Aufnahmefaden schreibt nur Werte in den Ringspeicher und blockiert nie. Der Auswertefaden liest in seinem eigenen Tempo, und wenn er nicht hinterherkommt, springt er vor und meldet das, statt den Schreiber aufzuhalten oder zusammengesetzten Ton zu lesen. Eine Lücke kostet ein Ereignis; verfälschter Ton erzeugt selbstbewussten Unsinn.
Alle auf der Java-Seite, Durchlauf rund 14 Sekunden. Geprüft wird gegen künstlich erzeugte Signale: Piepen bei 1 und 8 kHz, 25 dB Pegelunterschied, zwei Quellen gleichzeitig, Sprache und Musik als Störung. Und Stille, wenn nur Rauschen anliegt.
Der Signalgenerator liegt nicht im Testordner, sondern im Programm selbst. Die Diagnoseansicht sendet damit denselben Referenzton, gegen den die Tests laufen.
Erst ab dieser Fassung meldet das System, wo die Mikrofone eines Geräts sitzen. Ohne diese Angabe lässt sich aus einem Laufzeitunterschied kein Winkel machen.
Eine App, die zuhört, muss dazu etwas sagen können. Der Ton wird ausschließlich auf dem Gerät ausgewertet.
Angelegt am 16. August 2026. Der Rechenkern und die Prüfstände laufen, die Bedienung steht. Was fehlt, ist alles, was sich nur an echter Hardware in echten Räumen klären lässt.
Drei Auflösungen gleichzeitig, Untergrundschätzung, Ereigniserkennung, Fingerabdrücke, Gruppierung, Rhythmus, Zielverfolgung.
Korrelation mit Einhüllenden-Auswahl, Winkelbestimmung samt physikalischer Schranke, Zusammenfassung über viele Ereignisse mit Kreisstatistik, Prüfung der Kanalunabhängigkeit.
Uhrenabgleich über Wischtöne, akustische Abstandsmessung, Ortung mit Rastersuche vor der Verfeinerung und Unsicherheit durch Verwürfeln. Vollständig gegen künstliche Signale geprüft.
Die Bildschirme stehen: Suche, Verfolgung, Sweep, Raumortung, gespeicherte Geräusche, Diagnose. Die geführte Bedienung für den versetzten dritten Ort fehlt noch.
Die Mehrgeräte-Funktionen sind noch nie mit zwei Telefonen in einem echten Raum gelaufen. Sie sind deshalb in der App als experimentell gekennzeichnet. Auch die Verträglichkeitstabelle für Audiohardware ist angelegt und noch leer. Sie füllt sich aus Diagnoseberichten.
Erst wenn die Suche auf fremden Geräten so zuverlässig läuft wie auf meinen. Der Name ist bis dahin vorläufig.
Wie etwas gebaut ist, warum es so gebaut ist, ob es sich auf einen anderen Fall übertragen lässt – schreib einfach. Die Nachricht geht als E-Mail an mich, sonst passiert damit nichts.