Spektrum in Matlab berechnen

Gast #4376689
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
1
t=linspace(0,10e-3,5000); 
2
Signal=sin(2*pi*1000*t);
3
Ay=Signal;
4

5
f_A = 1/(t(2)-t(1));      % Abtastzeitpunkte festlegen
6
Ax_FFT = f_A/length(t)*(0:length(t)-1)';
7
Ay_FFT = abs(fft(Ay,length(Ay)));
8
Ay_FFT_shifted = fftshift(Ay_FFT);
9
Ay_FFT = 10*log10(Ay_FFT);
10
Ay_FFT = Ay_FFT';
11
figure(1);
12
plot(Ax_FFT,Ay_FFT)
#4376989
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.
#4377020
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.
Gast #4377024
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...
Gast #4377031
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 ?!!
Gast #4377041
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 ?
#4377043
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.
#4377045
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.
Gast #4377055
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));

???
#4377067
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.