Verschieden gepulste Signale "zusammenmischen"

Hallo liebes Arduino-Forum,

ich habe mir mit etwas Internethilfe einen Bandpassfilter zusammengebastelt. Um diesen auf Funktionalität zu prüfen würde ich gerne an einem anderen Arduino auf mehreren Digitalpins per tone() Signale mit verschiedenen Frequenzen ausgeben (Bsp.: 500 Hz, 1 kHz, 2 kHz, 5 kHz,...). Diese Signale würde ich gerne überlagern, um zu schauen ob bei meinem Bandpassfilter auch fast nur die richtige Frequenz durchkommt (~ 2 kHz).

Nun meine Frage: Wie überlagere ich diese Signale am besten? Kann ich einfach bei einem Breadboard die Digitalpins alle mit einer verbundene Reihe verbinden oder brät dann irgendetwas im Arduino durch? Ich bin leider eine Niete in E-Technik, wäre toll wenn ihr mich aufklärt :slight_smile:

LG Michael

Mischen geht, mit einem Schutzwiderstand (>220 Ohm) an jedem Ausgang. Die offenen Enden der Widerstände zum Summenpunkt = Ausgang verbinden. Die Widerstände dürfen weit größer werden, wenn der Eingangswiderstand der nachfolgenden Schaltung (analoger Pin? 50k) entsprechend hoch ist. Mit unterschiedlichen Widerständen kann den Signalen ein unterschiedliches Gewicht (Anteil) verpaßt werden.

Die Referenz zu tone hast du gesehen?

Only one tone can be generated at a time

Eine FFT vor dem Filter um das Signal zu erzeugen.
Eine FFT nach dem Filter für die Analyse.

DrDiettrich:
Mischen geht, mit einem Schutzwiderstand (>220 Ohm) an jedem Ausgang. Die offenen Enden der Widerstände zum Summenpunkt = Ausgang verbinden. Die Widerstände dürfen weit größer werden, wenn der Eingangswiderstand der nachfolgenden Schaltung (analoger Pin? 50k) entsprechend hoch ist. Mit unterschiedlichen Widerständen kann den Signalen ein unterschiedliches Gewicht (Anteil) verpaßt werden.

Danke, werde ich mal austesten :slight_smile:

michael_x:
Die Referenz zu tone hast du gesehen?

Oh, leider nicht... Hab hier noch ein paar mehr Arduinos rumliegen dann müssen die herhalten.

combie:
Eine FFT vor dem Filter um das Signal zu erzeugen.
Eine FFT nach dem Filter für die Analyse.

Wusste gar nicht dass das mit dem Arduino möglich ist, gibt es schon eine vorgefertigte Funktion für eine FFT beim Arduino?

Es gibt eine FFT Bibliothek für Arduinos. Für die Signalerzeugung nützt die allerdings wenig, weil alle Ausgänge digital sind. Das bedeutet daß jeder Pin viele Oberwellen abgibt, deren Amplitude nicht entsprechend der FFT beeinflußt werden können.

Ein Arduino Mega hat 6 Timer, von denen 5 für die Erzeugung unabhängiger Frequenzen benutzt werden können. Andere haben DACs, mit denen sich beliebige Frequenzgemische ausgeben lassen, wenn man nicht gerade Wert auf HiFi legt.

DrDiettrich:
Ein Arduino Mega hat 6 Timer, von denen 5 für die Erzeugung unabhängiger Frequenzen benutzt werden können. Andere haben DACs, mit denen sich beliebige Frequenzgemische ausgeben lassen, wenn man nicht gerade Wert auf HiFi legt.

Hmm, gibt es einen einfachen Weg diese 6 Timer anzusteuern? Ich hätte sonst vor mit analogWrite die zwei Standard PWM Frequenzen des Mega (490 Hz, 980 Hz) auszugeben und dazu tone() mit unterschiedlichen Frequenzen, sollte hoffentlich zum testen reichen.

Wusste gar nicht dass das mit dem Arduino möglich ist, gibt es schon eine vorgefertigte Funktion für eine FFT beim Arduino?

Nicht für alle Arduinos.
Viele sind einfach zu winzig, oder/und zu lahm.

Es gibt aber auch Arduino Kompatible mit in Hardware gegossener FFT.
z.B. die mit dem kendryte k210 Chip

Aber warm bin ich damit auch noch nicht.

Ich weiß nicht, was "einfach" für Dich ist. Zum Timer1 gibt es eine fertige Bibliothek TimerOne, der Code muß dann nur noch für jeden weiteren Timer kopiert und angepaßt werden.

Um einen Bandpass zu testen, ist es da nicht einfacher, sich nur eine Frequenz gleichzeitig anzusehen?

Mal abgesehen davon, dass ein Rechtecksignal (statt eines Sinustons) seine eigenen Probleme macht.

michael_x:
Um einen Bandpass zu testen, ist es da nicht einfacher, sich nur eine Frequenz gleichzeitig anzusehen?

Mal abgesehen davon, dass ein Rechtecksignal (statt eines Sinustons) seine eigenen Probleme macht.

Wenn man auf externe Chips setzt, könnte auch der AD9833 oder einer seiner Brüder interessant sein

Ich habe es nun hinbekommen mittels arduinoFFT das Signal direkt auszuwerten, ich gucke mir sozusagen die FFT direkt an und lasse bestimmte Frequenzen durch und andere nicht, klappt auch ganz gut.

Vielleicht etwas zum Kontext: Ich habe eine Fotodiode mit Transimpedanzverstärkung an den Arduino angeschlossen, welche nur gepulste Signale mit 2 kHz erkennen soll. So soll das Lichtsignal von Störquellen unterschieden werden können (Deckenlampe: 100-120 Hz,...). Leider ist das gepulste Signal nochmal mit 833 Hz gepulst, d.h. es geht alle 1200 Microsekunden wieder ein und aus. Also habe ich nur knapp unter 3 Perioden zum messen. Ich versuche jetzt mit dem Verhältnis der erkannten Amplituden der Frequenzen der FFT im Bereich 500-1750 Hz, 1750-2250 Hz und 2250+ Hz eine recht eindeutige Regel zum durchlassen zu erreichen, Mal schauen wie zuverlässig das klappt.

Die 2 kHz können auch erhöht werden, jedoch muss dann auch die FFT entsprechend schnell sein. Wenn ihr noch Ideen habt wie man in dem Kontext die Erkennung verbessern kann immer her damit. Ich kann auch später Mal den aktuellen Code posten.

Du musst bedenken, dass ein Rechtecksignal nicht das gleich ist wie ein Sinussignal. Ein Rechecktsignal enthält auch größere Frequenzen, als seine Grundfrequenz (siehe unten). Dein System könnte also immer noch falsche Signale erkennen.

Zum Testen des Bandfilters musst du die Signale eigentlich nicht mischen, und ich weiß auch nicht ob das sinnvoll ist. Ich würde einen Testlauf machen, in dem ich kontinuierlich die Frequenz ändere. Du kannst dann ja ebenso schauen, wann hinter deinem Filter signifikante Amplituden ankommen.