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给文本创立向量空间模型的教程
Apr 23 Python
python计算方程式根的方法
May 07 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
Jan 05 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
利用python numpy+matplotlib绘制股票k线图的方法
Jun 26 Python
python 遍历pd.Series的index和value
Nov 26 Python
python 6.7 编写printTable()函数表格打印(完整代码)
Mar 25 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 Python
Python Http请求json解析库用法解析
Nov 28 Python
python3代码输出嵌套式对象实例详解
Dec 03 Python
Python爬虫进阶之爬取某视频并下载的实现
Dec 08 Python
Django REST framework 限流功能的使用
Jun 24 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中autoload的用法总结
2013/11/08 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
PHP 验证登陆类分享
2015/03/13 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
Python探索之Metaclass初步了解
2017/10/28 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
Python实现自动访问网页的例子
2020/02/21 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
汉语言文学职业规划
2014/02/14 职场文书
检讨书1000字
2014/10/11 职场文书
处级干部考察材料
2014/12/24 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
利用Java连接Hadoop进行编程
2022/06/28 Java/Android