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使用Phantomjs截屏网页的方法
May 17 Python
Python实现爬虫爬取NBA数据功能示例
May 28 Python
Python matplotlib的使用并自定义colormap的方法
Dec 13 Python
Python 调用 zabbix api的方法示例
Jan 06 Python
Python实现的删除重复文件或图片功能示例【去重】
Apr 23 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
解决django 向mysql中写入中文字符出错的问题
May 18 Python
利用python 读写csv文件
Sep 10 Python
Python爬虫之Selenium下拉框处理的实现
Dec 04 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/10/09 PHP
php array的学习笔记
2012/05/16 PHP
PHP数据类型的总结分析
2013/06/13 PHP
Eclipse的PHP插件PHPEclipse安装和使用
2014/07/20 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
浅谈jQuery中的事件
2015/03/23 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
vue基础之事件v-onclick=&quot;函数&quot;用法示例
2019/03/11 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
用Python进行简单图像识别(验证码)
2018/01/19 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
django项目中新增app的2种实现方法
2020/04/01 Python
Python之变量类型和if判断方式
2020/05/05 Python
客户代表实习人员自我鉴定
2013/09/27 职场文书
机关门卫岗位职责
2013/12/30 职场文书
面包店的创业计划书范文
2014/01/16 职场文书
电脑售后服务承诺书
2014/03/27 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
写作之关于描写老人的好段摘抄
2019/11/14 职场文书
Python如何用re模块实现简易tokenizer
2022/05/02 Python