www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Phaseninkrement


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

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

Autor: schienbein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich meinte den Weg über eine Sinustabelle.
Sinustabelle auslesen, mit fester Schrittweite.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ajax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hägar (Gast)
Datum:

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

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens (Gast)
Datum:

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

Autor: Hanswurst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.