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

Zeitsignal FFT analysieren

 

nullstein
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 09.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2011, 10:54     Titel: Zeitsignal FFT analysieren
  Antworten mit Zitat      
Hallo.
Zunächst möchte ich Hallo sagen. Ich bin neu in diesem Forum und hoffe hier evtl ab und zu Hilfe zu finden, aber auch hoffentlich gelegentlich helfen zu können.
Zu meinem Problem:
Ich habe ein sehr fein abgetastetes Zeitsignal erhalten. Messdauer 60s mit Fs=102.4e3 kS/s.
Nun wird gefordert, dass ich das Zeitsignal FFT analysiere im Bereich von 16Hz-16kHz mit einer Auflösung df=1Hz. Und hierin besteht auch schon das Problem. Wie bekomme ich das hin?
Ich habe es mir einfach gemacht und die Anzahl der FFT Linien NFFT gleich der Samplingrate gesetzt--> NFFT=Fs. Um nun noch Unstetigkeiten auszubügeln habe ich mein Zeitsignal mit Hanning gefenstert und nen Overlap von 66,67% gewählt. Aber meine Ergebnisse sind leider falsch (verglichen mit Referenzergebnissen).

Hier mal mein abgespeckter Code:
Code:

Fs = 102.4e3
T = 1/Fs;                
Lk = size(Track1,2);
t = (0:Lk-1)*T;

if df == 0;
    L = Lk;
    NFFT = 2^nextpow2(L); % Next power of 2 from length of Track
    if NFFT > L
        NFFT = 2^nextpow2(L/2);
    else
    end
else
    L = size(Track1,2)/(max(t)*df);
    NFFT = Fs/df;
end
%--------------------------------------------------------------------------
switch wtype
    case 're'
        wind = rectwin(NFFT);
        corr = 1;
    case 'tr'                     %Triangular window.
        wind = triang(NFFT);
        corr = 1.328143;
    case 'hm'                     %Hamming window.
        wind = hamming(NFFT);
        corr = 1.362826;
    case 'hn'                     %Hanning window.
        wind = hann(NFFT);
        corr = 1/(sqrt(sum(wind.^2)/length(wind)));
    case 'ft'                     %Flattop window.
        wind = flattopwin(NFFT);
        corr = 3.428555;
end
wind = transpose(wind);
% Stride through the input with xx% overlap

for j = channels
    eval(['Y' num2str(j) '=zeros(1,NFFT);']);
end
for j = channels
    k = 1;
    for i=1:NFFT/overlap:(Lk-NFFT)
       
        eval(['Y' num2str(j) '=Y' num2str(j) '+fft(wind.*Track' num2str(j) '(1,i:(i+NFFT-1))*corr,NFFT)/(NFFT/overlap);']);
        k = k+1;
    end
    eval(['Y' num2str(j) '=1/k*Y' num2str(j) ';']);
end

%--------------------------------------------------------------------------
f = Fs/2*linspace(0,1,NFFT/2+1);
omega = f*2*pi;

%Spiegeln der Fourierreihe inkl Nulllinie
for i = channels
   
    eval(['A' num2str(i) '=2*abs(Y' num2str(i) '(1:NFFT/2+1));']);
   
end


Vielleicht was ja jemand Rat.

Vielen Dank.
Private Nachricht senden Benutzer-Profile anzeigen


Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2011, 11:07     Titel:
  Antworten mit Zitat      
Hallo,
Du hast N samples in 60s. Die Zeitauflösung ist also dt=60s/N.
Die höchste FFT Frequenz die noch realistisch ist f=(1/dt)*(N/2)/N
--> FFT --> bereich von 16Hz-16kHz rausschneiden.
Wo genau liegt dein Problem?
Gruß
Kevin
_________________

1000 Buchstaben? Warum nur 6?
Private Nachricht senden Benutzer-Profile anzeigen
 
nullstein
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 09.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2011, 11:47     Titel:
  Antworten mit Zitat      
Mein Problem liegt in der geforderten Auflösung! Momentan habe ich eine Auflösung von 0.02Hz. Gewollt sind aber 1Hz Auflösung. In meinem Code (siehe oben) habe ich die Auflösung auf 1Hz geschraubt. Die Ergebnisse sind aber komplett anders als bei 0.02Hz Auflösung.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.09.2011, 06:51     Titel:
  Antworten mit Zitat      
Du musst ein Upsampling des Signals durchführen:

Die Frequenzauflösung df = fs/N

Wenn ich mich nun nicht verrechnet habe, hast du bei df = 0.02 Hz und fs = 102.4e3 Hz Arrow N = 512e6 Messwerte

Damit df = 1 Hz ergibt, benötigst du also nur 102.4e3 Messwerte

512e6/102.4e3 = 50 ...somit kannst du nur jeden 50. Messwert des Zeitsignals für das FFT-Spektrum verwenden.
Private Nachricht senden Benutzer-Profile anzeigen
 
nullstein
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 09.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2011, 11:37     Titel:
  Antworten mit Zitat      
Das war ja meine erste Idee. Ich habe mit downsample jeden xten Wert meines Zeitsignals genommen. Die Amplituden stimmen dann aber gar nicht mehr. Ich habe dann viel zu geringe Amplituden.
Weitere Ideen?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.09.2011, 19:36     Titel:
  Antworten mit Zitat      
Sorry...aber dieser Code ist halt auch u.a dank der Eval Funktion sehr unübersichtlich. Ein paar mehr Kommentare wären auch hilfreich Wink Für mich ist hier nicht ersichtlich, dass du nur jeden 50. Messwert nutzt. Das mit dem Overlap verstehe ich schon mal gar nicht. Warum wird nicht das kompl. Zeitsignal mit der höheren Abtastrate in den Freq.bereich transfomiert?
Private Nachricht senden Benutzer-Profile anzeigen
 
Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.09.2011, 14:30     Titel:
  Antworten mit Zitat      
Hallo,
zwing' doch die Frequenzen zwischen den ganzzahligen künstlich auf NULL. Oder Du machst das schon vorgeschlagene und schmeißt einfach Werte aus dem Input raus, dann hast du die Frequenzen auch nicht.
Ich würd' so vorgehen:
1. FFT mit 0.02 Hz auflösung
2. ganzzahlige Frequenzen rausholen
3. nochmal FFT mit wenig Frequenzen
Gruß
Kevin
_________________

1000 Buchstaben? Warum nur 6?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.09.2011, 16:48     Titel: Re: Zeitsignal FFT analysieren
  Antworten mit Zitat      
Hallo nullstein,

Ich schließe mich DSP an:
Ich empfehle dringend auf die EVALs zu verzichten. Sie machen den Code langsam und behindern das Debuggen enorm. In diesem Forum gibt es hunderte Threads zu dem Thema, einfach mal nach EVAL, ASSIGNIN und EVALIN suchen. Wenn der Code danach übersichtlicher ist, springen die Fehler oft schnell ins Auge.

Siehe auch: http://matlab.wikia.com/wiki/FAQ
Es lohnt sich, die FAQ ganz zu lesen - wieso sollte man nicht von den Problemlösungen der anderen profitieren...

Gruß, Jan
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.