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的加密模块md5、sha、crypt使用实例
Sep 28 Python
python执行get提交的方法
Apr 29 Python
python采集百度百科的方法
Jun 05 Python
Python实现的归并排序算法示例
Nov 21 Python
快速了解Python相对导入
Jan 12 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
解决Django一个表单对应多个按钮的问题
Jul 18 Python
python django model联合主键的例子
Aug 06 Python
Python操作Jira库常用方法解析
Apr 10 Python
解决python运行启动报错问题
Jun 01 Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 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中上传多个文件的表单设计例子
2014/11/19 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
jquery JSON的解析方式
2009/07/25 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
原生JS实现日历组件的示例代码
2017/09/22 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
详解Python中列表和元祖的使用方法
2015/04/25 Python
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
Python中操作mysql的pymysql模块详解
2016/09/13 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
python字典操作实例详解
2017/11/16 Python
Django admin美化插件suit使用示例
2017/12/12 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
英国网上超市:Ocado
2020/03/05 全球购物
如何设置Java的运行环境
2013/04/05 面试题
NET程序员上机面试题
2015/05/23 面试题
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
英文简历中的自我评价
2013/10/06 职场文书
物业公司采购员岗位职责
2013/12/31 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
python可视化大屏库big_screen示例详解
2021/11/23 Python
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA