首页/文章/ 详情

傅里叶变换理论很难,但ANSYS的*FFT不复杂,时域-频率分析很方便

2年前浏览4873

FFT称为快速傅立叶变换(Fast Fourier Transformation),是时域-频率变换分析方法之一。

傅立叶变换的理论、原理和方法比较成熟,这些内容可参见相关书籍,这里只介绍ANSYS命令*FFT应用的最基本知识(土木工程而言)。

一、*FFT格式与用法

*FFT,Type,InputData,OutputData,DIM1,DIM2,ResultFormat

其中Type为FFT转换类型,FORW—正变换,BACK—逆变换。

InputData为要FFT变换的矩阵或向量名,矩阵为*DMAT创建的稠密矩阵,向量为*VEC创建的向量。输入数据可以是实序列,也可为复序列。

OutputData为FFT变换后保存的矩阵或向量名,其数据类型与输入数据一致,并且必须在*FFT之前先定义(创建)。在复域,无论正变换或逆变换,输入数据和输出数据均为复序列。在实域,正变换输入实序列,而输出则为复序列;逆变换输入复序列,输出为实序列。

DM1为向量项数或矩阵行数,缺省为输入向量项数或输入矩阵的行数。

DM2为矩阵列数,缺省为输入矩阵的列数。

ResultFormat为结果格式,FULL—保存全部结果,由DM1和DM2确定(当然可采用缺省值);PART—保存部分结果(仅对实序列),对输入的实序列,FFT结果的实数部分对称而虚部共轭,如此可节省计算时间和储存空间。

*FFT正变换输入实序列或复序列,输出均为复序列。*FFT逆变换输入均为复序列,但输出可为实序列(实域)或复序列(复域),一般仅用实序列。

二、FFT与*FFT基本知识

为易于理解和说明,这里仅以时间信号为例,通俗地(非专业)介绍一下FFT。

1.采样、采样频率、采样周期、采样间隔

采样是将一个连续信号转换成一个离散数据序列(即时间上的离散点)。采样频率是指每秒从连续信号中提取并组成离散信号的个数(叫采样个数),用Fs表示,单位为赫兹(Hz)。采样频率的倒数是采样周期,也就是采样的时间间隔DET。

2.傅里叶变换之FFT

傅里叶变换通常分为四种类别,即非周期性连续信号傅里叶变换(FT-Fourier Transform)、周期性连续信号傅里叶级数(FS-Fourier Series)、非周期性离散信号离散时域傅里叶变换(DTFT-Discrete Time Fourier Transform)和周期性离散信号离散傅里叶变换(DFT-Discrete Fourier Transform)。

FFT即快速傅里叶变换是DFT的一种快速算法或工具,DFT的基本公式如图1所示,FFT只是通过某种算法(当然该算法很牛)实现这个公式。

image.png

如不关心图1公式,只需知道:无论正变换还是逆变换,FFT变换的输入和输出都是N个数据点的序列。正变换的输出序列是幅值和相位数据,与采样频率联系时,就成为幅频;逆变换的输出序列数据与采样频率联系时,就是时间序列,一般不考虑复序列。

k点数据对应的频率:(k-1)/N*Fs或(k-1)/N/Det

n点数据对应的时间:(n-1)/Fs或(n-1)*Det

3.幅频图上0Hz对应的非零幅值与处理

FFT正变换可将时域信号转换为频率信号,而绘制的幅频图上可以看到有多个峰值,通常关心的是峰值对应的频率。在0Hz坐标处有时有很大的幅值,则表示x(t)中存在“直流”信号,要去除该值,可对x(t)进行处理,即将离散的x(n)求平均,将x(n)-均值后再做FFT即可。

4.*FFT结果格式为PART时,如何实现其逆变换?

*FFT结果输出时有PART和FULL两种格式,PART格式输出N/2 1个数据,其后数据均为零;FULL格式则为全部N个数据。因此,PART格式计算幅频数据时只需计算一半数据的模,而FULL格式可计算N个数据的模。

