使用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快速查找算法应用实例
Sep 26 Python
Python中的对象,方法,类,实例,函数用法分析
Jan 15 Python
深入理解python函数递归和生成器
Jun 06 Python
Python加密方法小结【md5,base64,sha1】
Jul 13 Python
python读取excel表格生成erlang数据
Aug 26 Python
对pandas中apply函数的用法详解
Apr 10 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
一行Python代码过滤标点符号等特殊字符
Aug 12 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
Aug 20 Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 Python
使用Python爬虫爬取小红书完完整整的全过程
Jan 19 Python
python数据库批量插入数据的实现(executemany的使用)
Apr 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 select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
PHP开发规范手册之PHP代码规范详解
2011/01/13 PHP
PHP 中关于ord($str)>0x80的详细说明
2012/09/23 PHP
php模拟js函数unescape的函数代码
2012/10/20 PHP
javascript比较文档位置
2008/04/08 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
javascript实现颜色渐变的方法
2013/10/30 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
在Python中使用__slots__方法的详细教程
2015/04/28 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
破解安装Pycharm的方法
2018/10/19 Python
python实现共轭梯度法
2019/07/03 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
python多维数组分位数的求取方式
2020/03/03 Python
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
销售业务实习自我鉴定
2013/09/23 职场文书
《我的信念》教学反思
2014/02/15 职场文书
工地宣传标语
2014/06/18 职场文书
大学生见习报告总结
2014/11/04 职场文书
升职自荐信怎么写
2015/03/05 职场文书
班主任自我评价范文
2015/03/11 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
幼儿园2016年圣诞活动总结
2016/03/31 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
Python基础详解之描述符
2021/04/28 Python
JVM钩子函数的使用场景详解
2021/08/23 Java/Android