Matlab中简单正弦波的傅里叶变换

时间:2012-04-02 14:41:26

标签: matlab signal-processing fft

我尝试显示简单正弦波的频谱,因为我们知道固定频率的单个正弦波必须在其频谱的峰值上编写此代码但是我无法在我的代码中得到这个错误:< / p>

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

2 个答案:

答案 0 :(得分:2)

您可以考虑使用MATLAB提供的内置傅里叶变换,而不是自己编写。见http://www.mathworks.se/help/techdoc/math/brentm1-1.html

<强>更新

您应该了解的fft功能有一些奇特的内容。第一件事是它生成的数组需要通过因子1/N进行标准化,其中N是数组的大小(这是因为MATLAB函数的实现)。如果你不这样做,那么频域中的所有幅度将比它们的N倍大。实际上&#34;是

第二件事是你需要以某种方式找到输出数组中每个元素对应的频率。下面代码中的第三行将采样时间数组转换为fourier数组对应的频率。

此功能在时域中采集信号并在频域中绘制。 t是时间数组,y是信号幅度。

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

答案 1 :(得分:0)

这里的关键点是使用窗口功能。结果代码如下:

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

结果是:

enter image description here