www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Auflösung xAchse FFT

Autor: Antonia (Gast)
Datum: 07.05.2008 10:32
Dateianhang: matlabvorlage.xls (1,4 MB, 22 Downloads)

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;
Autor: Antonia (Gast)
Datum: 07.05.2008 15:18

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?
Autor: Johannes (Gast)
Datum: 07.05.2008 17:52

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
Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite
Datum: 07.05.2008 20:57

Nimm doch die Funktion pwelch, die erledigt für dich die ganze
Handarbeit: PWELCH(X,WINDOW,NOVERLAP,NFFT,Fs)
Autor: Antonia (Gast)
Datum: 08.05.2008 09:47

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
Autor: I_ H. (i_h)
Datum: 09.05.2008 04:12

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.
Autor: Jasmin Euler (Gast)
Datum: 09.05.2008 09:54

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
Autor: die ??? (Gast)
Datum: 09.05.2008 11:59

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?
Autor: I_ H. (i_h)
Datum: 09.05.2008 15:06
Dateianhang: out.png (17,3 KB, 17 Downloads)
preview image for out.png

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.
Autor: I_ H. (i_h)
Datum: 09.05.2008 15:21

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.

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net