使用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 17 Python
python生成随机图形验证码详解
Nov 08 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
Python 文本文件内容批量抽取实例
Dec 10 Python
解决PySide+Python子线程更新UI线程的问题
Jan 11 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
详解用Python练习画个美队盾牌
Mar 23 Python
Django Rest framework认证组件详细用法
Jul 25 Python
在VS2017中用C#调用python脚本的实现
Jul 31 Python
Python实现快速排序的方法详解
Oct 25 Python
PyQt5 QDockWidget控件应用详解
Aug 12 Python
如何基于matlab相机标定导出xml文件
Nov 02 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
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
JavaScript中的事件处理
2008/01/16 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
JS定时器实例
2013/04/17 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
python中函数传参详解
2016/07/03 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
python版本五子棋的实现代码
2018/12/11 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
Python语言进阶知识点总结
2019/05/28 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
Python 获取项目根路径的代码
2019/09/27 Python
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
学生实习自我鉴定
2013/10/11 职场文书
物业门卫岗位职责
2013/12/28 职场文书
学习十八届三中全会精神实施方案
2014/02/17 职场文书
农村改厕实施方案
2014/03/22 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
初中学习计划书范文
2014/09/15 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python