生成一组chirp信号
t=0:0.001:1;
a=chirp(t,0,1,10);
该chirp信号频率范围0~10Hz,如图所示,但各频率成分大小从图中并不可知
利用matlab的fft变换,可将其转换到频域中进行分析,代码如下:
fs = 2*10; %根据采样定理,fs为你所关心的最大频率范围的两倍
L = length(0:1/fs:1);%对应图的采样点数
N = 2^nextpow2(L); %采样点数设置为2的整数幂,当信号中按采样频率进行采样,点数少于N时,fft函数将自动补零,设置N可提高fft性能,N最小的个数可以根据上述的定,若要提高频率分辨率,则N可自行增大
n = 0:N-1;
t = n/fs; %采样点对应的时间序列,可检验对应的点,如下图所示,红点表示采样点
%开始傅里叶变换
y1=fft(a,N); %对信号进行快速Fourier变换
mag1=abs(y1); %求得Fourier变换后的振幅
f=n*fs/N; %频率序列
mag1=mag1/(N/2);
figure(1)
semilogy(f(1:N/2),mag1(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');grid on;
zhe就是fft变化后的结果,从图中看结果还是比较粗糙的,这时就要考虑可能是频率间隔过大引起精确度不够,或者采样率过低,引起信号丢失在这里插入图片描述尝试更改采样频率fs为全部采样,fs=1000 Hz ,即1/dt
这样频率就对上了,因此今后最好是将所有数据点都用上,才能保证fft结果正确。
总结:先根据已知dt的离散数据,确定采样频率fs,fs=1/dt,同时要保证fs>2*fmax,N的设置可直接按照程序中进行给定Nmin,若频域划分的很细,可在Nmin基础上增加点数,但若后面补零数过多,也会影响fft结果。然后就直接应用fft即可,图中数据点的高度为对应频率的正弦波的幅值。
若大佬觉得有说的不对的地方敬请留言指出,相互学习。