使用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写的创建文件夹自定义函数mkdir()
Aug 25 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
Windows 7下Python Web环境搭建图文教程
Mar 20 Python
python绘制立方体的方法
Jul 02 Python
django主动抛出403异常的方法详解
Jan 04 Python
python实现在函数中修改变量值的方法
Jul 16 Python
python多线程同步之文件读写控制
Feb 25 Python
pytorch实现从本地加载 .pth 格式模型
Feb 14 Python
python爬虫中采集中遇到的问题整理
Nov 27 Python
Python离线安装各种库及pip的方法
Nov 28 Python
Python turtle实现贪吃蛇游戏
Jun 18 Python
python+opencv实现目标跟踪过程
Jun 21 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
文章推荐系统(三)
2006/10/09 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
JS 统计时间
2021/03/09 Javascript
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
js实现省市联动效果的简单实例
2014/02/10 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
js制作简易年历完整实例
2015/01/28 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
在Python中使用元类的教程
2015/04/28 Python
Python探索之自定义实现线程池
2017/10/27 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Python numpy 常用函数总结
2017/12/07 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
pyqt5 使用label控件实时显示时间的实例
2019/06/14 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
python随机模块random使用方法详解
2020/02/14 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
浅谈react路由传参的几种方式
2021/03/23 Javascript
工程力学专业毕业生求职信
2013/10/06 职场文书
环境科学专业个人求职信
2013/12/15 职场文书
大学生交通专业求职信
2014/09/01 职场文书
假释思想汇报范文
2014/10/11 职场文书
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang