Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT und Hilbert für Phasenberechnung


von BZoefel (Gast)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von BZoefel (Gast)


Lesenswert?

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

von Michael L. (Gast)


Lesenswert?

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

von BZoefel (Gast)


Lesenswert?

Super Tipps!
Danke dir vielmals, ich werds gleich ausprobieren...

von BZoefel (Gast)


Lesenswert?

Hat funktioniert, wow! :)

von Kai Z. (liquidsteel)


Lesenswert?

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.

von Michael L. (Gast)


Lesenswert?

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

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.