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.
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.
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.
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:
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.