www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Fourier Matlab

Autor: Dennis (Gast)
Datum: 14.04.2008 09:19

Hallo,
ich habe ein Verständnis Problem mit meiner Ausgabe. Ich erhalte zwei
Spektren, wenn ich eine Sinus Funktion mit der FFT transformiere.
Hier mein Programm.
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:54

Dennis wrote:
> Ich erhalte zwei Spektren, wenn ich eine Sinus Funktion mit der FFT
> transformiere.

Nicht ganz. Du bekommst ein Spektrum geliefert. Das Spektrum spiegelt
sich bei der halben Abtastfrequenz (Nyquistfrequenz).

  http://de.wikipedia.org/wiki/Nyquist-Frequenz


> Vielleicht kann mir jemand erklären, wieso ich ein weiteres Spektrum bei
> 900Hz erhalte.

Vorsicht, nicht die Begriffe durcheinander schmeißen. Du meinst
sicherlich nicht Spektrum sondern Spektrallinie.
Autor: Beate (Gast)
Datum: 17.04.2008 09:51

Hallo,

ich habe ein ähnliches Programm wie der Dennis geschrieben.
Funktioniert auch alles super.
Ich habe allerdings wohl eher ein mathematisches Verständnis Problem.
Vielleicht kann mir trotzdem jemand behilflich sein.
Ich erzeuge einen Sinus mit Amplitude=1 und einer Frequenz von 10Hz
Ich taste nun das Signal mit 1000 ab. Erhalte einen schönen Peak.
Mein Problem ist nun die Amplitude des Spektrums.
In meinem Fall erhalte ich eine Amplitude von genau 250.
Erhöhe ich die Ampltude des Sinus auf 2 erhöht sich die Amplitude des
Spektrums auf 1000.
Wie kommen die Amplituden im Spektrum zustande? Gibt es da einen
Mathematischen Hintergrund?

Ich hoffe mir kann jemand helfen.
Danke und Liebe Grüße
Beate
Autor: gast (Gast)
Datum: 17.04.2008 10:04

da im spektrum die leistung angegeben wird. doppelte amplitude ->
vierfache leistung
Autor: Beate (Gast)
Datum: 17.04.2008 10:35

Ok, aber so ganz habe ich es leider noch nicht verstanden.
Ich dachte immer, dass ein Spektrum eine Abbildung der Frequenz
(x-Achse) x Amplitude (y-Achse) von Sinusoiden ist.

So hätte ich ja dann eine Amplitude von 1 erhalten müssen und nicht von
250. Gibt es denn eine Formel für die Leistungsberechnung.

Danke.
LG Beate
Autor: Patric (Gast)
Datum: 17.04.2008 11:39

Bevor ihr hier mit Leistungsdichtespektrum usw. anfangt, versucht
erstmal die DFT(FFT) zu verstehen. Mit fft(x) ist es leider nicht getan.
Ich hab euch mal ein Matlab-Programm zur Demonstration angehängt. Es
sind einige Signalbeispiele enthalten, die bestimmte Eigenschaften der
DFT darstellen. Versucht das mal zu verstehen und meldet euch bei Bedarf
hier wieder.
%
% Berechnung der FFT und Darstellung in Bins und Frequenzen
%
clear all;

% Parameter
N = 1000;
fs = 1e3;
f = (0:(N-1))./N*fs;

% numerische Fehler vermeiden
err = 1e-6;

% Zeit
t = 0:1/fs:(N-1)*1/fs;

% Signal erzeugen
x = 5 + cos(2*pi*200.*t);
%x = 5 + cos(2*pi*1000.*t);
%x = -5 + cos(2*pi*1000.*t);
%x = sin(2*pi*500.*t+pi/2);
%x = sin(2*pi*500.*t+pi/4);
%x = 10*cos(2*pi*1000.*t) + 8*cos(2*pi*200.5.*t);
%x = cos(2*pi*2000.*t);

% FFT
X = fft(x,N);

% Betrag
betrag = abs(X)/N;
% Winkel
winkel = angle(X);
for p = 1:N
    if (abs(real(X(p))) < err & abs(imag(X(p))) < err)
        winkel(p) = 0;
    end;
end;


figure(1);
subplot(221), stem(0:(N-1), betrag); grid on;
title('abs X(f)'); xlabel('Bins');
subplot(223), stem(f, betrag); grid on;
title('abs X(f)'); xlabel('Frequenz');

subplot(222), stem(0:(N-1), winkel); grid on;
title('angle X(f)'); xlabel('Bins');
subplot(224), stem(f, winkel); grid on;
title('angle X(f)'); xlabel('Frequenz');

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






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net