首页/文章/ 详情

【知识拓展】手把手教你实现快速傅里叶变换(FFT)的3种工具

1年前浏览3000

背景

傅里叶变换应该是有史以来最伟大、最深刻的数学发现之一。作为工科生我们更是离不开这个强大的数学工具。但无奈傅里叶分析的公式看起来太复杂了,想要用起来还得先理解公式,真是为难我胖虎了·····
秉承着“做工程,只要会用就行”的理念,本文整理了3个保姆级教程,方便工程师快速将时域数据转换成频域数据。这三种方法,从傻瓜式的一键转换到自己编写代码,相互验证。如果想了解FFT的原理,建议以方法三、方法二、方法一的顺序观看。


1
midas Gen一键FFT功能    


在时程荷载菜单里,输入的时程数据均可以点击FFT进行快速傅里叶变换,如下:

(可以长按图片保存,在手机相册观看更清晰)

优点:傻瓜式一键操作,有手就能操作

缺点:转换后数据不能提取,只能点击鼠标查看结果

     


   
2
利用Excel的数据分析功能    


一、先确认excel表格是否有数据分析功能。

如果没有,则需要添加该功能,方法如下:

  1. 点击“文件”打开“选项”,选择“自定义功能区”,把“开发工具”这个打上“√”,如下图:

       
     
  2. 点击菜单栏“开发工具”中的“Excel加载项”,把“分析工具库”这个打上“√”,如下图:

     

二、将需要傅里叶变换的数据粘贴至excel表格中。

Excel的傅里叶分析数据个数要为2^n(例如:16……1024、2048、4096)。但是一般数据不会刚好是这个数值,所以需要进行补充或截断。

  • 如果尾部数据不重要,建议删除多余数据;
  • 如果尾部数据数据比较重要时,可以采用补充的方式,将不够的数据填为0,如下:

尾部数据不重要时删除多余数据

尾部数据数据比较重要时采用填充0的方式

三、开始计算

1、复 制数据到表格,本文为1024个数据(下图B、C列)

2、给数据编号(下图A列)

3、计算目标数据均值=数据总和/数据个数(下图D列)

4、数据中心化=目标数据-数据均值(下图E列)

5、傅里叶变换:对中心化后的数据(E列)进行傅里叶分析(下图F列)

4、求复数的模使用IMABS函数,对傅里叶变换后的值求模(下图G列)

5、幅值修正将求得的模除以数据个数(本文为1024),由于FFT之后为对称的双边谱,一般取前半部分,所以谱密度需要再乘以2(下图H列)

6、频域横坐标=(采样序号-1)/总时间(下图I列)

7、绘图取前半部分绘图
(表格下载链接见文末)

优点:可以提取变换后的数据

缺点:对数据点数有要求,需要是2^n个数,数据的补充和截断越多,误差越大。

   



3
利用MATLAB编写代码    


话不多说,直接上代码:

%将表格和.m文件放在一个目录下,一般表格的第一列为时间,第二列为需要进行傅里叶转换的目标数据    
date=xlsread('a2.xlsx');    
time=date(:,1); %提取表格第一列数据    
amplitude=date(:,2);%提取表格第二列数据    
%接着做fft分析    
response0=amplitude;%让amplitude等于response代表输出值    
response=response0-mean(response0);%数据中心化在开始变换前,需要将数据的直流分量(DC),也就是目标数据的平均值减去,否则FFT之后会在0Hz频率处有一个很强的频率分量,有可能会导致其他频率分量被淹没。    
y=fft(response);%利用MATLAB自带用fft函数对其转换    
sampleNumber=length(response);%样本数量等于response的长度    
ytemp1=abs(y/sampleNumber);%对傅里叶变换后的值求模    
ytemp2=ytemp1(1:sampleNumber/2+1);%由于FFT之后为对称的双边谱,一般取前半部分    
FreqResponse=ytemp2;    
FreqResponse(2:end)=2*FreqResponse(2:end);%因为只取一半,所以谱密度乘以2    
fbins=(0:(sampleNumber/2))/time(end);%频域横坐标频率值,只取样本一半    

   
%plot result    
%时域图    
subplot( 2, 1, 1 ) ;    
plot(time,amplitude) ;    
title( '原始信号' ) ;    
xlabel( 't/s' ) ;    
ylabel( 'f(t)' ) ;    
legend('Time-domian')    
%频域图像    
subplot( 2, 1, 2 ) ;    
plot(fbins,FreqResponse) ;hold on    
title( 'Fourier' ) ;    
xlabel( '频率/HZ' ) ;    
ylabel( '幅值' ) ;    
legend('Frequency-domian')    
%在图形中标出频率最大值    
ind = find( FreqResponse==max(FreqResponse), 1, 'first' ) ; %查找频率第一个最大值的下标    
x0 = fbins( ind ); %得到横坐标    
y0 = FreqResponse( ind ); %得到纵坐标    
plot( x0, y0, 'ro' );    
hold off    
text(x0,y0,num2str(x0,'频率=%f')) ;    


优点:对数据的个数没有限制,所以不要截断或补充,更加接近真实值

缺点:需要有一定的编程基础

   


4
结果对比      



综上:样本数量刚好满足2的N次幂时,三者结果基本一致;当需要补充或截断数据时,Excel分析会有较大误差,MATLAB最真实,midas Gen居中。



来源:midas机械部落

附件

免费快速傅里叶变换FFT计算表格.xlsx
MATLAB
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-10-25
最近编辑:1年前
MIDAS官方
幸福、贡献、分享-用技术创造幸福
获赞 125粉丝 334文章 446课程 11
点赞
收藏
作者推荐

免费 5.0
未登录
1条评论
Tek
签名征集中
1年前
怎样对一个面进行FFT,然后画出云图呢
回复
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