前言
今天尝试用Python来做FFT
FFT的原理就不涉及了,主要是应用
其实Tecplot里面有Fourier Transformation的功能,但是我嫌做起来不够优雅
做出来的图很丑不说,无量纲起来也不明不白的
所以决定用Python试试看。
简单的实现
其实核心功能非常之简单,直接y=fft(y)就可以……
当然是用的现成的库里的,一开始要import:
from scipy.fftpack import fft
也可以用numpy里的,但是用的时候语句就长一点
import numpy as np
yy=np.fft.fft(y)
所以是不是也可以这样:
from numpy import fft.fft
yy=fft.fft(y)
噢试了一下并不行,应该语法上还有些问题
反正最后还是用scipy了。
问题的提出
这个功能实现起来非常之简单了
只要给出一组离散点数据,然后fft一下就有频率和振幅结果了
但是我搞不清楚的是,怎么样的频率和振幅是正确的?
比如我把一组80%转速下1500步的P7结果输出,然后放到Tecplot里面直接处理。当我输出的数据中时域横轴选的是时间步和真实时间时,结果分别是这样:
从图中可以看到,两个图线样子是一样的,振幅也相同,但是频率差很大
数据为时间步的,频率从0到1
数据为真实时间的,频率从0到20多万
这儿我就搞不懂了,到底频率应该是多少啊?
处理方法
后来我找的网上的两个例子正好对频率有不同的处理方法,对比过之后我找到了正确的处理方法。
首先明确一点,tecplot的处理是没有问题,而我应该用“真实时间”结果去进行FFT,那么我在程序中要怎么做到计算出正确的频率和振幅?
- 频率处理方法
正确做法如下:
- 提供采样率 Fs(采样率就是单位时间内采集的样本数)
- 根据采样区间Ts来算,Fs=1/Ts
- Ts在非定常计算里就是时间步,在080N计算中Ts=4.8828125e-6 s
- 因此Fs=1/Ts=204800(这就是20多万的准确数字)
- 用采样率算出我这段数据中一共有多少个周期 T = n/Fs
- 这个n是我给的这段数据的采样点数,比如我的例子中n=1500
- Fs通常是个很大的数字,在我的非定常计算中T实际上是远小于1的
- 把采样点数的等差数列k除以周期T,就是频率 frq = k/T
- k = np.arange(n)(就是 [0, 1, 2, ... , 1500])
- 所以这样看来,frq = Fs * (k/n)
- 在Tecplot中这步他是处理对的
- 对于“时间步”的结果,时域横轴是时间步,间隔都为1,即Ts=1,则Fs=1,所以frq就是一个从0到1分成n份的数列
- 对于“真实时间”的结果,时域横轴是非定常步长,即Ts = 4.8828125e-6 s,那么Fs = 204800,所以frq是从0到204800分成n份的数列
- 幅值处理方法
以上是采样频率的处理,幅值也是要处理的,幅值的处理就比较简单,除以,处理出来的结果除以采样点数n就好了。
这是因为,采样点数越多,振幅是成比例增大的