Forum: Digitale Signalverarbeitung / DSP / Machine Learning Non-Uniform FFT zur Schwingungsanalyse


von Mahu (Gast)


Lesenswert?

Hallo,

Ich befasse mich im Moment mit dem Thema FFT und Schwingungsanalyse. 
Leider Blicke ich da nicht wirklich durch.

Angenommen ich habe ein Datenset von Zeiten und zugehörigen 
Accelerometerdaten. Die Zeitstempel sind nicht äquidistant. Ich möchte 
gerne die Frequenzen der Schwingung extrahieren.

Soweit ich das verstehe kommt hier eine Non-Uniform FFT 
(NUFFT,NFFT,USFFT) zum Einsatz. Allerdings Fehlt mir ein Algorithmus wie 
ich dabei vorgehen muss. Alles was ich immer lese sind ewig lange 
Formeln bei denen keiner die Variablen erklärt. Ich bräuchte einfach 
einen Step-by-Step Guide zur Anwendung einer NUFFT. Sowas in der Form:

1.Daten so und so aufbereiten
2.Berechnung
3.Output interpretieren

Kennt sich einer von euch damit aus, und kann mir einen solchen Guide 
nennen, oder eine Quelle?

Besten Dank,
Mahu

von Detlef _. (detlef_a)


Angehängte Dateien:

Lesenswert?

Yo, ich hab hier mal eine NUDFT gebastelt, i.e. eine DFT für nonuniform 
samples. Die samplezeitpunkte sind die tt, f sind die samples, das 
Spektrum der nonuniform samples heißt spf und fr sind die äquidistant 
interpolierten samples. Die sind auch in blau im angehängten .jpg zu 
sehen, in rot die Originalsamples. Ordentlich aufwendig die Chose, fürs 
schnelle Rechnen is das nix.

War Spaß gewesen.

Cheers
Detlef


clear
%zufaellige Samplezeitpunkte von 0 bis 1 sec
nn= 1500 ;
tt=rand(1,nn);
tt=sort(tt);
tt=tt(:);

%das sind die Parameter der gesuchten Zeitfkt.
T1=0.1;ph1=0*pi;
T2=0.2;ph2=0*pi;
T3=1/7;ph3=0*pi;

%Jetzt die Zeitfkt. zu den Samplezeitpunkten berechnen
f=sin(2*pi*tt/T1+ph1)+sin(2*pi*tt/T2+ph2)+sin(2*pi*tt/T3+ph3);

plot(tt,f,'b.-');

%FFT Fensterbreite, ist aber fest auf 1024
n=1024;
% Das wird die Matrix der Basisfkt. der FFT
%ausgerechnet an den Samplezeitpunkten
A=zeros(length(tt),n/2+1);
for(k=1:n/2+1)
  A(:,k)=exp(j*2*pi*(k-1)*tt);
end;
%conj. komplex ergänzen
A=[A conj(fliplr(A(:,2:512)))]/n;

spf=inv(A'*A)*A'*f;

fr=real(ifft(spf));

plot((0:1023)/1024,fr,'b.-',tt,f,'r.');

return

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.