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 03 Python
Python中动态获取对象的属性和方法的教程
Apr 09 Python
详解C++编程中一元运算符的重载
Jan 19 Python
Python连接数据库学习之DB-API详解
Feb 07 Python
pandas 使用apply同时处理两列数据的方法
Apr 20 Python
PyTorch CNN实战之MNIST手写数字识别示例
May 29 Python
Python多进程写入同一文件的方法
Jan 14 Python
Python读写压缩文件的方法
Jul 30 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
python 对一幅灰度图像进行直方图均衡化
Oct 27 Python
Python经常使用的一些内置函数
Apr 11 Python
Python日志模块logging用法
Jun 05 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 MSSQL 存储过程的方法
2008/12/24 PHP
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
php中ob函数缓冲机制深入理解
2015/08/03 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
js 操作符汇总
2014/11/08 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
vue 自定义右键样式的实例代码
2019/11/06 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
python简单验证码识别的实现方法
2019/05/10 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
司法所长先进事迹
2014/06/02 职场文书
党员个人自我剖析材料
2014/10/08 职场文书