FFT原理

原理目前还未搞懂

FFT程序

安装以下这几个库,(cmd下输入pip install matplotlib)
import numpy as np
from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt
import seaborn

1、生成一个0到1的等差序列 列表,用来表示X轴,即采样点。还有另一个意义,1刚好表示1秒,则列表的长度,就是采样频率Fs

例如:以下是生成10个点的等差数列,即采样频率Fs=10Hz

python 音频傅里叶变换 python快速傅里叶变换求幅值_python 音频傅里叶变换

2、生成纵坐标y值, 这是x的函数

python 音频傅里叶变换 python快速傅里叶变换求幅值_归一化_02


6----表示的是正弦波的幅值

当10x等于1的时候,括号里的值就是 2pi1, 刚好是一个周期的正弦波,如下图。如果x=1,则括号里是 10个2pi,则是10个周期正弦波。所以10是正弦波的频率。

python 音频傅里叶变换 python快速傅里叶变换求幅值_FFT_03


python 音频傅里叶变换 python快速傅里叶变换求幅值_正弦波_04

3、调用函数对 y进行傳里叶变换, 每一个y值对应一个复数,所以变换出来的也是一个列表

python 音频傅里叶变换 python快速傅里叶变换求幅值_取模_05


4、分别对变换出来的复数,取实部, 虚部,取模

yy=fft(y)                     #快速傅里叶变换
yreal = yy.real               # 获取实数部分
yimag = yy.imag               # 获取虚数部分
yf=abs(yy)                # 取模

5、归一化
如果需要归一化,则进行归一化,不然可以不归一化

yf1=yf / ((len(x)/2))           #归一化处理

归一化就是用模除以 采样点个数的一半, 没想明白?

yf2 =  yf1[range(int(len(x)/2))]  #由于对称性,只取yf1 列表的一半区间

6、生成X轴坐标

xf = np.arange(len(y))        # 这里就是生成一个0-n的列表
xf1 = xf
xf2 = xf[range(int(len(x)/2))]  #取一半区间

python 音频傅里叶变换 python快速傅里叶变换求幅值_python 音频傅里叶变换_06

7、画出FFT图,并显示出来
plt.plot(xf2,yf2,‘b’)
plt.show()