使用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 布尔操作实现代码
Mar 23 Python
Python中type的构造函数参数含义说明
Jun 21 Python
Python编程之序列操作实例详解
Jul 22 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
基于TensorBoard中graph模块图结构分析
Feb 15 Python
Python实现一个优先级队列的方法
Jul 31 Python
Python requests上传文件实现步骤
Sep 15 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 Python
Python类方法总结讲解
Jul 26 Python
Python中的 enumerate和zip详情
May 30 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通过分类列表产生分类树数组的方法
2015/04/20 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
Smarty3配置及入门语法
2017/02/22 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
express 项目分层实践详解
2018/12/10 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
python 切片和range()用法说明
2013/03/24 Python
Python复制目录结构脚本代码分享
2015/03/06 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
python 中if else 语句的作用及示例代码
2018/03/05 Python
Python 实现微信防撤回功能
2019/04/29 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
pytorch 常用线性函数详解
2020/01/15 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
python二维图制作的实例代码
2020/12/03 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
科研先进个人典型材料
2014/01/31 职场文书
小学毕业感言150字
2014/02/05 职场文书
2014年元旦感言
2014/03/06 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
Vue全家桶入门基础教程
2021/05/14 Vue.js