Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ich habe folgendes Problem bei der Ausgabe eines Signals über DAQ:
es soll ein Sinus generiert werden, welcher über ein cdaq-9174 und einem 9263 Modul ausgegeben wird. Der Sinus soll in seinen Parametern (Amplitude, Phase, Frequenz) während der Ausführung veränderbar sein und kontinuierlich ausgegeben werden.
Mit dem angehangenen Programm schaffe ich es aber nicht, dass er ohne Unterbrechung ausgegeben wird. Wenn ich die Sample-Raten von DAQ Write und der Sinuserzeugung gleich setze, bekomme ich pro Schleifendurchlauf 2 mal ein Knackgeräusch auf dem angeschlossenen Körperschallwandler. Je größer ich die Sample-Zahl des Sinus mache, desto länger wird das Signal, allerdings läuft die Schleife dadurch natürlich noch langsamer.
Da komm ich auch schon zu meinem zweiten Problem, der Geschwindigkeit. Ich bekomme gefühlt pro Sekunde einen Schleifendurchlauf und dadurch wird das ganze Programm sehr träge. Zum testen wurde die Sinuserzeugung aus der Schleife genommen (ist dadurch nicht mehr anpassbar im Betrieb), es ruckelt allerdings trotzdem. Daher scheint die Unterbrechung durch den Write zu entstehen.
Habe ich das ganze nun grundlegend falsch verstanden mit der Platzierung der Blöcke in der Schleife? Ich möchte das Signal verändern können um mittels Amplituden- und Frequenzanpassung einen vorhandenen Sinus auszulöschen ("manuelles" Active Noise Canceling, da ich es über einen LMS Baustein ebenfalls nicht schaffe aktuell), daher sollte der Sinus unterbrechungsfrei sein und seine Parameter schnell anzupassen sein (also nicht jedes mal mehrere Sekunden warten, bis eine Eingabe auch umgesetzt wird)
Zitat:Ich bekomme gefühlt pro Sekunde einen Schleifendurchlauf
Du erzeugst ein Signal mit einer Samplerate von 20kHz und 20000 Samples. Das ergibt genau eine Sekunde…
Zitat:bekomme ich pro Schleifendurchlauf 2 mal ein Knackgeräusch auf dem angeschlossenen Körperschallwandler
Erzeugst du deine Sinusverläufe auch so, dass du komplette Sinusperioden ausgibst?
Wenn du nur (z.B.) 0.75 Perioden ausgibst, bekommst du natürlich Knacken…
Das mit der einen Sekunde verstehe ich. Wenn ich z.b 80.000 Samples erzeugen lasse, bekomme ich 4 Sekunden lang ein ununterbrochenes Signal. Allerdings kann ich während dieser Laufzeit auch keinerlei Änderungen an den Sinus-Parametern vornehmen. Ist das denn generell möglich, ein kontinuierliches Signal zu erzeugen, welches ich auch jederzeit anpassen kann?
Ob ich komplette Sinus-Verläufe bekomme, kann ich nicht feststellen, aber wie du sagst, deutet ein knacken auf einen unvollständigen Sinus hin. Gibt es denn eine Möglichkeit den Schleifendurchlauf an den Sinus zu koppeln? Oder kann ich der Schleife eine fixe Laufzeit vorgeben und diese dann auf T=1/f setzen?
Ich kann zwar im Sinus-Block angeben, dass es das Signal nicht zurück gesetzt wird nach dem Durchlauf (also kein Knacken mehr), aber dafür kommt es zu einer Phasenverschiebung, die kontraproduktiv ist.
Zitat:Gibt es denn eine Möglichkeit den Schleifendurchlauf an den Sinus zu koppeln?
Du könntest die Signalgenerierung an die Sinusfrequenz koppeln: immer eine ganzzahlige Anzahl von Sinusperioden erzeugen lassen!
(Du kannst Fs und #s jeweils passend variieren…)
Blöd gefragt: wie genau setze ich das dann um mit der Koppelung?
Ist das denn ein allgemeines Problem, dass ich ein unterbrechungsfreies Signal nur innerhalb eines Schleifendurchlaufes erzeugen kann? Also sobald die Schleife erneut startet, wird ein Signal zurück gesetzt und einfach das geschrieben, was gerade als neues Signal erzeugt wurde?
29.07.2015, 13:29 (Dieser Beitrag wurde zuletzt bearbeitet: 29.07.2015 13:30 von GerdW.)
Zitat:wie genau setze ich das dann um mit der Koppelung?
Gehen wir mal von deiner Fs=20kHz aus:
Du willst z.B. ein Sinus mit 120 Hz ausgeben. Wieviele Samples entspricht also eine Periode bei Fs=20kHz? Richtig: 20kHz/120Hz=166.67 Samples. Du willst eine ganzzahlige Anzahl Perioden ausgeben und ein Signal von mind. 0.5s Länge haben: du musst also ein Vielfaches von 166.67 und mindestens 10kS berechnen: also 60 Perioden, die "zufälligerweise" () genau 10kS benötigen…
(Alles einfacher Dreisatz, Mathematik der Klasse 4)
tldr: über #samples kannst du sicherstellen, dass bei festem Fs immer eine ganze Anzahl Sinusperioden ausgegeben wird…