WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

FFT_x achse dimensionieren

 

luke_you know?
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.10.08
Wohnort: 100km weg von Shanghai
Version: ---
     Beitrag Verfasst am: 27.11.2008, 10:28     Titel: FFT_x achse dimensionieren
  Antworten mit Zitat      
hallo


ich möchte eine schwingung mit fft auf ihre frequenzanteile hin untersuchen.
ich schaffe es mir die relationene anzeigen zu lassen, aber leider verstehe ich nicht wie ich die x achse richtig dimensioniere.
also dass meiner grundschwingung wirklich ein absoluter wert wie 20Hz steht. im moment steht da z.B ein grosser peak bei x1 und ich weiss nicht welche einheit x1 hat hat.

mein signal hat eine abtastrate von 0.008ms; die fft zeigt vernünftige werte an.(also es seiht wie ein normales frequenzspektrum aus)
Code:

function y=fft_this(x,fs)   %x=daten fs=1/o.oo8
L=length(x);
x=x-(sum(x)/L);      
NFFT = 2^nextpow2(L);
n=0:length(y)-1;
f=fs*n/length(y);

stem(f(1:NFFT/2),abs(y(1:NFFT/2)));
 


liebe grüsse christian
_________________

hi i´m luke, like luky luke - you know?
Private Nachricht senden Benutzer-Profile anzeigen


luke_you

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2008, 16:19     Titel:
  Antworten mit Zitat      
kann mir hier keiner helfen?
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2008, 20:18     Titel:
  Antworten mit Zitat      
Hallo,

du musst bloß die Stelle des Maximums um 1 dekrementieren (der Werte an der Stelle 1 ist der Gleichanteil) und dann durch die Gesamtzeit dividieren.
z.B.
Code:
t = 2.43:0.008:14.79;
s = sin(2*pi*t*23); % 23 Schwingungen pro Sekunde
f = abs(fft(s));
figure
subplot(211)
plot(t,s);
subplot(212)
plot(f);

f = f(2:end-1); % Gleichanteil weg
f = f(1:length(f)/2); % gespiegelte Version weg
[f_max f_ind] = max(f);
t_diff = t(end)-t(1); % Zeitdifferenz
hz = f_ind/t_diff;


EDIT: Um die Zeitachse zu dimensionieren:
Code:
figure
plot (linspace(1/t_diff,length(f)/t_diff,length(f)),f);


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
luke!

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2008, 10:29     Titel:
  Antworten mit Zitat      
hey,
danke für die hilfe!
mein code sieht dann folgendermaßen aus:
Code:

function y=fft_this(x,fs)

s=x;

t = 0:1/fs:(length(s)-1)/fs;
figure
subplot(211)
plot(t,s);
f = abs(fft(s));
%%%%%%%%%%%%%%%%%%%%%%%%%%gleichanteil?

f = f(2:end-1);         % Gleichanteil weg
f = f(1:length(f)/2);   % gespiegelte Version weg
[f_max f_ind] = max(f);
t_diff = t(end)-t(1);   % Zeitdifferenz
hz = f_ind/t_diff;


taxis=linspace(1/t_diff,length(f)/t_diff,length(f))

subplot(212)
    stem (taxis,f);
 


ein paar fragen hab ich aber dann noch:
du meinst an stelle 1 vom ergebnis steht der gleichanteil? also bei der markierung oben bei f(1,1)??


-
das prgramm funktiniert super für sinusschwingungen bis ~40 sinusschwingungen pro sekunde, danach kommt aber komisches zeug raus, selbst wenn ich die samplefrequenz drastisch erhöhe..

gruss christian
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2008, 11:24     Titel:
  Antworten mit Zitat      
Hallo,

ja, ich denke schon dass der erste Eintrag (f(1)) den Gleichanteil darstellt. Du kannst einfach mal ein Signal nehmen (z.B. sinus) und es um einen Offset nach oben oder unten verschieben. Dann sollte sich nur der erste Koeffizient ändern.

