Forum: Digitale Signalverarbeitung / DSP / Machine Learning Frage FFT - Phase


von Dan M. (luizaranha)


Lesenswert?

Hallo zusammen,

Hätte da mal ne Frage bezüglich der FFT.

Ich habe ein Spannungssignal absolut nicht sinusförmig.
Jetzt möchte ich die Phasenverschiebung der Grundschwingung 
herausfinden. Daher hab ich das Signal einer FFT unterworfen. Habe dann 
die Phase der FFT im Frequenzbereich geplotet ( Matlab, stem) und mir 
dann den Peak bei der Grundschwingungsfrequenz herausgesucht.

Im Moment teste ich ein reines SInussignal: sin(a*t+phi). Aber phi läßt 
sich im Plot Phase über Frequenz nicht rausfiltern.

Hab ich da nen Denkfehler oder geht das anderst?

Gruß

von Tom (Gast)


Lesenswert?

Eigentlich müsste das schon gehen, denn der Ausgang der FFT liefert doch 
die Phase indirekt über Re/Im.

Dann suchst du schwerpunktmässig Deine Frequenz und seine beiden 
Nachbarn z.B., dann mittelst die 3 Werte rund um das Maximum.

Poste man den Graphen.

von Dan M. (luizaranha)


Angehängte Dateien:

Lesenswert?

Hi, ALso hier der Plot.

Wie man im Zeitsignal sieht, stimmt die Phase so ziemlich genau. Du 
meinst also, man sollte noch mitteln?

Weitere Geschichte: Die Amplitude sollte doch eig. positiv wie negativ 
0.5 sein?

achso, zum Bild noch: obiges ist das Zeitsignal, die unteren zwei plots 
sind x-achse frequenz. Den cursor hab ich dann an 50 Hz gelegt, wo die 
Phase dann auftaucht.

von Inder Preter (Gast)


Lesenswert?

Ein Zoom könnte nicht schaden - wie sieht das Signal inder Umgebung des 
50Hz - Punkte aus?

Phasensprung?

von Dan M. (luizaranha)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

also hier die gezoomte Version. Mit folgendem matlab Code sind dann auch 
die Randbedingungen klar. (fft mit zero padding)
1
Fs=3000;% Definition of the sampling frequency
2
T=1/Fs; % distance in time domain between each sample
3
t=(0:400)*T; %defining a vector with distance T in time domain
4
subplot(3,1,1)
5
a=230*cos(2*pi*90*t-pi/3)%+230*cos(3*2*pi*90*t+pi/6);
6
plot(t,a)
7
X=fftshift(fft(a,(20000)));  
8
Omega=(-(10000):(9999))*pi/(9999);    %% DT Frequency... -pi to pi %pi/512 hat bei 512 pi erreicht und darunter einen prozentualen Anteil
9
subplot(3,1,2)
10
h=plot((Fs/2)*(Omega/pi),abs(X)/400);   %normiert auf pi
11
grid on;
12
subplot(3,1,3)
13
h=plot((Fs/2)*(Omega/pi),atan2(imag(X),real(X))*180/pi);   %normiert auf pi
14
grid on;

Das hier wäre ja ein Beispielsignal. In echt habe ich ein absolut 
unsinusförmiges signal und bisher nur eine Periode... Kann man daraus 
auch schon die Phase der Grundschwingung bestimmmen?? das kann ich mir 
irgendwie nicht so recht vorstellen...
Es kommt ja auch darauf an, das Zeitfenster entsprechend der 
Grundfrequenz zu wählen. Die ist bei mir bekannt (90 Hz).
Kann man also bei der Betrachtung des Signals, bei dem nur 1x die 
Grundschwingung auftaucht, hier auch die Phase bestimmen?

Gruß

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

was meinst du unter "Phase bestimmen"?
Das was dir die FFT auswirft, ist die Phasenlage der Spektralanteile im 
Fenster( salopp: der Eintrittswinkél des Signals ins Fenster)! Und die 
ändert sich ständig, falls du nicht synchronisiert misst.Du kannst nur 
die Phasenlage in Bezug auf ein 2. synchron abgetastetes Signal angeben, 
indem du die Differenz der Phasen auswertest.

Grüsse

von Dan M. (luizaranha)


Lesenswert?

Hi Gebhard,

Also bei Zeitfenster T:
Ich habe ein Spannungs und ein Stromsignal.

Wenn ich die Phase der Grundschwingung von beiden auswerte und sie dann 
voneinander abziehe, bekomm ich doch die phasenverschiebung zwischen 
Strom und SPannung der  Grundschwingung

von Frank W. (Gast)


Lesenswert?

Gebhard Raich schrieb:
> Das was dir die FFT auswirft, ist die Phasenlage der Spektralanteile im
> Fenster( salopp: der Eintrittswinkél des Signals ins Fenster)! Und die
> ändert sich ständig, falls du nicht synchronisiert misst.

Ja klar, aber jedesmal gibt es einen Bezugspunkt, nämlich den Start des 
Samplens und bezogen auf den lässt sich die Pahsenverschiebeung 
bestimmen und da kommt auch immer dasselbe raus, abgesehen von 
Schwankungen die durch das Fenstern verursacht werden.

