Verfasst am: 17.12.2010, 15:05
Titel: FFT die x-te in Matlab
Hallo zusammen,
ich weiß das das Thema schon oft besprochen wurde.
Habe auch das Forum durch geschaut und einige gute Beispiele für die FFT in Matlab gefunden.
Muss aber ehrlich zugeben, dass ich die Vorgehensweise nicht verstehe.
Mein Ziel ist es mit einem GUI beliebige Signale auswählen/erstellen zu können und mir anschließend die FFT, vom Signal anzeigen zu lassen.
Anbei mein bisheriger Code: Würde das soweit passen?
Die Signalerstellung ( erstmal nur Sinus) ist von mir. Die Berechnung der FFT ist aus den Beispielen hier im Forum zusammen kopiert.
Und dazu habe ich ein Paar fragen. Aber erstmal der Code:
************************************************************
function signal
% Erzeugung eines beliebigen Signals mit:
f=1; % Frequenz des vorhandenen Signales
T=1/f; % Bestimmung der Periodenzeitdauer
o=(0.01/f); % Bestimmung der Schrittweite für beliebige
% Frequenzen
k= 0:T; % Erstellung des x-Vektors (Zeitachse)
a=1; % Amplitude
z=[]; % freier Vektor, der das Signal darstellen soll
v=1; % Laufindex
for t=0:T
z(v)=(a*(sin(2*pi*f*t)));
v=(v+1);
end
figure(1)
plot(k,z,'-r');
grid on;
ylabel('Amplitude');
xlabel('Zeitachse T');
title('Signalverlauf');
hold on;
% Beginnen der FFT
fa = f/2; % Abtastfrequenz
N = 1024; % Abtastpunkte
NFFT = 2^nextpow2(N); % Next power of 2 from length of y
Y = fft(z,NFFT)/N;
f = f/2*linspace(0,1,NFFT/2+1);
% Plot single-sided amplitude spectrum.
figure(2)
grid on;
plot(f,2*abs(Y(1:NFFT/2+1)));
title('Single-Sided Amplitude Spectrum of y(t)');
xlabel('Frequency (Hz)');
ylabel('|Y(f)|');
end
******************************************************
Fragen kommen im 2 Post
Muki_84
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 17.12.2010, 15:13
Titel:
Entschuldigt bitte, die sollen ein o sein.
Mir ist bewusst, das die Abtastfreuqenz groß genug sein muss. Mit f/2 hat man genau das Minimun, um keine Abtastfehler zu bekommen.
Die Anzahl der Abtastpunkte ist mir auch bekannt. Aber wie entscheide ich über die Größe? Gibt es dort Richtwerte?
Die weiteren 3 Schritte verstehe ich leider absolut nicht.
NFFT = 2^nextpow2(N); % Next power of 2 from length of y
Y = fft(z,NFFT)/N;
f = f/2*linspace(0,1,NFFT/2+1);
Wozu die max. Power?
Warum teile ich bei fft noch mal durch N?
was macht man mit linspace bei der fft?
Wäre sehr dankbar wenn mir jemand die Aufbereitung der Signale mit FFT in Matlab erklären könnte oder mir Links posten könnte.
Dann verwende bitte die Code-Umgebung, die solche Gags abfängt:
[ c o d e ] .... [ / c o d e ] (ohne Leerzeichen).
Gruß, Jan
Muki_84
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 17.12.2010, 15:58
Titel:
So hier noch mal der Code:
Code:
function signal
% Erzeugung eines beliebigen Signals mit:
f=1; % Frequenz des vorhandenen Signales
T=1/f; % Bestimmung der Periodenzeitdauer
q=(0.01/f); % Bestimmung der Schrittweite für beliebige % Frequenzen
k= 0:q:T; % Erstellung des x-Vektors (Zeitachse)
a=1; % Amplitude
z=[]; % freier Vektor, der das Signal darstellen soll
v=1; % Laufindex for t=0:q:T
z(v)=(a*(sin(2*pi*f*t)));
v=(v+1);
end figure(1) plot(k,z,'-r');
grid on;
ylabel('Amplitude');
xlabel('Zeitachse T');
title('Signalverlauf');
hold on;
% Beginnen der FFT
fa = f/2; % Abtastfrequenz, Nyquist
N = 1024; % Abtastpunkte
NFFT = 2^nextpow2(N); % Next power of 2 from length of y
Y = fft(z,NFFT)/N;
f = f/2*linspace(0,1,NFFT/2+1);
% Plot single-sided amplitude spectrum. figure(2) grid on;
plot(f,2*abs(Y(1:NFFT/2+1)));
title('Single-Sided Amplitude Spectrum of y(t)');
xlabel('Frequency (Hz)');
ylabel('|Y(f)|');
end
habe mich am WE nochmal mit der FFT & Matlab auseinander gesetzt.
Mittlerweile bin ich soweit, das ich ein Sinussignal(50Hz) erzeuge und per FFT(100Hz Abtastfrequenz) einen Impuls bei 50HZ bekomme.
Das sollte soweit stimmen oder? Aber müsste ich nicht bei n*50Hz weitere Impulse bekommen? Vielfache der Grundfrequenz?
Oder hat das damit zu tun, das ich nur fs/2 betrachte damit kein Aliasing auftritt?
Meine weitere Frage ist, wenn ich zum Sinus Signal was addiere, müsste sich dann der Peak nicht verschieben? Bzw müssten sich andere Peaks bilden, wegen Oberfrequenzen?
Hier mein Code
Code:
function signal
% Erzeugung eines beliebigen Signals mit:
f0 = 50; % Frequenz vom Signal
fs = 2*f0; % Sampling Frequenz
T0 = 1/f0; % Periodendauer
Ts = 1/fs; % Sampling Time
N= 1024; % Länge des abgetastem Signal
A = 1; % Amplitude
t= (0:N-1); % Zeitvektor für FFT
t0= 0:(0.01/f0):T0;
y = A*sin(2*pi*f0*t0); % würde das gerne hinzuaddieren +0.7*tan(2*pi*1000*t0); hold on;
figure(1);
plot(t0,y,'-r');
%FFT
NFFT = 2^nextpow2(N); % nächst höhere 2er Potenz finden % Hier egal da 1024 = 2^10 ist = N
yfft = fft(y,NFFT);
yfft1 = fft(y,NFFT)/N;
f= fs/2*linspace(1,1,NFFT/2+1); % Frequenz x-Achse erzeugen % fs/2 damit kein Aliasing auftritt % daher auch NFFT/2, beginnt aber bei 1 % daher Nfft/2 +1
Würde mich über ein Feedback freuen. Passt der Code soweit?
Gruß, Muki
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.