Forum: Digitale Signalverarbeitung / DSP / Machine Learning Habe grundlegende Verständnisprobleme bei der FFT!


von Max L. (max_l)


Angehängte Dateien:

Lesenswert?

Hi,

habe mich jetzt schon eine Zeit lang mit DSP und der FFT beschäftigt, 
aber ich habe da noch  Probleme:

Ich habe mir in Matlab ein Cosinus-Signal gebastelt mit einer Länge von 
N = 128 und einer Frequenz von 32Hz.
So wie ich die FFT verstehe, gibt mir die FFT ein Frequenzspektrum 
zurück, mit Peaks an den Frequenzen die dem Eingangssignal entsprechen. 
( Das Eingangssignal kann ja aus mehreren überlagerten Signalen bestehen 
)

Habe versucht den Frequenzgang auf 0 - 32Hz zu normieren.
Also sollte mir die FFT von einem Signal mit 32Hz, einen Peak bei 32Hz 
anzeigen.
Nur das tut sie bei mir nicht ganz.

Entweder liegt es an meinem Verständnis für Matlab, für die FFT oder 
wahrscheinlich an beidem ;)

Ich habe auch ein Problem die Zahl Pi in mein Signal zu bringen:
Wenn ich zb. so schreibe: x = cos(n*pi*f) , dann sind in x nur 1er und 
kein cosinus.
1
N = 128;                     % Length of signal
2
f = 32;                      % Frequenz
3
n = 0:N-1;
4
5
x = cos(n*f); 
6
7
8
% FFT
9
fx = fft(x);
10
11
12
figure;
13
subplot(3,1,1)
14
plot(n,x) 
15
title('x(t)')
16
17
subplot(3,1,2)
18
plot(abs(fft(x))) 
19
title('Spectrum of x(t)')
20
21
subplot(3,1,3)
22
plot(linspace(0, f, N),abs(fx))  % Normiert auf Werte zwischen 0 und 32 Hz
23
title('Spectrum of x(t)')
24
xlabel('0 - 32 Hz');

Hoffe mir kann wer helfen..
Lg
Max

von fpgamann (Gast)


Lesenswert?

kann es sein, dass da noch die Normierung auf PI fehlt?

Dein Cosinu soll doch sicher von 0...2 pi laufen.

Im Spkerum sehe ich an der 16. und der n-16. Stelle den peek.

16/128 * fs = 1/8 fs

mit 2pi * 1/8 = 3/4 -> > als Nyqist!

Ich würde sagen, du hast eine Art undersampling durchgeführt ...


Du solltest mal mehrere Frequenzen addieren und zwar so, dass sie alle 
unterhalb der Nyquistfrequenz sind.

Also

fs = 100% = 128 pkte
f1 = 25%
f2 = 35%

von Klausi (Gast)


Lesenswert?

Hi, nur mal ganz schnell, mach den cos mal so:


dt=0.00001;                     %Abtastzeit in s, ist Geschmackssache
N=1000;
t=[0:dt:(N-1)*dt]';             %Zeitvektor

f=32;

y = cos(2  pi  f * t);

Ausserdem musst du beachten, in welcher Reihenfolge die fft-Funktion das 
Ergebnis in den Ergebnis-Vektor schreibt --> erst die kleinsten 
positiven..., dann die größten negativen (imaginären, die selten 
jemanden interesiert)... ENDE des Vektors.


viele Grüße

von Max L. (max_l)


Angehängte Dateien:

Lesenswert?

Danke für die Antworten!
Die Darstellung passt jetzt.
1
fs = 1000;
2
dt=1/fs;                     %Abtastzeit in s
3
N=100;
4
t=[0:dt:(N-1)*dt]';             %Zeitvektor
5
f=100;                           % Frequenz
6
7
x = cos(2* pi * f * t);
8
9
% FFT
10
fx = fft(x);
11
12
figure;
13
subplot(2,1,1)
14
plot(t,x);
15
title('x(t)');
16
17
subplot(2,1,2)
18
plot(linspace(0, fs, N),abs(fx));
19
title('Spectrum of x(t)')

Aber bei der Darstellung der x-Achse im Frequenzgang habe ich noch 
leichte Probleme.

Also ich habe eine Abtastfrequenz von 10kHz, was der Gesamtbandbreite 
der FFT entspricht. Mein Cosinus hat eine Frequenz von 100 Hz, dort habe 
ich auch einen Peak.
Nur wieso ist bei 900 Hz ebenfalls ein Peak?

von Heinz (Gast)


Lesenswert?

Frage: Welche max. darstellbare Frequenz erwartest du bei eine 
Abtastrate von 1000/s

von Dirk K. (d-k)


Lesenswert?

Wie Heinz angedeutet hat bitte Nyquist-Shannon beachten.

Deweiteren hat matlab eine gute Hilfe. Z.B. 
http://www.mathworks.de/help/techdoc/ref/fft.html


1
fs = 1000;
2
dt=1/fs;                     %Abtastzeit in s
3
N=100;
4
t=[0:dt:(N-1)*dt]';             %Zeitvektor
5
f=100;                           % Frequenz
6
7
x = cos(2* pi * f * t);
8
9
% FFT
10
fx = fft(x);
11
fx = fftshift(fx);
12
13
figure;
14
subplot(2,1,1)
15
plot(t,x);
16
title('x(t)');
17
18
subplot(2,1,2)
19
plot(linspace(-fs/2, fs/2, N),abs(fx));
20
title('Spectrum of x(t)')

von Max L. (max_l)


Lesenswert?

Ja bei 1000Hz darf die höchste darstellbare Frequenz nicht größer als 
500Hz sein.
Aber das Theorem habe ich ja eingehalten.

Ich denke fftshift war die Funktion die ich benötigt habe :)

Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.