使用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写的一个简单DNS服务器实例
Jun 04 Python
Python3.x中自定义比较函数
Apr 24 Python
python开发之函数定义实例分析
Nov 12 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
numpy实现合并多维矩阵、list的扩展方法
May 08 Python
python3读取excel文件只提取某些行某些列的值方法
Jul 10 Python
python单例模式实例解析
Aug 28 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
python与idea的集成的实现
Nov 20 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 Python
Python pandas求方差和标准差的方法实例
Aug 04 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的autoload机制的实现解析
2012/09/15 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
Python中Random和Math模块学习笔记
2015/05/18 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
什么是servlet链?
2014/07/13 面试题
小学生班会演讲稿
2014/01/09 职场文书
高一生物教学反思
2014/01/17 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
四风自我剖析材料
2014/09/30 职场文书
学校少先队工作总结
2015/08/12 职场文书
2016教师节问候语
2015/11/10 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
JavaScript 定时器详情
2021/11/11 Javascript
python 中的jieba分词库
2021/11/23 Python