Audio Analyse über FFT & evtl. ML onboard auf dem FiPy

Ich habe mich die tage mal etwas intensiver mit der neuen Möglichkeit der neuen experimentellen inoffiziellen Firmware beschäftigt. Je tiefer ich in das Thema eintauche desto mehr fragen stellen sich mir. Die Hauptidee ist es, die Daten Direkt auf dem FiPy zu analysieren, da dieser ja eh einen Großteil der Zeit schläft und trotzdem über Netzanschluß versorgt werden muß so brauchen wir auch nur einen teil der Daten übertragen, um Bandbreite zu sparen.Die .wav würde ich zur nachträglichen Analyse auf der SD lassen und nur bei erreichen der Speicherkapazität jeweils die Ältesten löschen.

Ich habe das Beispiel für die Audioaufzeichnung von @Clemens genommen und wollte jetzt im ersten Zwischenschritt die erstellte .wav Datei wieder einlesen. Um Zeit und Speicher zu sparen will ich dieses in Frames machen. die Frage die sich mir jetzt stellt ist wie groß müssen die Frames sein und müßen wir die komplette .wav Analysieren, oder reicht uns ein etwas größeres Stück in der Mitte.
Um Datenmengen zu sparen finde ich auch, wir sollten wenn wir de Daten zu Grafana? übertragen auch nur ein bestimmtes Spektrum übertragen. Welches Frequenzspektrum kommt da überhaupt in Frage und wie fein sollten wir es auflösen. (wie sollte der Datensatz im Idealfall aussehen.

Des weiteren bin ich auf ein angefangenes Projekt von unserer Community und OSBH gestoßen “Audiohealth” die sich genau diesem Thema schon angenommen haben. Hier im Forum kann man auch schon einiges dazu nachlesen.

Um soetwas wie Audiohealth direkt Onboard ausführen zu können brauchen wir zusätzlich noch “machine learning”. Das einzige was ich bisher unter Micropython und Pycom gefunden habe ist allerdings nur MicroMLP welches allerdings in reinem Micropyton und zeit intensive Prozesse nicht in C ausgelagert sind. Anscheinend wird es auch nicht weiterentwickelt (letzter commit 1 Jun 2019).

Hat jemand Ideen oder ein paar Infos für mich?

Ich habe da die tage auch dran gearbeitet. Dazu habe ich mich an folgender Quelle Orientiert:
https://www.mathworks.com/help/matlab/ref/fft.html

Die micropython Implementierungen habe ich eben in ein Repository geschmissen:


Beachte hier, dass dieses WIP und nur zum testen da ist.

Dort findest du einmal in der fft_analyzer_without_mic.py die Umsetzung der mathworks Implementierung und die darauffolgende Unterteilung in ‘Bins’. Mit Bins ist ein Bereich gemeint welchen wir analysieren wollen. In dem Beispiel haben wir 10 100Hz Bins von 0 bis 1000Hz. Für jeden Bin wird dann einfach das Maximum ausgegeben(Kann man aber auch zu avg o.ä. ändern).

In der Zweiten Datei ist mein versuch die Daten des Mics als input zu verwenden. Allerdings bin ich dort noch nicht sehr weit gekommen. Mein momentanes Problem ist, dass ich nicht mathematisch die Datenmenge des Mikros für einen festen Zeitrahmen mit fester Abtastrate bestimmen kann. Weshalb auch immer ist diese Datenmenge deutlich höher als berechnet.

Falls du mehr über den Code wissen willst kann ich diesen gerne noch genauer Beschreiben.

wie gesagt meine Idee ist es die wav Dateien sowieso erstmal in einer art Ringspeicher auf SD mit einem Index versehen zu speichern.
So können wir nachträglich auf diese Roh Dateien noch zugreifen, falls uns im nachhinein was verdächtiges im Stock oder im Spektrum auffällt.

Der Code müsste aus der Hüfte geschoßen etwa so aussehen. (noch nicht getestet)

#read file again in frames for fft 

BUFFER_SIZE = 1024

in_wav = open('/sd/mic_left_channel_16bits.wav','rb')

frames_to_read = BUFFER_SIZE / (in_wav.getsampwidth() + in_wav.getnchannels())

while True:

    frames = in_wav.readframes(frames_to_read)

    if not frames:

        break

    # do something with frames

ein sehr schönes fundstück zum Aufbau von wav files
https://web.archive.org/web/20140221054954/http://home.roadrunner.com/~jgglatt/tech/wave.htm

Wäre es dann nicht sinnvoller die Daten bei der Aufnahme zu analysieren und auf die sd karte zu schreiben? Sonst macht man sich ja mehr arbeit, wenn man die Daten zum analysieren wieder einlesen müsste.

Mike Teachman hat ebenfalls einige Beispiele wie man wav Dateien einlesen kann.

Sicher, da hast Du schon recht. Ich würde Aktuell aber gerne noch das Wav File zu der entsprechenden Analyse zusätzlich behalten. Im Idealfall sollte die Spektrumanalyse die Probe auch innerhalb des Soundfiles nach z.B. 1-2 Sec. nehmen.
Eine einzelne Spektrum Analyse würde ich alle X Min mit den anderen Sensordaten auf unseren Server zu Grafana hochladen.

Wenn ich jetzt irgendetwas auffälliges am Stock, den anderen Sensordaten oder am Spektrum bemerke, kann ich die dazugehörigen .wav Dateien entweder per SD oder FTP vom FiPy holen und nochmal selbst horchen oder weiter untersuchen und Archivieren.

Wenn wir einen fertigen funktionierenden Logarithmus haben, der den Status bei den Bienen erkennt brauchen wir das natürlich nicht mehr.
Um einen solchen zu erstellen brauchen wir aber eine umfassende Datenbank mit möglichst viel Informationen.
Dazu gehört sicherlich auch die dazu passende 3-5 sec Sounddatei.

1 Like