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ß
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.
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.
Ein Zoom könnte nicht schaden - wie sieht das Signal inder Umgebung des 50Hz - Punkte aus? Phasensprung?
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ß
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
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
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.
@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
Man sollte am Besten gleich die Abtastrate so getalten, dass die gesuchte Frequenz ganzzahlig in die FFT passt.
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
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, ....
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.