Hallo,
ich möchte mein Signalspektrum berechnen und ich weiß nicht wo mein
Denkfehler hierbei ist ?!?! Die Abtastrate ist deutlich höher als die
meines eigentlichen signals und somit wird nyquist eingehalten. Meine
Frequenzachse ist leider um den Faktor 100 zu groß. D.h. stelle ich die
"Abtastfrequenz" auf 5 kHz bekomme ich einen Peak bei 500 kHz angezeigt,
aber warum ?
Ich bekomme einfach kein signal ausgegeben -> hier bei der Frequenz von
1 khz
Eine Idee zum Problem nicht aber vielleicht noch einen Tipp wo du
wahrscheinlich eher Hilfe zu Matlab bekommen kannst als hier: Frage doch
mal im Forum www.gomatlab.de nach.
Ich mache leider schon ewig nix mehr mit Matlab und FFT hab ich damit
noch nie gemacht.
Du weisst aber, dass Matlab eigentlich ganz verständliche Beispiele im
Netz bietet...
Schau mal hier:
http://de.mathworks.com/help/matlab/ref/fft.html
Auf die schnelle würde ich sagen, du übersiehst, dass die FFT
symmetrisch ist
Schon in der ersten Zeile entsteht das Problem.
>> t=linspace(0,10e-3,5000);
erzeugt einen Zeitvektor aus 5000 Elementen im Zeitfenster 0 bis 10ms.
Das entspricht nun einmal einer Abtastfrequenz von 500kHz und nicht
5kHz.
Auch kannst du dir das unnötige Transponieren bei Ax_FFT und Ay_FFT
sparen. Und die Art, wie du Ax_FFT erzeugst, ist ünnötig kompliziert.
dadada schrieb:> Du weisst aber, dass Matlab eigentlich ganz verständliche Beispiele im> Netz bietet...>> Schau mal hier:> http://de.mathworks.com/help/matlab/ref/fft.html>> Auf die schnelle würde ich sagen, du übersiehst, dass die FFT> symmetrisch ist
hmm.. danke erst einmal. Da habe ich auch schon nachgeschaut.
Aufbauend darauf habe ich ja das skript s.o. entwickelt. Nun leider
verstehe ich meinen Fehler noch nicht ganz...
Leider kann ich meinen Post nicht mehr bearbeiten, aber:
Das Ergebnis ist korrekt bei 1kHz.
P.S.: Intern wird die FFT eh auf eine DFT reduziert, da die Anzahl
deiner Werte nicht 2^n entspricht.
Christian L. schrieb:> Schon in der ersten Zeile entsteht das Problem.>>> t=linspace(0,10e-3,5000);> erzeugt einen Zeitvektor aus 5000 Elementen im Zeitfenster 0 bis 10ms.> Das entspricht nun einmal einer Abtastfrequenz von 500kHz und nicht> 5kHz.
Ja das stimmt ..
ich habe die Zeile jetzt so umgeändert
t=linspace(0,1,5000); -> das entspricht dann einer Abtastfrequenz von
5kHz
Trotzdem ist das Spektrum nicht richtig...
Christian L. schrieb:> Auch kannst du dir das unnötige Transponieren bei Ax_FFT und Ay_FFT> sparen. Und die Art, wie du Ax_FFT erzeugst, ist ünnötig kompliziert
was genau meinst du damit ?!!
Ah, ok ich nehme es zurück es funktioniert doch.
Ich habe aber noch eine andere Frage, wenn ich jetzt das Signal ersetzen
möchte mit einem beliebigen Signal, welches ich in einem Zeitraum von t2
aufgenommen habe. Wie kann ich hiervon das Spektrum berechnen ?
Lutz schrieb:> Trotzdem ist das Spektrum nicht richtig...
Also bei mir passt es. Es gibt einen Peak bei 1kHz und bei 4kHz. Die
4kHz sind aber nur eine Spiegelfrequenz und eh über dem Nyquist limit
von 2,5kHz. Du solltest also nur die Hälfte des Diagramms ploten, dann
sieht es wie gewohnt aus.
Lutz schrieb:> Christian L. schrieb:>> Auch kannst du dir das unnötige Transponieren bei Ax_FFT und Ay_FFT>> sparen. Und die Art, wie du Ax_FFT erzeugst, ist ünnötig kompliziert>> was genau meinst du damit ?!!
Zum ersten Punkt:
Deine "'" am Ende der Zeilen. Die Drehen einen Spaltenvektor zu einem
Reihenvektor und umgedreht. Auch ohne diesen Schritt funktioniert es.
Zum zweiten Punkt:
Deine Abtastzeitpunkte, aus denen du deine Frequenzvektor erzeugst,
kannst du doch viel einfacher direkt aus t ableiten.
Ich würde dir sogar dazu raten die Abtastrate und Zeiten separat
vorzugeben. Z.B. so:
1
f_t = 5000;
2
t_max = 1;
3
4
t = linspace(0, t_max, f_s*t_max);
Dann hast du alle Größen auf einen Blick und musst nicht immer von Hand
die Größen für t rechnen.
Lutz schrieb:> Ich habe aber noch eine andere Frage, wenn ich jetzt das Signal ersetzen> möchte mit einem beliebigen Signal, welches ich in einem Zeitraum von t2> aufgenommen habe. Wie kann ich hiervon das Spektrum berechnen ?
Du ersetzt einfach dein Ay durch dein Signal. Solange Abtastfrequenz und
Zeitbereich passen, es also gleich viele Datenpunkte, wie Zeitpunkte
gibt, ist der FFT das egal, wie das Signal aussieht.
Christian L. schrieb:> Ich würde dir sogar dazu raten die Abtastrate und Zeiten separat> vorzugeben. Z.B. so:f_t = 5000;> t_max = 1;>> t = linspace(0, t_max, f_s*t_max);> Dann hast du alle Größen auf einen Blick und musst nicht immer von Hand> die Größen für t rechnen.
Ja stimmt, gute Idee. Das habe ich jetzt auch so geändert.
der grund warum ich das zuerst wie hier gemacht habe
Lutz schrieb:> t=linspace(0,10e-3,5000);
ist, weil ich eine andere Funktion in diesem Zeitintervall simuliert
habe und ich möchte von dieser Funktion das Spektrum sehen. Um das
Ergebnis meiner DFT zu überprüfen habe ich einen Sinus genommen.
Bsp: Meine Funktion die ich habe, ist im Zeitinterval von 0 bis 10 ms
aufgenommen wurden und entspricht einem Dreieck Signal. Dann habe ich im
Zeitintervall "t" meine x Werte und in Ay meine Amplitudeninformationen.
Wenn die Zeitpunkte Äquidistant sind, kann ich dann einfach sagen
Lutz schrieb:> f_A = 1/(t(2)-t(1));
???
Lutz schrieb:> Wenn die Zeitpunkte Äquidistant sind, kann ich dann einfach sagen>> Lutz schrieb:>> f_A = 1/(t(2)-t(1));>> ???
Im Prinzip ja, wobei du über die Anzahl der Messpunkte und der
zeitlichen Länge auf das gleiche Ergebnis kommen solltest. Auch kennst
du ja wahrscheinlich die Abtastfrequenz deines Signals und kannst sie
somit direkt vorgeben.
Falls sie nicht bekannt ist, man also ein völlig unbekanntes Signal hat,
würde man sich ja auch fragen müssen, ob die Nyquist-Bedingung wirklich
eingehalten wurde.