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!
10.06.2010, 14:55 (Dieser Beitrag wurde zuletzt bearbeitet: 10.06.2010 15:02 von Danika.)
ich habe ein verdammt großes Problem. Ich habe in der Uni die Aufgabe eine Harfe mit Hilfe LabVIEW zu realisieren. Das wäre soweit auch ganz einfach, wenn es nicht über ein NI C-Rio Einheit laufen sollte. Wir haben 30 digitale Eingänge und einen analogen Ausgang. Immer wenn sozusagen die Harfe gezupft wird, soll ein Ton ausgegeben werden. Nach Angabe unseres Profs soll das gesamte Programm im FPGA.vi beschrieben werden.
Mit dem Sinusgenerator kann ich auch einen Ton ausgeben lassen solange die Boolsche Variable der digitalen Eingäng auf true gestellt ist. Das habe ich mit einem Event-Case umgesetzt. Jedoch hört man das es kein sauberer Sinus ist. Auch nach der Überprüfung mit einem Osziliskop wurde ersichtlich, dass nur Rechtecke ausgegeben werden.
Weiterhin sind unseren Aufgaben unabhängig von der Dauer der Boolschen Variable, dass das Sinussignal immer 5 Sekunden lang ausgegeben wird und im Laufe dieser Zeit gedämpft wird.
Jedoch ist die Timervielfalt sehr begrenzt und die Exponentialfunktion funktioniert auch nicht.
Der Timer ist ja ein interner Zähler. Wie kann ich den zurücksetzen? Wie kann ich die Dämpfung einer Sinusfunktion im FPGA-Code umsetzen??Warum gibt ein Sinusgenerator ein Rechtecksignal aus??
Ich bin wirklich ratlos und muss leider zugeben, dass ich sonst auch keine weiteren LabVIEWerfahrungen habe. Über Denkanstöße wäre ich sehr erfreut.
Vielen dank für eure Hilfe im voraus.
Generelle Ideen:
- Du hast nur einen Sinus hinterlegt, der erste Eingang startet die Ausgabe, die dann dauernd erfolgt und mit der Zeit abklingt (kann man über nen Schleifenzähler oder so realisieren)
- Der nächste Eingang erzeugt keinen neuen Sinus, sondern ändert nur die Ausgaberate des hinterlegten Sinus (Das ist so in den NI-Beispielen zur Ausgabe von Analogen Signalen auf dem FPGA dargestellt, musst Du dir vielleicht mal ansehen).
- Hast Du mal überlegt, dass Du bei z.B. 20 kHz und einem C-RIO (das glaube ich nur Ausgabemodule mit max 200 kHz oder so hat) nur ca. 10 Werte pro Schwingung hast und das je nach Timing auch nach "Rechteck" aussehen könnte?
Da Du keine großen Erfahrungen hast, solltest Du auch ganz klein anfangen.
Meine Empfehlung für Dein Sinusprojekt:
FPGA Memory Block
- lege auf dem FPGA einen Speicher an
- wähle als Datentyp I16 ( damit bildest Du die möglichen 16 bit für die Ausgabe ab )
- die Anzahl der Werte bestimmt später die Auflösung des Sinus, beginne hier mit z.Bsp 2048 Werten für eine Periode
- nutze zur Initialisierung des Speichers die eingebaute Sinusfunktion
Damit hast Du für den FPGA eine auf I16 normierte Sinusperiode.
Versuche nun den Speicher auf einem AO auszugeben und verwende wie erwähnt eine Schleife um die Amplitude zu verändern und das Signal nicht nur für eine Periode sondern länger auszugeben.
Bitte beachte das Du bei dieser Methode RAW und nicht FixedPoint Werte verwenden müsstest. Das heisst Du musst die Kalibrierinformationen selbst verrechnen ( auf dem RT oder dem PC ). Für den Anfang kannst Du auch auf die Kalibrierung verzichten.
Bei konstanter Ausgabefrequenz kann dann eine Änderung der Signalfrequenz durch eine entsprechende Abtastung der normierten Periode realisiert werden.
Hope it helps
Christian
11.06.2010, 08:32 (Dieser Beitrag wurde zuletzt bearbeitet: 11.06.2010 08:33 von Lucki.)
Ich weiß ja nicht, wie die Aufgabenstellung formuliert ist, aber immerhin kommt darin das Wort "Harfe" vor. Mit Musik oder gar Harfe hat das alles aber gar nichts zu tun, wenn für die Tonerzeugung ein Sinusgenerator verwendet wird. Die Basis für die Kangerzeugung müßten vielmehr MIDI-Samples sein. Du müßtest Dich also erst mal mit den Grundlagen der Klangerzeugung auf der Basis von MIDI-Samles vertraut machen. Dann würde ich mir entsprechende Samples besorgen und ein Programm mit LabVIEW erstellen -eigentlich ein sehr interessantes Projekt.
14.06.2010, 09:58 (Dieser Beitrag wurde zuletzt bearbeitet: 14.06.2010 13:04 von jg.)
Danke erst einmal für die vielen Antworten. Konnte leider nicht eher reagieren, weil ich nur an der Uni LabVIEW habe. An das Clipping hatte ich auch bereits gedacht, und habe deswegen mal ganz simpel unterschiedliche Amplituden angegeben, wodurch aber kein Unterschied bei der Signalausgabe ersichtlich war.
Mein Prof meint die Midi-Samples ist ein weiterer Schritt den man gehen kann. Wir sollen uns jedoch ersteinmal auf Tonerzeugung im physikalischen Sinne beziehen, sodass dieser Vorschlag mir auch nicht weiterhilft.
Ich habe jetzt ein VI hinbekommen , dass einen Schleifenzähler aufweist. Ist zumindest schoneinmal ein anfang. Ich habe das vi erstmal hochgeladen. Vielleicht gibt es ja dann noch andere Ansätze.
Grüße
Anzeige
14.06.2010, 12:28 (Dieser Beitrag wurde zuletzt bearbeitet: 14.06.2010 12:29 von chrissyPu.)
Vielleicht keine Ansätze für Dein Problem, aber Ansätze für richtiges Programmieren:
- Lokale Variablen sind nicht dazu da, BDs hübsch aussehen zu lassen. Besser durch Schieberegister ersetzen.
- Wenn überhaupt auf dem FPGA Globale Variablen nutzen und keine Lokalen, da das einen Performance-Gewinn bringt (siehe auch Hilfe zu Variablen bei FPGA-VIs)
- Generell versteh ich ein paar Dinge nicht, warum ist Deine Resetbedingung für den Sinus z.B. Zähler > x? Wenn Zähler >x ist, kommst du nie in den entsprechenden Case, da Zähler <x dafür Bedingung ist. Daher dann doch lieber den Wert des Digitalen Eingangs durchführen, weil du nur damit resetten kannst.
- Warum sowas wie Zähler + 0?
- Warum I8 als Ausgabe für 16bit-IO?
Vielleicht versuchst du einfach mal, einen festen Ton zu generieren. Dann eine Tongeneration, die Tonfrequenz, Taktrate des FPGA und Ausgabefrequenz Deiens Signals unabhängig voneinander macht. Im nächsten Schritt dann die Dämpfung für diesen Ton einzubauen und dann als nächstes die Sache mit mehreren Tönen parallel zu überlagern...
Viel Erfolg,
ch
14.06.2010, 17:12 (Dieser Beitrag wurde zuletzt bearbeitet: 14.06.2010 17:33 von Danika.)
Danke für die Hinweise.
Die Resettbedingung habe ich rausgenommen, war ja somit doppelt gemobbelt. Auch die +0 habe ich rausgelassen, da es ja sinnfrei ist. So nun aber die Probleme, Schieberegister werden im FPGA nicht compiliert, somit fand ich die lokalen Variablen als einfachste Umsetzung, auch wenn ich einen Performanceverlust habe. Die Nutzung von globalen Variablen habe ich nicht verstanden. Ich weiß nur, dass sich dadurch ein neues VI öffnet und ich dort meine Variable definieren soll. Jedoch habe ich keine Umsetzung für dieses VI gefunden. Das mit dem Integerzahlentyp habe ich geändert.
Die Umsetzung mit der getrennten Eingabe von Tongeneration, Tonfrequenz,... ist leichter gesagt als getan. Ich habe am Anfang viel Zeit damit verschwendet, den Sinus nicht über diesesn Sinusgenerator zu erstellen. Jedoch ist mir keine Umsetzung gelungen durch die eingeschränkte Funktionsvielfalt im FPGA.Mit dem Sinusgenerator kann ich wenigstens einen Ton generieren und damit war ich schon sehr glücklich. Es ist zwar nicht die schönste Art und Weise aber ich hatte mir zur Not gedacht, einfach 30 Sinusgeneratoren zu verwenden.
Hat jemand schon Erfahrung mit dem Sinusgenerator? Wieso gibt dieser nur ganze Zahlen aus? Wie kann ich eine Dämpfung realisieren, wenn bei der Verwendung von Festkommazahlen immer die essentiellen Stellen weggeschnitten werden und dadurch nur Nullen ausgegeben werden?
ich hänge auch mal ein Vi dran, wie ich mir das mit der Dämpfung vorgestellt habe, wo jedoch noch eine Umwandlung in Festkomma erfolgen muss, nur weiß ich nicht wie.
' schrieb:So nun aber die Probleme, Schieberegister werden im FPGA nicht compiliert,
Nope. Das geht, zumindest in 8.6.1 und Schieberegister sind auch in den NI Styleguidelines für FPGA-I/O (Stichwort: Pipelining) das nötige Konstrukt... Siehe http://zone.ni.com/devzone/cda/tut/p/id/3749 Meinst Du vielleicht Rückkopplungsknoten? Schieberegister sind die, die man mit Rechtsklick auf den Schleifenrand erzeugt...
' schrieb:Die Umsetzung mit der getrennten Eingabe von Tongeneration, Tonfrequenz,... ist leichter gesagt als getan. Ich habe am Anfang viel Zeit damit verschwendet, den Sinus nicht über diesesn Sinusgenerator zu erstellen. Jedoch ist mir keine Umsetzung gelungen durch die eingeschränkte Funktionsvielfalt im FPGA.Mit dem Sinusgenerator kann ich wenigstens einen Ton generieren und damit war ich schon sehr glücklich. Es ist zwar nicht die schönste Art und Weise aber ich hatte mir zur Not gedacht, einfach 30 Sinusgeneratoren zu verwenden.
Ich will Dich nicht enttäuschen, aber mit 2048 Werten mit 16bit für 30 Generatoren bist du bei 125 kByte Speicherbedarf für die Werte (da der Compiler das glaube ich nicht sinnvoll mit nur einem Speicherbedarf optimiert) - und das haben die kleinen FPGAs schon nicht mehr. Bei NI gibt es ein Beispiel, wie man einen beliebigen Sinus ausgeben kann. Schau Dir das doch mal an.
' schrieb:Hat jemand schon Erfahrung mit dem Sinusgenerator? Wieso gibt dieser nur ganze Zahlen aus? Wie kann ich eine Dämpfung realisieren, wenn bei der Verwendung von Festkommazahlen immer die essentiellen Stellen weggeschnitten werden und dadurch nur Nullen ausgegeben werden?
Was gibt denn dein DA-Modul aus? Normalerweise können DA-Wandler nicht mit Festkommazahlen umgehen, sonden halt nur mit Integern - und da macht es halt auch Sinn, mit "ganzen Zahlen" zu arbeiten. Außerdem fressen Festkommazahlen die Performance, die du glaube ich brauchst, um halbwegs sinnvolle Töne erzeugen zu können... Zum Thema Skalierung (und Dämpfung ist ja nichts anderes als eine laufzeitabhängige Skalierung ) siehe http://zone.ni.com/devzone/cda/tut/p/id/3661