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

21ic电子网 2020-03-21 00:00

从时域到频域


这里以快速傅里叶变换(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。

图1. 1000个数据点


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

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


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

clear;clcclose all%% FFTFs = 100e6; % Sampling frequency / HzT = 1/Fs; % Sampling time / sL0 = 1000; % Original signal lengthL = 1000; % Data length t0 = (0:L0-1)*T; % Original signal time sequencex = cos(2*pi*1e6*t0) + cos(2*pi*1.05e6*t0); % Signal functiont = (0:L-1)*T; % Data time sequence%% 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 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')%% FFTY = fft(x); % FFT% Calculate double sides spectrum P2, and then calculate single side% spectrum P1 based on P2 and even data lengthP2 = abs(Y/L0);P1 = P2(1:L/2+1);P1(2:end-1) = 2*P1(2:end-1);f = Fs*(0:(L/2))/L;% Rfftfigure(2)plot(f, P1,'r-','Marker','.','markersize',10,'linewidth',1.5)axis([0.5e6 1.5e6 0 1.5])title('\fontsize{10}\fontname{Times New Roman}Power Spectrum')xlabel('\fontsize{10}\fontname{Times New Roman}\it f /\rm Hz')ylabel('\fontsize{10}\fontname{Times New Roman}\it y\rm(\itf\rm)')grid on;set(gca,'FontSize', 10 ,'FontName', 'Times New Roman')set(gcf,'unit','centimeters','position',[15 10 13.53 9.03],'color','white')

频率分辨率

发现频率成分无法被区分开来,第一反应应该就是:频率分辨率不够。那么,如何提高频率分辨率呢?首先要清楚,这里存在两种类型的频率分辨率。

一种叫波形分辨率,其由原始数据的时间长度决定:

另一种可以称之为视觉分辨率FFT分辨率,其由采样频率和参与FFT的数据点数决定[1]

之所以要区分,就是因为后面要进行“补零”的操作。如果不补零,直接对原始数据做FFT,那么这两种分辨率是相等的。

例如上面,有:

补零

那么,如果现在在原始数据点后补零会有什么效果呢?假设在这 1000 个原始数据点后面再补充零达到 6000 个点,那么数据变成了:

图3. 7000个补零后数据点


此时对其做快速傅里叶变换,结果如下:

图4. 7000个补零后数据点做FFT的频谱


可以发现,频谱点密集了不少,但是在 1MHz 附近依然无法将 1MHz 和 1.05MHz 的两个频率成分分开。这是因为从式 (1) 可以看出,波形分辨率只与原始数据的时长 T 有关,而与参与FFT的数据点数无关。虽然补了很多零,但波形分辨率依然为1/10μs= 100 kHz,该分辨率大于1MHz 和 1.05MHz  这两个频率成分之间的距离50 kHz 。这就好比用筛子分黄豆和大米,分辨率就好像是筛子上孔的大小,如果筛子的孔太大了,就没有办法把这两者分开。

而“时域补零相当于频域插值”[2],也就是说,补零操作增加了频域的插值点数,让频域曲线看起来更加光滑,也就是增加了FFT频率分辨率,注意式(2) 所示,这是“补零”的另一个原因

clear;clcclose all%% FFTFs = 100e6; % Sampling frequency / HzT = 1/Fs; % Sampling time / sL0 = 1000; % Original signal lengthL = 7000; % Data length t0 = (0:L0-1)*T; % Original signal time sequencex = cos(2*pi*1e6*t0) + cos(2*pi*1.05e6*t0); % Signal functiont = (0:L-1)*T; % Data time sequencey = zeros(1,L);y(1:L0) = x;%% Plotfigure(1)plot(t*1e6,y,'b-','linewidth',1.5)title('\fontsize{10}\fontname{Times New Roman}Time domain signal with Zero Padding')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 70 -2 2])set(gca,'FontSize', 10 ,'FontName', 'Times New Roman')set(gcf,'unit','centimeters','position',[15 10 13.53 9.03],'color','white')%% FFTY = fft(y); % FFT% Calculate double sides spectrum P2, and then calculate single side% spectrum P1 based on P2 and even data lengthP2 = abs(Y/L0);P1 = P2(1:L/2+1);P1(2:end-1) = 2*P1(2:end-1);f = Fs*(0:(L/2))/L;% Rfftfigure(2)plot(f, P1,'r-','Marker','.','markersize',10,'linewidth',1.5)axis([0.5e6 1.5e6 0 1.5])title('\fontsize{10}\fontname{Times New Roman}Power Spectrum')xlabel('\fontsize{10}\fontname{Times New Roman}\it f /\rm Hz')ylabel('\fontsize{10}\fontname{Times New Roman}\it y\rm(\itf\rm)')grid on;set(gca,'FontSize', 10 ,'FontName', 'Times New Roman')set(gcf,'unit','centimeters','position',[15 10 13.53 9.03],'color','white')


