Mustererkennung und Frequenzmessung Arduino

Hallo,

Ich möchte mit meinem Arduino Audio-Signale verarbeiten, dabei geht es darum, ein Muster zu erkennen.

Es soll nach folgendem Schema ablaufen: Der Arduino misst über ein Mikrofon eine Frequenz und zeichnet in einer unendlichen Schleife für ca.5 Sekunden auf. Sobald ein bestimmtes Muster erkannt wird, bricht die Aufzeichnung ab und der Arduino startet eine Berechnung.

Ist das generell möglich? Und welche Möglichkeiten habe ich?

Gruß, Golfer86

Du weißt schon, daß der Arduino UNO 2kByte Ram hat bzw der Arduino Mega 8kByte Ram hat und daß nichtmal alles zur Verfügung steht? Wohin willst Du die Daten schreiben?
Was meinst Du mit einer Frequenz?

Das ist möglich: Secret Knock Detecting Lock - YouTube
Secret Knock Detecting Door Lock
Grüße Uwe

Mir geht es nicht um eine vollständige Audiodatei, ich habe vor die Frequenz eines Automotors zu messen (Fahrgeräusch) ich habe mir das so vorgestellt: Am Arduino hängt ein Mikro, der Arduino misst die prägnanteste Frequenz ein paar Mal/Sekunde und speichert sie in einem Array, sobald er dabei ein Muster erkennt (z.B. die Frequenz fällt ab, steigt wieder an und fällt dann wieder) soll er die letzten 5 Sekunden fest speichern und ausgeben.

Gruß, Golfer86

Also dieser Türöffner sieht echt interessant aus so was müsste doch auch mit NFC gehen oder?
Währe ja cool wenn man nur noch ne Chipkarte vor die Tür hält und die dann aufgeht. Oder sogar nur sein Smartphone solange man kein Apfel hat

Hi,

Frequenz eines Automotors zu messen (Fahrgeräusch)

.

Hi,

dazu kommen mir zwei Ideen:

  1. Piezo-Sensor an den Motorblock und Abstand zwischen den höchsten Analog-Werten bestimmen.
  2. Wenns dir nur darum geht rauszukriegen, wie hoch der Motor gerade dreht, dann kannst du dein Arduino mit dem OBD-Port verbinden und die Drehzahl auslesen.

Mir geht es um eine Erfassung außerhalb des Autos, das Auto fährt am Arduino vorbei.

Ich denke die größte Schwierigkeit liegt in der Erfassung eines sauberen Signals, hat da jemand Tipps?

also aus rein mathematischer sicht ist hier sicherlich eine Fouriertransformation das, was du ausführen musst, diese wandelt dir dein signal vom zeitraum in den frequenzraum um (du misst eine gewisse zeit ein audiosignal und bekommst danach alle frequenzen mit deren intensitäten ausgegeben), es gibt auch gute implementierungen für solche Fouriertransformationen (Fast Fourier Transform, kurz FFT wird hier meistens verwendet) ich weiß aber nicht ob der arduino dafür mchtig genug ist, da müssen ein paar ziemlich lange summen ausgerechnet werden, ich könnte mir aber vorstellen das es fertige bauteile gibt, die soetwas machen können, spätestens dein computer kann sowas (jedes gute audioprogramm kann dir ein spektrogramm, das ist die fouriertransformation abgetragen über die zeit, ausgeben, audacity (kostenlos) hat solche eine funktion). du solltest bei einem vorbeifahrenden auto allerdings auch bedenken (sofern dein ziel nicht dessen veranschaulichung ist), dass du den dopplereffekt mit misst.

edith: im playground ist ein artikel zu FFT auf dem arduino verlinkt, zeigt auch die grenzen auf, so wie ich es überflogen hab und gibt eine schönere und ausführlichere beschreibung über FTs als meine :wink:
http://www.arduinoos.com/wordpress/?p=1022

Vielleicht wäre es hilfreich, wenn wir eine Beschreibung des zu lösenden Problems hätten. Evtl. ist ja schon der ansatz der Frequenzmessung ja schon unglücklich gewählt.
@Golfer86: Beschreib doch einfach mal, was genau Du machen willst und dann überlegen wir, wie man das Problem mit einem Arduino gelöst bekommt.

Mario.

Geschwindigkeitsmessung per Dopplereffekt würde nur funktionieren, wenn man sich auf ein bestimmtes Frequenzband konzentriert. Bei den Rardarpistolen sind das Radarwellen, die von der Pistole gesendet werden. Beim Ultraschallsensor sind es eben Ultraschallwellen.

Wollte man soetwas selbst bauen, könnte man ( z.B. für Clubsport/Drag-racing ) das Fahrzeug mit einer eindeutig identifizierbaren "Geräuschquelle" ausrüsten.

Einfacher wäre aber dann eine Lichtschrankenmessung....

Es sollte tatsächlich auf eine Geschwindigkeitsmessung herauslaufen, wenn ich eine Geräuschquelle am Objekt anbringe dann kann ich auch ein Doppler-Radar bauen, es ging mir darum, gerade kein Gerät am Fahrzeug zu montieren.

FFT bedeutet also grob gesagt ich splitte ein breites Frequenzspektrum in die einzelnen Frequenzen auf und kann die dann nach Intensität bewerten?

Wäre es alternativ möglich, das Motorgeräusch im Stand aufzunehmen (mit der Drehzahl, die bei der gesuchten Geschwindigkeit herrscht) und dann die ungefähren Frequenzen zu berechnen, um dann bei einer Messung des fahrenden Fahrzeugs die gesuchte Frequenz eingrenzen zu können?

Eine geschwindigkeitsmessung per drehzahl funktioniert nicht, da die geschwindigkeit des autos nicht drehzahlabhängig ist, sprich im ersten gang hast du bei 6000U/min noch keine 50km/h während du bei der gleichen drehzahl im 4. gang weit über hundert fahren dürftest, vorausgesetzt du fährst nicht berg ab, wo du ohnehin nur die leerlaufdrehzahl brauchst, falls du die kupplung trittst...

Das ist mir klar, deshalb natürlich Messung der Frequenz, die nacher bei der zu messenden Geschwindigkeit im gefahrenen Gang herrscht :wink:

Nochmal das konkrete Problem:

Messung einer Geschwindigkeit, wobei die Geschwindigkeit auf +- 10 km/h bekannt ist, sie kann auch mehrmals gemessen werden. Hintergrund: Doppler-Effekt -> Messung der Frequenz, bei der das Objekt auf das Mikro zu kommt und der, bei der sich das Objekt entfernt.

Zu messendes Objekt: 2-x-rädrige Fahrzeuge angetrieben durch Verbrennungsmotor.

Schwierigkeit: Wie kann ich eine saubere Frequenz mit dem Arduino erfassen und auswerten?

tjoa, wenn du das wirklich machen willst, dann würde ich ein mikrophon mit verstärker an den analogen eingang klemmen, ein kurzes sample aufnehmen (nach dem was ich gelesen habe schätze ich 64 oder 128 samples, mehr is wohl nicht drin), das dann fouriertransformieren und in der transformierten funktion den peak suchen, der peak ist, im rahmen der messunsicherheiten, deine frequenz

Dann habe ich das richtig verstanden ...

Ich werde mich mal mit der Library beschäftigen, die begrenzte Rechenleistung sollte nicht das Problem sein, ich brauche keine Echtzeitanalyse.

die rechenleistung ist auch nicht das proble, der speicher ist es, ob echtzeit oder nicht ist dabei egal, du brauchst das gesamte sample das du fouriertransformieren willst auf einmal im speicher :wink:

derder:
die rechenleistung ist auch nicht das proble, der speicher ist es, ob echtzeit oder nicht ist dabei egal, du brauchst das gesamte sample das du fouriertransformieren willst auf einmal im speicher :wink:

Dann bietet sich ggf. der Arduino Mega an, der hat etwas mehr RAM. Evtl. noch mit der möglichen RAM-Erweiterung:

Irgendwo hab ich das glaub ich auch schon mal als Shield gesehen.