但当PART格式要频域滤波并进行逆变换时,必须将N/2 1个数据补全到N个数据。而PART格式N/2 1后面为零的数据,与前面N/2个数据是对称的,也就是共轭复数,按此补全数据即可。详见下文的*FFT应用实例命令流。

5.频域滤波

时域滤波和频率滤波都有很多方法,这里仅仅介绍频率滤波方法之一,该方法简单,过程如下:

A.对离散时域信号正变换,得到N个复序列数据。

B.对上述数据求模,当模小于某个阈值时,将对应复序列数据的实部和虚部赋零。

C.对滤波后的复序列进行逆变换,得到时域的数据,完成频率滤波。

详见下文的*FFT应用实例命令流。

三、*FFT应用实例

特别注意:下述命令流因在公式信号的基础上添加了随机噪音,每次运算后的结果会有差别。其次,命令流中为了演示一些数据的不同获取方法,也采用了看似不必要的命令,如获得矩阵大小的方法、复矩阵的实部和虚部的提取等等。

FINISH$/CLEAR$/POST26

PI=ACOS(-1)

N=1024!离散数据点个数

DT=0.001!时间间隔

*DIM,YSXH,,N!原始信号

*DIM,SJZS,,N!随机噪声(0,1)

*DIM,ZSXH,,N!噪声信号

!1)=================================

!先对噪声充值,然后按公式采样

!并添加噪声形成噪声信号

*VFILL,SJZS,RAND,0,1!均匀分布随机数

*DO,I,1,N

TI=(I-1)*DT

YSXH(I)=2.5*SIN(40*TI 4) 2*SIN(70*TI 1) 1.5*SIN(130*TI)

ZSXH(I)=YSXH(I) 6.0*SJZS(I)

*ENDDO

!2)=================================

!是否去直处理,简单去除均值

SFQZ=0 !0-去直,1-不去

*IF,SFQZ,EQ,0,THEN

JZ=0

*DO,I,1,N$JZ=JZ ZSXH(I)$*ENDDO

JZ=JZ/N

*DO,I,1,N$ZSXH(I)=ZSXH(I)-JZ$*ENDDO

*ENDIF

!3)=================================

!绘制信号曲线(仅为显示)-"变量T"

*DIM,YSXHT,TABLE,N

*DIM,ZSXHT,TABLE,N

*DIM,TT,TABLE,N

*DO,I,1,N,1

TT(I)=(I-1)*DT

YSXHT(I)=YSXH(I)$

ZSXHT(I)=ZSXH(I)

*ENDDO!!

*VPLOT,TT,YSXHT

*VPLOT,TT,ZSXHT

!图2的一些曲线

image.png

!4)=================================

!导入APDLMATH箱,进行FFT正变换

*VEC,ZSXH_M,D,IMPORT,APDL,ZSXH

!FFTKEY结果格式:0-PART,1-FULL

FFTKEY=1

!FFT变换--输出矩阵必须先定义

!输出数据SCDX_M(输出大X)

*VEC,SCDX_M,Z,ALLOC,N

*IF,FFTKEY,EQ,0,THEN

*FFT,FORW,ZSXH_M,SCDX_M,,,PART!

*ELSE

*FFT,FORW,ZSXH_M,SCDX_M,,,FULL!

*ENDIF!

!5)=================================

!获取输出数据的实部和虚部结果

*VEC,SCDXR_M,D,COPY,SCDX_M,REAL

*VEC,SCDXI_M,D,COPY,SCDX_M,IMAG

!获取向量SCDXR_M的大小(=N)

OSIZE=SCDXR_M_ROWDIM

*IF,FFTKEY,EQ,0,THEN!

OSIZE=OSIZE/2

*ENDIF!!

!计算输出结果的幅值

*VEC,SCDXM_M,D,ALLOC,OSIZE

*DO,I,1,OSIZE

IR=SCDXR_M(I)$II=SCDXI_M(I)

SCDXM_M(I)=SQRT(IR*IR II*II)

*ENDDO!!!

!绘制幅-频图----------------

*EXPORT,SCDXM_M,APDL,SCDXM

*DIM,SCDXMT,TABLE,OSIZE

*DIM,PLT,TABLE,OSIZE

*DIM,PL,,OSIZE

*DO,I,1,OSIZE!

SCDXMT(I)=SCDXM(I)

PL(I)=(I-1)/N/DT

PLT(I)=PL(I)$*ENDDO

*VPLOT,PLT,SCDXMT

!可输出SCDXM-PL到文件。幅频如图3

image.png

!6)=================================

!准备逆变换,如为PART则将结果补全

!将SCDX_M赋予SCDX2_M

*VEC,SCDX2_M,Z,COPY,SCDX_M

!如果为PART补充至FULL

*IF,FFTKEY,EQ,0,THEN!!!

*DO,I,OSIZE 2,N

SCDX2_M(I,1)=SCDX2_M(2*OSIZE-I 2,1)

SCDX2_M(I,2)=-SCDX2_M(2*OSIZE-I 2,2)

*ENDDO!!!!

*ENDIF!!!

!7)=================================

!进行频域滤波

YZ=150.0!设置模的阈值

*DO,I,1,N,1!

IR=SCDX2_M(I,1)

II=SCDX2_M(I,2)

MI=SQRT(IR*IR II*II)

*IF,MI,LT,YZ,THEN

SCDX2_M(I,1)=0.0

SCDX2_M(I,2)=0.0

*ENDIF!!!!

*ENDDO!!!!!

!8)=================================

!进行逆变换得到频率滤波后的实序列

!必须先定义变换的输出矩阵

!逆变换输出数据SCXX_M

*VEC,SCXX_M,D,ALLOC,N

*FFT,BACK,SCDX2_M,SCXX_M

!9)=================================

!输出或绘制滤波后的时域信号

*EXPORT,SCXX_M,APDL,SCXX

*DIM,SCXXT,TABLE,N

*DO,I,1,N,1!!!

SCXXT(I)=SCXX(I)

*ENDDO!!!!!!

*VPLOT,TT,SCXXT!如图2中

综上所述,*FFT可很简便的实现信号的FFT。如果对某些内容不感兴趣进一步简说,那就是*FFT输入N个数据,输出也是N个数据;与采样频率关联时,FFT正变换输入N个实序列数据(时域数据),输出N个复序列数据(频域数据);FFT逆变换输入N个复序列数据(频域数据),输出N个实序列数据(时域数据)。

image.png

理论科普代码&命令求解技术其他软件
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-08-12
最近编辑:2年前
王新敏
硕士 | 教授 好好学习,天天快乐
获赞 119粉丝 590文章 97课程 0
点赞
收藏
未登录
6条评论
哈
签名征集中
1月前
老师,您好,能否请教一下ansys APDL 如何实现增量动力时程分析?尝试进行循环改变地震峰值,发现时间没有办法从0开始
回复
溪溪适扬
签名征集中
2年前
老师您好,谢谢您解决了我的问题。我关注到Simapps仿真APP开发者社区在招募CAE技术专家,推荐给您看下,https://www.simapps.com/v/29388.html
回复
TheQing
签名征集中
2年前
王老师您好,我想向您请教 ANSYS中的优化设计是怎么设置的呢
回复
Clement仁
签名征集中
2年前
好的,谢谢您的解答
回复
王新敏
好好学习,天天快乐
2年前
这块我较少涉及。经典中也有(搜索疲劳即可),但专业模块更强,如fe-safe,ncode等。
回复
Clement仁
签名征集中
2年前
王老师您好,我是看了您的专著时候慢慢熟悉掌握ansys软件。我想问一下,关于疲劳分析这一块,是不是需要学习ansys中的workbench这块来进行分析的,ansys经典板块我没有找到相关的,我是ansys19.2版本的。
回复
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