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实现将元祖转换成数组的方法
May 04 Python
Python 文件管理实例详解
Nov 10 Python
python 换位密码算法的实例详解
Jul 19 Python
Python模拟三级菜单效果
Sep 11 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
Python 查看文件的读写权限方法
Jan 23 Python
python实现图片文件批量重命名
Mar 23 Python
python opencv调用笔记本摄像头
Aug 28 Python
python实现文件的分割与合并
Aug 29 Python
Python 实现OpenCV格式和PIL.Image格式互转
Jan 09 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 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
漂亮但不安全的CTB
2006/10/09 PHP
Zend 输出产生XML解析错误
2009/03/03 PHP
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
php和asp语法上的区别总结
2019/05/12 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
关于二级域名下使用一级域名下的COOKIE的问题
2011/11/07 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
实现python版本的按任意键继续/退出
2016/09/26 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
服务承诺书格式
2014/05/21 职场文书
出国导师推荐信
2015/03/25 职场文书
聘用合同范本
2015/09/21 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书