基于python的FFT频率和振幅处理

一:FFT变换

fft变换其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。
  和傅立叶变换算法对应的是反傅立叶变换算法。该反变换从本质上说也是一种累加处理,这样就可以将单独改变的正弦波信号转换成一个信号。因此,可以说,傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅立叶反变换将这些频域信号转换成时域信号。

二、频率和振幅的处理

(1)、频率处理方法

1.提供采样率 Fs
  • 采样率就是单位时间内采集的样本数
  • 根据采样区间Ts来算,Fs=1/Ts
  • Ts在非定常计算里就是时间步,也就是采样区间
  • Ts=1.0/Fs
2. 周期 T
  • 用采样率算出我这段数据中一共有多少个周期 T = n/Fs
  • 这个n是我给的这段数据的采样点数,比如我的例子中n = len(y)
3.频率 frq
  • 把采样点数的等差数列k除以周期T,就是频率 frq = k/T
  • k = np.arange(n)(就是 [0, 1, 2, … , n])
  • 所以这样看来,frq = Fs * (k/n)

(2)、幅值处理方法

幅值也是要处理的,幅值的处理就比较简单,进行归一化处理,处理出来的结果除以采样点数n就好了。
这是因为,采样点数越多,振幅是成比例增大的

二、python代码(TestFFT02.py)

该代码的GitHub地址为:https://github.com/taw19960426/jiSuan01

import matplotlib.pyplot as plt
import numpy as np


Fs = 150.0;                 # 采样率
Ts = 1.0/Fs;                # 采样区间
t = np.arange(0,1,Ts)       # 时间矢量,这里Ts也是步长
#range返回从0到1构成的list,而arange返回一个array对象

fs = 25;                    # frequency of the signal信号频率
y = np.sin(2*np.pi*fs*t)

n = len(y)                  # 信号长度
k = np.arange(n)            #采样点数的等差数列k
T = n/Fs                    #共有多少个周期T
frq = k/T                   # two sides frequency range两侧频率范围
frq1 = frq[range(int(n/2))] # #由于对称性,取一半区间

YY = np.fft.fft(y)          # 未归一化
Y = np.fft.fft(y)/n         #  归一化
Y1 = Y[range(int(n/2))]

fig, ax = plt.subplots(4, 1)

ax[0].plot(t,y)
ax[0].set_xlabel('Time')
ax[0].set_ylabel('Amplitude振幅')

ax[1].plot(frq,abs(YY),'r') #绘制频谱
ax[1].set_xlabel('Freq (Hz)')
ax[1].set_ylabel('|Y(freq)|')

ax[2].plot(frq,abs(Y),'g')  # plotting the spectrum
ax[2].set_xlabel('Freq (Hz)')
ax[2].set_ylabel('|Y(freq)|')

ax[3].plot(frq1,abs(Y1),'b') # plotting the spectrum
ax[3].set_xlabel('Freq (Hz)')
ax[3].set_ylabel('|Y(freq)|')

plt.show()

结果显示:
基于python的FFT频率和振幅处理_第1张图片

四、结果分析

  1. 假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=sqrt(a*a+b*b)(某点处的幅度值An = A*(N/2)
  2. 某点处的幅度值An = A*(N/2),A表示原始信号的幅值,N表示采样点。
  3. 原函数频率fs=25Hz,所以采样区间ts=1/25=0.04。与图中第一个波形相同,0.04*5=0.2。
  4. 已知A=1,N=150,由此可以计算出An=75。与图中第二个波形相同。
  5. 归一化幅度值=An/n=75/100=0.75。

你可能感兴趣的:(FFT,github,python)