wenn nicht vor ort analysiert werden muss könnte man sich auch überlegen ein solches sample lediglich zu speichern und die FFT auf einem PC auszuführen, dann braucht man allerdings garkeinen arduino, ein richtmikrophon mit aufnahmefunktion tut es dann auch... ansonsten könnte man noch überlegen die bibliothek umzuschreiben und die daten scheibchenweise zu verarbeiten und zum beispiel eine sd-card als (laaaaaaangsamen) RAM zu verwenden, das würde die bauteilkosten in grenzen halten (SD-Karte an arduino braucht ohne shield nur ein paar widerstände), das wäre aber sicher eine riesen arbeit das zu programmieren und würde meine fähigkeiten überschreiten, möglich sollte es allerdings sein. ab einem gewissen punkt halte ich aber wieder einen kleinen computer mit soundkarte, richtmikro und ein programm wie audacity oder mathematika für sinnvoller, ein raspberry pi mit angeschlossenem monitor wäre hier sicher potent genug, muss es unbedingt ein arduino sein?

Es muss nicht sein, aber zumindest die FFT ist ja anscheinend problemlos möglich.

Grundidee war es ein Gerät zu haben, mit dem man durch Knopfdruck die Geschwindigkeit messen kann und sonst nichts, eben diese Einfachheit bietet ein PC nicht, da eben gerade vor Ort analysiert werden soll.

Im Endeffekt sind es ca. 7 Sekunden die eine Messung dauert, was aber wohl schon wieder zu viel ist ...

Ich werde mich erst einmal grundsätzlich mit der FFT-Analyse befassen, der eigentliche Programmcode der zur Analyse notwendig ist scheint nicht sehr umfangreich zu sein.

das ist richtig, wenn die bibliothek die FFT berechnet ist der rest eigentlich leichter als er sich anfangs anhört, ein 7 sekunden audiosample kannst du im arduino vergessen, ich denke selbst im mega wirst du schon probleme mit dem reinen speichern des samples haben, das ausführen der FFT braucht nochmal längen mehr speicher. mit einem raspberry pi ist theoretisch auch ein portables gerät denkbar. an sich glaube ich aber immer noch, das die messmethode über drehzahl des motors VIEL zu störanfällig ist, du musst bedenken das auch alle umgebungsgeräusche mit aufgenommen (und fouriertransformiert) werden, soll meinen wenn nebenan einer seine gitarre genügend laut auf kammerton a stimmt kommt am ende ne frequenz von 440Hz bei raus, außerdem könntest du auch karosserievibrationen messen, die vermutlich gedämpft sind und in einer eigenfrequenz vibrieren, die nur in seltensten fällen (wenn das ganze auto laut brummt) gleich der motorfrequenz sind. ich nehme mal an du willst mal eben die geschwindigkeit eines autos bei irgendwelchen DTM-rennen o.ä. mit publikum ausmachen, das funktioniert dann alleine schon wegen des publikumslärms nicht akustisch, bzw nicht im hörbaren akustischen bereich, hier müsstest du auf ultraschall- oder lichtlaufzeit mit modulierten signalen zurückgreifen, was voraussetzt, das sich das auto gerade auf dich zu oder von dir weg bewegt, du misst dann in kurzer zeit zweimal die entfernung und berechnest daraus die geschwindigkeit. wenn es WIRKLICH mit der drehzahl des ganz bestimmten, vorher vermessenen, motors gehen SOLLTE, dann müsstest du aufgrund der umgebungsgeräusche schon auf ein Laser-Mikrophon zurückgreifen und da bekommst du wieder das problem, das du sehr wahrscheinlich als hauptkomponente die vibration der karosserie misst, wobei man da vielleicht noch in der FFT nicht ausschließlich nach der stärksten frequenz suchen könnte sondern geschickt eine auswählen, die definitiv vom motor stammt, ich weiß allerdings nicht wie weit sich die beiden dinge da überlappen...

just my 2 cents...

Die Messung soll unter relativ günstigen Bedingungen erfolgen, sprich auf einer Straße, wo nur das zu messende Objekt fährt, ohne Publikum bzw. sonstigen Lärm, im dümmsten Fall Vogelgezwitscher.

Selbst wenn ich die Karosserieschwingungen aufzeichnen würde, wäre das ja prinzipiell egal, da der Doppler-Effekt ja auf das gesamte bewegte Objekt wirkt.

Ich habe einen Mega, wenn ich die Abtastrate relativ weit absenke und jeweils 1s des Hinwegs und 1s des Rückwegs aufzeichne, hätte ich ja relativ wenig Verbrauch? Die Schwierigkeit liegt dann eher darin, herauszufinden wann aufgezeichnet werden soll.