使用python实现离散时间傅里叶变换的方法


Posted in Python onSeptember 02, 2019

我们经常使用傅里叶变换来计算数字信号的频谱,进而分析数字信号,离散时间傅里叶变换的公式为:

使用python实现离散时间傅里叶变换的方法

可是自己动手实现一遍才是最好的学习。

在数字分析里面,傅里叶变换默认等时间间隔采样,不需要时间序列,只需要信号数组即可分析。

分析过程如下:

  • 对于含有 n 个样本值的数字信号序列,根据奈奎斯特采样定律,包含的周期数最大为 n/2,周期数为 0 代表直流分量。所以,当周期数表示为离散的 0,1,2,3…n/2 ,总的数目为 n/2+1
  • 傅里叶变换之后的结果为复数, 下标为 k 的复数 a+b*j 表示时域信号中周期为 N/k 个取样值的正弦波和余弦波的成分的多少, 其中 a 表示 cos 波形的成分, b 表示 sin 波形的成分
  • 首先产生一个长度为 n,一倍周期的 $e^{-jwn} $ (即为 $cos(wn)-jsin(wn) $ )波样本序列.
  • 将数字信号序列中的每一个样本与 1 倍周期的样本波形序列相乘,得到 n 个乘积,将 n 个乘积相加,放入 f[1] 中。
  • 再产生一个长度为 n,两倍周期的 $e^{-jwn} $ (即为 $cos(wn)-jsin(wn) $ )波样本序列,再将数字信号序列中的每一个样本与 2 倍周期的样本波形序列相乘,得到 n 个乘积,将 n 个乘积相加,放入 f[2] 中。依次重复。
  • 对于 0 倍周期,即直流分量来说,可以认为产生的是 0 倍周期的样本波形,重复操作,放入 f[0] 即可。
  • 这样就得到了数字信号序列的傅里叶变换

使用方法:

从以上过程得到数字序列的傅里叶变换之后,如果想要得到真正频谱,还需要做处理:

  • 计算出的每一个频率下的幅值需要除以时间序列的长度,类似求平均的过程
  • 每一个频率下的幅值是一个复数,需要对它求模,而且因为在负频率处也有值,所以需要对于实信号需要乘 2
  • 频率的序列为 0 到采样率的一半,长度为 n/2+1

完整程序:

# 离散时间傅里叶变换的 python 实现
import numpy as np
import math
import pylab as pl
import scipy.signal as signal
import matplotlib.pyplot as plt

sampling_rate=1000
t1=np.arange(0, 10.0, 1.0/sampling_rate)
x1 =np.sin(15*np.pi*t1)

# 傅里叶变换
def fft1(xx):
#   t=np.arange(0, s)
  t=np.linspace(0, 1.0, len(xx))
  f = np.arange(len(xx)/2+1, dtype=complex)
  for index in range(len(f)):
    f[index]=complex(np.sum(np.cos(2*np.pi*index*t)*xx), -np.sum(np.sin(2*np.pi*index*t)*xx))
  return f

# len(x1)
xf=fft1(x1)/len(x1)
freqs = np.linspace(0, sampling_rate/2, len(x1)/2+1)
plt.figure(figsize=(16,4))
plt.plot(freqs,2*np.abs(xf),'r--')

plt.xlabel("Frequency(Hz)")
plt.ylabel("Amplitude($m$)")
plt.title("Amplitude-Frequency curve")

plt.show()

使用python实现离散时间傅里叶变换的方法

plt.figure(figsize=(16,4))
plt.plot(freqs,2*np.abs(xf),'r--')

plt.xlabel("Frequency(Hz)")
plt.ylabel("Amplitude($m$)")
plt.title("Amplitude-Frequency curve")
plt.xlim(0,20)
plt.show()

使用python实现离散时间傅里叶变换的方法

此处实现的是传统的傅里叶变换,这种方法实际已经不用了,现在使用快速傅里叶变换,其实两种是等价的,但是快速傅里叶变换时间复杂度要小很多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 生成不重复的随机数的代码
May 15 Python
使用python绘制人人网好友关系图示例
Apr 01 Python
Apache如何部署django项目
May 21 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
python实现Adapter模式实例代码
Feb 09 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
关于numpy数组轴的使用详解
Dec 05 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
OpenCV+Python3.5 简易手势识别的实现
Dec 21 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 #Python
Django使用中间件解决前后端同源策略问题
Sep 02 #Python
python elasticsearch环境搭建详解
Sep 02 #Python
关于pymysql模块的使用以及代码详解
Sep 01 #Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 #Python
Python 使用多属性来进行排序
Sep 01 #Python
详解一种用django_cache实现分布式锁的方式
Sep 01 #Python
You might like
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
Web程序工作原理详解
2014/12/25 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
jQuery 添加/移除CSS类实现代码
2010/02/11 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
vue组件间通信解析
2017/03/01 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
python 正则式使用心得
2009/05/07 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
Django中Q查询及Q()对象 F查询及F()对象用法
2020/07/09 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
学期自我鉴定
2013/11/04 职场文书
大学生入党思想汇报
2014/01/14 职场文书
优秀教师先进事迹
2014/01/22 职场文书
学生保证书范文
2014/04/28 职场文书
面试感谢信范文
2015/01/22 职场文书
介绍信范文
2015/01/31 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
车辆安全隐患排查制度
2015/08/05 职场文书
初二数学教学反思
2016/02/17 职场文书