Forum: Digitale Signalverarbeitung / DSP / Machine Learning Auflösung xAchse FFT


von Antonia (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich schreibe gerade meine Diplomarbeit.
Ich nehme eine Schwingung auf und möchte die Frequenz mit Hilfe der FFT 
herausfiltern.
Meine Messwerte werden in eine Excel Tabelle geschrieben.
Die Abtastung wird mit 19200 realisiert.

Mein Problem ist es nun, dass ich bei der FFT falsche Frequenzen 
bekomme.

Vielleicht kann mir jemand helfen.?
Die Excel Tabelle befindet sich im Anhang.
Hier mein Code:

clc
clear all

[nums, txt] = xlsread('Matlabvorlage.xls') %Einlesen der Datei

varNames = char(txt(1,:)); %Bestimmen der 
Spaltenüberschriften=Variablennamen

for col=1:size(varNames,1)
  if isnan(nums(1,col)) %erstes Datenwort nicht numerisch?
    assignin('base',varNames(col,:),char(txt(2:end,col))); %Zuweisen der 
Strings in der Spalte
  %else %falls doch numerisch?
    %assignin('base',varNames(col,:),nums(:,col)); %Zuweisen der Zahlen 
in der Spalte
  end;
end;

a = nums(1,1);
x = nums(:,2);
t = nums(:,3);
b = nums(1,5)
%abtast = 1000;
l = length(x);
lt = length(t);
if (b ~= 1000)   % ungleich
    abtast = 1000;
end

z = fft(x,abtast);
Leistungsspektrum = abs(z)/abtast*2; %Leistungsdichtespektrum
xAchse = 1000*(0:abtast-1)/abtast;
achse = xAchse.*(b/1000);
figure(1)
plot(t,x)
ylim([-a-1,a+1])
title('Sinus')
xlabel('Zeit [s]')
ylabel('Amplitude')
grid on;

figure(2)
stem(achse,Leistungsspektrum(1:abtast));
ylim([0,a+1])
title('Spektrum')
xlabel('Frequenz [Hz]')
ylabel('Amplitude')
grid on;

von Antonia (Gast)


Lesenswert?

Ich programmiere mit Matlab.
Funktioniert so weit auch alles, ausser das Spektrum verschiebt sich 
immer.
Bei einer Frequenz von 200Hz gibt er mir eine Spektrallinie bei 192Hz.

Liegt das Aliasing Effekt?
Müsste ich also die Abtastung verändern?

von Johannes (Gast)


Lesenswert?

Hallo Antonia,

soweit ich mich erinnere musste man noch die Funktion fftshift() 
anwenden um alles richtig hinzurücken. Mit der fft() wird dir ja ein 
Spektrum berechnet, dass an der y-Achse gespiegelt ist. D.h. wenn du wie 
beschrieben mit 19200 Hz abtastet geht dein Spektrum bis +/- 9600 Hz. 
Ohne fftshift bekommst Du eine falsche Darstellung.

Was auch ganz hilfreich ist, ist sich ein Testsignal zu machen (z.B. ne 
Sinusfunktion) und da mal die fft-Operationen anzuwenden. Dann sollte 
es, wenn alles richtig ist, extakte Peaks geben.


Worin schreibst Du denn Dein Diplom?


Grüße

Johannes

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Nimm doch die Funktion pwelch, die erledigt für dich die ganze 
Handarbeit: PWELCH(X,WINDOW,NOVERLAP,NFFT,Fs)

von Antonia (Gast)


Lesenswert?

Hallo,

mit der Funktion pwelch ist eine gute Idee. Habe mir die pwelch Funktion 
angeschaut, mittels help.
Aber so ganz habe ich die noch nicht verstanden.
Bekomme immer eine Fehlermeldung, bzw. ein komischen graphen.
Könntest du mir die pwelch Fkt nochmals detailierter Aufschreiben?
Oder sogar in meinen Code, der oben angegeben ist, integrieren.
Danke.
LG Antonia

von I_ H. (i_h)


Lesenswert?

Eine Sache zur Genauigkeit - die DFT gibt dir ein diskretes 
Frequenzspektrum. Also die ermittelte Frequenz ist relativ ungenau.

Wenn du weist, dass wirklich nur eine Frequenz drinnen ist (mit geringen 
harmonischen) geht das anders genauer.

von Jasmin Euler (Gast)


Lesenswert?

Hallo Antonia,

kennst du eigentlich Dieter?

Mir ist nur aufgefallen das Dieter scheinbar ein ähnliches Problem 
bearbeitet und dann auch noch sein Matlab dem deinen so ähnlich 
aussieht.

Vergleich mal mit hier:

Beitrag "Excel-Datei in Matlab"

Vielleicht kann er dir ja mit der PWelch-Funktion helfen ;)

Liebe Grüße,

Jasmin Euler

von die ??? (Gast)


Lesenswert?

I_ H. wrote:
> Wenn du weist, dass wirklich nur eine Frequenz drinnen ist (mit geringen
> harmonischen) geht das anders genauer.

Gibst du einen Tipp ab?

von I_ H. (i_h)


Angehängte Dateien:

Lesenswert?

Am genauesten über die fft mit einfach Maximum bestimmen geht es, wenn 
man nahe der Grenzfrequenz operiert. Das ist aber ansonsten ziemlich 
doof, da muss man bei 10k Samples 5k Perioden aufnehmen.

Hab mir vor'ner Weile mal eine Routine geschrieben, die versucht den 
0-Durchgang so exakt wie möglich zu ermitteln. Beim Sinus/Cosinus ist 
zB. der Schnittpunkt einer Gerade durch cos(PI/2-x) und cos(PI/2+x) auch 
bei PI/2.
Und weil die Sache nahe 0 recht linear ist, gilt das in etwa auch für 
cos(PI/2-x-y) und cos(PI/2+x) für y << x.

Macht man das nun für einige x bekommt man zB. 500 unterschiedliche 
0-Stellen, die kann man einfach mitteln.


Weil mich die Genauigkeit jetzt auch mal interessiert hat, hab ich das 
mal für einige Frequenzen durchrechnen lassen. 10240 Samples, perfekter 
Sinus, Zeitraum 0 bis 0.05 (fG=102400). Abweichung in % vom richtigen 
Wert, grün Maximum der FFT, rot meine zusammengehackte Methode. 
Getestete Frequenzen von 100 bis 50k, entspricht 5 bis 2500 
aufgezeichneten Perioden.

Wie man sieht wird meine Methode obenrum immer ungenauer, ab 70k oder so 
ungenauer als die FFT. Hab's aber auch nicht für so kurze Perioden 
ausgelegt, da hat eine ja nur noch 2..4 Samples.

Wenn du einen reinen Sinus mit 10k Samples oder so aufnimmst, sagen dir 
10k Samples nur genau 3 Sachen: Amplitude, Offset und Frequenz. Mein 
Oszi ist mit 14 Bit angegeben, das macht dann 5.9kB pro Wert. Genug um 
Rauschen etc. rausrechnen zu können.

... und ich hab die Phase vergessen. Dann halt 4 Werte.

von I_ H. (i_h)


Lesenswert?

Eine 2. Variante ist, dass du die Dauer nicht nur zwischen sin(x)=0 
misst, sondern allgemein zwischen sin(x)=c für c aus [-1:1] oder 
praxisnäher zB. c aus [-0.2:0.2]. Glaub das kommt da auch irgendwo zum 
Einsatz.

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.