Arduino-Bot, der ein bestimmtes Tonsignal finden kann

Ich arbeite an meinem Senior-Design-Projekt. Es ist ein von Arduino gesteuerter Roboter. Ich versuche herauszufinden, wie ich die Soundlokalisierung am besten implementieren kann. Es scheint einfach, mindestens zwei Mikrofone, Fourier-Transformation des Signals, Berechnung der Phasendifferenz.

Mein Problem ist, dass ich mich auf eine bestimmte Frequenz konzentrieren möchte, also nicht nur versuche, die Quelle mit der größten Amplitude zu finden. Hat jemand eine Empfehlung, wie man so etwas macht. Ich habe noch nie Mikrofone benutzt, kann jemand ein gutes empfehlen?

Ich möchte, dass es eine ziemlich anständige Reichweite hat, wie ein kleines Wohnzimmer oder Schlafzimmer. Ich denke darüber nach, eine sehr niedrige Frequenz zu verwenden, damit ich mir keine Gedanken über eine so hohe Abtastrate machen muss.

Ich verwende ein Arduino Uno für alle, die damit vertraut sind. Ich studiere Computer Engineering, also bin ich mit EE-Begriffen ziemlich vertraut, aber ich lerne dieses Semester immer noch etwas über Signalverarbeitung. Ich weiß, dass ich eine Art Bandpassfilterung verwenden sollte, aber was wäre der beste Weg, dies zu tun?

Wenn Sie Beispiele kennen, die andere Leute gemacht haben, oder Schaltpläne, wäre es sehr hilfreich.

Haben Sie sich einige Artikel zu diesem Thema angesehen, um Informationen darüber zu erhalten, was in Situationen des wirklichen Lebens funktioniert und was nicht?
Was auch immer Sie tun, Sie müssen das System im Voraus kalibrieren. Du hast Recht, Amplitude ist nicht das Richtige ...
Ich habe einige bedeutende Nachforschungen angestellt, aber ich habe kein wirklich gutes Referenzmaterial gefunden, das etwas Ähnliches tut wie das, was ich versuche. Wenn Sie gutes Material finden, posten Sie es bitte.
Wenn Sie nur eine einzelne Frequenz in einem Signal erkennen möchten, benötigen Sie keine vollständige FFT. Berechnen Sie einfach, wie dieses Signal mit einem Sinus und Kosinus dieser Frequenz korreliert. Das sind zwei Werte, die Ihnen auch die Phase geben.

Antworten (2)

Der „ Goertzel-Algorithmus “ benötigt weniger Ressourcen (RAM, Codespace) und weniger CPU-Zyklen für eine einzelne spezifische Frequenz.

Wiki hat eine gute Reihe von Links, durch die man sich vertiefen kann.

Ich habe Goertzel auf ATMega328P und P8X32A mit großartigen Ergebnissen verwendet. Viel Glück mit Ihrem Projekt.

Spät aber .... eine Arduino-Bibliothek: github.com/jacobrosenthal/Goertzel

Die beste Lösung ist die Verwendung von akustischem Beamforming. Ich würde vorschlagen, auf dem DSP-Stackexchange zu posten, aber ich kann Ihnen einige Tipps geben.

Die grundlegende Theorie besteht darin, ein Mikrofonarray zu haben, das die Mikrofone um eine halbe Wellenlänge voneinander trennt (offensichtlich hängt die Wellenlänge von der interessierenden Frequenz ab).

Dieses Mikrofonarray kann verwendet werden, um einen räumlichen Filter zu erzeugen. Es ist dann möglich, digital nach der Richtung mit der höchsten Signalstärke zu suchen. Der einfachste Algorithmus wird Delay-and-Sum-Verfahren genannt. Matlab verfügt über eine praktische Phased-Array-Toolbox, die bei der Implementierung hilft.

Es gibt noch einige Tricks, über die Sie sich Gedanken machen müssen, z. B. die Bandbreite des Eingangssignals. Für Beamforming benötigen Sie im Allgemeinen ein Schmalband zum Berechnen, sodass Sie möglicherweise einen Bandpassfilter für das akustische Eingangssignal implementieren müssen, da akustische Signale breitbandig sind (20 Hz - 20 kHz).

Eine gute Ressource für den Einstieg: http://research.ijcaonline.org/volume61/number11/pxc3884758.pdf