hallo,
ich weiß, es gibt schon ein paar Foreneinträge zum Thema, aber ich habe
leider nicht das richtige gefunden.
ich möchte mit einem ATtiny 44a per DAC weißes Rauschen zum Hören
erzeugen.
Das ganze kann ohne Proble Psudozufall sein.
ich habe srand() und rand() der stdlib gefunden und damit folgendes
gemacht:
#include <avr/io.h>
#include <stdlib.h>
void pwminit(void)
{
DDRA = (1 << PA6 ); // ATtiny44A OC1A pin
TCCR1A = (1<<COM1A0); // Compare Output Mode for Channel A
TCCR1B = (1<<WGM12) | (1<<CS10); // CTC (Clear Timer on Compare) |
no prescaling
}
int main()
{
srand((unsigned int)600); // Startzahl für Pseudozufall setzen
pwminit();
while (1)
{
OCR1A = ((rand()%500) + 200); // Zufällige Freq in Dauerschleife
}
}
nun höre ich ganz schnell viele zufällige Töne, aber kein Rauschen,
dafür ist es noch zu langsam obwohl der Prescaler Null ist.
Vielleicht benutze ich den falschen PWM-Mode für sowas?
Fast-PWM?
Ich möchte ja eigentlich nicht zufällig verschiedene Frequenzen ausgeben
sondern zufällig verschiedene Spannungen --> Rauschen
Funktioniert es vielleicht wenn ich ein RC-Glied an den Ausgang schalte
um das ganze zu glätten?
Wenn ja, wie dimensioniere ich dieses?
Kann ich mir das nicht sparen und irgendwie direkt ein Rauschen
ausgeben?
daher dachte ich zufällig verschiedene Frequenzen. Er Schaltet nur
leider zu langsam.
Für Antworten, Anmerkungen, Tips und Tricks bin ich sehr dankbar
Mirko
Das rand() wird wohl viel zu lange brauchen, denn das beinhaltet
bereits Divisionsoperationen. Deine zusätzliche Division macht
es nicht besser.
Ich glaube, ein Controller dieses Formats ist mit einem LFSR einfach
in der Geschwindigkeit überfordert. Sowas könnte man am besten auf
einem FPGA implementieren, ein CPLD könnte ebenfalls genügen.
> Das rand() wird wohl viel zu lange brauchen, denn das beinhaltet> bereits Divisionsoperationen.
Ja genau, die Rechnung selbst ist zu langsam. Der Versuch mit fast PWM
ergab schnelleren Zufall, teilweise auch Rauschen, aber auch immer ein
hohen Dauerton mit Rauschanteilen.
>Deine zusätzliche Division macht> es nicht besser.
OCR1A = ((rand()%500) + 200 bedutet doch nur dass 500 Zufallszahlen ab
199 möglich sind. Also 199, 200, 201, ... , 699
?
auch die Primzahlinkremitierung habe ich versucht, was ja schneller ist
(siehe Post Beitrag "pseudo zufall als pwm ersatz"), ergab aber
leider kein Rauschen, sonder interresante Töne.
FPGA und CPLD hören sich kompliziert an
ich möchte das eigentlich auch nur digital erzeugen um verschieden
gefärbtes Rauschen schnell programmieren zu können.
dac <-- zu teuer
Da gibt es noch die Möglichkeit mit externen Rauschgeneratoren
(Zehnerdiode+OPamp, Radio ect.) und diese dann analog zu Filtern...
hat jemand noch eine Idee?
mirko schrieb:> OCR1A = ((rand()%500) + 200 bedutet doch nur dass 500 Zufallszahlen ab> 199 möglich sind. Also 199, 200, 201, ... , 699> ?
Ja, allerdings ist eine Division durch 500 langsam. Wenn du durch
512 dividieren würdest, geht es viel schneller.
> FPGA und CPLD hören sich kompliziert an
Naja, ein LFSR dürfte dort eher zu den Einsteigerübungen gehören.
Gut, die PWM müsste man noch mit drauf implementieren, aber sowas
findest du bestimmt als fertigen IP-Block.
mirko schrieb:> dac <-- zu teuer
Wie hoch ist denn die Stückzahl...
Selbst bei Farnell gibt's z.B. Stereo-Audio-DACs (WM5824) mit LineOut
für 1.34 € (ab 1 St.)
MCP4725 (12-Bit DAC) für 1.39 €
Versuchs mal mit einem Twisted GFSR, die brauchen nur wenige schnelle
Operationen pro Zufallszahl.
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/ARTICLES/tgfsr3.pdf
Deren Hauptproblem ist, dass die vorgegebenen zu viel Speicher brauchen,
und dass man gute Parameter für kleinere finden muss.
Das kann man durch Ausprobieren und Testen mit Diehard o.ä. machen.
> Selbst bei Farnell gibt's z.B. Stereo-Audio-DACs (WM5824) mit LineOut> für 1.34 € (ab 1 St.)> MCP4725 (12-Bit DAC) für 1.39 €
danke, guter Tip, ist mir dafür jetzt leider auch noch zu teuer.
> Versuchs mal mit einem Twisted GFSR, die brauchen nur wenige schnelle> Operationen pro Zufallszahl.
hört sich sehr gut an, guck ich mir mal genauer an
mir ist eingefallen, dass es doch auch die Möglichkeit gibt die Zahlen
fest einzuprogrammieren und geloopt wiederzugeben. Dann braucht er keine
Rechnung zu machen sondern muss nur nachgucken welchen wert er als
nächstes ausgibt.
Also pseudo-pseudo-zufall (kein Zufall). Irgendwie etwas wirres wie
011110010000100000000111101111111111100001001010000001001000000000
müsste doch Rauschen ergeben, wenn es lange genug ist bevor es sich
wiederholt.
Wie gebe ich sowas schnell aus? einfach nacheinander
DDRA = (1 << PA3 );
DDRA = (0 << PA3 );
DDRA = (0 << PA3 );
DDRA = (1 << PA3 );
DDRA = (1 << PA3 );
...
?
also eine Liste die, die Zahlen für Rauschen schon enthält. 1-Bit Sound.
vielen Dank Mirko
mirko schrieb:> Also pseudo-pseudo-zufall (kein Zufall).
Was anderes ist rand() ja auch nicht, allerdings hat es meiner
Meinung nach 2^31 verschiedene Zustände. Die willst du nicht im
Flash-ROM haben. ;-)
> 2^31 verschiedene Zustände. Die willst du nicht im> Flash-ROM haben. ;-)
ein Bruchteil davon würde schon genügen? Eben den Flash voll machen? und
dann wiederholt es sich. Gegen wiederholung vielleicht eine sehr
einfache Rechnung noch dazu?
Mirko
LFSR sollte doch auch schnell hinzukriegen sein: Man nimmt für jeden TAB
ein ganzes Byte um ohne die Bitschiebereien hinzukommen, Länge des
arrays ne Potenz von 2 zB 32, dann nen Pointer auf das array, damit man
die Bytes nicht schieben muß. Insgesamt also zB vier Speicherzugriffe,
XOR, abspeichern, Pointermanipulation, fertig ist die Laube. Ich denke,
da sollten 20 oder 30 Assemblerbefehle ausreichen, mit 16MHz getaktet
ist man da bei 500KHz Schleifenfrequenz, reicht.
Cheers
Detlef
Ich hab das schon mal gelöst.Allerdings auf einem ADUC841 mit externem
RAM.
Die simle Funktion für Zufallszahlen:
void make_audio_buf(void)
{
unsigned int i,temp1;
temp1=0x7FFF; //Startwert
for(i=0;i<0x4000;i++){temp1=(temp1*5+3);
audio_buf[i]=temp1/32;
}
}
Die Ausgaberate (auf dem 12bit DAC) war 16384Hz. Das lieferte ein
schönes konstantes Rauschen ohne hörbare Periodizität.
Bei höherer Rechenleistung und/oder geringerer Ausgaberate können die
Werte auch in Echtzeit gerechnet werden.
Grüße Gebhard
Hallo,
vielleicht ein Ansatz:
das ist mein Kaminfeuer im Puppenhaus.
2 Pseudo-Zufallsroutinen (rückgekoppeltes Schieberegister), irgendwo im
Netz gefunden.
Mein Ansatz für das Rauschen wäre jetzt entweder auf einen Port ausgeben
und dann ein R2R-Netzwerk dran oder das Compareregister einer PWM damit
füttern.
Gruß aus Berlin
Michael