简单理解FFT的matlab使用
1、说明在matlab中FFT需要注意3个参数,首先是序列长度L,这个就是你收到的信号的长度。比如你收到的信号长度是2秒,采样频率设置的是512/2(那么采样间隔就是2/512),那么你得到的信号长度就是L =512.第二个参数就是采样频率fs,采样频率要设置为大于信号频率的2 倍(也就是奈奎斯特采样定律),信号的采样频率越大,得到的频域的频谱就越精确,但是设置的太大,计算量就直接上去了。第三个参
1、说明
在matlab中FFT需要注意3个参数,首先是序列长度L,这个就是你收到的信号的长度。比如你收到的信号长度是2秒,采样频率设置的是512/2(那么采样间隔就是2/512),那么你得到的信号长度就是L = 512.
第二个参数就是采样频率fs,采样频率要设置为大于信号频率的2 倍(也就是奈奎斯特采样定律),信号的采样频率越大,得到的频域的频谱就越精确,但是设置的太大,计算量就直接上去了。
第三个参数就是FFT 的变换点数N,一般选择为2.^M(M为正整数),根据频域采样定理,要求 N>=L,时域才不会发生混叠。注意我的N设置为多少,频谱就会出现多少个点。
2、仿真实例
首先说明我的代码里出现的F_mu是已知的接收到的一串信号样本(我的信号样本是类似于sic函数形状的),信号序列L是2048个,信号的接收时间是2 秒,也就是说我的采样频率fs是2048/2;FFT变换的点数NFFT我取的是2048,满足N>=L。
close all;
load Wr.mat 'F_mu'
% 其中F_mu为构造的模板函数
F_mu1 = F_mu(1:16:2048*16);
NFFT = 2048; % FFT变换点数
fs = 2048/2; % 采样频率;
L = 0:NFFT-1; % 频谱序列
Wz_nfft = fft(F_mu1,NFFT)/NFFT; % 模板函数的fft
Wr_absshift = abs(fftshift(Wz_nfft)); % FFT后要shift,并只取权值的幅度进行分析,因此要abs<>
fig1L = 600;
fig1H = 388;
Default_LW = 1.5; % 默认线宽
Default_MS = 3; % 默认markersize大小
Default_LTS = 12; % 默认XYlabel文本大小
Default_LGDS = 10.5; % 默认legend字体大小
Default_ATS = 12; % 默认刻度数字大小
figure
set(gcf,'Position',[200,200,fig1L,fig1H], 'color','w');
set(gca,'Position',[.15 .18 .79 .75]); %左下宽高
hold on
h=stem(L/NFFT*fs,abs(Wz_nfft),'ok'); % % 对应构造模板函数Fu
set(h,'linewidth',Default_LW);
ylim([0 3.5])
box on
grid on
set(gca, 'Fontname', 'Times New Roman', 'Fontsize', Default_ATS);
xlabel('序列\iti','Fontname', 'Times New Roman', 'Fontsize', Default_LTS,'rotation',0);
ylabel('幅度大小 ','Fontname', 'Times New Roman', 'Fontsize', Default_LTS,'rotation',-270);
h = legend('MIFA对应的权值','IFT对应的权值','Location','NorthWest');
set(h,'Fontname', 'Times New Roman', 'Fontsize', Default_LTS);
仿真结果如下:
这个信号是我直接对方向图进行傅里叶变换画出的结果,其中左半部分是我们真实的频谱图,如果要观察真实的频谱,还是要做一下频移,也就是 fftshift ,代码如下:
close all;
load Wr.mat 'F_mu'
% 其中F_mu为构造的模板函数
F_mu1 = F_mu(1:2048);
NFFT = 2048; % FFT变换点数
L = 0:2048-1;
fs = 2048/2; % 采样频率;
N = 0:NFFT-1; % 频谱序列
Wz_nfft = fft(F_mu1,NFFT)/NFFT; % 模板函数的fft
Wr_absshift = abs(fftshift(Wz_nfft)); % FFT后要shift,并只取权值的幅度进行分析,因此要abs<>
fig1L = 600;
fig1H = 388;
Default_LW = 1.5; % 默认线宽
Default_MS = 3; % 默认markersize大小
Default_LTS = 12; % 默认XYlabel文本大小
Default_LGDS = 10.5; % 默认legend字体大小
Default_ATS = 12; % 默认刻度数字大小
figure
set(gcf,'Position',[200,200,fig1L,fig1H], 'color','w');
set(gca,'Position',[.15 .18 .79 .75]); %左下宽高
hold on
h=stem(L/NFFT*fs-fs/2,Wr_absshift,'ok'); % % 对应构造模板函数Fu
set(h,'linewidth',Default_LW);
% ylim([0 3.5])
box on
grid on
set(gca, 'Fontname', 'Times New Roman', 'Fontsize', Default_ATS);
xlabel('序列\iti','Fontname', 'Times New Roman', 'Fontsize', Default_LTS,'rotation',0);
ylabel('幅度大小 ','Fontname', 'Times New Roman', 'Fontsize', Default_LTS,'rotation',-270);
h = legend('MIFA对应的权值','IFT对应的权值','Location','NorthWest');
set(h,'Fontname', 'Times New Roman', 'Fontsize', Default_LTS);

综上所述,可以直接对信号做 fft ,得到的结果也是真实的,0到fs/2的范围内是真实的载频,实信号的 fft 的负频率在fs/2到fs二的范围内,所以前一部分是具有参考价值的,对于复信号,fft得到的结果就是真实的情况。
第二种方法就是将得到的fft信号做 fftshift ,在画频谱时要考虑将横坐标减去fs/2,得到真实的结果。具体可以参见下面的博文进行深入理解:
https://www.cnblogs.com/limanjihe/p/10014142.html
3、补充代码深入理解
clear
close all
N=512;%采样点个数
n=0:N-1;%时间轴离散化
si=sin(2*pi*20*n/N)+sin(2*pi*50*n/N);%正弦信号离散化
f=fft(si);%傅里叶变换
subplot(2,2,1);plot(n,si);%关于n和f的作图,图像位置设置
xlabel('时间(s)');
ylabel('幅度(v)');title('时域信号波形');
Nyquist=N/2-1;%谐波次数设置
fn=abs(f)*2/N;%取绝对值,计算幅度
subplot(2,2,2);plot(n(1:Nyquist),fn(1:Nyquist));%频谱图绘制,由奈奎斯特取样定理可知只需要显示前N/2-1次谐波
xlabel('频率(hz)');
ylabel('功率(dbw)');title('信号频谱图');
c=ifft(f,N);
fliterband1=zeros(1,N);fliterband1(1,10-2:10+2)=1;fliterband1(1,N-(10+2):N-(10-2))=1;
fliterband2=zeros(1,N);fliterband2(1,50-2:50+2)=1;fliterband2(1,N-(50+2):N-(50-2))=1;
y1=ifft(fliterband1.*f);
y2=ifft(fliterband2.*f);
subplot(2,2,4);plot(n,y1);
subplot(2,2,3);plot(n,y2);
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)