www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP DSP Anfängerfrage


Autor: schnudl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach einer Zeit der Beschäftigung mit MCUs möchte ich mich nun ein wenig 
mit DSPs beschäftigen. Es geht mir vorerst nur um ein Basiswissen und 
ein Gefühl, wozu DSPs gut sind, wo sie dem simplen Controller überlegen 
sind und wie man sie im Prinzip programmiert. Daher bitte ich Euch, 
meine folgenden dilletantische Fragen zu verzeihen:

Soviel ich weiss, besteht der wesentliche Unterschied in der 
Bereitstellung einer "ultraschnellen" Multiplikation/Addition, mit deren 
Hilfe zB digitale Filter realisiert werden können.

Wie ginge ich bei der Implementierung eines Digitalen Filters nun 
konkret vor?

1)
Ich muss das Eingangssignal zunächst bandbegrenzen und dann abtasten. 
Kommt mir hier der DSP entgegen? Das kann jede MCU auch, vielleicht 
nicht so schnell.

2)
Wie verarbeite ich dann die abgetasteten Werte? Geschieht dies etwa in 
einer IR-Routine nach jeder fertigen Wandlung - ? Das kann eine MCU 
auch.
Oder gubt es hier einen Automatismus, der einen Eingangsstream 
automatisch verarbeitet, ohne dass ich mich um jede Wandlung im 
Einzelnen kümmern muss?

3)
Sobald ich den digitalen Wert in der Hand habe muss ich ihn "digital 
verarbeiten", zB ein Filter, welches Multiplikationen und Additionen der 
aktuellen und vergangenen Werte erfordert. Details sind jetzt 
uninteressant. Geschehen diese "zeitintensiven" Berechnungen nun 
genauso, wie ich sie in einer normalen MCU tun würde, nur einfach 
schneller und vielleicht in einem Maschinenbefehl? Falls ja, Kann man 
das auch in C programmieren oder macht man sowas immer in Assembler?

4)
Nun müsste ich die Werte wieder analog umwandeln. Ich habe mal kurz 
nachgeschaut, der dsPic (er schreibt sich ja auf die Schulter, zumindest 
ein "halber" DSP zu sein) hat aber nur einen A/D Wandler. Wie verwende 
ich diesen "DSP" dann, wenn ich ein Filter implementieren möchte und 
wieder ein analoges Ausgangssignal brauche? Ich habe gesehen, es steht 
eine I²S Schnittstelle zur Verfügung, aber die dient ja nur zur 
Übertragung digitaler Streams von einem Chip auf den anderen.

Ihr seht, irgendwie habe ich noch kein geschlossenen Bild, was ein DSP 
wirklich macht, bzw. WIE man verschiedenen Dinge mit diesem machen kann.

Kann mir jemand meine Fragen allgemein beantworten ?

Und: Der dsPic wird an verschiedenen Stellen als Einstieg in die DSP 
Welt empfohlen. Wenn ich mir jedoch ein konkretes Datenblatt aus dieser 
Serie ansehe, so sehe ich eigentlich nur Dinge, die ich auch in einem 
normalen Controller vorfinde, zusätzlich einige wenige Maschinenbefehle 
für schnelle Multiplikationen/Akkumulierungen. Klar, dass letzteres den 
Unterschied ausmachen kann, aber wenn das "alles" ist, was einen DSP 
ausmacht, dann bin ich eigentlich ein wenig enttäuscht :-)

Vielen Vielen Dank,
Ich hoffe es war nicht zu doof!

Autor: 6632 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja. Neben der schnellen MAC operation kann ein DSP auch noch ein oder 
zwei DMA operationen parallel. Nein, der analoge Teil mit ADC und DAC 
muss nicht Teil eines DSP sein. die koennen auch ausserhalb sein. Nur 
die ganz scnellen ADC und DAC sind parallel angebunden, die langsameren 
sind seiell, meist uber SPI. Zur Filterimplementation empfehle ich ein 
Buch. Hab meins grad nicht zur Hand.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein DSP ist einfach nur ein Prozessor, der speziell fuer die 
Berechnungen die man bei der Signalverarbeitung braucht optimiert wurde. 
Prinzipiell kann man das selbe auch auf einem Mikrocontroller machen.

Siehe auch: 
http://www.mikrocontroller.net/articles/Digitale_S...

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

die dsPICs kenne ich nicht, deshalb hier einige Infos, die sich auf 
"normale" DSPs beziehen (ich bin vor allem auf dem Blackfin von Analog 
Devices zu Hause, aber die Antworten unten gelten auch für andere DSPs).
Ich vermute, der dsPIC ist ein PIC, der um einige Peripherie und ein 
paar DSP-spezifische Befehle aufgebohrt wurde, deshalb mögen die Dinge 
da etwas anders liegen...

Prinzipiell hast Du zunächst einmal Recht, dass ein DSP auch nichts 
anderes ist als ein Prozessor/Controller -- er ist lediglich darauf 
optimiert, die typische Signalverarbeitungsoperation durchzuführen: 
Skalarprodukte von Vektoren (also zwei Vektoren elementweise miteinander 
multiplizieren und die Ergenisse zusammenaddieren). Das kann er aber 
richtig gut -- ein DSP kann in einem einzigen Prozessortakt zwei Zahlen 
miteinander multiplizieren, das Ergebnis zu einem Zahlenwert addieren 
(diese beiden Operation sind die "MAC"-Operation, multiply and 
accumulate), und daneben noch 2 neue Zahlenwerte aus dem Speicher in 
Register laden (das sind dann die Zahlen, die im nächsten Takt 
multipliziert werden). Die Blackfin-Familie kann das Ganze, wenn die 
Zahlen nur 16 Bit breit sind, auch noch zweifach...

Die "normalen" DSPs haben keine A/D und D/A-Wandler mit auf dem Chip -- 
normalerweise verwendet man externe Wandler, die über I2S oder ähnliche 
serielle Protokolle vom und zum DSP gesendet werden. Die von Dir 
erwähnte Abtastung und Bandbegrenzung wird dann direkt im A/D und 
D/A-Wandler durchgeführt -- nähres erfährt man halt im Datenblatt des 
Wandlers...

Die Verarbeitung der empfangenen Werte in einer Interrupt-Routine ist 
die normale Vorgehensweise. Da es aber relativ ineffizient ist, eine 
(oftmals komplexe und in mehreren Subroutinen verzweigende) 
Berechnungsfunktion für jeden Abtastwert einzeln durchzuführen, werden 
oftmals erst eine gewisse Anzahl von Abtastwerten gesammelt (ein 
"Frame"), und dieses Frame dann zusammen verarbeitet. Der Blackfin 
bietet hierfür auch DMA-Funktionalität an: Der DMA sammelt erst eine per 
Software definierte Anzahl von Abtastwerten ein, bevor er einen 
Interrupt auslöst und damit die Daten an die Verarbeitungsroutine 
übergibt.

Die eigentliche Verarbeitung/Berechnung wird in einem DSP ganz normal in 
Software programmiert -- im Prinzip so, wie man es auch in einem uC 
machen würde. Allerdings hat ein DSP einen Befehlssatz, der viele für 
die Signalverarbeitung wichtige Funktionen bereithält, die sonst sehr 
aufwändig (sprich: mit vielen Rechenzyklen) mit anderen Befehlen 
implementiert werden müßten. Beispiele: Ein DSP hat Funktionen, um z.B. 
einen Wert um n Bits nach rechts oder links zu shiften (nicht nur um 1 
Bit pro Takt) -- es gibt einen Befehl, um innerhalb eines Taktes zu 
bestimmen, wie viele führende Nullen oder Einsen (binär) in einem 
Register stehen, usw. usw.
Ob man das ganze in Assembler oder in C programmiert, ist oft auch eine 
Frage der verfügbaren und bezahlbaren Tools -- die DSP-Hersteller wie TI 
oder Analog Devices lassen sich die Entwicklungsumgebungen, die ein 
komfortables Entwickeln in C ermöglichen, mit mehreren tausend Euro 
bezahlen. Für den Blackfin gibt es allerdings eine Portierung von 
uClinux samt GNU-Entwicklungsumgebung (gcc): 
http://blackfin.uclinux.org. Mit einem Board für ca. 180 EUR (die 
"STAMP" Boards) hat man dann ein System, das "out of the box" uClinux 
auf dem DSP bootet und man kann relativ komfortabel ähnlich wie unter 
Linux auf dem Desktop-PC entwickeln und debuggen (für Ein- und Ausgabe 
von analogen Audio-Signalen muß man noch eine Zusatzplatine kaufen, die 
integrierte A/D und D/A-Wandler (einen sog. Codec) enthält).
Generell kann man sagen, dass man ein komplexes Projekt wenn möglich in 
C entwickeln wird und dann die rechenintensiven Teile der Software (dies 
sind  bei der Signalverarbeitung meistens einige relative kleine 
Code-Abschnitte) anschliessend optimiert, indem man sie z.B. als 
inline-assembler neu implementiert.

Eine wichtige Sache noch: Es gibt eine für die Signalverarbeitung 
fundamentale Unterscheidung von DSPs: fixed-point- und 
floating-point-DSPs.
Einfach gesagt, kann ein fixed-point-DSP nur mit Festkomma-Werten 
rechnen (also in C: short, int). Fliesskomma-Operationen (float, double) 
kann man zwar in C schreiben, aber der Compiler setzt dies intern wieder 
in Befehle mit integer-Werten um, was schlichtweg ineffizient (soll 
heißen: rechenaufwändig) ist. Fixed-Point ist deshalb wesentlich 
aufwändiger zu entwickeln (man muss ständig überlegen, in welchem 
Wertebereich die Rechenergebnisse liegen können und die Eingangswerte 
und Ergebnisse entsprechend shiften). Bei aufwändiger Signalverarbeitung 
braucht dies schon eine Menge Erfahrung. Vorteil von fixed-point DSPs 
ist der geringere Preis und der geringere Stromverbrauch. (Ich vermute 
mal, der dsPIC hat auch keine Fliesskomma-Einheit und ist deshalb ein 
fixed-point-DSP...)

Generell kannst Du auch Signalverarbeitung auf jedem uC machen -- Du 
wirst bloß relativ schnell feststellen, dass die Rechenleistung nicht 
ausreicht, so bald Du über ein gewisses "Anfänger-DSP" hinausgehst.
Wenn Du Signalverarbeitung erst mal generell lernen willst, würde ich 
zunächst einmal ganz von DSPs Abstand nehmen und das Ganze direkt am PC 
machen -- hier hat man genügend Speicher, Rechenleistung und eine 
komfortable Entwicklungsumgebung, mit der man sich ganz auf das Lernen 
und das Entwickeln von Algorithmen konzentrien kann, ohne sich mit 
bisher unbekannten "Effekten" und Funktionsweisen des DSP herumärgern 
muß. Der PC kann zwar nicht die oben beschriebenen DSP-Operationen 
genauso effizient ausführen (wobei aber MMX und SSE-Instruktionen schon 
in diese Richtung gehen), aber er ist schlichtweg so hoch getaktet, dass 
er das wieder wett machen kann... Außerdem gibt es für den PC Software 
und Libraries, die viele grundsätzliche Signalverarbeitungsfunktionen 
(Filter, FFTs etc.) zur Verfügung stellen, was bei freien 
Entwicklungsumgebungen für embedded systems nicht unbedingt gegeben ist.

Viele Grüße
Frank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.