Software-Konfigurierbarer Rauschgenerator auf 8-Bitter

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.
Reply to
Johannes Bauer
Loading thread data ...
Johannes Bauer schrieb:
recht einfach berechnen: prng() * x / 256 ( = prng() / (256/x)) und
Christian
--
Christian Zietz  -  CHZ-Soft  -  czietz (at) gmx.net 
WWW: http://www.chzsoft.de/ 
 Click to see the full signature
Reply to
Christian Zietz
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.
Reply to
Johannes Bauer
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.
--
Christian Zietz  -  CHZ-Soft  -  czietz (at) gmx.net 
WWW: http://www.chzsoft.de/ 
 Click to see the full signature
Reply to
Christian Zietz
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
Reply to
Volker Bartheld
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
y[n] = a0 x[n] + a1 x[n-1] + a2 x[n-2] + b1 y[n-1] + b2 y[n-2]
y sind die Ausgabewerte, x die Eingabewerte aus prng. [n-1] meint den letzten Ein- bzw. Ausgabewert, [n-2] den vorletzten.
Die Koeffizienten a0 .. b2 bekommt man z.B. hier her:
formatting link

Samplingrate bzw. Schleifenfrequenz ab.
man braucht nur noch den vorletzten Eingabewert - Und a2 = -a0, zudem ist b1 immer negativ. Damit reduziert sich die Formel zu
y[n] = a0 x[n] - a0 x[n-2] - (-b1) y[n-1] + b2 y[n-2]
also die Nummer mit x[n-2] komplett schenken.
y[n] = a0 x[n] - (-b1) y[n-1] + b2 y[n-2]
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:
y[n] = (x[n] >> 8) + ((b1' * y[n-1]) >> 5) - (y[n-1]
Reply to
Marcel Mueller
formatting link

-20dB/Dekade sind analog als Filter billig zu haben,
MfG JRD
Reply to
Rafael Deliano
Hi Rafael,
Nicht wirklich, erst dann, wenn man ca 1/2 Dekade jenseits der
beim Integrator erster Ordnung. Wenn man nun die Steilheit auf die
mit einem Allpassfilter den Phasengang des ungefilterten Signals dem des Integrators anpassen, bevor man summiert...
Marte
Reply to
Marte Schwarz

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.