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 ) ??
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
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 ?!?
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
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.
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.
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 ;-)
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
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 !!
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
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 ??
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
overflow error. system is going down. ..sagt mein hirn. ich meld mich morgen nochmal ;- ps. wk ist der beste !
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 ???
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
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 ?
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.
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
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
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 ??
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
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
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
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 ;-)
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.