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使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
Python正则捕获操作示例
Aug 19 Python
基于Python闭包及其作用域详解
Aug 28 Python
利用python解决mysql视图导入导出依赖的问题
Dec 17 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 Python
在Django admin中编辑ManyToManyField的实现方法
Aug 09 Python
python之yield和Generator深入解析
Sep 18 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
Python 使用threading+Queue实现线程池示例
Dec 21 Python
Pytorch 实现数据集自定义读取
Jan 18 Python
pandas创建DataFrame的7种方法小结
Jun 14 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学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
Laravel 5框架学习之表单
2015/04/08 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
Javascript Global对象
2009/08/13 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
xml转json的js代码
2012/08/28 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
Python中扩展包的安装方法详解
2017/06/14 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
python3中zip()函数使用详解
2018/06/29 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
给同事的道歉信
2014/01/11 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
银行办公室岗位职责
2014/03/10 职场文书
导师工作推荐信范文
2014/05/17 职场文书
办公室主任岗位承诺书
2014/05/29 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
党员自我剖析材料(群众路线)
2014/10/06 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS