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实现巡检系统(solaris)示例
Apr 02 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
Nov 16 Python
python与C互相调用的方法详解
Jul 14 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 26 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
如何创建一个Flask项目并进行简单配置
Nov 18 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 Python
Python基础 括号()[]{}的详解
Nov 07 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设计模式 State (状态模式)
2011/06/26 PHP
php 函数中使用static的说明
2012/06/01 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
JavaScript获取/更改文本框的值的实例代码
2013/08/02 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
一个精品风格的世界:Atterley
2019/05/01 全球购物
办公室文秘岗位职责
2013/11/15 职场文书
市场部专员岗位职责
2013/11/30 职场文书
四年的大学生生活自我评价
2013/12/09 职场文书
公司成立感言
2014/01/11 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
活动主持人开场白
2015/05/28 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL