Forum: Mikrocontroller und Digitale Elektronik nochmal delta/sigma


von Reiner D. (dollreiner)


Lesenswert?

hab alles gelesen, was hier über den dezi-filter steht. ich verstehe 
auch die theorie, also die spektralen zusammenhänge.

aber :

wie ist die schaltung aufgebaut, die aus bitstrom pcm macht ?
(ein fir, wie meistens zu sehen, macht doch aus pcm wieder pcm)

wie komme ich auf die n bit wortbreite (praktisch, nicht theoretisch ) 
??

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Stell' dir z.B. ein FIR FIlter vor, mit diesen Koeffizienten:
[1,1,1,1,1,1,1]
Dort fuellst du deine 1 bit breiten Samples rein. Und - oh Wunder - es 
kommen 3 bit breite Samples raus...

Die Filter duerfen "in Echt" auch ruhig laenger sein und "bessere" 
Koeffizienten haben - aber dann sind sie nicht mehr so schoen im Kopf zu 
rechnen...

Gruss
WK

von Reiner D. (dollreiner)


Lesenswert?

bitte betrachte das als humane geste : ich kapiers nicht ;-(

das fir hat als eingang doch die gleiche wortbreite wie am ausgang.
die addierer nach den filterkoeffinzienten addieren doch n bit breite 
worte, die nach verzögerung und koeffizientenmultiplikation wieder n bit 
breit sind ?!?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Reiner D. schrieb:
> das fir hat als eingang doch die gleiche wortbreite wie am ausgang.

Nee, muss es nicht haben. Die Koeffizienten in meinem Beispiel sind 
gerade so gestrickt, dass man prima mit 1 bit Breite reingeht und 3 Bit 
rausbekommt.
Einfach mal ausrechnen:
Wenn du da 7x ein Sample mit dem Wert 0 reinschiebst; kommt auch wieder 
0 raus (Ok, nicht so spannend)
Aber wenn du 7x ein Sample mit dem Wert 1 reinschiebst, dann kommt 7 
raus - akkurat 3 bit breit...

Gruss
WK

von W.S. (Gast)


Lesenswert?

Reiner D. schrieb:
> das fir hat als eingang doch die gleiche wortbreite wie am ausgang.

Also, stell dir mal vor, du machst einen Mittelwert aus je 2 
Eingangswerten.

1 2 5 3 2 7 8 0 1 5

(1+2)/2 --> 1.5
(5+3)/2 --> 4.0
(2+7)/2 --> 4.5
na und so weiter.
Was siehst du da? Klar, du siehst eine Halbierung der Datenrate und 
zugleich eine Nachkommastelle. Wenn du jetzt die gewonnenen Mittelwerte 
nochmal mittelst, dann kriegst du ne zweite Nachkommastelle. Und so 
weiter.

Das ganze kann man natürlich auch mit nem besseren und längeren 
Filterkernel machen, dann kriegst du mit einem Hieb eben mehr 
Nachkommastellen.

Über die Breite des Integer-Teils haben wir bislang noch keine 
Festlegung getan, also geht für's Prinzip auch eine einzige 
Integerstelle, eben 1 oder 0.

Klaro?

W.S.

von Jim M. (turboj)


Lesenswert?

Man kann mit einen FIR auch Downsampling betreiben. Das ergibt dann eine 
gewichtete Aufsummierung in der Praxis, d.h. N Bits des Bitstroms werden 
zu einem Sample zusammengefasst (aufsummiert).

Oder kurz: Man lässt beim FIR einfach viele Ausgangssamples inclusive 
Berechnung weg.

von Reiner D. (dollreiner)


Lesenswert?

icgh versuch mir mal ne grobe schaltung zu zeichnen, auf der man die 
rechnerisch ja völlig einsichtige funktion praktisch sieht.
wahrscheinlich komm ich dann nochmal blöd fragend daher ;-)

von Dergute W. (derguteweka)


Angehängte Dateien:

Lesenswert?

Moin,

Hier hab' ich mal was "Grobes" gemalt. Das verkauf' ich dir als FIR 
Filter mit 1bit Eingangsbitbreite und 2 bit Ausgangsbitbreite und diesen 
Koeffizienten: [1,1,1] (Mein Originalvorschlag mit den 7 Koeffizenten 
war mir zu viel Zeichenarbeit)

"Gebaut" aus 3 TTL Chips. Eingang ist unten links, Ausgang oben rechts. 
Hoffentlich hab' ich mich nicht vertan mit der Invertiererei.

Gruss
WK

von Reiner D. (dollreiner)


Lesenswert?

das ist exakt das, was ich gesucht habe.
bis ich das wirklich im kern kapiert hab, was da passiert, brauch ich 
ein wenig bedenkzeit.

wahnsinnig nett von dir, mir soviel von deiner zeit zu schenken !!

von Reiner D. (dollreiner)


Lesenswert?

es hat keinen sinn mit mir, mir ist wahrscheinlich ein stück gehirn 
abgestorben.

der 74138 ist doch ein 1-aus-n decoder. die drei bit eingang (pcm) 
werden auf die 1-aus-8 ausgänge rauscodiert.

der bitstrom kommt über die flipflops vorbeigetaktet. der 74138 liest 
das pcm-muster ---- aber das ist doch kein pcm, sondern der ausgang vom 
modulator ?!?!

was immer da an bits vorbeirauscht, es wird am ausgang immer nur ein bit 
high sein, also ist nur msb oder lsb = 1 (außer bit 7, weil die parallel 
dranhängen, was bringt das nand ?

mein kopf kann nicht kapieren, wieso das "bitstream-mittelwert" auf pcm 
umsetzt.

(nochmal : theoretisch völlig klar was zu tun wäre, aber wie soll das 
eine schaltung realisieren ???)


...ist denn hier keiner, der das gleiche problem hat wie ich. singuläres 
brett vorm hirn bei mir ?

: Bearbeitet durch User
von Reiner D. (dollreiner)


Angehängte Dateien:

Lesenswert?

noch ein versuch :

im kern ist es die schaltung im anhang.

1 bit geht rein, wird durchgetaktet, parallel mit den koeffizienten 
bewertet, im unteren zweig wieder aufaddiert  ....   und dann ist es 
doch immer noch nur 1 bit breit ?

klar, 1 bit kann man nicht aufaddieren, das seh ich auch, aber wo sind 
die "abgriffe" für bit 0 bis n ??

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Reiner D. schrieb:
> und dann ist es
> doch immer noch nur 1 bit breit ?

Nee, durch das Aufaddieren werden's mehrere Bits.

Reiner D. schrieb:
> klar, 1 bit kann man nicht aufaddieren, das seh ich auch, aber wo sind
> die "abgriffe" für bit 0 bis n ??

Doch, klar kan man mehrere 1 bit breite Signale aufaddieren. Dadurch 
werden's mehr als 1 bit...

OK; andere Herangehensweise: Stell dir ein FIR Filter vor, wie du's 
gewohnt bist: mit z.b. 8 bit Eingangssamplebreite und 8 bit 
Ausgangssamplebreite.
So und jetzt nimmst du einen ganz dicken Loetkolben und machst ueber die 
8 bit Eingangssignal einen dicken Loetklecks. So dass die 8 bit 
Eingangssignal immer nur noch alle gleichen Pegel haben koennen. Und an 
diesen dicken Loetklecks schliesst du deinen 1bit Ausgang vom SigmaDelta 
ADC an.
Dann kriegt das Filter nicht immer nur 1bit breite 0 oder 1, sondern es 
kriegt immer 8bit breite 0 bzw. 255. Und es liefert dir auch ein 8 bit 
breites Ausgangssignal...
Besser?


Gruss
WK

von Reiner D. (dollreiner)


Lesenswert?

overflow error.
system is going down.

..sagt mein hirn. ich meld mich morgen nochmal ;-




ps. wk ist der beste !

von Reiner D. (dollreiner)


Lesenswert?

ok, also seriell mit einem bit rein.
nehmen wir ein fir mit drei verzögerungen an, koeffizienten für diese 
überlegung egal (aber verschieden) sagen wir von links nach rechts :
0,2 - 0,3 - 0.5

jetzt leg ich null (gleichspannung) an den modulatoreingang. der taktet 
seriell eine pulsdichtemodulation mit 0.5 mittelwert raus, also : 
1010101010101...

(kann man hier auch ausprobieren : 
http://www.analog.com/en/design-center/interactive-design-tools/sigma-delta-adc-tutorial.html 
)

das jetzt auf den obig gedachten fir, rauskommt :  0,7 - 0,3 - 0,7 - 0,3 
....

das soll die digitalisierung einer gleichspannung sein ???

von Dergute W. (derguteweka)


Angehängte Dateien:

Lesenswert?

Moin,

Reiner D. schrieb:
> sagen wir von links nach rechts :
> 0,2 - 0,3 - 0.5

OK, ist zwar jetzt nicht grad' ein Bruellerfilter, aber das sieht dann 
vom Frequenzgang so aus wie im Bild.

Reiner D. schrieb:
> jetzt leg ich null (gleichspannung) an den modulatoreingang. der taktet
> seriell eine pulsdichtemodulation mit 0.5 mittelwert raus, also :
> 1010101010101...

Oha - und schon haben wir evtl. ein Problem mit vorzeichenbehafteten und 
vorzeichenlosen Groessen. Also obacht geben - fuer den Anfang wuerd' ich 
mal nur mit positiven Spannungen arbeiten; also 0 am Wandlereingang 
ergibt den Bitstrom 00000... und Uref am Wandlereingang 111111...
Uref/2 waeren dann der Bitstrom 0101010101...

Reiner D. schrieb:
> das jetzt auf den obig gedachten fir, rauskommt :  0,7 - 0,3 - 0,7 - 0,3
> ....

Richtig.

> das soll die digitalisierung einer gleichspannung sein ???

So isses. Am Eingang deines Tiefpasses schwankt das Signal um 1; am 
Ausgang noch um 0.7-0.3=0.4 Die Schwankung wird also gedaempft mit dem 
Faktor 0.4/1; oder aber auch 20*log10(0.4)=-8 dB.
Und jetzt guck' mal den Frequenzgang deines Filters bei der 
normalisieren Frequenz 1 an: -8dB...

Wie waers' mit einem Tiefpass [0.5 0.5] oder [0.25 0.25 0.25 0.25]?

Gruss
WK

edit: hupsi; kleiner Vorzeichenfehler

: Bearbeitet durch User
von Reiner D. (dollreiner)


Lesenswert?

kleine zwischenfrage (dem großen problem komm ich jetzt näher, mein 
resthirn beginnt sich das vorstellen zu können)

welches tool erlaubt dir, den frequenzgang des fir so schnell zu 
ermitteln ?

von Reiner D. (dollreiner)


Lesenswert?

stimmt natürlich lles !

z.b. bei 8 mal 0.125 als koeffizienten (schnell geraten, weil ich kein 
designtool für fir hab) krieg ich für ur/2 eine schöne gleichspannung.

ich glaube das brett vorm hirn kam von einer veröffentlichung, die ich 
im web gelesen hab. da wurden die koeffizientenprodukte nicht summiert 
(!), sondern direkt als bits für die ausgangs-pcm verwendet. also z.b. 
das erste produkt nach der ersten verzögerung war das msb und dann so 
weiter runter bis zum lsb.

das springt bei unserem beispiel von vorher natürlich dann wild hin-und 
her.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

GNU Octave (mit dem "signal" package) - oder fuer den dickeren 
Geldbeutel: Matlab.
Dort gibts die Funktion freqz() - und ein Aufruf von:
freqz([0.2 0.3 0.5])

macht exakt das Bild...

Gruss
WK

von chris (Gast)


Lesenswert?

Hier eine einfache, praktische Art einen Sigma-Delta DAC zu bauen, fast 
ohne Theorie:

http://www.hobby-roboter.de/forum/viewtopic.php?f=5&t=141

von Reiner D. (dollreiner)


Lesenswert?

eine nuß ist am d/s-baum noch nicht geknackt :

das pulsdichte-signal am fir kann bei n bit betrachteter länge (=anzahl 
der verzögerungen und koeffizienten) nur n+1 verschiedene stufen haben.

also bei 3 bit :

000
100
110
111

(die verteilung der 1-en im signal ist ja bei gleichen koeefizienten 
egal,
also z.b. 101 bringt keine andere info am ausgang als 110)

ich brauche also für z.b. 3 bit ausgang vom filter (das sind 8 stufen)
7 verzögerer + multiplizierer


...bis hierher richtig ?

wenn ich jetzt die hohen auflösungen will, (z.b. 24 bit bei einem 
drucksensor mit d/s-wandler, den ich einsetze), brauche ich 2^24 - 1 
komponenten. das sind 16 * 10^6 verzögerer und multplizierer.

...aha. wo ist da jetzt wieder der denkfehler ??

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Reiner D. schrieb:
> ...aha. wo ist da jetzt wieder der denkfehler ??

Der Denkfehler ist, wenn man glaubt, dass man tatsaechlich stumpf ein 
FIR Filter mit 16.777e+6 Taps aufbauen muss.
Es laeuft ja lediglich darauf raus, dass man ein 1bit breites 
Eingangssignal hat, welches einen Tiefpass mit ziemlich niedriger 
Grenzfrequenz und eine ziemlich hohe Dezimation (z.B. 1:256) durchlaufen 
muss. Danach will man eine hohe Bitbreite haben. Sonst ist alles 
wurscht. Also kann man natuerlich vereinfachen:

* Es muss z.b. kein klassisch aufgebautes FIR Filter sein. (z.b. 
CIC-Filter sind recht simpel)
* Man muss nicht alles ausrechnen, wenn man danach eh' z.B. 255/256 
aller Filterberechnungsergebnisse bei der Dezimation wegschmeisst.
* Die Dezimation muss nicht in einem Rutsch passieren; sondern man kann 
in verschiedenen Stufen abwechselnd Tiefpassfiltern und Dezimieren.

Es wird nicht gaaaaanz simpel, also im Sinne von: Ich bau diese 
Signalverarbeitung mit einer Handvoll TTL-Chips nach. Aber es wird so 
simpel, dass man es billiger und stabiler in Chips quetschen kann als 
"normale" ADCs mit ihren hoeheren Anforderungen an das analoge 
Antialiasingfilter am Eingang.

Gruss
WK

von Reiner D. (dollreiner)


Lesenswert?

ok, ich geb auf.
daß da nicht ne million stufen drin sind, war mir schon klar ;-)
entscheidend ist wohl deine aussage :

