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中for循环的使用方法
May 14 Python
Python实现控制台输入密码的方法
May 29 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
python实现梯度下降算法
Mar 24 Python
为什么Python中没有&quot;a++&quot;这种写法
Nov 27 Python
flask-restful使用总结
Dec 04 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
Python urllib.request对象案例解析
May 11 Python
在python中使用pyspark读写Hive数据操作
Jun 06 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 Python
python上下文管理的使用场景实例讲解
Mar 03 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
5.PHP的其他功能
2006/10/09 PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
判断window.onload是否多次使用的方法
2014/09/21 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
原生JS实现小小的音乐播放器
2017/10/16 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
opencv实现图片模糊和锐化操作
2018/11/19 Python
简单了解Python生成器是什么
2019/07/02 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
python中pow函数用法及功能说明
2020/12/04 Python
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
shell程序中如何注释
2012/01/28 面试题
法雷奥SQA(electric)面试问题
2016/01/23 面试题
2014年自我评价
2014/01/04 职场文书
素食餐饮项目创业计划书
2014/02/02 职场文书
护理助产毕业生的求职信
2014/03/02 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
党建工作整改措施
2014/10/28 职场文书
爱情保证书
2015/01/17 职场文书
python 如何用terminal输入参数
2021/05/25 Python