Nach einer kurzen Einführung in die Signalverarbeitung werden DSP-spezifische Eigenschaften und Möglichkeiten am Beispiel des VS1063 Audiocodecs dargestellt.
“Eine CPU kann rechnen, aber ein DSP kann zaubern”
1. Eine CPU kann rechnen,
aber ein DSP kann zaubern
Harald Kipp
HaSi-Talk am 21.08.2014
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
2. Wer ist der Typ da vorne?
Harald Kipp
Geschäftsführer der egnite GmbH
● Entwicklung, Produktion und Vertrieb von
Mikrocontroller Boards
● Distribution von Ethernet-Sensoren, Audio-Codecs etc.
● www.egnite.de
Gründer und Admin des Ethernut Projekts
● Open Source Hardware und Software
● www.ethernut.de
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
3. Wer sitzt im Publikum?
● Hardwarekenntnisse
– Erfahrung mit Spannung und Strom
– Allgemeine Struktur einer CPU ist bekannt (Register, Bus)
● Softwarekenntnisse
– Erste Erfahrungen mit C-Programmierung
– Erste Erfahrungen mit Assemblerprogrammierung
● Mathematikkenntnisse
– Grundrechenarten
– Lesen von Diagrammen
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
4. Worum es geht hier eigentlich?
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
D igitaler
S ignal-
P rozessor
Eine CPU kann rechnen, aber ein DSP kann zaubern
– Signalverarbeitung im Schnelldurchgang (0:10)
– Nachteile von universellen Prozessoren (0:05)
– Hacking eines MP3-Decoders (0:15)
– Kurze Pause (0:05)
– Anleitung zum Bau eines Filters (0:15)
– Demonstration eines Audioeffekts (0:10)
5. Signal
Ein Signal ist eine sich kontinuierlich ändernde
physikalische Größe, die Information enthält.
Gesäusel (Luftdruck
ändert sich kontinuierlich)
Telefondraht (Elektrische
Spannung ändert sich
Bundesarchiv, Bild 183-57339-0018
Mr. Dagger Complex kontinuierlich)
„prüft“ kontinuierlich
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
6. Verstärken
● Ein elektrisches Signal wird verstärkt, um es über eine
große Entfernung übertragen zu können.
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Graphics made
by SciLab
7. Modulieren
● Das Signal wird auf einen Träger aufmoduliert.
Signal
Träger
Modulierter Träger
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
8. Mischen und Filtern
● Modulierte Trägerwel-len
zusammenfassen
um mehrere Signale
über eine Leitung zu
transportieren.
● Am Leitungsende ein-zelne
Träger durch
Filter trennen und das
Ursprungssignal mit
Demodulator zurück-gewinnen.
● Das ist Signalverarbei-tung.
Signal 1
Träger 1 AM 1
Signal 2 Träger 2
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
AM 2
Summe
9. Analog und digital
● Analog
– Kontinuierliche
Funktionen
– Realisierung mit
Hardware
● Digital
– Diskrete Werte
– Realisierung
überwiegend in
Software
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Roger McLassus
Creative Commons Attribution-Share Alike 3.0 Unported
11. Mathematische Methoden
Hardware Mathematik
Verstärken
UOUT = 2 * UIN
Modulieren
UOUT = US * UT
Summieren
UOUT = U1IN + U2IN + ...
Filtern
UOUT = Σ coeff[i] * UIN[n-i]
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
12. Anforderungen an digitale
Signalverarbeitung
● Kontinuierliche Verarbeitung von Datenströmen...
– Hauptsächlich Multiplikation und Addition von
Vektoren
– Behandlung von Überläufen
● ...in Echtzeit
– Effektive Speicherzugriffe
– Effektive Schleifen
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
13. Programmschleifen
Compiler C-Programm Assemblerprogramm
/* Verstärker */
for (i = 0; i < 100; i++) {
u_out[i] = u_in[i] * amp;
}
● Universeller Prozessor
– Die meisten Befehle werden
für die Schleifensteuerung
benötigt
– Daher hohe Taktrate für
Echtzeitverarbeitung
erforderlich
– Viele MIPS, wenig GRIPS
LDI R1, 0
LDI R2, 100
LD R3, AMP
LOOP:
CMP R1, R2
JGE END
LDX R4, U_IN, [R1]
MUL R4, R3
STX R4, U_OUT, [R1]
INC R1
JMP LOOP
END:
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
14. Kontinuierliche Multiplikation und
Addition
● Filter sind die typische Anwendung bei der digitalen
Signalverarbeitung
z.B.
C-Programm
/* Filter */
for (k = 0; k <= bufsiz; k++) {
for (i = 0; i <= m; i++) {
y[k] = y[k] + h[i] * u[k - i];
}
}
Schleifen sind nicht gut
für universelle CPUs.
Viel Rechnerei, aber es
kommt noch dicker.
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
15. 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Überlauf
Alarm
Sättigungsarithmetik
Beispiel: Zweifache Verstärkung von 128V am Eingang
und maximal 255V Ausgangsspannung (Wertebereich)
Hardware: 128V * 2 = 255V 8-Bit Software: 128V * 2 = 0V
/* Handle overflow using 16-bit math */
u_out[i] = u_in[i] * 2;
if (u_out[i] > 255)
u_out[i] = 255;
Einfache Lösung
funktioniert mit
Einschränkungen.
Vorzeichen?
Nachkommastellen?
16. Überlauf anschaulich gemacht
A + B = Sättigungsarithmetik
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Standardarithmetik
● Bildhelligkeit erhöhen
Original + Offset
Screenshot of Blender 2.41
17. Aktueller Leistungsvergleich
● High-End DSPs ● High-End PC
Texas Instruments C6000
32-Bit CPU
1,2Ghz Taktfrequenz
8MB 2nd-Level Cache
Optionale Fließkomma-Einheit
Analog Devices SHARC / (Blackfin)
400MHz Taktfrequenz
Offizielle GNU Toolchain (für Blackfin)
Intel Haswell
64-Bit CPU mit FPU
3,9Ghz Taktfrequenz (Turbo)
84 Watt
Und was ist mit Cortex-M4?
Freescale StarCore
Multi-Core
1Ghz Taktfrequenz
Theodor Fontane schreibt:
Ein fester Kessel,
ein doppelter Dampf,
die bleiben Sieger
in solchem Kampf.
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
18. Historischer Leistungsvergleich
1995
● WinPlay3, der erste real-time
MP3-Decoder für
PCs, benötigte
● 32-Bit 468DX2 66MHz
● FPU
● 8kB Cache
● 6W Stromverbrauch
(nur CPU)
1999
● Single-Chip MP3 De-coder
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
auf DSP-Basis
benötigte
● 16-Bit mit 25MHz
● Keine FPU
● Kein Cache
● 50mW Stromver-brauch
(CPU ohne
Analogteil)
19. MP3 Hardware-Decoder
Moderne Miniatur-Audioplayer
– z.B. mit VS10XX von VLSI Solution Oy
USB-Schnittstelle
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Bist du
meine Mami?
GPIO-Taster
DSP-Chip
Streichholz?
Audio-Ausgang
Serielles Flash
Steckergehäuse!
Directmedia DVD-ROM 10.000 Meisterwerke der Malerei
20. Audiocodec-Architektur
Theorie... ...und Praxis
ADC
DSP
DAC
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Wichtig! 2 Busse!
Programmier-schnittstelle
Analogsignal
Analogsignal
21. VSDSP4 Register
● Spezialregister
– Programmzähler PC
– 2 Page Register IPR0 und IPR1
– IPR0 wird beim Interrupt nach
IPR1 kopiert
– 32-Bit Produktregister P
– 3 16-Bit Loop Register LS, LC und
LE
– 2 16-Bit Link Register LR0 und
LR1
– LR0 für Unterprogramme
– LR1 für Interrupts
– Pseudoregister NULL (alle Bits 0)
und ONES (alle Bits 1)
– 16-Bit Mode Register MR0
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
22. Pipeline
*
*
AND A0,A0,A0
NOP
JZS OUT
NOP
*
*
Takt Laden Dekodieren Ausführen Ergebnis
1 AND * *
2 NOP AND *
3 JZS NOP AND Z-Flag gesetzt
4 NOP JZS NOP
5 ? NOP JZS Sprung ausgeführt
● Nach einer arithmetischen Operation können die Flags
erst nach einem Delay als Sprungentscheidung
verwendet werden.
● Sprünge werden mit einem Delay ausgeführt.
● Statt NOP können wir etwas sinnvolleres tun.
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
23. Pipeline Beispiel
Auswirkungen der Pipeline sind verwirrend und
erfordern Kreativität.
ldx (i0),b0
add c0,b0,b0
and a0,a0,a0
nop
jzs out
nop
and a0,a0,a0
ldx (i0),b0
jzs out
add c0,b0,b0
Delay Slots ausnutzen
Modifiziert die Flags.
Darf keine Operation sein, die das
Z-Flag wieder verändern könnte.
Sprung kann jetzt entschieden
werden.
Da auch der Sprung einen Delay hat,
wird dieser Befehl immer ausgeführt.
Hier dürfen die Flags wieder
modifiziert werden.
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
24. Das blanke Entsetzen
Das war eine abschreckende Eigenschaft.
Jetzt kommen die Bonbons
...endlich!
Charles Darwin's The Expression of the Emotions in Man and Animals
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
25. MAC
● MAC ist eine Abkürzung für Multiply and Accumulate
– Eigentliche Reihenfolge: Erst ADD, dann MUL
● Mächtiges Kommando für Filter-Implementierung
c += a[i] * b[n-i]
DSP PC
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
c += p;
p = a0*b0;
mac a0,b0,c 1 Takt Viele Takte
26. Schleifen
LOOP A1,LOOPEND-1
NOP
LOOPSTART:
*
LOOPEND:
*
● LOOP-Befehl
Reg. Inhalt
LS Startadresse der Schleife
LC Schleifenzähler
LE Endadresse der Schleife
– Kopiere PC+1 nach LS
– Kopiere Register in Parameter 1 nach LC
– Kopiere Adresse in Parameter 2 nach LE
● Bearbeite Befehle bis PC gleich LE, dann
– Prüfe, ob LC gleich Null
– Wenn ungleich Null, dekrementiere LC um 1 und kopiere
LS nach PC
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
27. Modulo Adressierung
● Implementierung von Ringpuffern
– 0x8000: I1 wird jeweils um 1
inkrementiert und nach 47 wieder
auf 0 gesetzt
– 0xA000: I1 wird jeweils um 1
dekrementiert und nach 0 wieder
auf 47 gesetzt
– Puffer muss auf Adresse liegen, die
durch nächsthöhere Zweierpotenz
der Pufferlänge teilbar ist.
Bei einer Pufferlänge von 48 muss
der Puffer also an einer Adresse
liegen, die durch 64 teilbar ist.
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
ldc 0x8000+(48-1),i0
ldx (i1)*,a0
ldc 0xA000+(48-1),i0
ldx (i1)*,a0
28. Parallele Verarbeitung
● Viele Operationen können parallel ausgeführt werden
– Arithmetische Operation, z.B. macss a0,a1,d
– Zugriff auf X-Memory, z.B. ldx (i0)*,a0
– Zugriff auf Y-Memory, z.B. ldy (i2)*,a1
– Loop
and a0,null,a0
mulss a0,a0
loop a1,END-1
and d,null,d; ldx (i1)*,a0; ldy (i2)*,a1
mac a0,a1,d; ldx (i1)*,a0; ldy (i2)*,a1
END:
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Initialisierung
Schleife (1 Taktzyklus)
Realisierung eines Filters:
f
a
Tiefpass
30. Tiefpass Assemblerroutine
Reale Implementierung der FIR Assemblerroutine
Finite Impulse Response
Filter mit endlicher Impulsantwort
//void FirAsm(register __i0 s_int16 *d, __y register __i2 s_int16 *s);
.sect code, FirAsm
.export _FirAsm
_FirAsm:
// Store register values
stx i1, (i6)+1
stx i3, (i6); sty ls, (i6)+1
stx le, (i6); sty lc, (i6)+1
stx a0, (i6); sty a1, (i6)+1
stx b0, (i6); sty b1, (i6)
Filterkoeffiziententabelle
bestimmt die Filterfunktion
ldc MAKEMOD64(-2,LINE_IN_BUF_LEN), i3 //-2 step
mv i0, i5
ldc _firCoeffs, i0 // coefficient vector
ldc 1, i1 // linear forwards +1 (No modulo)
ldc 0x0000, mr0 // fract mode
and a,NULL,a; ldx (i0)*,b1; ldy (i2)*,b0
// clear a-reg., load first coef./sample -pair
ldc FIR_LEN-2, lc // loop count
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
31. Tiefpass Assemblerroutine
loop lc, firloop1end-1 // start looping
// Delay slot, perform first multiply, load next coef./sample -pair
mul b1, b0; ldx (i0)*,b1; ldy (i2)*,b0
firloop1:
mac b1, b0, a; ldx (i0)*,b1; ldy (i2)*,b0 // use pipelined MAC to implement FIR
firloop1end:
add a, p, a
ldc FIR_SCALE, b0
ashl a, b0, a
rnd a, a1
stx a1, (i5)
// Restore registers
ldx (i6), b0; ldy (i6)-1, b1
ldx (i6), a0; ldy (i6)-1, a1
ldx (i6), le; ldy (i6)-1, lc
ldx (i6), i3; ldy (i6)-1, ls
ldx (i6)-1, i1
jr
ldc 0x200, mr0 // Delay slot, restore integer mode
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
32. Tiefpass C-Programmaufruf
Aufruf der FIR Assemblerroutine
__y s_int16 *delayLinePtr = lineInPtr;
s_int16 *sp = audioOut;
int i;
for (i=0; i<BLOCKSIZE; i++) {
// apply the filter
FirAsm(sp++,delayLinePtr++); // left channel
FirAsm(sp++,delayLinePtr++); // right channel
}
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
33. Filterkoeffizienten berechnen
Filterkoeffizienten können bequem mit GNU Octave, MATLAB
oder SciLab berechnet werden
pkg load all
Anweisungen für GNU Octave
fs=48000;
fsp2=fs/2;
f1=3100;
f2=4300;
deg=62;
b=firls(deg, [0 f1/fsp2 f2/fsp2 1], [1 1 0 0]);
Filterkoeffizienten nach der Methode
der kleinsten Quadrate berechnen
Normalisierungsfaktor
Übergangsbereich des Filters
Ordnung des Filters
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Frequenzen und
Amplituden sind
normalisiert
Samplerate
Normalisierte Frequenzwerte:
So umrechnen, dass der Wert 1 der halben
Abtastrate entspricht (Nyquist-Grenze).
34. Frequenz- und Phasengang
Anweisung für GNU Octave
freqz(b);
Durchlassbereich
Übergangsbereich
Sperrbereich
Welligkeit
f
a
Tiefpass
Quizfrage: Frequenz von 0 bis 1?
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
38. VSDSP Toolchain
● VSIDE
– Vollständige Entwicklungs-umgebung
für VSDSP Signal-prozessoren
– Unterstützt Debugging auf
realer Hardware über RS232
(USB-Bridge)
● Kommandozeile
– ANSI-C Compiler, Assembler,
Linker, Profiler etc.
● Windows only!
● Kostenlos
lcc -g -hhw_desc -O6 -fsmall-code -DDEBUG -DVS1063 -IC:/VSIDE
optimizing (452): 299 281 274 273.273.271.271.271
C 271 CF 0 X 6 Y 8198 F 0
Successfully compiled 2012 lines (244 in source) with 0 warni
vsa -c hw_desc -D ASM -D VS1063 -I C:/VSIDE/libvs1063 -o Deb
vslink -k -m user_vs1063-extra.mem C:/VSIDE/libvs1063/rom1063
coff -L. -LC:/VSIDE/libvs1063 -lc
vssym -Q Debug/effect.coff
Debug/effect.coff:
C 429 CF 0 X 6 Y 8198 F 0
total code memory size 0x01ad 429 words
total X memory size 0x0006 6 words
total Y memory size 0x2006 8198 words
const_x 0x0006 6 words
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
bss_y 0x2000 8192 words
const_y 0x0006 6 words SORRY!
39. Hello World
main() {
// show text in console
puts("Hello, world.");
// setup button and led
CONFIGURE_LED_1;
CONFIGURE_OPTO_1;
//
// enter busy loop, detect button press
//
while (1) {
if (OPTO_1_ACTIVE) {
SET_LED_1_ON;
} else {
SET_LED_1_OFF;
}
}
return 0;
}
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
www.usda.gov/oc/photo/opclibra.htm
41. Vielen Dank
We're cool, right?
You are allowed to
applaude by clapping the
hands or knocking on the
tables.
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Kibadunno: Mega_awesome_super_cool_amazing_sunglasses
42. Questions ?
Thank you for
your attention.
Any questions?
www.twitter.com/egniteEmbedded www.facebook.de/egniteDe
www.youtube.com/user/egniteGmbH plus.google.com/+EgniteDe
21.08.2014 HaSi-Talk: Ein DSP kann zaubern