"Es wird nicht gaaaaanz simpel, also im Sinne von: Ich bau diese
Signalverarbeitung mit einer Handvoll TTL-Chips nach."

ich hab schon gesehen, daß da kaskadierte tiefpässe drin sind. ist 
offenbar ein gegenstand, der sich eben nicht auf simple grundprinzipien 
runterbrechen läßt. gibts ja z.b. in der funktechnik zuhauf solche 
gegenstände.

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Reiner D. schrieb:
> ok, ich geb auf.

Nicht so pessimistisch. Die Frage ist halt - was willst du erreichen? 
So'n Filter+Dezimation nachbauen? Kann man schon machen, aber halt 
(besser) nicht mit einem Haufen TTL Chips. Mit einem FPGA geht das 
schon. Oder auch - wenn's nicht zu schnell sein soll, auf einem 
ordinaeren µController.

Aber alleine das Design von theoretischen digitalen Filtern fuellt ja 
schon dicke Buecher, und so ein Filter, das in der Theorie prima laeuft, 
ist in der Praxis zu teuer/gross/bloed/... Also muss dann halt noch 
vereinfacht und getrickst werden - auch das fuellt wieder Buecher...

Hier mal 2 links, wie man Filter "sparsamer" bauen kann:

http://www.dspguru.com/sites/dspguru/files/cic.pdf
http://www.ee.ic.ac.uk/hp/staff/dmb/courses/DSPDF/01200_Polyphase.pdf

Gruss
WK

von Reiner D. (dollreiner)


Lesenswert?

der zweite link ist sehr hilfreich.
vielen, vielen dank nochmal für deine mühe.
ich bin kein "aktiver" entwickler mehr, das habe ich vor 30 jahren 
aufgehört, es muß also nix funktionieren ;-)

von chris (Gast)


Lesenswert?

Dergute Weka (derguteweka)
>Es laeuft ja lediglich darauf raus, dass man ein 1bit breites
>Eingangssignal hat, welches einen Tiefpass mit ziemlich niedriger
>"Es wird nicht gaaaaanz simpel, also im Sinne von: Ich bau diese
>Signalverarbeitung mit einer Handvoll TTL-Chips nach."

Es kann aber ziemlich simpel werden. Wenn Du den zweiten Beispielcode 
für den Arduino hier anschaust:

http://www.hobby-roboter.de/forum/viewtopic.php?f=5&t=141#p557

Dort reduziert sich der Filter auf eine Zeile.
1
    integrator+=sollwert-oldValue;

Das ergibt am Schluss quasi ein Tiefpassfilter erster Ordnung, welches 
den außen angeschlossenen RC-Tiefpass modelliert. Das Ganze ist am 
Schluss eine Regelschleife, welche das Tiefpassmodell zum Regeln des 
Pulssignals benutzt.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Ja, aber ADC != DAC. Bei einem SD-DAC braucht man einen digitalen 
Integrator; der ist mit der einen Zeile C erschlagen (In TTL wuerde 
sowas auch schon umfangreicher). Bei einem SD-ADC ist der Integrator 
noch auf der analogen Seite, also ueblicherweise irgendwas mit einem 
OpAmp.

Beim ADC braucht man auf der dititalen Seite einen Tiefpass, der sollte 
im Nutzfrequenzbereich einen halbwegs glatten Frequenzgang haben; wenn 
du da einen simplen Integrator nimmst, laeuft der dir bei tiefen 
Frequenzen weg.
Aber das I in CIC Filter kommt von Integrator; also es kann schon in 
diese Richtung gehen.

Gruss
WK

von Reiner D. (dollreiner)


Lesenswert?

hatte viel um die ohren, deshalb die verzögerung.

ok, ich denke mit des guten weka's hilfe hat mein verrostetes hirn nun 
das prinzip des d/s-wandlers verstanden. der modulator ist eh klar, und 
das dezimationsfilter stell ich mir als fir vor, der am eingang mit der 
vollen wortbreite angesteuert wird. so kann man das verstehen.

ein wenig kopfzerbrechen macht mir der filter noch, ein "standard"-fir 
wirds aber wohl kaum sein, cic oder irgendwas modifiziertes auf 
fir-basis.

standard deshalb nicht, weil z.b. bei einem 24 bit- wandler (in dem 
drucksensor drin, der mich ins grübeln gebracht hat) dann da ja viele 24 
bit breite mulitplizierer drin sein müßten.

ich denke, das wird wohl ungefähr so laufen, daß aus dem pdm-signal in 
der größenordnung der überabtastung (bei dem sensor 4096-fach) lange 
teile gemittelt werden (summe und dann shift als division). dann ist 
dezimiert auch gleich, und dann halt noch ein einfacher tiefpaß. wenn 
das nicht grob falsch ist, geb ich mich zufrieden.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Reiner D. schrieb:
> standard deshalb nicht, weil z.b. bei einem 24 bit- wandler (in dem
> drucksensor drin, der mich ins grübeln gebracht hat) dann da ja viele 24
> bit breite mulitplizierer drin sein müßten.

Waere nicht ganz so schlimm. Weil das ja z.b. 1bit X 24bit Multiplizerer 
sein koennten - es geht ja nur ein 1bit "breites" Signal "rein".
Damit vereinfachen sich die Multiplizierer ziemlich denn es gibt nur die 
Moeglichkeit 0*h0 oder 1*h0 (siehe dezi.jpg).

>
> ich denke, das wird wohl ungefähr so laufen, daß aus dem pdm-signal in
> der größenordnung der überabtastung (bei dem sensor 4096-fach) lange
> teile gemittelt werden (summe und dann shift als division). dann ist
> dezimiert auch gleich, und dann halt noch ein einfacher tiefpaß. wenn
> das nicht grob falsch ist, geb ich mich zufrieden.

Jepp, so ungefahr kann man das machen. Es ist halt ein Tiefpass, der 
ohne Vereinfachungen sehr umfangreich waere, den man aber sehr stark 
durch verschiedene Tricks eindampfen kann.

Gruss
WK

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
Noch kein Account? Hier anmelden.