本文摘要(由AI生成):
本文介绍了使用FFT(快速傅里叶变换)在ANSYS APDL(参数化设计语言)环境中进行信号处理的详细步骤。内容涵盖了FFT正变换与逆变换的实现,包括数据的导入、FFT参数设置、结果获取(实部和虚部)、计算幅值、绘制幅频图、频域滤波以及逆变换后时域信号的绘制。特别强调了FFT变换中输入与输出数据的性质(实序列与复序列),以及如何通过FFTKEY参数控制结果格式(PART或FULL)。最终,通过*FFT函数简化了信号的FFT处理过程,并提供了FFT在信号分析中的基本理解和应用。
FFT称为快速傅立叶变换(Fast Fourier Transformation),是时域-频率变换分析方法之一。
傅立叶变换的理论、原理和方法比较成熟,这些内容可参见相关书籍,这里只介绍ANSYS命令*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。
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只是通过某种算法(当然该算法很牛)实现这个公式。
如不关心图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应用实例命令流。
特别注意:下述命令流因在公式信号的基础上添加了随机噪音,每次运算后的结果会有差别。其次,命令流中为了演示一些数据的不同获取方法,也采用了看似不必要的命令,如获得矩阵大小的方法、复矩阵的实部和虚部的提取等等。
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的一些曲线
!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
!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个实序列数据(时域数据)。