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 08 Python
python关闭windows进程的方法
Apr 18 Python
实例说明Python中比较运算符的使用
May 13 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
Python读取excel中的图片完美解决方法
Jul 27 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
Python绘制股票移动均线的实例
Aug 24 Python
python中bytes和str类型的区别
Oct 21 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
python db类用法说明
Jul 07 Python
python基础之停用词过滤详解
Apr 21 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
建立文件交换功能的脚本(一)
2006/10/09 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
xmlHTTP实例
2006/10/24 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
Python下线程之间的共享和释放示例
2015/05/04 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
python 读写中文json的实例详解
2017/10/29 Python
python实现控制台打印的方法
2019/01/12 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
澳大利亚百货公司:David Jones
2018/02/08 全球购物
怎样写好自荐信和推荐信
2013/12/26 职场文书
班长自荐书范文
2014/02/11 职场文书
《雨霖铃》听课反思
2014/02/13 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
工商局调档介绍信
2015/10/22 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers