Verfasst am: 22.02.2013, 20:24
Titel: FFT - Amplitude, Hann
Hallo!
Ich muss mich gleich entschudligen, weil ich mit einem solchen Thema starte.
Der Grund ist folgender: Ich hab viel gelesen zum Thema und glaube kenn mich stellenweise ganz gut aus, es fehlt aber der Überblick und das numerische "Gefühl" - was passiert wenn etc.
Bin neu in Octave/Matlab (benutze ersteres, was aber wurscht sein sollte).
Also die Frage: Wie/warum beeinflussen Datenpunkte die Amp einer FFT?
Genauer:
Ich habe eine FFT von einer großen Menge Daten vor und muss dazu kleine Stücke aus Messungen wählen, fenstern und FFT'n. Funkt alles soweit wirklich brilliant - außer der Amp!
Bei nem Signal y * cos (x * 2pi * t) komm ich schön auf meine y und die Frequenzen passen perfekt. Das Ding ist, wenn ich meinen eigentlichen Datensatz nehm ist die Amplitude VIEL zu gering - so im Bereich Faktor 30 bis min 2,3. Durch Test bin ich drauf gekommen, dass wenn ich die Daten feiner Interpoliere bekomm ich noch kleinere Amplituden -> Die Abhängigkeit ist 1/Npts. Dieses 1/nfft gehört doch da rein, oder? Aber die Amplitude dürfte doch keine Abhängigkeit zeigen!?
Und zum Zero Padding - wie ich das gemacht habe passt doch, oder? Ich denke das vergurkt nur alles, eben wegen der Abhängigkeit von der Zahl der Punkte. also das wär dann nexpow term & fft(signal, nfft);
Um jede Hilfe/Hinweis dankbar.
Entschuldigt das übersättigte Thema, aber man findet so viel schlechte/falsche/unübersichtliche Infos dazu...
if(max(dt)-min(dt) > 0.01*mean(dt))% print residual check if grater than 1% of mean error("Sampling Frequency not constant!");
else
dt = mean(dt);
endif
fs = 1/dt; %sampling frequncy
%nfft= 2^(nextpow2(length(signal))); % Use next highest power of 2 greater than or equal to length(x)
nfft = length(signal);
signal_fft = fft(signal)/nfft;
freq_vect = fs/2*linspace(0,1,floor(nfft/2+1)); % Number of unique Pts = floor(nfft/2 +1)
amp = signal_fft (:,1:floor(nfft/2+1)); %cut imaginary part of the conjugate complex fourier coefficients
amp = 2*abs(amp); %scale all coefficients so only one sumis sufficient
amp(:,1)=0.5*amp(:,1); %scale down c_0 to correct value (constant value)
I now know, that you have to divide by length(signal) and not the transformation length. This reduces the problem to: why does the amp is so fine for testing and on my data its miserable:
This should plot the signal through the coefficients taken from the FFT and is just there for looking, wether or not the amplitude of the signal is represented corretly within my code. Obviously it is, because for any test signal i get very accurate interpolations.
With my data though it's horrible!
I've attached a sample - it has to be divided by its mean.
second col = time in ms (divide by 1000 for s)
first col = velocity in m/s
Data must be interpolated due to uneven spacing! I use pchip.
So I get 11339 Points, which should be enough, right?
The picture attached is the interpolation with the coeffitients of the FFT. Over the Input (including Hann Window).
The solution to this unique thing was: I was cutting the files into pieces, where in between was just 0. I failed to take these massive amounts of zeroes into account.
As I mentioned before, you need to divide by the length of the signal - not the transformed length (zero padding of any sort doesn't count).
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
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.