Hi, ich suche einen Algorithmus um einen Sinus zu erzeugen. Ich erinnere mich dunkel, das ich das in 56002 Assembler mal gesehen habe. War bei den Beispiel-Programmen eines 56002 Eval-Boards dabei. Leider habe ich das längst entsorgt. Waren nur ein paar Zeilen Assembler Quellcode. Keine Sinustabelle! Wollte das jetzt gern nach C portieren.
Dazu gibts hier mehrere Artikel: http://www.mikrocontroller.net/articles/Digitale_Sinusfunktion http://www.mikrocontroller.net/articles/Schnelle_32Bit-Integer_Sinusberechnung http://www.mikrocontroller.net/articles/Sinusgenerator_mit_IIR-Filter http://www.mikrocontroller.net/articles/Sinus_Tabelle http://www.mikrocontroller.net/articles/AVR_Arithmetik/Sinus_und_Cosinus_%28CORDIC%29 Zwei Gruppen, Tabellenbasiert oder immer neu berechnet. Letztere brauchen irgendeine Amplitudenregelung wie jeder analoge Sinusgenerator (Wien-Brücke mit der berühmten Glühlampe als nichtlinearer Widerstand).
Folgende Rekursion liefert Dir nen super Sinus: z0=z1+z1-(z1>>8)-z2; z2=z1; z1=z0; Initialisierung z.B. z1=2000; z2=0; Kost nix. Andere Frequenz (ist jetzt ~ 101samples/Welle) geht auch, wenn man z1>>8 ändert. Amplitude ändert sich durch die Initialisierung. Cheers Detlef
Detlef _a schrieb: >Rekursion liefert Dir nen super Sinus: > z0=z1+z1-(z1>>8)-z2; > z2=z1; > z1=z0; Geht klasse! Vielen lieben Dank! Meine Initialisierung:
1 | z1 = 399; |
2 | z2 = z1; |
So ist Amplitude 399
steht auf dem Schlauch schrieb: >
1 | > z1 = 399; |
2 | > z2 = z1; |
3 | >
|
> So ist Amplitude 399
Ah, geschickt, so setzt man die Amplitude und muss nicht rumfummeln.
Cheers
Detlef
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.