www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Matlab Problem mit FFT

Autor: Zonck (Gast)
Datum: 21.08.2007 22:24

Hallo Leute.
Ich mache gerade erste Gehversuche in Matlab und habe mit einen Sinus
generiert, den ich gerne mittels FFT in den Spektralbereich
tranformieren möchte. Das der Sinus eine Frequenz von 50Hz hat, erwarte
ich natürlich auch einen Dirac bei 50Hz im Spektrum...aber den bekomme
ich nicht - sondern bei etwa 54Hz! Warum?
Danke für euer Bemühen!!!

Hier mein Code:

t = 0:.001:.239;
x = sin(2*pi*50*t);
subplot(2,1,1)
hndl=plot(t,x)
grid on;

%FFT vom Signal x
Y= fft(x,240);
Pyy=Y.*conj(Y)/240; %Leistungsdichtespektrum
f=1000/240*(1:120);
subplot(2,1,2)
hndl=plot(f,Pyy(1:120));
grid on;
Autor: Thomas (Gast)
Datum: 21.08.2007 22:37

Erhöhe mal die Genauigkeit, dann landet er auch bei der 50. Also von den
240 z.B. auf 2400 gehen.
Autor: Zonck (Gast)
Datum: 22.08.2007 10:44

Hallo nochmal, und danke Thomas!

Ich hatte die Genauigkeit schon etwas hochgedreht aber wie dich gezeigt
hat, muss man sie "massiv" hochdrehen. Nun habe ich das Spektrum so, wie
es sein soll. Doch bei der erneuten Rücktransformation (es sollte ja
wieder das Zeitsignal rauskommen) klappt wieder was nicht - glaube
Matlab will mich ärgern! :-(

t = 0:.001:.239;
x = sin(2*pi*50*t);
subplot(3,1,1)
hndl=plot(t,x)
grid on;

%FFT vom 10000);
Pyy=Y.*conj(Y)/10000; %Leistungsdichtespektrum
f=1000/10000*(1:5000);
subplot(3,1,2)
hndl=plot(f,Pyy(1:5000));
grid on;

%Rücktransformation
T=ifft(Y);
subplot(3,1,3)
hndl=plot(T);
grid on

Problem: Ich denke, die Zeitachse ist falsch skaliert!?

Danke
Autor: Thomas (Gast)
Datum: 22.08.2007 13:58

Tach.

Du willst wohl folgendes:

t = 0:.001:.239;
punkte = length(t);
x = sin(2*pi*50*t);
subplot(3,1,1)
plot(t,x);
grid on;

points = 10000; % muss gerade und in N sein

%FFT
Y = fft(x,points);
Pyy=Y.*conj(Y)/points; %Leistungsdichtespektrum
f=1000*(1:(points/2))/points;
subplot(3,1,2)
plot(f,Pyy(1:(points/2)));
grid on;

%Rücktransformation
T=ifft(Y,points);
length(Y)
subplot(3,1,3)
plot(1:punkte,T(1:punkte));
grid on;


Beachte den Unterschied zwischen "punkte" und "points", ungeschickte
Namenswahl, ok, bin schuld. Aber da siehst du die Skalierung.
Autor: Dennis (Gast)
Datum: 11.04.2008 10:58

Hallo,

ich beschäftige mich momentan auch mit der FFT in Matlab.
Dabei sind nun drei Fragen aufgetreten.
Vielleicht kann mir jemand helfen.

1.Ich habe das Programm ähnlich aufgebaut. Nun verstehe ich aber zwei
Zeilen nicht.
f=1000*(1:(points/2))/points;
Was passiert hier genau?
plot(f,Pyy(1:(points/2)));
hier wird ja der Graph erzeugt. Doch was bewirkt (1:(points/2)) ?

2. Die FFT ist ein Algorithmus der DFT. Bei der die Abtastrate eine
zweierpotenz sein muss. Aber ist es ja in diesem Fall nicht, weil mit
10000 abgetastet wird. ???

3. Mein Spektrum passt soweit. Was ich nicht verstehe ist, warum am Peak
eine Abweichnung von +-1hz vorliegt. z.B. Frequenz ist auf 50Hz
eingestellt.
Nun fängt das Spektrum bei 49Hz an zu steigen und hat bei 50Hz sein
Maximum und fällt dann bis 51Hz.
Egal was ich änder, die +-1Hz bleiben. Wieso?

Kann mir da jemand weiterhelfen?
Autor: die ??? (Gast)
Datum: 11.04.2008 11:09

1. Var(x:y) == Var ist ein Vector*, schneide den Bereich mit den Indizes
               x bis y aus.

 *) Kann auch ein mehrdimensionales Array sein.


2. Ist MATLAB egal, da wird zero-padding durchgeführt (Nullen anfügen
   bis zur nächsten 2er-Potenz).  help fft


3. Leckeffekt. Ausserdem verbindet MATLAB mit dem Aufruf plot alle
   Datenpunke mit einer Linie, was zu vermeindlichen 'Flanken' führt.
   Versuch mal stem.
Autor: Dennis (Gast)
Datum: 11.04.2008 11:20

Alles klar.

Danke!
Autor: Dennis (Gast)
Datum: 14.04.2008 10:53

Hallo,
ich habe ein Verständnis Problem mit meiner Ausgabe. Ich erhalte zwei
Spektren, wenn ich eine Sinus Funktion mit der FFT transformiere.
Vielleicht kann mir jemand erklären, wieso ich ein weiteres Spektrum bei
900Hz erhalte. (Bzw. bei Abtast-f)
Hier mein Programm:

clc

%%%%%%%%%%%%%%%%%%%
%  Eingabe:       %
%%%%%%%%%%%%%%%%%%%
a = 1;
w = 2*pi;
f = 100;
n = 0.001;
time = (0:n:1)';
time1 = (n:n:1)';
abtast = floor(1/n);
lt = length(time);


%%%%%%%%%%%%%%%%%%%
%  Schwingung     %
%%%%%%%%%%%%%%%%%%%
v_sin = a.*sin(w.*f.*time);
subplot(2,1,1)
plot(time, v_sin)
title('Schwingung')
xlabel('Zeit [s]')
ylabel('Amplitude')
grid on;


%%%%%%%%%%%%%%%%%%%
%  Fourier        %
%%%%%%%%%%%%%%%%%%%
z = fft(v_sin,abtast)
Leistungsspektrum = z.*conj(z)/abtast; %Leistungsdichtespektrum
b = length(Leistungsspektrum);
x = (0:((abtast-1)));
subplot(2,1,2)
stem(x,Leistungsspektrum(1:abtast));
title('Spektrum')
xlabel('Frequenz [Hz]')
ylabel('Amplitude')
grid on;

%%%%%%%%%%%%%%%%%%%%
%  Ausgabe         %
%%%%%%%%%%%%%%%%%%%%
[MaxLeistungsspektrum,freq] = max(Leistungsspektrum);
freqMax = (freq-1);
MaxAmplitude = MaxLeistungsspektrum
MaxFrquenz = freqMax
Autor: die ??? (Gast)
Datum: 14.04.2008 10:56

Doppeltes posting ist unhöflich.

  Beitrag "Fourier Matlab"
Autor: Dennis (Gast)
Datum: 14.04.2008 11:00

Tschuldigung,
letztes Mal kam ziemlich schnell eine Antwort. Da dachte ich, dass die
vorherige Mail nicht angekommen ist.
Wird nicht wieder vorkommen

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net