Forum: Mikrocontroller und Digitale Elektronik Spektrum in Matlab berechnen


von Lutz (Gast)


Lesenswert?

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)

von Lutz (Gast)


Lesenswert?

hat niemand eine idee?

von M. K. (sylaina)


Lesenswert?

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.

von dadada (Gast)


Lesenswert?

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

von Mirko W. (Gast)


Lesenswert?

Falls es dir allein ums Plotten geht, dann probier es lieber mal mit der 
Funktion spectrogram()

von Christian L. (cyan)


Lesenswert?

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.

von Lutz (Gast)


Lesenswert?

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...

von Christian L. (cyan)


Lesenswert?

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.

von Lutz (Gast)


Lesenswert?

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 ?!!

von Lutz (Gast)


Lesenswert?

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 ?

von Christian L. (cyan)


Lesenswert?

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.

von Christian L. (cyan)


Lesenswert?

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.

von Lutz (Gast)


Lesenswert?

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));

???

von Christian L. (cyan)


Lesenswert?

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.

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
Noch kein Account? Hier anmelden.