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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
python选择排序算法实例总结
Jul 01 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
一看就懂得Python的math模块
Oct 21 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
python实现本地批量ping多个IP的方法示例
Aug 07 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
10款最佳Python开发工具推荐,每一款都是神器
Oct 15 Python
Python turtle编写简单的球类小游戏
Mar 31 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
Zerg兵种介绍
2020/03/14 星际争霸
提高PHP编程效率 引入缓存机制提升性能
2010/02/15 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
php闭包中使用use声明变量的作用域实例分析
2018/08/09 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
jQuery实现的调整表格行tr上下顺序
2016/01/10 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
node.js实现的装饰者模式示例
2017/09/06 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
JS实现密码框效果
2020/09/10 Javascript
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
Python访问纯真IP数据库脚本分享
2015/06/29 Python
python操作oracle的完整教程分享
2018/01/30 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
python读取和保存图片5种方法对比
2018/09/12 Python
python调用staf自动化框架的方法
2018/12/26 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
解决python运行启动报错问题
2020/06/01 Python
MaBelle玛贝尔香港官网:香港钻饰连锁店
2019/09/09 全球购物
农行实习自我鉴定
2013/09/22 职场文书
幼儿师范毕业生自荐信
2013/11/09 职场文书
外语系毕业生找工作的求职信
2013/11/28 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
铅球加油稿100字
2014/09/26 职场文书
在职证明书模板
2015/06/15 职场文书
2015年小学生暑假总结
2015/07/13 职场文书