amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Sin/Cos => Magnitude/Phase => Sin/Cos [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

13.02.2008, 16:14 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Hallo!

Beim Herumspielen mit der FFT bin ich auf folgendes Problem gestossen, wo mir auch eine intensive Google-Recherche nicht weitergeholfen hat.
(wer nicht weiss was FFT ist, braucht nicht weiter zu lesen)

Bei der FFT bekomme ich aus dem Zeitbereich eines Signals das Spectrum, und zwar in Cosinus/Real (r) und Sinus/Imaginär (i) Anteilen.
Jetzt möchte ich das in Magnitude (m) und Phase (p) umrechnen, manipulieren und wieder in Cosinus/Sinus umwandeln, damit ich es in den Zeitbereich rücktransformieren kann.

Kurz gesagt, ich benötige zwei Funktionen:

fft_SinCos2MagPha(srcBuff,dstBuff,length)
fft_MagPha2SinCos(srcBuff,dstBuff,length)


Sinus/Cosinus nach Magnitude/Phase mache ich so:

m = Sqrt(r*r + i*i)
p = ATan(i/r) oder p = ASin(i/m) oder p = ACos(r/m)

soweit so gut.

Aber wie komme ich wieder zu meiner ursprünglichen Darstellung?

r = Cos(p) * m
i = Sin(p) * m


... würde man meinen. Stimmt auch fast, aber nur fast!
Der Betrag von r und i stimmen zwar, aber manchmal stimmen die Vorzeichen nicht mehr!
Was mache ich hier falsch ?


--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 13.02.2008 um 16:17 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

13.02.2008, 16:57 Uhr

_PAB_
Posts: 3016
Nutzer
@Der_Wanderer:
Ansich ist alles richtig.
Welche Vorzeichen stimmen denn nicht ?
Nur die von r oder nur die von i ?
Wenn es nur die von i sind, könnte es sein, daß beim p irgendwo ein Minus verlorengegangen ist...
Hast Du vielleicht aus Versehen irgendwo unsigned genommen ?
Oder die Winkelfunktionen, die Du verwendest sind nicht streng 2-pi-periodisch !?
Rechnest Du in Radians oder Grad ?
Gibt es da vielleicht irgendwo unterschiedlich definierte Winkelfunktionen bei Dir ?

PS: Bei Google wirst Du vielleicht fündiger, wenn Du nicht von Magnitude/Phase sprichst, sondern von der r * e^i*phi-Darstellung.
(r = m , phi = p)

[ Dieser Beitrag wurde von _PAB_ am 13.02.2008 um 17:00 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

13.02.2008, 17:08 Uhr

Der_Wanderer
Posts: 1229
Nutzer
So grobe Fehler wie Radian vs. Grad sind da natürlich nicht mehr drin, sonst würde ja alles durcheinander kommen.

Die Beträge stimmen alle, nur die Vorzeichen nicht.
Sieht so aus, also ob die Vorzeichen von i nicht stimmen, die von r hingegen schon. Kann allerdings auch an meinen Test-Zahlen liegen, dass es sich zufällig so verhält. Da muss ich noch ein wenig rumprobieren.
Die Vorzeichen sind auch nicht systematsich falsch. Ich kann es nicht nachvollziehen und auch nicht durch Tricks ausgleichen.

Was mir eingefallen ist:

Cos(Pi/2) = Cos(-Pi/2) = 0

ACos(0) = Pi/2

ACos() kann also nicht zwischen 90 und -90 Grad unterscheiden, verallgemeinert kann man nicht zwischen Winkeln unterscheiden, die gneau 180° auseinander liegen => das Vorzeichen der Schwinung geht verloren.
Es geht also bei der Winkelberechnung Information verloren, da die Winkel nur zwischen -90 und +90 Grad liegen können.
Ist ja auch klar:

Berechne ich den Winkel mit...

p = ASin(i/m)

... geht das Vorzeichen von r überhaupt nicht in die Berechnung ein.

Nehme ich ...

p = ACos(r/m)

... fehlt das Vorzeichen von i.

Aber ...

p = ATan(i/r)

...liefert auch keine korrekten Ergebnisse.

Hm...


--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 13.02.2008 um 17:37 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

13.02.2008, 17:46 Uhr

akl
Posts: 265
Nutzer
@Der_Wanderer:

FFT oder mehr FT?
http://www.iti.fh-flensburg.de/lang/algorithmen/fft/fft.htm


[ - Antworten - Zitieren - Direktlink - ]

13.02.2008, 18:18 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Beispiel:

x = -6.7 - 1.3i => r=-6.7; i=-1.3

1) Cos/Sin => Mag/Pha
m = Sqrt(-6.7*-6.7 + -1.3*-1.3) = 6.825
p = ATan(-1.3/-6.7) = ATan(0.194) = 0.191

2) Mag/Pha => Cos/Sin
r' = Cos(0.191) * 6.825 = +6.7
i' = Sin(0.191) * 6.825 = +1.3


Also wenn r und i beide negativ sind, dann bekommt man die gleichen p und m als wenn sie positiv wären.

--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

13.02.2008, 18:30 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Ok, ich glaube ich habs rausgefunden.

Die Berechnung der Phase p muss so gehen:

p = ATan(i/r)
if (r<0) p + Pi/2

Dadurch bekommt der Winkel volle 360° und r und i können 1:1 rekonstruiert werden. Puh!
(Hab ich nirgends so im Netz gefunden!)

--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 13.02.2008 um 18:30 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

13.02.2008, 21:16 Uhr

Madcat
Posts: 246
Nutzer
Zitat:
Original von Der_Wanderer:
...
ACos() kann also nicht zwischen 90 und -90 Grad unterscheiden, verallgemeinert kann man nicht zwischen Winkeln unterscheiden, die gneau 180° auseinander liegen => das Vorzeichen der Schwinung geht verloren.
Es geht also bei der Winkelberechnung Information verloren, da die Winkel nur zwischen -90 und +90 Grad liegen können.
...


Noch ein kleiner Hinweis auch wenn das Problem gelöst ist:

Verallgemeinert muss man sagen, dass man nicht zwischen den Winkeln Ω und -Ω beim Kosinus unterscheiden kann, d.h. cos(Ω)=cos(-Ω). Da müssen keine 180° zwischen den Winkeln liegen (Beispiel: cos(π/6) und cos(-π/6) ist ein Winkelunterschied von grad mal π/3, π entsprächen 180° ;) ). Der Kosinus ist im Gegensatz zum Sinus eine grade Funktion.

--
Zeit ist eine Droge. Zuviel davon bringt einen um.

[ Dieser Beitrag wurde von Madcat am 13.02.2008 um 21:17 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

13.02.2008, 22:17 Uhr

_PAB_
Posts: 3016
Nutzer
@Der_Wanderer:
Richtig !
Bei den arcus-Funktionen geht Dir ein Vorzeichen flöten... klar.
Die letzte Variante sieht mit der Fallunterscheidung definitiv gut aus.
Tricky... ;-)

@akl:
Klar, es geht um die Fourrier-Transformation (FT).
FFT ist zwar grundsätzlich gleich, allerdings diskret an einer Zweierpotenz-Anzahl von Stützstellen...

[ Dieser Beitrag wurde von _PAB_ am 13.02.2008 um 22:19 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

14.02.2008, 17:31 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Ja klar, hier geht es um die diskrete FT. "FFT" ist lediglich ein Alogrithmus, mit dem man eine DFT von 2^n Punkten berechnen kann. Ich habe den Kommentar ignoriert, da er nur Haarspalterei ist und nichts beiträgt. Jeder der weiss, was FFT ist, weiss auch was eine FT ist.

--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Sin/Cos => Magnitude/Phase => Sin/Cos [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.