使用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的框架中为MySQL实现restful接口的教程
Apr 08 Python
详细解读Python中的__init__()方法
May 02 Python
python实现web方式logview的方法
Aug 10 Python
Python选课系统开发程序
Sep 02 Python
python 异或加密字符串的实例
Oct 14 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
Dec 15 Python
使用python爬取抖音视频列表信息
Jul 15 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
django rest framework 实现用户登录认证详解
Jul 29 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
May 12 Python
Python如何生成xml文件
Jun 04 Python
分享提高 Python 代码的可读性的技巧
Mar 03 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 正则匹配函数体
2009/08/25 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
浅析Javascript使用include/require
2013/11/13 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
使用jquery+CSS实现控制打印样式
2014/12/31 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
浅析vue.js数组的变异方法
2018/06/30 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
python中去空格函数的用法
2014/08/21 Python
Python中的引用和拷贝浅析
2014/11/22 Python
调试Python程序代码的几种方法总结
2015/04/28 Python
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
pytorch 修改预训练model实例
2020/01/18 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
公司晚会主持词
2014/03/22 职场文书
2016公司年会通知范文
2015/04/25 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL
mysql配置SSL证书登录的实现
2021/09/04 MySQL