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设计模式之代理模式实例
Apr 26 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
实例讲解python中的序列化知识点
Oct 08 Python
Face++ API实现手势识别系统设计
Nov 21 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
Python requests模块实例用法
Feb 11 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
Python numpy多维数组实现原理详解
Mar 10 Python
python爬虫使用正则爬取网站的实现
Aug 03 Python
详细介绍python类及类的用法
May 31 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
Protoss热键控制
2020/03/14 星际争霸
给多个地址发邮件的类
2006/10/09 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
Mootools 1.2教程 函数
2009/09/15 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
python 中的列表解析和生成表达式
2011/03/10 Python
python实现计算倒数的方法
2015/07/11 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
Python3中的bytes和str类型详解
2019/05/02 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
Python的两道面试题
2013/06/29 面试题
英文自荐信格式
2013/11/28 职场文书
《手指教学》反思
2014/02/14 职场文书
全国文明单位申报材料
2014/05/31 职场文书
运动会横幅标语
2014/06/17 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
个人借款协议书范本
2014/11/17 职场文书
2015年幼儿园元旦亲子活动方案
2014/12/09 职场文书
村干部任职承诺书
2015/01/21 职场文书
预备党员考察意见范文
2015/06/01 职场文书
天河观后感
2015/06/11 职场文书
工作服管理制度范本
2015/08/06 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书