Forum: Digitale Signalverarbeitung / DSP / Machine Learning Phaseninkrement


von Jens (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

Wie wäre es mit einer simplen Wertetabelle oder einem simplen FIR Filter 
um einen Sinus zu erzeugen?

von schienbein (Gast)


Lesenswert?


von Detlef _. (detlef_a)


Lesenswert?

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

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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?

von Detlef _. (detlef_a)


Lesenswert?

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

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

Ja ich meinte den Weg über eine Sinustabelle.
Sinustabelle auslesen, mit fester Schrittweite.

von Jens (Gast)


Lesenswert?

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

von Christoph db1uq K. (christoph_kessler)


Lesenswert?


von Jens (Gast)


Lesenswert?

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?

von ajax (Gast)


Lesenswert?

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

von TheMason (Gast)


Lesenswert?

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

von Hägar (Gast)


Lesenswert?

Was auch gut geht: Grenzstabiler IIR mit einem Pol bzw. einem komplexen 
Polpaar auf dem Einheitskreis.

von TheMason (Gast)


Lesenswert?

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

von Horst (Gast)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

Wie wird dann dieser IIR Filter bzw. die andere Variante mit 
Sinustabelle in einem C-Programm implementiert?

von Hanswurst (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.