Dass es mit höheren Frequenzen nicht funktioniert, kann ich so nicht bestätigen.
Code:
t = 0:0.0001:10; % Fs = 10000 Hz -> hz_max = 5000 Hz (Nyquist);
s = sin(2*pi*t*3736); % 3736 Schwingungen pro Sekunde
f = abs(fft(s));
figure
subplot(211)
plot(t,s);
subplot(212)
plot(f);

f = f(2:end); % Gleichanteil weg
f = f(1:ceil(length(f)/2)); % gespiegelte Version weg
[f_max f_ind] = max(f);
t_diff = t(end)-t(1); % Zeitdifferenz
hz = f_ind/t_diff;


Ich erhalt hier als hz = 3736 Hertz

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Donmojito
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 04.12.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2008, 15:26     Titel:
  Antworten mit Zitat      
Hallo,

ich habe ein ähnliches Problem und bin auch schon ein gutes Stück weitergekommen. Allerdings handelt es sich bei mir um reale Messwerte.
Kurze Beschreibung:

Ergebnisvektor mit 1645 Messwerten (im Weiteren l)

500 MW/s als Aufzeichnungsfrequenz der Messtechnik. Es sind also rund 3 Sekunden Messzeit.

Mich interessiert das Rauschspektrum des Signals.

Also folgendes gemacht:

t= 0:0.002:(1645/500) %Zeitvektor zu 500Hz
f=abs(fft(l));

Wenn ich mir das nach eurem Programm erstellte Spektrum anschaue ist der erwartete Peak bei 50 Hz (elektrisches Netzrauschen) sehr verschoben.

----

Nächste Frage:
[f_max f_ind] = max(f);

Was macht der Befehl genau ?
Er speichert in f_max den Maximalwert von f und in f_ind ?
hz = f_ind/t_diff; berechnet dann die zugehörige Frequenz ?
Wie sieht das ganze in einem Signal unterschiedlicher Frequenzen aus ?

Ich hoffe ihr könnt mir da weiterhelfen...

Danke schonmal
Heiko
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2008, 16:27     Titel:
  Antworten mit Zitat      
Hallo,

Code:
[f_max f_ind] = max(f)
f_ind ist der Index, an dem das Maximum auftritt ( f_max = f(f_ind); )
Code:
hz = f_ind/t_diff
berechnet die Frequenz des höchsten Ausschlages in Hertz.

Um die Achse der Frequenztransformation nach Hertz zu konvertieren:
Code:
t_diff = t(end)-t(1); % sollte bei dir 1645/500 sein;
figure;
plot (linspace(1/t_diff,length(f)/t_diff,length(f)),f);


Synthetisch erzeugte Daten
Code:
Fs = 500; % Hz
T = 1645/Fs;
t = 0:1/Fs:T;
x = sin(2*pi*50*t)+0.1*rand(size(t)); % 50 Hz Signal - verrauscht
figure;
subplot(211)
plot(t,x);

% fft
f = abs(fft(x));
f = f(2:ceil(length(f)/2));
[f_max f_ind] = max(f);
t_diff = t(end)-t(1); % Zeitdifferenz
max_hz = f_ind/t_diff % Max in Hz

subplot(212)
plot(linspace(1/t_diff,length(f)/t_diff,length(f)),f);


Ich erhalte nun bei 50.15 Hz den Peak. Je größer T oder Fs wird, desto genauer wird natürlich auch das Ergebnis.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Donmojito
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 04.12.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2008, 10:13     Titel:
  Antworten mit Zitat      
Danke.
Dann kann das bei mir nicht klappen und die Darstellung ist tatsächlich richtig. FS hoch oder T größer hilft bekannterweise. Habe die Daten auch nochmal mit fs=5000 und fs=50000 und siehe da - es wird so langsam...das Rauschen ist schon noch sehr fies.
Also nächste Frage Filterdesign. Mal schaun wo ich die stelle.
Vielen Dank schonmal für deine Ausführungen.
Heiko
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.