Hallo, für die DSP Programmierung benötige ich den Sinus. Die Berechnung der Werte mit einer Sinus Funktion ist für den DSP zu rechenintensiv. Darum hab ich erfahren, dass man mit einem Phaseninkrement diese Sinus Werte damit berechnene kann. Dies soll deutlich schneller sein. Kann mir einer das Prinzip des Phaseninkrementes erklären? deltaPHI = w*t=2*pi*fo*t Mir ist unklar wie man die Werte berehcnen kann.
Wie wäre es mit einer simplen Wertetabelle oder einem simplen FIR Filter um einen Sinus zu erzeugen?
Jens wrote: > Kann mir einer das Prinzip des Phaseninkrementes erklären? > ja. Beispiel: nimm die komplexe Zahl (1+i*0) . Die hat den Betrag eins und den Winkel 0°. Jetzt nimm ne komplexe Zahl (1+i*1)/sqrt(2), die hat den Betrag 1 und den Winkel 45°. Beide Zahlen miteinander multipliziert liefert Dir die Zahl (1+i*1)/sqrt(2), also die Zahl 1+i*0 um das Phaseninkrement 45° gedreht. Das achtmal gemacht und Du bist einmal um den Kreis rum. Das geht mit beliebigen 'Phaseninkrementen'. Die erste Komponente der komplexen Zahl, die Du drehst, ist Dein Cosinus, die zweite Dein Sinus. Das kostet eine komplexe Multiplikation und heißt Cordic. gute Nacht Detlef
Phaseninkrement klingt eher nach DDS, die Zahl die jedesmal dazuaddiert wird, kann man so bezeichnen. Der Cordic funktioniert ja iterativ nähernd, nicht nur in einem Schritt.
deltaPHI N fo N k = -------------- = -------- 2*pi fa Von einer Vorlesung habe ich diese Formel mal aufgeschrieben. Weiss nicht mehr was diese bedeutet. Was soll da k darstellen?
http://catb.org/~esr/faqs/smart-questions.html >>Hallo, für die DSP Programmierung benötige ich den Sinus. jau, 'den Sinus'. Abtastfrequenz? Frequenz? Amplitude? float/Integerrechnung ....... Jens, was willse denn nu? Cheers Detlef
Ja die Frage ist etwas unpräzise gestellt. Zur digitalen Sinuserzeugung gibt es nicht so viele Möglichkeiten, wie schon genannt: * Sinustabelle auslesen, entweder mit fester Schrittweite oder feiner gestuft mit Jitter nach dem DDS-Prinzip. *Dann die Berechnung, ohne Tabelle, dazu bietet sich der Cordic Algorithmus an. *Und schließlich die Filterung, aus einer Rechteckschwingung wird durch Tiefpassfilter auch ein Sinus. Digital bieten sich dazu Digitalfilter wie FIR oder IIR an.
Ja ich meinte den Weg über eine Sinustabelle. Sinustabelle auslesen, mit fester Schrittweite.
Ist es nicht so, dass man zuerst die Sinuswerte von 0 bis pi/2 errechnen muss.Dieser Werte müsste man doch dann in ein Array ablegen. Im weiteren Programmanlauf, muss dann die Anzahl N der erwünschten Impulse festgelegt werden. Die Abtastfrequenz bleibt eigentlich konstant oder? k = (deltaPHI*N)/(2*pi) = (fo*N)/fa
Ja eine Tabelle, Andreas benutzt hier z.B. 256 Werte: http://www.mikrocontroller.net/articles/Digitaler_Funktionsgenerator http://www.mikrocontroller.net/wikifiles/5/51/Dds.pdf
Vielen Dank für die Infos. Was mir eigentlich fehlt, ist so ein Beispiel mit Zahlenwerte, wo die Abtastfrequenz, die Anzahl N der Impulse und die Signalfrequenz vorkommen. Gibt es irgendwo ein Skript wo dies expliziet erklärt?
Mir scheint hier das Thema Phasenincrement ein wenig untergegangen. 1. Es wird eine Drehmatrix A gebildet mit z.B einem Winkel von 5 Grad, sozusagen das Phasenincrement 2. Wir nemen ein Signal s(n), wobeil s(0) = 1 3. Das Signal wird mit der Drehmatrix schrittweise gedreht s(n+1)=A*s(n) 4. Das Sinussignal ist Real(s(n)) Kleines Problem bei der rekursiven Rechnung: wachsende Rundungsfehler durch beschränkte Genauigkeit Lösungsmöglichkeit: Signal hin und wieder normieren
ich hab da auch mal eine frage zu : wenn ich einen sinus in einer tabelle ablege (habe es mir einfach gemacht und einen kompletten sinus-zug abgelegt) und diese tabelle mittels dds auslese und an einen audio-dac gebe habe ich zwar einen sinus, aber der ist natürlich nicht so genau (aufgelöst), da ich ja nur eine endliche (begrenzte) anzahl an sinus-werten (sütztstellen wenn man so will) habe. diese ungenauigkeit ist messbar (und auch hörbar, je nach frequenz). meine frage ist nun ob es eine faustformel gibt mit der sich anhand der anzahl der werte der sinustabelle und der samplerate die qualität des signals (in form von thd) berechnen lässt. gerade bei sinus fallen harmonische am ehesten auf. hintergrund ist der das ich (mal wieder das audio-projekt) eine wavetable eingebaut habe um mehr als nur 2 wellenformen (sägezahn, rechteck) zur verfügung zu haben. habe also ein ram, und dieses ram hat 1024 worte (16-bit). ich überlege nun ob ich 1, 2 oder 4 verschiedene wellenformen ablegen kann. je weniger wellenformen, desto "genauer" wird die wiedergabe. allerdings kostet es halt auch speicher (und der ist leider sehr begrenzt) und für einen synthesizer sollten meiner meinung nach schon so zw. 4-6 wellenformen auswählbar sein. bei wellenformen die ohnehin schon einige harmonische haben ist das nicht ganz so kritisch, wenn ich aber an einen sinus-bass denke dürfte dieser nicht so toll klingen bei nur 256 sinus werten. gibt es sowas wie eine fausformel für so einen fall (bezogen auf thd) ? gruß rene
Was auch gut geht: Grenzstabiler IIR mit einem Pol bzw. einem komplexen Polpaar auf dem Einheitskreis.
@hägar auch ne idee. aber dann habe ich nur nen sinus :-( möchte ja nene wavetable haben. dann kann ich auch andere wellenform-züge im ram ablegen.
wenn sich die Formen wiederholen musst du nicht die ganzen Werte ablegen, z.B. beim Sinus reichen die Werte bis zur hälfte der 1. Halbwelle. Die restlichen werte kann man durch spiegeln erzeugen. Wenn du noch den Cosinus brauchst, kannst du dir den auch aus der gleichen Tabelle erzeugen. LG Horst
Wie wird dann dieser IIR Filter bzw. die andere Variante mit Sinustabelle in einem C-Programm implementiert?
schau mal hier: Beitrag "DDS-Direct Digital Synthesis" Das mit dem IIR Filter funktioniert ähnlich. Da muss man nur die LUT durch das Filter ersetzen
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.