INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Umsetzung Harfe



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.)
Beitrag #1

Danika Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Jun 2010

9.0
2009
de


Deutschland
Umsetzung Harfe
Hallo,

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.Sad
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
10.06.2010, 15:24
Beitrag #2

oenk Offline
LVF-Stammgast
***


Beiträge: 361
Registriert seit: May 2005

>= 7.1
2004
EN

3018
Schweiz
Umsetzung Harfe
' schrieb:Warum gibt ein Sinusgenerator ein Rechtecksignal aus??
Wenn Dein Sinusgenerator Rechtecke "rausgibt", dann wird wohl clipping vorliegen. Dh deine Ausgänge können den Pegel des Sinus nicht liefern.

In theory, there is no difference between theory and practice; In practice, there is.

Chuck Reid
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.06.2010, 19:29
Beitrag #3

chrissyPu Offline
LVF-Stammgast
***


Beiträge: 467
Registriert seit: Jun 2006

2014 PDS
2006
DE_EN

64283
Deutschland
Umsetzung Harfe
Hi,

lad doch mal dein VI hoch.

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?

Grüße,
ch
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
11.06.2010, 08:14
Beitrag #4

dlambert Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 89
Registriert seit: May 2009

2010
2007
en

12359
Deutschland
Umsetzung Harfe
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
11.06.2010, 08:32 (Dieser Beitrag wurde zuletzt bearbeitet: 11.06.2010 08:33 von Lucki.)
Beitrag #5

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Umsetzung Harfe
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.06.2010, 09:58 (Dieser Beitrag wurde zuletzt bearbeitet: 14.06.2010 13:04 von jg.)
Beitrag #6

Danika Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Jun 2010

9.0
2009
de


Deutschland
Umsetzung Harfe
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

Lv09_img2


Angehängte Datei(en)
Sonstige .vi  FPGA.vi (Größe: 68,33 KB / Downloads: 275)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.06.2010, 12:28 (Dieser Beitrag wurde zuletzt bearbeitet: 14.06.2010 12:29 von chrissyPu.)
Beitrag #7

chrissyPu Offline
LVF-Stammgast
***


Beiträge: 467
Registriert seit: Jun 2006

2014 PDS
2006
DE_EN

64283
Deutschland
Umsetzung Harfe
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
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.06.2010, 17:12 (Dieser Beitrag wurde zuletzt bearbeitet: 14.06.2010 17:33 von Danika.)
Beitrag #8

Danika Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Jun 2010

9.0
2009
de


Deutschland
Umsetzung Harfe
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.Rolleyes
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.
Lv09_img2


Angehängte Datei(en)
Sonstige .vi  FPGA.vi (Größe: 67,82 KB / Downloads: 266)

Sonstige .vi  D_mpfung.vi (Größe: 18,27 KB / Downloads: 255)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.06.2010, 08:41
Beitrag #9

chrissyPu Offline
LVF-Stammgast
***


Beiträge: 467
Registriert seit: Jun 2006

2014 PDS
2006
DE_EN

64283
Deutschland
Umsetzung Harfe
Morgen...!
' 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

Viele Grüße,

ch
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Gehe zu: