Software-Konfigurierbarer Rauschgenerator auf 8-Bitter
Oct 06, 2019 8 Replies
J
Johannes Bauer
Hallo Gruppe,
ich habe mir einen Rauschgenerator gebaut mit einem AVR ATtiny26. Mega simples Design: PRNG erzeugt 8-Bit Wort, wirft es auf PORTA, R2R,
Es geht nicht um irgendwie physikalisch korrektes rosa/braunes Rauschen,
Verteilung Energie/Frequenz in Software.
Das ist unheimlich simpel: Ich habe einen 8-Bit Akkumulator, der jeweils auf PORTA ausgegeben wird. In jeder Iteration wird der durch
accu += (prng() / divisor)
Voller Code:
formatting link
knacksen.
Da das immer an denselben Stellen auftritt in demselben Pattern (ist ja ein 100% deterministischer PRNG) nehme ich an, dass das an der Division liegt, die auf dem AVR in Software emuliert wird und daher nicht Laufzeitkonstant ist.
Zweierpotenzen als Teiler zulassen, aber dann ist der Unterschied
man das ohne Hardwaredivision, nur mit Integerarithmetik und in
Johannes
selben Hardware." -- Hans-Peter Diettrich in d.s.e.
Didn't find your answer? Ask the community — no account required.
C
Christian Zietz
Johannes Bauer schrieb:
recht einfach berechnen: prng() * x / 256 ( = prng() / (256/x)) und
Oh, die Idee ist gut! Im vorliegenden Fall geht das leider nicht, habe auch keinen HW-Multiplizierer, aber kommt definitiv in die Trickkiste.
Habe ein bisschen damit herumexperimentiert eine Bitmaske zu einem gegebenen Maximalwert vorauszuberechnen (das ist dann nur eine Subtraktion im Worst-case), aber irgnedwo ist da noch ein Wurm drin. Siehe
formatting link
Johannes
selben Hardware." -- Hans-Peter Diettrich in d.s.e.
C
Christian Zietz
Johannes Bauer schrieb:
kannst Du ja die Worst-Case-Samplerate bestimmen, d.h. die erreichbare
Samplerate erzwingen, indem Du die Samples nicht gleich am Ende der Berechnung sondern z.B. timer-gesteuert ausgibst.
Christian
PS: Hier mangels HW-Multiplikator nicht hilfreich, aber dennoch viel zu wenig bekannt: Man kann auch die Division durch viele Ganzzahlen durch Multiplikation und Shifts hinbekommen. Code sagt mehr also Worte: . gcc vermeidet hier die (auch auf einem x86 teure) Division durch 3.
Wenn Dein ATtiny noch ein bisserl PLatz im EEPROM hat, kannst Du dort auch
Externe Beschaltung mit Rauschdiode am ADC scheidet kategorisch aus?
Ciao, Volker
M
Marcel Mueller
Am 06.10.19 um 09:43 schrieb Johannes Bauer:
Zufallsbits, die von prng kommen. Sehr deutlich wird das bei Zweierpotenzen. Diese entsprechen einem Shift-Operator, der einfach die unteren Bits entsorgt.
Divisor ja auch noch konstant ist.
Berechne doch mal die Folge auf dem PC vor und schau dir das Ergebnis mit Audacity an.
einfachsten Fall ist das ein Integrator (Addition), dann gibt es erst
bekommst, sonst ist das Spektrum komplett im Eimer.
Addition abziehen und somit eine Eskalation des Akkumulators
Das bringt mich zum zweiten Punkt: in jedem Fall braucht der Akkumulator mehr Bits (also faktisch 16), von denen nur die obersten an den ADC
obigem Muster kompensierten Akkumulatorwerte zwar ebenfalls tiefpassfiltern, aber es hat eben auch eine Resonanzfrequenz unterhalb
weg, die letztlich DAC-Headroom kosten, von denen der 8-Bitter ohnehin viel zu wenig hat.
Man braucht also am besten einen Bandpass mit einer sehr schlechten
Technisch ist ein IIR Filter ein bisschen +,-,*. Division braucht man
zu Samplingrate alle nahe bei ganzen Zahlen. Daher bietet es sich an,
Beispiel: b1 = -1,98; per Definition sind die oberen 8 Bit des
unteren 8 Bit die Nachkommastellen. b1 * y[n-1] = b1' * y[n-1] - (y[n-1] > 5) - (y[n-1] > S Man beachte die Shift-Richtung. Per Definition sind x[n] Vorkommastellen, also die oberen 8 Bit. Diese werden multipliziert mit
Multiplikationsergebnisses sind am Ende Vorkommastellen, die unteren Nachkomma, exakt passend zu dem y-Akkumulator. Allerdings wird man schnell feststellen, dass der y-Akkumulator auf
oberen 8 Bit des Multiplikationsergebnisses werden nur zu den Nachkommastellen des y-Akkumulators addiert. Damit muss man nur noch bei
den Frequenzgang. Am Ende muss man ausprobieren, wie weit hoch man sich traut. Es ist
gar keine Multiplikation mit a0. Damit bekommt man die weiter reduzierte Formel: