Hallo zusammen,
ich möchte gerne die Phase eines Sinussignals berechnen.
Um die Berechnungen per FFT und Hilbert-Transformation zu vergleichen,
habe ich ein sinusförmiges Signal erzeugt und die Phase mit beiden
Methoden berechnet.
Bei Signalen, in der jeweils nur eine Frequenz steckt (z.B. reine
2Hz-Sinuswelle), klappt das auch super.
Jetzt habe ich zwei Frequenzen übereinander gelegt (z.B. 1Hz+2Hz) und
versuche, die Phase einer der beiden Frequenzen (z.B. 2 Hz) zu
extrahieren. Dabei bin ich auf ein Problem gestoßen:
Wenn ich die Phase per Bandpass-Filter und Hilbert-Transformation
berechne, wird die Phase der 2 Hz-Welle wunderbar berechnet (siehe 2.
Bild).
Wenn ich allerdings die FFT anwende und dann die Phase der 2Hz-Welle
extrahieren möchte, wird die Phasenberechnung von der 1Hz-Welle
beeinflusst. Auf dem 1.Bild ist das gezeigt (blau 2Hz-Signal, rot
1Hz+2Hz-Signal, schwarz extrahierte Phase). Wenn die 1- und
2-Hz-Komponenten im Signal genau gleich groß sind, liegt meine
berechnete Phase genau in der Mitte der beiden (1 Hz und 2 Hz) Phasen,
je höher die Amplitude der 1Hz-Welle, desto näher liegt die für 2Hz
extrahierte Phase an der Phase für 1 Hz.
Ich habe die Phase so berechnet, indem ich die komplexe Zahl an der
2.Stelle (da Frequenzauflösung 1 Hz und die Phase von 2Hz berechnet
werden soll) des Fourier-transformierten Signal genommen habe und die
Phase per atan2(imag,real) berechnet habe.
Jetzt meine Frage: Kann mir jemand erklären, wieso die Phasenberechnung
für die 2Hz-Komponente des Signals von der für 1Hz beeinflusst wird?
Ich hoffe, ich habe alles nicht zu verwirrend erklärt. :-/
Danke für jede Hilfe!
Benedikt
Man sollte dafür entweder viel größere Datenmengen nehmen, oder die FFT
Fensterung auf die Nulldurchgänge synchronisieren und das Fenster über
genau eine Periode legen. Vielleicht gibt es auch noch andere
Möglichkeiten, aber so konnte ich das mal lösen.
Grüße,
Peter
Hi Peter,
vielen Dank für deine Hilfe. Das Problem ist, dass ich diese Berechnung
online, d.h. während der Datenerhebung, durchführen möchte. Daher kann
ich weder große Datenmengen verwenden (der Delay wäre zu groß) noch die
Nulldurchgänge voraussagen. Vielleicht gibt es noch eine andere
Möglichkeit...?
Viele Grüße,
Benedikt
BZoefel schrieb:> Hi Peter,> vielen Dank für deine Hilfe. Das Problem ist, dass ich diese Berechnung> online, d.h. während der Datenerhebung, durchführen möchte. Daher kann> ich weder große Datenmengen verwenden (der Delay wäre zu groß) noch die> Nulldurchgänge voraussagen. Vielleicht gibt es noch eine andere> Möglichkeit...?> Viele Grüße,> Benedikt
Hallo,
Dein Problem sind die Signalränder bzw. - wenn Du es im Frequenzbereich
und auf Englisch ausdrücken willst - der sogenannte "leakage effect".
Die Signalränder werden bei der FFT immer zum Problem, Du nur wenige
Signalperioden aufzeichnest. Der Grund, weshalb die Ränder solche
Probleme machen, besteht letztlich darin, daß Du ein endlich langes
Signal mit unendlich langen Funktionen (Sinusfunktionen) zusammensetzen
willst. Am einfachsten Nachzuvollziehen ist das an der Formel für die
Sampling-Reihe. (Die Theorie erläutere ich Dir nur, wenn Du es unbedingt
wissen willst; die Andeutungen müssen sonst hier reichen.)
Wahrscheinlich genügt es, wenn Du das Zeitsignal mit etlichen Nullen vor
und hinter dem eigentlich Signal versiehst (Zero-Padding). "Etlich"
bedeutet beispielsweise, daß Du einen Zeitbereich von 20-100
Periodendauern mit Nullen ausfüllst.
Wenn Du danach die FFT durchführst, wirst Du erkennen, daß die
Frequenzauflösung deutlich genauer ist und Du die Frequenzen von 1 und 2
Hz voneinander unterscheiden kannst.
Wenn Du Vorwissen über die Frequenzen hast hilft es auch, die
Signallänge auf ein Vielfaches der Periodendauer zu beschränken. Ggf.
hilfreich ist auch eine Fensterung des eigentlichen Signals (Stichwort
für die Suche "Fensterfunktion"), bzw. eine mehrfache Wiederholung des
Signals mit Spiegelung an den Signalrändern (verhindert Signalsprünge an
den Signalrändern, d. h. die erste Ableitung des Signals am Rand ist
gleich Null).
Gruß,
Michael
Michael Lenz schrieb:> Wenn Du Vorwissen über die Frequenzen hast hilft es auch, die> Signallänge auf ein Vielfaches der Periodendauer zu beschränken. Ggf.> hilfreich ist auch eine Fensterung des eigentlichen Signals (Stichwort> für die Suche "Fensterfunktion"), bzw. eine mehrfache Wiederholung des> Signals mit Spiegelung an den Signalrändern (verhindert Signalsprünge an> den Signalrändern, d. h. die erste Ableitung des Signals am Rand ist> gleich Null).
Mit Interessieren dein letzter Absatz. Das könnte mir auch sehr
hilfreich sein. Könntest du das noch ein bisschen näher erläuter, das
wäre wirklich super. In meinem Projekt setzte ich nämlich nur eine
Fensterfunktion ein, aber die Frequenz kann ich auch durch vorherigen
Berechnngen ungefähr abschätzen.
Hallo Kai,
> Michael Lenz schrieb:>> Wenn Du Vorwissen über die Frequenzen hast hilft es auch, die>> Signallänge auf ein Vielfaches der Periodendauer zu beschränken. Ggf.>> hilfreich ist auch eine Fensterung des eigentlichen Signals (Stichwort>> für die Suche "Fensterfunktion"), bzw. eine mehrfache Wiederholung des>> Signals mit Spiegelung an den Signalrändern (verhindert Signalsprünge an>> den Signalrändern, d. h. die erste Ableitung des Signals am Rand ist>> gleich Null).>> Mit Interessieren dein letzter Absatz. Das könnte mir auch sehr> hilfreich sein. Könntest du das noch ein bisschen näher erläuter, das> wäre wirklich super. In meinem Projekt setzte ich nämlich nur eine> Fensterfunktion ein, aber die Frequenz kann ich auch durch vorherigen> Berechnngen ungefähr abschätzen.
Was Du verhindern möchtest sind hochfrequente Anteile an den
Signalrändern des Signals s.
Wenn der Rand glatt sein soll, so mußt Du dafür sorgen, daß daß die
Ableitung s'=ds/dt sowie alle höheren Ableitungen s'', s''', s'''' ...
existieren und stetig sind.
Dummerweise ist bei einer einfachen Fensterung schon das Ursprungssignal
unstetig. Indem Du das Signal spiegelst und das gespiegelte Signal
periodisch fortsetzt, erreichst Du, daß zumindest keine Signalsprünge
vorkommen.
Signal:
12345
gespiegeltes Signal:
1234554321
gespiegeltes Signal periodisch fortgesetzt:
123455432112345543211234554321...
Gruß,
Michael