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;
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?
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
Nimm doch die Funktion pwelch, die erledigt für dich die ganze Handarbeit: PWELCH(X,WINDOW,NOVERLAP,NFFT,Fs)
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
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.
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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.