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 相关文章推荐
wxpython 学习笔记 第一天
Mar 16 Python
python实现多线程的方式及多条命令并发执行
Jun 07 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
python实现学生管理系统
Jan 11 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
python正则表达式之对号入座篇
Jul 24 Python
python gdal安装与简单使用
Aug 01 Python
python爬虫爬取幽默笑话网站
Oct 24 Python
通过python实现windows桌面截图代码实例
Jan 17 Python
Python延迟绑定问题原理及解决方案
Aug 04 Python
Python Pandas数据分析工具用法实例
Nov 05 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中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
js计数器代码
2006/11/04 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
Angular.js回顾ng-app和ng-model使用技巧
2016/04/26 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
vue.js数据绑定操作详解
2018/04/23 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
python中xrange和range的区别
2014/05/13 Python
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
详解在Python程序中使用Cookie的教程
2015/04/30 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
python数据类型强制转换实例详解
2020/06/22 Python
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
简历里的自我评价
2014/01/31 职场文书
环保倡议书怎么写
2014/05/16 职场文书
IT工程师岗位职责
2014/07/04 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
办公室日常管理制度
2015/08/04 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
Javascript中的解构赋值语法详解
2021/04/02 Javascript