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中DJANGO简单测试实例
May 11 Python
学习python之编写简单乘法口诀表实现代码
Feb 27 Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 Python
Python使用Django实现博客系统完整版
Sep 29 Python
python 除法保留两位小数点的方法
Jul 16 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
用Python配平化学方程式的方法
Jul 20 Python
自定义django admin model表单提交的例子
Aug 23 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截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
jQuery Html控件基本操作(日常收集整理)
2016/03/11 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
微信小程序通过js实现瀑布流布局详解
2019/08/28 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
Ubuntu下安装PyV8
2016/03/13 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
python 命名规范知识点汇总
2020/02/14 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
2021/03/03 Python
医生自荐信
2013/10/11 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
商品陈列协议书
2014/09/29 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
党员先进事迹材料
2014/12/19 职场文书
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python