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库urllib与urllib2主要区别分析
Jul 13 Python
python写入中英文字符串到文件的方法
May 06 Python
python框架django基础指南
Sep 08 Python
Python 爬虫图片简单实现
Jun 01 Python
使用Python &amp; Flask 实现RESTful Web API的实例
Sep 19 Python
python的exec、eval使用分析
Dec 11 Python
django缓存配置的几种方法详解
Jul 16 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
python实现键盘输入的实操方法
Jul 16 Python
Python随机数函数代码实例解析
Feb 09 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
matlab中imadjust函数的作用及应用举例
Feb 27 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 ImageMagick windows下安装教程
2015/01/26 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
PHP实现的简单sha1加密功能示例
2017/08/27 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
javascript显示选择目录对话框的代码
2008/11/10 Javascript
JavaScript 动态生成方法的例子
2009/07/22 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
2018/08/13 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
在Python中使用判断语句和循环的教程
2015/04/25 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
UNIX命令速查表
2012/03/10 面试题
如何写一份好的英文求职信
2014/03/19 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
欢迎领导检查标语
2014/06/27 职场文书
反对邪教标语
2014/06/30 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
婚礼庆典答谢词
2015/01/20 职场文书
浅谈Java父子类加载顺序
2021/08/04 Java/Android
MySQL连接控制插件介绍
2021/09/25 MySQL
php png失真的原因及解决办法
2021/11/17 PHP