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 list使用示例 list中找连续的数字
Jan 27 Python
跟老齐学Python之玩转字符串(1)
Sep 14 Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 Python
Django数据库表反向生成实例解析
Feb 06 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
Python程序包的构建和发布过程示例详解
Jun 09 Python
Django框架创建mysql连接与使用示例
Jul 29 Python
详解PyTorch中Tensor的高阶操作
Aug 18 Python
tensorflow之自定义神经网络层实例
Feb 07 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
python 实现一个图形界面的汇率计算器
Nov 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中,文件上传
2006/12/06 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
Javascript 自定义类型方法小结
2010/03/02 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
使用JS动态显示文本
2017/09/09 Javascript
在vue中使用G2图表的示例代码
2019/03/19 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
python实现简单遗传算法
2018/03/19 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
python 爬取疫情数据的源码
2020/02/09 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
优秀共产党员先进事迹
2014/01/27 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
学习礼仪心得体会
2014/09/01 职场文书
2015年度质量工作总结报告
2015/04/27 职场文书
浅谈Python类的单继承相关知识
2021/05/12 Python
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL