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 in Matlab

 

Donpulio
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 07.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2010, 13:23     Titel: fft in Matlab
  Antworten mit Zitat      
Hallo!

Wie speichert Matlab genau eine fft ab?
Wenn ich ein Signal der Länge N abgespeichert habe, ergibt die fft dieses Signals ebenso einen 1xN Vektor.
Nun möchte ich das Signal in der Phase "verschieben".
Eigentlich dachte ich könnte ich das, indem ich zu jedem Wert im fft Vektor eine Phasenverschiebung mit der komplexen e-Funktion, hinzumultipliziere:
Code:

phase = pi/4;     %hier Phasenverschiebung angeben
fft_signal = fft(signal);
fft_verschoben = fft_signal .* exp(-i*phase);
signal_verschoben = ifft(fft_verschoben);      
 

Aber das geht so nicht.
Im FFT Vektor sind doch komplexe Werte, also Betrag und Phase gespeichert ?
Danke für Eure Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen


Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 29.06.2010, 08:35     Titel:
  Antworten mit Zitat      
Hallo,

die Formel des verschiebungssatzes lautet:
Code:

x(t-t0)------>X(f)*exp(-i*2*pi*f*t0)
 


dh du musst schon deine Frequenzen definieren usw.
hier ist ein Beispiel, es ist von der Matlabhilfe, habe ich dann bisschen erweitert dass man die verschiebung sieht.das alles kannst du auf deine aufgabe anpassen.
Code:

Fs = 1000;                    
T = 1/Fs;                    
L = 100;                    
t = (0:L-1)*T;                

y = sin(2*pi*80*t);
plot(Fs*t,y)
title('Original')
NFFT = 2^nextpow2(L);
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

figure(2)
plot(f,2*abs(Y(1:NFFT/2+1)))

Y=Y(1:NFFT/2+1).*exp(-1i*2*pi*f*20*T);
x=ifft(Y,NFFT)*L;
figure(3)
plot(Fs*t(1:100),x(1:100))
title('Verschoben um 20 SAMPLES');
 


gruss
_________________

Ein schlechter General ist besser als zwei gute.
Private Nachricht senden Benutzer-Profile anzeigen
 
Donpulio
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 07.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2010, 14:09     Titel:
  Antworten mit Zitat      
Vielen Dank erstmal für die gute Antwort!

Aber wenn ich es mit einem anderen Testsignal (hier ein Auszug aus einem Stromsignal: Fs=10000 Hz, Länge 200 Samples) probiere ergibt sich ein "Offset" beim phasengeänderten Signal (siehe Fig 3).
Hier ist mein abgeänderter Code und im Anhang die files dazu.

Code:

Fs = 10000;                    
T = 1/Fs;                    
L = length(Strom);                    
           

y = Strom;

plot(Zeit,y)
title('Original')
xlabel('time / s')
NFFT = L;
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

figure(2)
plot(f,2*abs(Y(1:NFFT/2+1)),'*')
xlabel('f / Hz ')

Y=Y(1:NFFT/2+1).*exp(-1i*2*pi*f*20*T);
x=ifft(Y,NFFT)*L;
figure(3)
plot(Zeit,x)
xlabel('time / s')
title('Verschoben um 20 SAMPLES');
 

Wie kommt es dazu ?

Stromsignal.zip
 Beschreibung:

Download
 Dateiname:  Stromsignal.zip
 Dateigröße:  3.31 KB
 Heruntergeladen:  532 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 30.06.2010, 09:27     Titel:
  Antworten mit Zitat      
Hallo,

es könnte daran liegen dass nach dieser zeile:
Code:

Y=Y(1:NFFT/2+1).*exp(-1i*2*pi*f*20*T)
 


Y nur noch die länge 100 hat. und dann rechnest du ifft der länge 200:
Code:

x=ifft(Y,NFFT)*L;
 


damit wird Y mit Nullen erweitert und es könnte zu verfälschungen führen.

ich hab jetzt den Code bisschen geändert, der offset ist weg, aber man sieht eine kleine verfälschung im verschobenen Signal.
es könnte auch daran liegen dass:
Code:

abs(exp(-1i*2*pi*f*20*T))


nicht immer genau 1 ist. kannst du mit format long e anschauen.

Code:

Fs = 10000;                    
T = 1/Fs;                    
L = length(Strom);                    
           

y = Strom;

plot(Zeit,y)
title('Original')
xlabel('time / s')
NFFT = L;
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT);

figure(2)
plot(f,2*abs(Y(1:NFFT)),'*')
xlabel('f / Hz ')

Y=Y(1:NFFT).*exp(-1i*2*pi*f*20*T);
x=ifft(Y,NFFT)*L;
figure(3)
plot(Zeit,x)
xlabel('time / s')
title('Verschoben um 20 SAMPLES');
 


bin mir aber nicht so sicher dass es wirklich daran liegt.

gruss
_________________

Ein schlechter General ist besser als zwei gute.
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 - 2024 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.