www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Auflösung xAchse FFT


Autor: Antonia (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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;

Autor: Antonia (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Antonia (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jasmin Euler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: I_ H. (i_h)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.