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中的from..import绝对导入语句
Jun 21 Python
Python如何为图片添加水印
Nov 25 Python
Python中的连接符(+、+=)示例详解
Jan 13 Python
Python进度条实时显示处理进度的示例代码
Jan 30 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
Python实现将多个空格换为一个空格.md的方法
Dec 20 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
May 13 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
Jul 22 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
Jan 08 Python
Python新手如何理解循环加载模块
May 29 Python
Python+Opencv实现把图片、视频互转的示例
Dec 17 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
Linux下php5.4启动脚本
2014/08/03 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
Python中的pass语句使用方法讲解
2015/05/14 Python
Python运算符重载用法实例分析
2015/06/01 Python
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
使用matplotlib画散点图的方法
2018/05/25 Python
Python hashlib模块用法实例分析
2018/06/12 Python
Python画图高斯分布的示例
2019/07/10 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
python创建n行m列数组示例
2019/12/02 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
《春笋》教学反思
2014/04/15 职场文书
安全承诺书
2015/01/19 职场文书
校园广播稿范文
2015/08/19 职场文书
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android