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 中的列表解析和生成表达式
Mar 10 Python
一则python3的简单爬虫代码
May 26 Python
python和C语言混合编程实例
Jun 04 Python
Python实现二叉搜索树
Feb 03 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
python使用webdriver爬取微信公众号
Aug 31 Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 Python
详解Python字典小结
Oct 20 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
详解django2中关于时间处理策略
Mar 06 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
如何使用python自带IDLE的几种方法
Oct 10 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中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
PHP分享图片的生成方法
2018/04/25 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
简单谈谈json跨域
2016/03/13 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
小程序转发探索示例
2019/02/19 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
Python实现线程池代码分享
2015/06/21 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
Python 删除整个文本中的空格,并实现按行显示
2018/07/24 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
办公室副主任岗位职责
2013/11/25 职场文书
校园报刊亭的创业计划书
2014/01/02 职场文书
参观考察邀请函范文
2014/01/29 职场文书
八一建军节部队活动方案
2014/02/04 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
统招统分证明
2015/06/23 职场文书
教师远程培训心得体会
2016/01/09 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL