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实现下载网易云音乐的高清MV
Mar 16 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 Python
python如何求解两数的最大公约数
Sep 27 Python
python隐藏终端执行cmd命令的方法
Jun 24 Python
简单了解python代码优化小技巧
Jul 08 Python
基于python全局设置id 自动化测试元素定位过程解析
Sep 04 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 Python
Pytorch DataLoader shuffle验证方式
Jun 02 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
php预定义常量
2006/12/25 PHP
PHP 文件扩展名 获取函数
2009/06/03 PHP
写出高质量的PHP程序
2012/02/04 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
2013/04/25 PHP
PHP中的socket_read和socket_recv区别详解
2015/02/09 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
XENON基于JSON变种
2010/07/27 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
详解python eval函数的妙用
2017/11/16 Python
python抽取指定url页面的title方法
2018/05/11 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
软件设计的目标是什么
2016/12/04 面试题
幼儿教师自我鉴定
2013/11/02 职场文书
小学教师办公室制度
2014/02/03 职场文书
仓库文员岗位职责
2014/04/06 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
2014年科技工作总结
2014/11/26 职场文书