FFT - Amplituden nicht korrekt
Sigggi
Forum-Anfänger
Beiträge: 46
Anmeldedatum: 27.01.11
Wohnort: ---
Version: ---
Verfasst am : 10.02.2011, 10:08
Titel : FFT - Amplituden nicht korrekt
Hallo, liebe Gemeinde,
ich erzeuge mit folgender Funktion ein Spektrum aus einem Zeitsignal:
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.
Scriptor
Forum-Century
Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
Verfasst am : 10.02.2011, 19:07
Titel :
Rechne mal nicht dein Spektrum komplett durch n, sondern nur durch sqrt(n).
Dann müsstes funzen.
Mfg Ich
Sigggi
Themenstarter
Forum-Anfänger
Beiträge: 46
Anmeldedatum: 27.01.11
Wohnort: ---
Version: ---
Verfasst am : 16.02.2011, 13:27
Titel :
Hallo Ich,
danke für die schnelle Anwort. Mit
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.
Einstellungen und Berechtigungen
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
| 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.