Software-Konfigurierbarer Rauschgenerator auf 8-Bitter

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From German to

Threaded View
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: https://github.com/johndoe31415/tiny26noise/blob/master/main.c




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.

Re: Software-Konfigurierbarer Rauschgenerator auf 8-Bitter
Johannes Bauer schrieb:


Quoted text here. Click to load it

Quoted text here. Click to load it



recht einfach berechnen: prng() * x / 256 ( = prng() / (256/x)) und



Christian
--  
Christian Zietz  -  CHZ-Soft  -  czietz (at) gmx.net
WWW: http://www.chzsoft.de/
We've slightly trimmed the long signature. Click to see the full one.
Re: Software-Konfigurierbarer Rauschgenerator auf 8-Bitter
On 06.10.19 10:33, Christian Zietz wrote:


Quoted text here. Click to load it


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 https://github.com/johndoe31415/tiny26noise/blob/master/noisegen.c


Johannes

--  

selben Hardware." -- Hans-Peter Diettrich in d.s.e.

Re: Software-Konfigurierbarer Rauschgenerator auf 8-Bitter
Johannes Bauer schrieb:

Quoted text here. Click to load it



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:
<https://godbolt.org/z/1oMbHS . 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/
We've slightly trimmed the long signature. Click to see the full one.
Re: Software-Konfigurierbarer Rauschgenerator auf 8-Bitter
On Sun, 6 Oct 2019 09:43:02 +0200, Johannes Bauer wrote:
Quoted text here. Click to load it

Quoted text here. Click to load it

Quoted text here. Click to load it





Wenn Dein ATtiny noch ein bisserl PLatz im EEPROM hat, kannst Du dort auch




Quoted text here. Click to load it

Externe Beschaltung mit Rauschdiode am ADC scheidet kategorisch aus?  

Ciao,
Volker

Re: Software-Konfigurierbarer Rauschgenerator auf 8-Bitter
Am 06.10.19 um 09:43 schrieb Johannes Bauer:
Quoted text here. Click to load it


Quoted text here. Click to load it


Zufallsbits, die von prng kommen. Sehr deutlich wird das bei  
Zweierpotenzen. Diese entsprechen einem Shift-Operator, der einfach die  
unteren Bits entsorgt.

Quoted text here. Click to load it



Quoted text here. Click to load it





Divisor ja auch noch konstant ist.

Berechne doch mal die Folge auf dem PC vor und schau dir das Ergebnis  
mit Audacity an.



Quoted text here. Click to load it

Quoted text here. Click to load it






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:
https://www.earlevel.com/main/2013/10/13/biquad-calculator-v2/


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] << 1) mit
   b1' = b1 + 2 = 0,02 entspricht 0x05


Man braucht mehr.
Man kann sich aber leicht mehr Nachkommastellen herauskitzeln, indem man  
mit Shift-Operatoren arbeitet:
   b1 * y[n-1] = ((b1' * y[n-1]) >> 5) - (y[n-1] << 1)  mit
   b1' = 32 * 2 - b1 = 0,64 entspricht 0xA4


Bleibt noch die Sache mit der Pegelregelung. Dazu nimmt man sich den  
a0-Koeffizienten vor. Also:
   a0 * x[n] = (a0' * x[n]) >> 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] << 1)
        - ((b2' * y[n-2]) >> 5) + y[n-2]

wobei >> 8 jetzt nur der Addition zu den unteren 8 Bit von y entspricht.
Man braucht jetzt genau 2 8*16 Bit Multiplikationen pro Ausgabewert und  
keine Division.


Alle bisher genannten Kalkulationen beziehen sich auf Signed-Integer  
Werte. Technisch hat das bis hier hin keine Auswirkung, aber bei der  

oberen 8 Bit des y-Akkumulators zu nehmen, man muss zudem das oberste  
Bit toggeln (entspricht +128).

Kleiner Hinweis noch: Die Anzahl der signifikanten Bits bei der  








beispielsweise durch y[n-1] << 1 hingegen unkritisch. Die kompensieren  
sich automatisch.


Marcel

Re: Software-Konfigurierbarer Rauschgenerator auf 8-Bitter
Quoted text here. Click to load it

http://www.embeddedFORTH.de/temp/Kolm.pdf

-20dB/Dekade sind analog als Filter billig zu haben,


MfG  JRD

Re: Software-Konfigurierbarer Rauschgenerator auf 8-Bitter
Hi Rafael,
Quoted text here. Click to load it


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

Site Timeline