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随机生成信用卡卡号的实现方法
May 14 Python
python直接访问私有属性的简单方法
Jul 25 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
Tensorflow实现卷积神经网络的详细代码
May 24 Python
分享vim python缩进等一些配置
Jul 02 Python
Python使用pickle模块储存对象操作示例
Aug 15 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
通过实例解析Python return运行原理
Mar 04 Python
python小白切忌乱用表达式
May 29 Python
python报错: 'list' object has no attribute 'shape'的解决
Jul 15 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 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
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
php操作access数据库的方法详解
2017/02/22 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
浅析python中的分片与截断序列
2016/08/09 Python
python基础练习之几个简单的游戏
2017/11/10 Python
python实现俄罗斯方块
2018/06/26 Python
python实现推箱子游戏
2020/03/25 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
python3使用GUI统计代码量
2019/09/18 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
爱岗敬业演讲稿
2014/05/05 职场文书
环境卫生标语
2014/06/09 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
北京英文导游词
2015/02/12 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书