matlab中的fft不补零也能计算,快速傅里叶变换(FFT)中为什么要“补零”?

为了大家能够复现各个图中的结果,我附上了所有我编写的MATLAB代码。

创作不易,未经允许,禁止转载。

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

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

0c2797073b3173347556fe97ea585905.png

快速傅里叶变换 FFT

202857f3ac662e20bf240d79bb11412b.png

6ed88ed65e28d29f023dd12726d2faf2.png

图1. 1000个数据点

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

8ed1b0fa3408ee6995e48490dc991059.png

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

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

clear;clc

close all

%% FFT

Fs = 100e6; % 采样频率 Hz

T = 1/Fs; % 采样周期 s

L0 = 1000; % 信号长度

L = 1000; % 数据长度

t0 = (0:L0-1)*T; % 信号时间序列

x = cos(2*pi*1e6*t0) + cos(2*pi*1.05e6*t0); % 信号函数

t = (0:L-1)*T; % 数据时间序列

%% Plot

figure(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 y\rm(\itt\rm)')

grid on;

axis([0 10 -2 2])

set(gca,'FontSize', 10 ,'FontName', 'Times New Roman')

set(gcf,'unit','centimeters','position',[15 10 13.53 9.03],'color','white')

%% FFT

Y = fft(x); % 快速傅里叶变换

% 计算双侧频谱 P2。然后基于 P2 和偶数信号长度 L 计算单侧频谱 P1。

P2 = abs(Y/L0);

P1 = P2(1:L/2+1);

P1(2:end-1) = 2*P1(2:end-1);

f = Fs*(0:(L/2))/L;% Rfft

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值