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 相关文章推荐
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 Python
Python中matplotlib中文乱码解决办法
May 12 Python
python字典操作实例详解
Nov 16 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Python使用百度api做人脸对比的方法
Aug 28 Python
Python jieba库用法及实例解析
Nov 04 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
解决Django Haystack全文检索为空的问题
May 19 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 Python
python中如何对多变量连续赋值
Jun 03 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 显示指定路径下的图片
2009/10/29 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
2015/03/02 PHP
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
[33:42]LGD vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python中__call__方法示例分析
2014/10/11 Python
详解python3实现的web端json通信协议
2016/12/29 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
外语系毕业生自荐信范文
2013/12/16 职场文书
售后服务承诺书模板
2014/05/21 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
2015年教师节广播稿
2015/08/19 职场文书
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript
Python中使用ipython的详细教程
2021/06/22 Python
mysql的Buffer Pool存储及原理
2022/04/02 MySQL
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server