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!
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.
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_Signalverarbeitung#Hardware
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.