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 - Amplituden nicht korrekt

 

Sigggi
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 27.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2011, 11:08     Titel: FFT - Amplituden nicht korrekt
  Antworten mit Zitat      
Hallo, liebe Gemeinde,

ich erzeuge mit folgender Funktion ein Spektrum aus einem Zeitsignal:

Code:
%
function y = spektrum(x,fs)

if nargin==1, fs = 8192; end

n = length(x);

% Hanning - Fenster immer über gesamten Signalausschnitt
w = hann(length(x));
for i = 1:length(x);
    x(i) = x(i)*w(i);
end

%% FFT
c = fft(x)/n;
amp = 2*abs(real(c));
amp(1) = amp(1)/2;
m = floor(n/2);
y(1,:) = linspace(0,(m-1)*fs/n,m);
y(2,:) = amp(1:m);

 


Getestet an einem Referenzsignal, das ich parallel mit DASYlab auswerte sind die Amplituden zu klein.

Ein in Matlab generiertes Sinussignal mit der Ampitude 1 liefert ein Spektrum kleiner 1. Woran könnte das liegen?

Vielen Dank, Sigggi.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2011, 20:07     Titel:
  Antworten mit Zitat      
Rechne mal nicht dein Spektrum komplett durch n, sondern nur durch sqrt(n).

Dann müsstes funzen.

Mfg Ich
Private Nachricht senden Benutzer-Profile anzeigen
 
Sigggi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 27.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2011, 14:27     Titel:
  Antworten mit Zitat      
Hallo Ich,

danke für die schnelle Anwort. Mit

Code:

nfft = 2^nextpow2(length(xt));
z = 2*abs(fft(xt,nfft));
 


kommen nun plausible Amplituden. Die Funktion sieht nun insgesamt so aus:

Code:

%% Funktion FDFT - Fast Discrete Fourier Transformation
%
% Diskrete Fouriertransformation für Zeitsignale mit bekannter
% Abtastfrequenz
%
% Erstellt am 25.01.2011
%
% korrigiert am 16.02.2011, Höhe der Amplituden an generiertem Sinussignal
% getestet und plausibel befunden
%
% Aufruf: y = FDFT(fs,xt,lf,hf)
%
%           wobei   y(1,:)... Frequenzvektor
%                   y(2,:)... Spektrum
%                   fs    ... Abtastrate
%                   xt    ... Zeitsignal
%                   lf    ... untere Grenzfrequenz
%                   hf    ... obere Grenzfrequenz

function[xfft] = FDFT(fs,xt,lf,hf)

%% Hanning-Fenster
w = hann(length(xt));
for i = 1:length(xt);
    xt(i) = xt(i)*w(i);
end

%% Schnelle Fourier-Transformation
nfft = 2^nextpow2(length(xt));       % Wichtig für den Algorithmus
z = 2*abs(fft(xt,nfft));               % Schnelle diskrete Fouriertransformation, Realanteil

NumUniquePts = ceil((nfft+1)/2);     % Anzahl der gleichen Punkte
z = z(1:NumUniquePts);               % symmetrische FFT, deshalb Hälfte wegschmeißen

z = z/length(xt);                    % Skalieren, damit es keine Funktion von lenght(xt) ist

% Weil die Hälfte aus der FFT weggelassen wird, muss der Energieinhalt
% berücksichtigt werden. Wir multiplizieren mit 2.

if rem(nfft, 2)                     % ungerade nfft schließt den Mittelpunkt (Nyquist-point) aus
  z(2:end) = z(2:end)*2;
else
  z(2:end -1) = z(2:end -1)*2;
end

%% Überprüfen,ob untere und obere Grenzfrequenz übergeben wurde

if exist('lf') == 0;
    lf = 0;
end
if exist('hf') == 0;
    hf = (NumUniquePts-1)*fs/nfft;
end

%% Frequenzband herausschneiden
if (NumUniquePts-1)*fs/nfft  > hf*nfft/fs
    lf = round(lf*nfft/fs);
    hf = round(hf*nfft/fs);
else
    lf = 0;
    hf = NumUniquePts-1;
end

%% Werte übergeben
xfft(1,:) = (lf:hf)*fs/nfft;          % Frequenzvektor
xfft(2,:) = z(lf+1:hf+1);              % Pegelvektor

 



Viele Grüße, Sigggi.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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.