amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Sin/Cos => Magnitude/Phase => Sin/Cos [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2008-02-13, 16:14 h

Der_Wanderer
Posts: 1229
User
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. ]

[ - Answer - Quote - Direct link - ]

2008-02-13, 16:57 h

_PAB_
Posts: 3016
User
@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. ]

[ - Answer - Quote - Direct link - ]

2008-02-13, 17:08 h

Der_Wanderer
Posts: 1229
User
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. ]

[ - Answer - Quote - Direct link - ]

2008-02-13, 17:46 h

akl
Posts: 265
User
@Der_Wanderer:

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


[ - Answer - Quote - Direct link - ]

2008-02-13, 18:18 h

Der_Wanderer
Posts: 1229
User
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


[ - Answer - Quote - Direct link - ]

2008-02-13, 18:30 h

Der_Wanderer
Posts: 1229
User
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. ]

[ - Answer - Quote - Direct link - ]

2008-02-13, 21:16 h

Madcat
Posts: 246
User
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. ]

[ - Answer - Quote - Direct link - ]

2008-02-13, 22:17 h

_PAB_
Posts: 3016
User
@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. ]

[ - Answer - Quote - Direct link - ]

2008-02-14, 17:31 h

Der_Wanderer
Posts: 1229
User
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


[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Sin/Cos => Magnitude/Phase => Sin/Cos [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.