matlab傅立叶变换补零,快速傅里叶变换中“补零”有何意义?

原标题:快速傅里叶变换中“补零”有何意义?

8313716416950641f7eca71dd686f80d.gif

从时域到频域

这里以快速傅里叶变换(FFT)为对象举实例进行解释,并附上全部MATLAB代码。

另外,说明一下,用MATLAB做FFT并不要求数据点个数必须为以2为基数的整数次方。之所以很多资料上说控制数据点数为以2为基数的整体次方,是因为这样就能采用以2为基的FFT算法,提升运算性能。

如果数据点数不是以2为基数的整数次方,处理方法有两种,一种是在原始数据开头或末尾补零,即将数据补到以2为基数的整数次方,这是“补零”的一个用处;第二种是采用以任意数为基数的FFT算法。

而MATLAB的fft(x,N)函数在参数N正好就是数据x的长度,但又不是以2为基数的整体次方时,并不会采用补零的方法,而应该是采用以任意数为基数的FFT算法(说“应该”是因为帮助文档里没有明确说明),这样也能得到很好的结果,只不过速度要稍稍慢了一些,以通常的计算量是体现不出来的。

快速傅里叶变换FFT

例如,现在有一个信号,这个信号中仅包含两个正(余)弦波,一个是1 MHz,一个是1.05 MHz,即x = cos(2π×1000000 t)+ cos(2π×1050000 t)。设定采样频率为Fs = 100 MHz,如果采1000个点,那么时域信号的时长就有10μs。

69955ae6ab502a6469463d05c5bdbd4f.png

图1。1000个数据点

如果,直接对这1000个数据点做快速傅里叶变换,将得到频谱图:

35fb36688af12523ce60357e163fd153.png

图2。1000个数据点做FFT的频谱

可以发现,频谱点稀疏,在1MHz附近根本无法将1 MHz和1.05 MHz的两个频率分开。

clear;clccloseall%% FFTFs = 100e6; % Sampling frequency / HzT = 1/Fs; % Sampling time/ sL0= 1000; % Original signal lengthL = 1000; % Data lengtht0= (0:L0-1)*T; % Original signal timesequencex= cos(2*pi*1e6*t0) + cos(2*pi*1.05e6*t0); % Signal functiont = (0:L-1)*T; % Data timesequence%% Plotfigure(1)plot(t*1e6,x,'b-','linewidth',1.5)title ('fontsize{10}fontname{Times New Roman}Time domain signal')xlabel('fontsize{10}fontname{Times New Roman}it t /rm mus')ylabel('fontsize{10}fontname{Times New Roman}it yrm(ittrm)')grid on;axis([010-22])set(gca,'FontSize', 10,'FontName', 'Times New Roman')set(gcf,'unit','centimeters','position',[151013.539.03],'color','white')%% FFTY = fft(x); % FFT% Calculate double sides spectrum P2, andthen calculate single side% spectrum P1 based on P2 a

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值