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每天必学之bytes字节
Jan 28 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
Django在win10下的安装并创建工程
Nov 20 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
python random从集合中随机选择元素的方法
Jan 23 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 Python
keras之权重初始化方式
May 21 Python
pytorch 常用函数 max ,eq说明
Jun 28 Python
零基础学python应该从哪里入手
Aug 11 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
matplotlib自定义鼠标光标坐标格式的实现
Jan 08 Python
numba提升python运行速度的实例方法
Jan 25 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+xslt在windows平台上
2006/10/09 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
JavaScript中Math对象使用说明
2008/01/16 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
老生常谈Python基础之字符编码
2017/06/14 Python
Anaconda入门使用总结
2018/04/05 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
python使用PyQt5的简单方法
2019/02/27 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
python识别验证码的思路及解决方案
2020/09/13 Python
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
复古服装:RetroStage
2019/05/10 全球购物
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
周年庆典邀请函范文
2014/01/24 职场文书
股份转让协议书
2014/04/12 职场文书
家长建议怎么写
2014/05/15 职场文书
普通党员整改措施
2014/10/24 职场文书