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共享引用(多个变量引用)示例代码
Dec 04 Python
python中的多重继承实例讲解
Sep 28 Python
Django验证码的生成与使用示例
May 20 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
Django如何实现内容缓存示例详解
Sep 24 Python
Django入门使用示例
Dec 12 Python
python如何生成各种随机分布图
Aug 27 Python
Python基于scipy实现信号滤波功能
May 08 Python
python sorted方法和列表使用解析
Nov 18 Python
python 读取二进制 显示图片案例
Apr 24 Python
Python OpenCV实现测量图片物体宽度
May 27 Python
Django实现在线无水印抖音视频下载(附源码及地址)
May 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
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
PHP中字符串长度的截取用法示例
2017/01/12 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
2017/02/28 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
新闻内页-JS分页
2006/06/07 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
jquery分页优化操作实例分析
2019/08/23 jQuery
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
python写的一个文本编辑器
2014/01/23 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
大学生实习感言
2014/01/16 职场文书
求职信范文怎么写
2014/01/29 职场文书
如何写一封打动人心的求职信
2014/02/17 职场文书
小学生交通安全寄语
2015/02/27 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
中学校园广播稿
2015/08/18 职场文书
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL
LeetCode189轮转数组python示例
2022/08/05 Python