Ich würde einen Mittelwert um den Punkt suchen. Abgesehen von den 
Zacken, scheint mir da eine leichte Steigung drinzustecken, mit 
Mittelwert von 30 Grad rund um die gesuchte Frequenz.

Kommt das hin?
Wie speist Du ein?

Man kann im Übrigen mehrere FFTs überlagen und sich dann den Mittelwert 
der Phasen geben lassen.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

@Dan
>Wenn ich die Phase der Grundschwingung von beiden auswerte und sie dann
>voneinander abziehe, bekomm ich doch die phasenverschiebung zwischen
>Strom und SPannung der  Grundschwingung

Das ist richtig! Du musst aber auch wirklich zeitgleich deine 2 Signale 
sampeln, sonst hast du einen (nachträglich korrigierbaren) Fehler. 
Weiters wärs gut, wenn du das FFT-Fenster so gestaltest(über 
Abtastrate), dass es genau ein ganzes Vielfaches der Grundschwingung 
erfasst.

Grüsse Gebhard

von Tippgeber (Gast)


Lesenswert?

Man sollte am Besten gleich die Abtastrate so getalten, dass die 
gesuchte Frequenz ganzzahlig in die FFT passt.

von russenbaer (Gast)


Lesenswert?

Frank W. schrieb:
> Man kann im Übrigen mehrere FFTs überlagen und sich dann den Mittelwert
> der Phasen geben lassen.

Das gibt dann, je nach "Überlagerung", eine Art Leistungsdichtespektrum. 
LDS haben keinerlei Phaseninformation. Was da rechnerisch rauskommt ist 
nur Mist.

Die Phase, wie von einigen Autoren oben erwähnt, ist die Information wie 
das Sinussignal zu einem Bezugspunkt (Nullpunkt) verschoben ist.

Als erstes würde ich die Phase "unwrappen". Das bedeutet das keine 
Unstetigkeitsstellen, wie in deinem Plot zu sehen sind, auftreten. Ich 
glaube es gibt in MATLAB sogar solch eine Funktion die das für Dich 
automatisch macht.

Wenn Du die exakte Grundfrequenz kennst (bzw. weisst was Du erwartest) 
kannst Du Dir ausrechnen auf welchem bin, bzw. wo genau zwischen zwei 
bins, eigentlich Deine Frequenz liegt. Wenn Deine Frequenz zwischen zwei 
bins liegt kannst Du entweder (natürlich gibts da auch einen Fehler) die 
Werte des nähesten bins verwenden oder zwischen den bins interpolieren 
(linear, Lagrange) um an Phasenwerte zu gelangen.

Beide Messungen (Strom, Spg) müssen absolut synchron gesampelt sein, 
sonst hast Du auf jeden Fall einen Phasenfehler zwischen den Messungen.
Um diesen zusätzlich zu minimieren, mache mehrere Messungen.
Diese Messungen kannst Du dann mitteln und statistisch Auswerten.

Die verwendete Fensterfunktion sollte egal sein, sollange das gleiche 
Fenster auf beide Signale angewandt wird. Bitte schlag mich aber nicht 
wenns nicht so ist, aber es ist grad ein bisserl spät und ich bin müde 
;)

Der Tipp von Tippgeber ist nicht schlecht, wenn man sich alles aussuchen 
kann. Zu beachten ist natürlich das es die Kombination von fs und der 
FFT Größe ausmacht. (Wenns funktioniert brauchst Du nicht interpolieren)

lg
Russenbaer

von Dan M. (luizaranha)


Lesenswert?

Hi zusammen, vielen Dank für die nützlichen Antworten.

Also generell sieht es so aus, dass ich mit einem Simulationsprogramm 
arbeite, dass bei der FFT nur die Beträge betrachtet.

D.h. Ich speicher meine Simulationswerte in einem textfile und 
importiere sie in Matlab.

Das Zeitfenster X kann ich ja jetzt auf 1,2,3 ganze Perioden legen, Für 
den Strom gilt ja das selbe, er tritt eben phasenverschoben mit der 
gleichen Anzahl der Grundschwingungen auf...

Die Abtastwerte kann ich ja im Endeffekt durch die Auflösung meines 
Solvers auch selber bestimmen. Die fft berechnet ja für jeden Abtastwert 
in der Zeit einen Frequenzwert mit Phase und Amplitude.
Wenn man hier, wie von tippgeber erwähnt, dass ganzzahlige Vielfache 
erwischt hat man die genaue information von Phase und amplitude?

Gruß

ps.: Es handelt sich um die elektrische Frequenz eines Generators, der 
in einen 3ph passiven Gleichrichter speist.
Somit weiß ich ja die Frequenz der Grundschwingung..

psps.: Die phase hab ich mal unwrapped, find ich aber nicht so toll, da 
ich ja jetzt die Phaseninformation erst noch berechnen muss. Ohne unwrap 
hab ich sie gleich dastehen, ....

von Dan M. (luizaranha)


Angehängte Dateien:

Lesenswert?

Hier die unwrapped geschichte...

von Marc O. (Gast)


Lesenswert?

Was ist denn "unwrapped"?

von russenbaer (Gast)


Lesenswert?

Hallo wieder,

Der Frequenzabstand Deiner FFT bins ergibt sich aus:
fs/NFFT

wobei fs die Abtastrate und NFFT die Größe Deiner FFT ist (Anzahl der 
Punkte)

z.B. hast Du mit fs = 1024Hz und NFFT=512 einen bin-Abstand von 1024/512 
= 2Hz/bin.

Das heisst Deine bins liegen in diesem Beispiel auf:

DC=0Hz, 2Hz, 4Hz, 6Hz, 8Hz, ...., 512Hz
(wobei das nur die ersten 257 bins sind, der Rest trägt dieselbe Info 
bei einem reelwertigen Eingangssignal)

(fs = 1024 Hz habe ich hier gewählt da es sich besser Rechnen lässt :) )

Damit Du genau einen bin auf 90 Hz bekommst musst Du dann die 
Samplingrate und die FFT Größe geschickt wählen.
Vergiss nicht das die höchste Frequenz die Du darstellen kannst fs/2 
ist.
Falls Du Frequenzen über fs/2 hast und die nicht ausgefiltert sind 
bekommst Du Aliasing (= grob gesagt Fehler)!

Da man sich bei Messungen meist nicht alles aussuchen kann und die 
gesuchte Frequenz meist zwischen zwei bins liegt, dachte ich das Du 
interpolieren musst. Dafür ist ein unwrapping der Phase gut, da Du dann 
die Unstetigkeitsstellen los wirst (bei denen nicht gut interpoliert 
werden kann).
Um auf die gewrappte Phase zu kommen mußt Du ja eh nur vielfache von 2Pi 
solange abziehen bis Du im Zielbereich bist (Zielbereich siehe weiter 
unten Antwort auf Marc O.)

@Marc O:
unwrappen bedeutet das die Phase fortlaufend dargestellt wird und nicht 
nur im Bereich 0-2Pi (0-360 Grad) bzw. -pi/2 bis pi/2 (-180 bis 180 
Grad).

Ich nehme an das Du ein Rechteckfenster verwendest. Denke darüber nach 
ob nicht andere Fenster geeigneter wären, z.B. ein von Hann-Fenster.
Fensterung bedeutet das eine Fensterfunktion mit dem Zeitsignal 
multipliziert wird (bei Dir jetzt wahrscheinlich nichts = Rechteck). 
Diese Multiplikation ist eine Faltung im Frequenzbereich. Das kannst Du 
Dir als eine Art Verschmierung vorstellen, wobei verschiedene Fenster 
verschiedene Eigenschaften haben (es gibt bessere Fenster zum 
Frequenzmessen und bessere zum Amplitudenmessen bzw. darstellen).
Wikipedia ist bei den Fensterfunktionen nicht so schlecht wenn ich mich 
recht erinnere.


hoffe das hilft Dir,
lg
Russenbaer

von Detlef _. (detlef_a)


Lesenswert?

Hi,

Frequenz, Amplitude und Phase eines unbekannten Sinus kann man ohne FFT 
berechnen. Ich habe den Matlab Code für das oben gepostete Beispiel mal 
angehängt. Man ist bei der Frequenz nicht auf die Auflösung der FFT 
angewiesen. Hatte ich schon öfter dargelegt, unter anderem hier:

Beitrag "Frequenzlinie ausfiltern und deren Amplitude auswerten"

Cheers
Detlef

Fs=3000;% Definition of the sampling frequency
T=1/Fs; % distance in time domain between each sample
t=(0:400)*T; %defining a vector with distance T in time domain
subplot(3,1,1)
a=230*cos(2*pi*90*t-pi/3)%+230*cos(3*2*pi*90*t+pi/6);
plot(t,a)
X=fftshift(fft(a,(20000)));
Omega=(-(10000):(9999))*pi/(9999);    %% DT Frequency... -pi to pi 
%pi/512 hat bei 512 pi erreicht und darunter einen prozentualen Anteil
subplot(3,1,2)
h=plot((Fs/2)*(Omega/pi),abs(X)/400);   %normiert auf pi
grid on;
subplot(3,1,3)
h=plot((Fs/2)*(Omega/pi),atan2(imag(X),real(X))*180/pi);   %normiert auf 
pi
grid on;

n=length(a);
sig=a;
s1=sig(1:n-2)+sig(3:n);
% Das ist der zwischenliegende wert
s2=sig(2:n-1);

%Jetzt mit linearer Regression den Faktor bestimmen
% Regression s1 auf s2
M= [s2.' ones(length(s1),1)];
coff=inv(M'*M)*M'*s1.';

%Den Faktor in die Frequenz umrechnen
wn=acos(coff(1)/2);

% Dieser rotierende Zeiger hat Amplitude und Phase
% darauf nochmal lineare regression anwenden
M=[cos((0:n-1)*wn).' sin((0:n-1)*wn).'];
coff=inv(M'*M)*M'*sig.';

%fertig
cc=coff(2)+j*coff(1);
amp=abs(cc);
ph=angle(cc);

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.