Die Anzahl für nfft = 4096 waren nur ein Bsp. Wie gesagt hängt die tatsächliche Anzahl an Messwerten innerhalb von 20 sek von der Abtastrate ab. Die kenne ich ja nicht
Ich habe hier noch vergessen...das Fenster darf natürlich nur die Länge von nfft haben.
Code:
...
win = hamming(nfft);
for i=1:k
% Fensterung mit Hamming window
signal_win = signal(m:nfft+m-1) .* win;
H = fft(signal_win, nfft);
% Betrag bilden und positiven Frequenzbereich speichern
H_pos0(1:(nfft/2)+1,i) = abs(H(1:(nfft/2)+1));
% nächstes Segement
m = m + nfft;
end
Der Betrag ist die Länge des komplex. Zeigers...wenn du die Signalamplituden darstellen willst, benötigt man den Betrag. Die fft() Funktion berechnet eine beidseitges Spektrum von -fa/2...0...+fa/2 [Hz] mit fa = Abtastfrequenz. I.d.R. interessiert aber nur der positive Frequenzbereich, weshalb ich den negativen Bereich einfach nicht mit speicher.
H(1) = Amplitude bei f = 0
H((nfft/2)+1) = Amplitude bei f = + fa/2
Du solltest dir mal die Dokumentation des fft() Befehls anschauen und außerdem mal das umfassende FFT Bsp. hier in der Skript-Ecke. Ich habe den Eindruck, dass dir Grundlagen zur Fouriertransformation fehlen.
Mike1221
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.10.2011, 09:43
Titel:
Guten Morgen DSP,
leider hast Recht, Ich muss die Grundlagen der FFT richtig nachholen
Ich habe eien Abtastrate von 8Hz dh glaube ich 2^8 = 256 Messwerte für 10s
mein code sieht jetzt so aus:
% Bsp.: 10 sek sind 2^8 =256 Messwerte bei 10s
nfft = 256;
% Anzahl der Segmente bestimmen
k = round(N/nfft); % hier muss angepasst werden, was passieren soll, wenn k nicht ganzzahlig ist...was passiert mit den restlichen Werten??? % k Segmente der Länge nfft transformieren % pre-allocate
H = zeros(nfft,1);
Hpos0 = zeros(nfft,k);
m = 1;
win = hamming(nfft);
for i=1:k
% Fensterung mit Hamming window
signal_win = signal(m:nfft+m-1) .* win;
H = fft(signal_win, nfft);
% Betrag bilden und positiven Frequenzbereich speichern
H_pos0(1:(nfft/2)+1,i) = abs(H(1:(nfft/2)+1));
% nächstes Segment
m = m + nfft;
plot(H) end
Ich bekomme aber einen FFT verlauf den nicht klar ist (siehe Anhang).
habe Ich was falsches hier auch gemacht?
Schau dir doch mal bitte dieses Skript an, in Bezug auf die Darstellung, wie du dir den Frequenzvektor erzeugst etc. Das plotten von H macht hier gar keinen Sinn, da dies komplexe Werte sind. Willst du denn wirklich alle Einzelsegmente darstellen...ich dachte du willst ein Gesamtspektrum haben. Dann musst du die Hpos(:,i) irgendwie zu einem zusammenfassen. Z.B. durch Mittelung.
Bist du dir sicher, dass du eine Abtastfrequenz von 8 Hz hast? Kennst du denn das Abtasttheorem? Wenn nicht, unbedingt nachlesen. Mit 8 Hz kannst du maximal Signale mit einer Frequenz von 4 Hz richtig rekonstruieren.
Bsp: fa = 100 Hz
Ta = 1/fa = 0.001 sek = 10 ms
Bei einer Messzeit von 20 sek ergeben sich damit 20*100 Messwerte/sek = 2000.
Mit der Lektüre ist das etwas schwierig...es kommt darauf an, was du wissen möchtest. Für den Einstieg gibt es genügend freie Skripte im Netz...suche dir einfach zum Thema Signalverarbeitung, Fouriertransformtion und Frequenzspektrum Skripte von Hochschulen. Das sollte für den Anfang reichen.
Edit: Ist zwar in Englisch, aber dennoch recht leicht verständlich. Vor allem bekommt man ein Grundverständnis der Signaltheorie ohne zunächst mit zu viel Mathematik erschlagen zu werden. Kapitel 8-12
Error using ==> plot
Vectors must be the same lengths.
also die beiden Vektoren müssen gleiche Länge haben
aber :
>> size(f)
ans =
1 41
und:
>>size(H_pos0(1:k))
ans =
1 60100
meien Frage ist:
H_pos0(1:k) gibt Alle beträge der FFT von 1:k
also die x-Achse ist die Frequenz achse und y-achse die Betrag achse oder??
d.h normalerweise wenn ich plot(H_pos0(1:k)) eingebe ohne f wird die Darstellung automatisch über f oder?
Was soll denn der obere Code? Er gehört zu einer Funktion für ein Spektrogramm. Du willst doch aber das Amplitudenspektrum darstellen und dabei das Zeitsignal segmentieren.
Auf Grund deiner Fragen macht es nicht den Eindruck, dass du meine Zeilen wie auch das FFT-Skript mal nachvollzogen hast. Da macht das Helfen nicht wirklich Spaß, denn ich erkläre ungern alles 3-mal.
Code:
fs = 8; % Was soll denn 8 sein...8 Hz? Ich habe dich dazu schon auf das Abtasttheorem hingewiesen
df = fs/nfft; % Frequenzauflösung: nfft = Segmentlänge
fn = 0.5 * fs % Nyquistfrequenz
x_fn = 0 : df : fn % Frequenzachse für plot in [Hz] von 0...fn
Nehmen wir an dein Signal hat 4096 Messwerte und du willst es in 256er Segmente teilen und transformieren. Es gibt dann also 16 Segmente der Länge 256. H_pos0 enthält nur den positiven Frequenzbereich, womit das Amplitudenspektrum eines Segments nur noch die Länge 129 hat (und nicht mehr 256). Da H_pos aber alle 16 Segmente enthält, hat es nach der Transformation (in der for-Schleife berechnet) die Größe H_pos0(129x16).
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.