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中的split()函数的使用方法
Apr 07 Python
在Django的模板中使用认证数据的方法
Jul 23 Python
遗传算法之Python实现代码
Oct 10 Python
Python 统计字数的思路详解
May 08 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
Python Django Cookie 简单用法解析
Aug 13 Python
Python数据分析模块pandas用法详解
Sep 04 Python
python django中8000端口被占用的解决
Dec 17 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
jupyter notebook实现显示行号
Apr 13 Python
Python如何识别银行卡卡号?
Jun 10 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正确解析UTF-8字符串技巧应用
2012/11/07 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
IE6浏览器中window.location.href无效的解决方法
2014/11/20 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
2018/04/18 jQuery
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python基础教程之udp端口扫描
2014/02/10 Python
python利用正则表达式提取字符串
2016/12/08 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
python实现图片批量压缩程序
2018/07/23 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
Python中bisect的用法及示例详解
2020/07/20 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
2014年大学生就业规划书
2014/04/04 职场文书
大学生在校表现评语
2014/12/31 职场文书
故宫英文导游词
2015/01/31 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书