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/ 
PGP/GnuPG-Key-ID: 0x52CB97F66DA025CA / 0x6DA025CA
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/ 
PGP/GnuPG-Key-ID: 0x52CB97F66DA025CA / 0x6DA025CA
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

ist nicht mehr erforderlich.

MfG JRD

Reply to
Rafael Deliano

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.