频谱泄漏

显然,根据上面的分析可知,在采样频率不变的情况下,要想将 1MHz 和 1.05MHz 这两个频率成分分析出来,光靠“补零”是不够的,必须要改变波形分辨率,也就是要延长原始数据的时长。现在以相同的采样频率对信号采 7000个点作为原始信号:

图5. 7000个数据点


对其做快速傅里叶变换,结果如下:

图6. 7000个数据点做FFT的频谱

因为此时的波形分辨率为:1/70μs≈14kHz ,小于 1MHz 和 1.05MHz 这两个频率成分之间的距离 50 kHz ,所以可以看出有两个明显的峰值。

但是会发现 1MHz  对应的幅值为1,与原始信号中该频率成分的幅值一致,但 1.05MHz  对应的幅值明显低于1,但是其周边的点上却都有不小的幅值,这就是所谓的频谱泄露,因为数据点的个数影响,使得在 1MHz   处有谱线存在,但在 1.05MHz 处没有谱线存在,使测量结果偏离实际值 ,同时在实际频率点的能量分散到两侧的其它频率点上,并出现一些幅值较小的假谱。

clear;clcclose all%% FFTFs = 100e6; % Sampling frequency / HzT = 1/Fs; % Sampling time / sL0 = 7000; % Original signal lengthL = 7000; % Data length t0 = (0:L0-1)*T; % Original signal time sequencex = cos(2*pi*1e6*t0) + cos(2*pi*1.05e6*t0); % Signal functiont = (0:L-1)*T; % Data time sequence%% 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 y\rm(\itt\rm)')grid on;axis([0 70 -2 2])set(gca,'FontSize', 10 ,'FontName', 'Times New Roman')set(gcf,'unit','centimeters','position',[15 10 13.53 9.03],'color','white')%% FFTY = fft(x); % FFT% Calculate double sides spectrum P2, and then calculate single side% spectrum P1 based on P2 and even data lengthP2 = abs(Y/L0);P1 = P2(1:L/2+1);P1(2:end-1) = 2*P1(2:end-1);f = Fs/2*linspace(0,1,L/2+1);% Rfftfigure(2)plot(f, P1,'r-','Marker','.','markersize',10,'linewidth',1.5)axis([0.5e6 1.5e6 0 1.5])title('\fontsize{10}\fontname{Times New Roman}Power Spectrum')xlabel('\fontsize{10}\fontname{Times New Roman}\it f /\rm Hz')ylabel('\fontsize{10}\fontname{Times New Roman}\it y\rm(\itf\rm)')grid on;set(gca,'FontSize', 10 ,'FontName', 'Times New Roman')set(gcf,'unit','centimeters','position',[15 10 13.53 9.03],'color','white')


为了解决这个问题,可以设法使得谱线同时经过1MHz 和 1.05MHz 这两个频率点,找到他们的公约数。

如果原始数据不变,在后面再补充 1000 个零点:

图7. 8000个补零后数据点

那么FFT分辨率就是 12.5kHz ,是这两个频率的公约数, 1MHz=80×12.5kHz ;1.05MHz=84×12.5kHz  ,所以谱线同时经过 1MHz 和 1.05MHz  这两个频率点。

对其做快速傅里叶变换,结果如下:

图8. 8000个补零后数据点做FFT的频谱

会发现 1MHz 和 1.05MHz  对应的幅值均为1,与原始信号一致。这也是一种补零操作带来的影响

clear;clcclose all%% FFTFs = 100e6; % Sampling frequency / HzT = 1/Fs; % Sampling time / sL0 = 7000; % Original signal lengthL = 8000; % Data length t0 = (0:L0-1)*T; % Original signal time sequencex = cos(2*pi*1e6*t0) + cos(2*pi*1.05e6*t0); % Signal functiont = (0:L-1)*T; % Data time sequencey = zeros(1,L);y(1:L0) = x;%% Plotfigure(1)plot(t*1e6,y,'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 80 -2 2])set(gca,'FontSize', 10 ,'FontName', 'Times New Roman')set(gcf,'unit','centimeters','position',[15 10 13.53 9.03],'color','white')%% FFTY = fft(y); % FFT% Calculate double sides spectrum P2, and then calculate single side% spectrum P1 based on P2 and even data lengthP2 = abs(Y/L0);P1 = P2(1:L/2+1);P1(2:end-1) = 2*P1(2:end-1);f = Fs/2*linspace(0,1,L/2+1);% Rfftfigure(2)plot(f, P1,'r-','Marker','.','markersize',10,'linewidth',1.5)axis([0.5e6 1.5e6 0 1.5])title('\fontsize{10}\fontname{Times New Roman}Power Spectrum')xlabel('\fontsize{10}\fontname{Times New Roman}\it f /\rm Hz')ylabel('\fontsize{10}\fontname{Times New Roman}\it y\rm(\itf\rm)')grid on;set(gca,'FontSize', 10 ,'FontName', 'Times New Roman')set(gcf,'unit','centimeters','position',[15 10 13.53 9.03],'color','white')


图8 中会有一些旁瓣出现,这是因为补零影响了原始信号,如果,直接采8000个点作为原始数据,即将程序中的L0改为8000,那么有:

图9. 8000个数据点


并对其做FFT,结果如下

图10. 8000个数据点做FFT的频谱


这样也就不存在补零带来的误差了。

参考

  1. Zero Padding http://www.bitweenie.com/listings/fft-zero-padding/

  2. ZeroPaddingTheorem https://ccrma.stanford.edu/~jos/dft/Zero_Padding_Theorem_Spectral.html




21ic电子网 即时传播最新电子科技信息,汇聚业界精英精彩视点。
评论
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 151浏览
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 80浏览
  • 在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求。然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案。康谋ADTF正是应运而生,它提供了一个广受认可和广泛引用的软件框架,包含模块化的标准化应用程序和工具,旨在为ADAS功能的开发提供一站式体验。一、ADTF的关键之处!无论是奥迪、大众、宝马还是梅赛德斯-奔驰:他们都依赖我们不断发展的ADTF来开发智能驾驶辅助解决方案,直至实现自动驾驶的目标。从新功能的最初构思到批量生
    康谋 2025-01-09 10:04 40浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球中空长航时无人机产值达到9009百万美元,2024-2030年期间年复合增长率CAGR为8.0%。 环洋市场咨询机构出版了的【全球中空长航时无人机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球中空长航时无人机总体规模,包括产量、产值、消费量、主要生产地区、主要生产商及市场份额,同时分析中空长航时无人机市场主要驱动因素、阻碍因素、市场机遇、挑战、新产品发布等。报告从中空长航时
    GIRtina 2025-01-09 10:35 37浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 115浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2025-01-09 09:58 33浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 105浏览
  • 一个真正的质量工程师(QE)必须将一件产品设计的“意图”与系统的可制造性、可服务性以及资源在现实中实现设计和产品的能力结合起来。所以,可以说,这确实是一种工程学科。我们常开玩笑说,质量工程师是工程领域里的「侦探」、「警察」或「律师」,守护神是"墨菲”,信奉的哲学就是「墨菲定律」。(注:墨菲定律是一种启发性原则,常被表述为:任何可能出错的事情最终都会出错。)做质量工程师的,有时会不受欢迎,也会被忽视,甚至可能遭遇主动或被动的阻碍,而一旦出了问题,责任往往就落在质量工程师的头上。虽然质量工程师并不负
    优思学院 2025-01-09 11:48 54浏览
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 82浏览
  • 在智能网联汽车中,各种通信技术如2G/3G/4G/5G、GNSS(全球导航卫星系统)、V2X(车联网通信)等在行业内被广泛使用。这些技术让汽车能够实现紧急呼叫、在线娱乐、导航等多种功能。EMC测试就是为了确保在复杂电磁环境下,汽车的通信系统仍然可以正常工作,保护驾乘者的安全。参考《QCT-基于LTE-V2X直连通信的车载信息交互系统技术要求及试验方法-1》标准10.5电磁兼容试验方法,下面将会从整车功能层面为大家解读V2X整车电磁兼容试验的过程。测试过程揭秘1. 设备准备为了进行电磁兼容试验,技
    北汇信息 2025-01-09 11:24 51浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 94浏览
  • 1月7日-10日,2025年国际消费电子产品展览会(CES 2025)盛大举行,广和通发布Fibocom AI Stack,赋智千行百业端侧应用。Fibocom AI Stack提供集高性能模组、AI工具链、高性能推理引擎、海量模型、支持与服务一体化的端侧AI解决方案,帮助智能设备快速实现AI能力商用。为适应不同端侧场景的应用,AI Stack具备海量端侧AI模型及行业端侧模型,基于不同等级算力的芯片平台或模组,Fibocom AI Stack可将TensorFlow、PyTorch、ONNX、
    物吾悟小通 2025-01-08 18:17 43浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