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的函数嵌套的使用方法
Jan 24 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
python实现下载整个ftp目录的方法
Jan 17 Python
python3+PyQt5实现文档打印功能
Apr 24 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
numpy求平均值的维度设定的例子
Aug 24 Python
python实现复制文件到指定目录
Oct 16 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
Jun 06 Python
基于Python模拟浏览器发送http请求
Nov 06 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
Feb 20 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Apr 13 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 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验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
Extjs中使用extend(js继承) 的代码
2012/03/15 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
2016/04/08 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
python多线程调用exit无法退出的解决方法
2019/02/18 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
Flask配置Cors跨域的实现
2019/07/12 Python
python如何实现单链表的反转
2020/02/10 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
中文专业毕业生自荐信
2013/10/28 职场文书
电脑饰品店的创业计划书
2014/01/21 职场文书
公司活动方案范文
2014/03/06 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
户籍证明格式
2014/09/15 职场文书
企业计划生育责任书
2015/05/09 职场文书
英语演讲开场白
2015/05/29 职场文书
python实现会员管理系统
2022/03/18 Python