2012-04-02 4 views
3

Ich versuche, Spektrum der einfachen sin Welle zu zeigen, wie wir wissen, eine einzige sin Welle mit fester Frequenz muss auf Peak in sein Spektrum Ich schreibe diesen Code, aber ich kann diesen einen Gipfel nicht bekommen was ist in meinem Code falsch:Fourier-Transformation der einfachen sin Welle in Matlab

clc 
nsteps=200;%number of signal elements in time domain 
i=sqrt(-1); 
NFREQS=100;%number of elements in frequency domain 
ddx=1e-9; 
dt=ddx/(6e8);%separation between each time domain elements 
lambdai=150e-9; 
lambdaf=500e-9; 
freqi=3e8/lambdai; 
freqf=3e8/lambdaf; 
freq=zeros(1,NFREQS); 
for j=1:NFREQS 
freq(j)=freqi-j*(freqi-freqf)/NFREQS;%desired frequency domain 
end 
arg=2*pi*freq*dt; 
et=zeros(nsteps,1); 
    for j=1:nsteps 
     et(j)=sin(2*pi*3e15*j*dt);%sin wave in time domain 
    end 
e=zeros(NFREQS,1); 
for n=1:NFREQS 
for j=1:nsteps 
e(n)=e(n)+et(j)*exp(-i*arg(n)*n);%sin wave in frequency domain 
end 
end 
lambda=linspace(lambdai,lambdaf,NFREQS); 
plot(lambda,abs(e)) 

The result is here

+0

Was ist das Ergebnis, das Sie bekommen? –

+0

@OliCharlesworth Ich füge Ergebnis in Bearbeitung hinzu. – peaceman

Antwort

0

Der Hauptpunkt hier ist die Verwendung der Fensterfunktion. Der resultierende Code ist dies:

clc 
clear 
nsteps=40000; 
i=sqrt(-1); 
Sc=0.5; 
ddx=1e-9; 
dt=ddx*Sc/(3e8); 
lambdai=100e-9; 
lambdaf=700e-9; 
lambda=lambdai:1e-9:lambdaf; 
[m,NFREQS]=size(lambda); 

    freq=3e8./lambda; 
et=zeros(nsteps,1); 
    for j=1:nsteps 
     et(j)=sin(2*pi*3e8/(300e-9)*dt*j);%sin wave in time domain 
    end 
    w=blackman(nsteps);%window function for periodic functions 
    for j=1:nsteps 
     et(j)=et(j)*w(j); 
    end 
    e=zeros(1,NFREQS); 
    for n=1:NFREQS 
     for j=1:nsteps 
      e(n)=e(n)+et(j)*exp(-i*2*pi*freq(n)*dt*j); 
     end 
    end 
    plot(lambda,abs(e)) 

Und das Ergebnis ist:

enter image description here

2

Sie in Erwägung ziehen könnte unter Verwendung der in Fourier-Transformation, die gebaut MATLAB bietet anstelle der eigenen zu schreiben. Siehe http://www.mathworks.se/help/techdoc/math/brentm1-1.html

aktualisieren

ein paar eigenartige Dinge über die fft Funktion Es gibt Sie kennen sollten. Die erste Sache ist, dass das Array, das es erzeugt, um einen Faktor von 1/N normalisiert werden muss, wobei N die Größe des Arrays ist (dies liegt an der Implementierung der MATLAB-Funktion). Wenn du das nicht tust, werden alle Amplituden im Frequenzbereich N mal größer sein als sie "eigentlich" sind.

Die zweite Sache ist, dass Sie irgendwie die Frequenzen finden müssen, denen jedes Element im Ausgangsarray entspricht. Die dritte Zeile im folgenden Code konvertiert das Array der Abtastzeiten in die Frequenzen, die dem Array fourier entsprechen.

Diese Funktion nimmt ein Signal im Zeitbereich auf und zeichnet es im Frequenzbereich auf. t ist das Zeitfeld und y ist die Signalamplituden.

function plotSpectrum(t, y) 
freqUnit = 1/(abs(t(2) - t(1)) * length(t)); 
f = -length(t) * freqUnit : freqUnit : (length(t) - 1) * freqUnit; 
oneSidedFFT = fft(y); 
fourier = horzcat(oneSidedFFT, oneSidedFFT); 
plot(f, abs(fourier)); 
xlabel('Frequency'); 
ylabel('Magnitude'); 
+0

Ich habe ein Problem mit der fft-Funktion von MATLAB, wenn ich fft (et) in meinen Code schreibe, was ist der Frequenzbereich und wie kann ich diesen Bereich ändern? Könnten Sie bitte meinen Code für das Plotten der Fourier-Transformation von "e" in (.6e15 bis 1e15 Hz) Region – peaceman