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常用小技巧总结
Jun 01 Python
redis之django-redis的简单缓存使用
Jun 07 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
详解用python计算阶乘的几种方法
Aug 14 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 Python
python 画函数曲线示例
Dec 04 Python
Python迭代器模块itertools使用原理解析
Dec 11 Python
Python中使用gflags实例及原理解析
Dec 13 Python
Python : turtle色彩控制实例详解
Jan 19 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
Django 实现jwt认证的示例
Apr 30 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
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
php实现的mongodb操作类
2015/05/28 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Python中文竖排显示的方法
2015/07/28 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
python 线程的五个状态
2020/09/22 Python
Django实现随机图形验证码的示例
2020/10/15 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
学校岗位设置方案
2014/01/16 职场文书
平安工地建设方案
2014/05/06 职场文书
超市店庆活动方案
2014/08/31 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis