Python FFT合成波形的实例


Posted in Python onDecember 04, 2019

使用Python numpy模块带的FFT函数合成矩形波和方波,增加对离散傅里叶变换的理解。

导入模块

import numpy as np
import matplotlib.pyplot as plt

分别是产生一个周期的方波和三角波程序

# 产生size点取样的三角波,其周期为1
def triangle_wave(size):
  x = np.arange(0, 1, 1.0/size)
  y = np.where(x<0.5, x, 0)
  y = np.where(x>=0.5, 1-x, y)
  return x, y
 
def square_wave(size):
  x = np.arange(0, 1, 1.0/size)
  y = np.where(x<0.5, 1.0, 0)
  return x, y

其中np.where函数第二个值是if,第三个是else

下面程序可以计算对应的频谱,采样点数取为2的n次幂是为了便于FFT计算

fft_size = 256
 
# 计算三角波和其FFT
x, y = triangle_wave(fft_size)
fy = np.fft.fft(y) / fft_size

下面对计算的频谱进行可视化,频率对应的强度使用工程上常用的分贝dp来表示

# 绘制三角波的FFT的前20项的振幅,由于不含下标为偶数的值均为0, 因此取
# log之后无穷小,无法绘图,用np.clip函数设置数组值的上下限,保证绘图正确
plt.figure()
plt.plot(np.clip(20*np.log10(np.abs(fy[:20])), -120, 120), "o")
plt.xlabel("frequency bin")
plt.ylabel("power(dB)")
plt.title("FFT result of triangle wave")

下面用正弦和余弦函数合成信号

# 取FFT计算的结果freqs中的前n项进行合成,返回合成结果,计算loops个周期的波形
def fft_combine(freqs, n, loops=1):
  length = len(freqs) * loops
  data = np.zeros(length)
  index = loops * np.arange(0, length, 1.0) / length * (2 * np.pi)
  for k, p in enumerate(freqs[:n]):
    if k != 0: p *= 2 # 除去直流成分之外,其余的系数都*2
    data += np.real(p) * np.cos(k*index) # 余弦成分的系数为实数部
    data -= np.imag(p) * np.sin(k*index) # 正弦成分的系数为负的虚数部
  return index, data

其中index代表频谱空间的采样点

画出合成信号,x坐标使用默认的整数表示即可

# 绘制原始的三角波和用正弦波逐级合成的结果,使用取样点为x轴坐标
plt.figure()
plt.plot(y, label="original triangle", linewidth=2)
for i in [0,1,3,5,7,9]:
  index, data = fft_combine(fy, i+1, 2) # 计算两个周期的合成波形
  plt.plot(data, label = "N=%s" % i)
plt.legend()
plt.title("partial Fourier series of triangle wave")
plt.show()

以上这篇Python FFT合成波形的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
对python模块中多个类的用法详解
Jan 10 Python
对python列表里的字典元素去重方法详解
Jan 21 Python
python调用自定义函数的实例操作
Jun 26 Python
PyQt 图解Qt Designer工具的使用方法
Aug 06 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
Python 字典中的所有方法及用法
Jun 10 Python
python程序如何进行保存
Jul 03 Python
python爬取企查查企业信息之selenium自动模拟登录企查查
Apr 08 Python
理解深度学习之深度学习简介
Apr 14 Python
深入浅析python3 依赖倒置原则(示例代码)
Jul 09 Python
使用python动态生成波形曲线的实现
Dec 04 #Python
python3实现绘制二维点图
Dec 04 #Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
Dec 04 #Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 #Python
Python绘制二维曲线的日常应用详解
Dec 04 #Python
使用python远程操作linux过程解析
Dec 04 #Python
基于Python检测动态物体颜色过程解析
Dec 04 #Python
You might like
php adodb介绍
2009/03/19 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
使用URL传输SESSION信息
2015/07/14 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
javascript document.referrer 用法
2009/04/30 Javascript
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
Python数据集切分实例
2018/12/08 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
请说出你所知道的线程同步的方法
2013/04/19 面试题
Java提供了哪些企业应用编程接口
2015/02/13 面试题
金山毒霸系列的笔试题
2013/04/13 面试题
数控技术专业毕业自荐书范文
2014/02/05 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers