FFT快速傅里叶变换的python实现过程解析


Posted in Python onOctober 21, 2019

FFT是DFT的高效算法,能够将时域信号转化到频域上,下面记录下一段用python实现的FFT代码。

# encoding=utf-8

import numpy as np
import pylab as pl # 导入和matplotlib同时安装的作图库pylab


sampling_rate = 8000 # 采样频率8000Hz
fft_size = 512  # 采样点512,就是说以8000Hz的速度采512个点,我们获得的数据只有这512个点的对应时刻和此时的信号值。
t = np.linspace(0, 1, sampling_rate)  # 截取一段时间,截取是任意的,这里取了0~1秒的一段时间。

x = np.sin(2*np.pi*156.25*t) + 2*np.sin(2*np.pi*234.375*t) # 输入信号序列,人工生成了一段信号序列,范围在0~1秒
xs = x[:fft_size]  # 由上所述,我们只采样了512个点,所以我们只获得了前512个点的数据
xf = np.fft.rfft(xs)/fft_size # 调用np.fft的函数rfft(用于实值信号fft),产生长度为fft_size/2+1的一个复数向量,分别表示从0Hz~4000Hz的部分,这里之所以是4000Hz是因为Nyquist定理,采样频率8000Hz,则能恢复带宽为4000Hz的信号。最后/fft_size是为了正确显示波形能量

freqs = np.linspace(0, sampling_rate//2, fft_size//2 + 1) # 由上可知,我们得到了数据,现在产生0~4000Hz的频率向量,方便作图
xfp = 20*np.log10(np.clip(np.abs(xf), 1e-20, 1e1000)) # 防止幅值为0,先利用clip剪裁幅度,再化成分贝

pl.figure(figsize=(8, 4)) # 生成画布
pl.subplot(211) # 生成子图,211的意思是将画布分成两行一列,自己居上面。
pl.plot(t[:fft_size], xs) # 对真实波形绘图
pl.xlabel(u"time(s)")
pl.title(u"The Wave and Spectrum of 156.25Hz and 234.375Hz")
pl.subplot(212) # 同理
pl.plot(freqs, xfp) # 对频率和幅值作图,xlabel是频率Hz,ylabel是dB
pl.xlabel(u"Hz")
pl.subplots_adjust(hspace=0.4) # 调节绘图参数
pl.show()

代码进行了详细标注。有一个小细节是FFT对于取样时间有要求。N点FFT进行精确频谱分析的要求是N个取样点包含整数个取样对象的波形。因此N点FFT能够完美计算频谱,对取样对象的要求是n*Fs/N(n*采样频率/FFT长度)在本例中Fs = 8000Hz,N=512 base_freq=15.625Hz 所以本例中给出了频率为156.25Hz(n=10)和234.375Hz(n=15)做例子。

效果如下:

FFT快速傅里叶变换的python实现过程解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python itertools模块详解
May 09 Python
python多进程共享变量
Apr 06 Python
对于Python中RawString的理解介绍
Jul 07 Python
Sanic框架配置操作分析
Jul 17 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
python中的global关键字的使用方法
Aug 20 Python
Python 3.8 新功能大揭秘【新手必学】
Feb 05 Python
Python @property原理解析和用法实例
Feb 11 Python
Python中使用filter过滤列表的一个小技巧分享
May 02 Python
python 三种方法实现对Excel表格的读写
Nov 19 Python
OpenCV+Python3.5 简易手势识别的实现
Dec 21 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 #Python
python文件读写代码实例
Oct 21 #Python
python 动态调用函数实例解析
Oct 21 #Python
python 两个数据库postgresql对比
Oct 21 #Python
python多进程(加入进程池)操作常见案例
Oct 21 #Python
Python实现字符串中某个字母的替代功能
Oct 21 #Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 #Python
You might like
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
11个PHPer必须要了解的编程规范
2014/09/22 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
PHP上传图片类显示缩略图功能
2016/06/30 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
json 实例详细说明教程
2009/10/31 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
浅析vue数据绑定
2017/01/17 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
2017/04/17 jQuery
bootstrap轮播图示例代码分享
2017/05/17 Javascript
微信小程序报错:this.setData is not a function的解决办法
2017/09/27 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
python新手经常遇到的17个错误分析
2014/07/30 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
Django操作session 的方法
2020/03/09 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
公司前台接待岗位职责
2013/12/03 职场文书
教师师德考核自我评价
2014/09/13 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
2016年小学生新年寄语
2015/08/18 职场文书
导游词之张家口
2019/12/13 职场文书