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不规范的日期字符串处理类
Jun 10 Python
Python中有趣在__call__函数
Jun 21 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
Python Matplotlib实现三维数据的散点图绘制
Mar 19 Python
Python JSON格式数据的提取和保存的实现
Mar 22 Python
python的pytest框架之命令行参数详解(上)
Jun 27 Python
微信小程序python用户认证的实现
Jul 29 Python
pandas分组聚合详解
Apr 10 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
深入理解Pytorch微调torchvision模型
Nov 11 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访问带有密码的Redis方法示例
2017/02/09 PHP
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
JavaScript prototype对象的属性说明
2010/03/13 Javascript
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
js中eval详解
2012/03/30 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
2016/01/26 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
JS添加删除DIV的简单实例
2016/07/08 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
Python简单生成随机姓名的方法示例
2017/12/27 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
浅析HTML5 Landmark
2020/09/11 HTML / CSS
应届毕业生自我鉴定范文
2013/12/27 职场文书
汽车队司机先进事迹材料
2014/02/01 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
2014年医院工作总结
2014/11/20 职场文书
小班上学期个人总结
2015/02/12 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
市场营销计划书
2019/04/24 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python