【PY】FFT小结(1:频率和振幅的处理)

前言

今天尝试用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里面直接处理。当我输出的数据中时域横轴选的是时间步真实时间时,结果分别是这样:

【PY】FFT小结(1:频率和振幅的处理)_第1张图片
Monitor_P7_L1500.png
【PY】FFT小结(1:频率和振幅的处理)_第2张图片
Monitor_P7_L1500_time.png

从图中可以看到,两个图线样子是一样的,振幅也相同,但是频率差很大
数据为时间步的,频率从0到1
数据为真实时间的,频率从0到20多万
这儿我就搞不懂了,到底频率应该是多少啊?

处理方法

后来我找的网上的两个例子正好对频率有不同的处理方法,对比过之后我找到了正确的处理方法。
首先明确一点,tecplot的处理是没有问题,而我应该用“真实时间”结果去进行FFT,那么我在程序中要怎么做到计算出正确的频率和振幅?

- 频率处理方法

正确做法如下:

  1. 提供采样率 Fs(采样率就是单位时间内采集的样本数)
    • 根据采样区间Ts来算,Fs=1/Ts
    • Ts在非定常计算里就是时间步,在080N计算中Ts=4.8828125e-6 s
    • 因此Fs=1/Ts=204800(这就是20多万的准确数字)
  2. 用采样率算出我这段数据中一共有多少个周期 T = n/Fs
    • 这个n是我给的这段数据的采样点数,比如我的例子中n=1500
    • Fs通常是个很大的数字,在我的非定常计算中T实际上是远小于1的
  3. 把采样点数的等差数列k除以周期T,就是频率 frq = k/T
    • k = np.arange(n)(就是 [0, 1, 2, ... , 1500])
  4. 所以这样看来,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就好了。
这是因为,采样点数越多,振幅是成比例增大的

你可能感兴趣的:(【PY】FFT小结(1:频率和振幅的处理))