WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

FFT Real und Imaginärteil vertauscht

 

Protestallianz
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 21.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2014, 08:36     Titel: FFT Real und Imaginärteil vertauscht
  Antworten mit Zitat      
Hallo,
ich beschäftige mich zwecks Signalauswertung mit der FFT, benötige dabei aber nicht nur das Amplitudenspektrum sondern auch die Anteile: Also Real- und Imaginär Anteil.
Code:
% Sampling frequency
Fs = 1024;
% Time vector
t = 0:1/Fs:10;
N=length(t);

%Signal
y=sin(1*2*pi*t);
% FFT mit Skalierung
Y=2*fft(y)/N;

% Frequenzvektor
  f = Fs/2*linspace(0,1,N/2+1);


Das ganze liefert mir dan dem Y Eintrag zu meiner Frequenz 1 Hz:
0.0031-0.9999i

Dabei müsste es doch aber eigentlich:
1+0i sein.

Ich verstehe, dass man nicht genau auf 0 kommt aber warum ist der Realanteil
und der Imaginäranteil vertauscht?
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.09.2014, 09:34     Titel:
  Antworten mit Zitat      
Wie entnimmst du denn die Werte in Y zu 1Hz? Die FFT funktion liefert ja ein zweiseitiges Spektrum.

Man sollte auch möglichst für N = 2^x wählen, damit wirklich der FFT und nicht der langsame DFT Algorithmus verwendet wird.

Code:

N=2^nextpow2(length(t)); % bei deinem Bsp N = 16384

% FFT mit Skalierung
% Da length(y) < N werden automatisch von der FFT die fehlenden Werte als Nullen ans Ende von y gehängt um auf N Werte zu kommen
Y=2*fft(y,N)/N;
 


0 Hz liegt dann beim Index Y(8193).

Code:
Y(0:8192) = ... % entspricht -Fs/2 Hz...-df Hz, wobei df = fa/N  = Frequenzauflösung mit fa = Fs/2
Y(8193:16384) = ... % 0Hz...+Fs/2 Hz
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Protestallianz
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 21.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2014, 10:42     Titel:
  Antworten mit Zitat      
Ja das mit dem N=x² wusste ich aber bisher ginge doch recht flott und ich dachte, ich bau keine zusätzliche Fehlerquelle ein (wegen fehlendem Verständnis). Aber deinen Ansatz werde ich so mal übernehmen.

Ja ich hab mir den Frequenzvektor angeschaut. Und dann recht am Anfang Index 5 oder 11 war dann schon die Frequenz 1 Hz (steht ja im meinem Anregungssigna 1*2*pi....).
Aus dem Grund, dass es double Sided ist, nehme ich nachher beim Polten die Daten:
Code:
Y(1:N/2+1)


Aber wenn ich mir die restlichen Einträge von MEINEM Vektor anschaue, finde ich keine weiteren reellen Einträge. Also ich bin mir sicher, deine Variante funktioniert, aber um das ganze etwas besser zu verstehen, würde ich gerne in Erfahrung bringen warum es bei mir vertauscht ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.09.2014, 11:17     Titel:
  Antworten mit Zitat      
Sorry...habe hier einen Fehler gemacht. Es ist natürlich umgekehrt.

Code:

Y(0:8192) = ... % entspricht 0Hz ... +Fs/2 Hz
Y(8193:16384) = ... % -df Hz ... -Fs/2 Hz
 


Aber der Fehler liegt vermutlich woanders. Du bekommst in dein Bsp. nämlich nicht die Werte zu deinem erstellten Frequenzvektor. Tatsächlich liefert dir die FFT nicht exakt bei 1Hz einen Wert, sondern bei

Code:

df = Fs/N; % = 0.099990235328581

format long
df*10

ans =

   0.999902353285812 % Hz
 


Daher dann auch die Abweichung von deinem erwarteten Ergebnis. Da deine Frequenzauflösung df kein ganzes Vielfaches deiner Signalfrequenz von 1Hz ist, entsteht der Leakage Effekt. Somit ist Y(11) eben nicht der Real- und Imaginärteil zu 1Hz.

So sieht dein Frequenzvektor tatsächlich zu deinem Signal y aus.

Code:

fn = Fs/2;
df = Fs/N;
% Frequenzvektor: Darstellung bis Nyquistfreq.
fv = 0: df : fn;
 


Ich empfehle dir mal folgendes Skript zur FFT: http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html

Wenn du außerdem nach Amplitudenspektrum hier im Forum suchst, wirst du weitere FFT Funktionen als Skript finden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Protestallianz
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 21.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2014, 11:37     Titel:
  Antworten mit Zitat      
Danke für den Hinweis mit dem Vielfachen, und die ganzen anderen netten Hinweise du hast zu meinem Verständnis der FFT sehr beigetragen. Ja das umfassende Beispiel kenn ich schon.


Okay das Leckage erklärt die Abweichung. Aber nicht warum es vertauscht ist?
Warum ist der Wert 0-1i und nicht 1+0i?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.09.2014, 11:52     Titel:
  Antworten mit Zitat      
Das kommt auf Grund der Darstellung einer komplexen Zahl.

z = a + i * b = r * (cos(alpha) + i * sin(alpha)).

Da dein Signal ein reiner Sinus ohne Phasenverschiebung ist, ist logischerweise der cos(alpha) = 0. Die DFT/FFT gibt ja auch nichts anderes wieder als die Darstellung von z für alle Winkel von fv = 0: df : fn.
Für den Betrag = Amplitude deines Sinus macht es ja dann keinen Unterschied ob

Code:

>> abs(0+1i)

ans =

     1

>> abs(1+0i)

ans =

     1
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Protestallianz
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 21.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2014, 12:28     Titel:
  Antworten mit Zitat      
Nein ich brauche nicht nur die Amplitude, viel interessanter ist für mich die Aufteilung. In meinem Fall welcher Anteil dämpfend ist (Imaginär) und so weiter.

Naja ich habe keine Phase also alpha=0 für den Fall der Zeigedarstellung.
Ich hab also cos(0)=1 und sin(0)=0. Der reine Sinus müsste auf der Reellen Achse liegen (x-Achse) und keinen Imaginäranteil haben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.