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