使用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 01 Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 Python
Python 数据结构之堆栈实例代码
Jan 22 Python
python实现发送邮件功能代码
Dec 14 Python
简单了解Python matplotlib线的属性
Jun 29 Python
Python类中方法getitem和getattr详解
Aug 30 Python
解决django model修改添加字段报错的问题
Nov 18 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 Python
Python爬虫基础讲解之请求
May 13 Python
python中的getter与setter你了解吗
Mar 24 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字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
FileUpload上传图片(图片不变形)
2010/08/05 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
2015/12/26 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
vue组件横向树实现代码
2018/08/02 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
JavaScript实现简单进度条效果
2020/03/25 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
Python中enumerate()函数编写更Pythonic的循环
2018/03/06 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
用canvas显示验证码的实现
2020/04/10 HTML / CSS
英国足球店:UK Soccer Shop
2017/11/19 全球购物
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
教师年度考核自我鉴定
2014/01/19 职场文书
程序员求职信
2014/04/16 职场文书
调研座谈会发言材料
2014/08/23 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
技术入股合作协议书
2014/10/07 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
银行竞聘报告范文
2014/11/06 职场文书
会计岗位职责范本
2015/04/02 职场文书
党校培训学习心得体会
2016/01/06 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python