使用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 相关文章推荐
Python3指定路径寻找符合匹配模式文件
May 22 Python
Python实现多线程抓取网页功能实例详解
Jun 08 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
详解python异步编程之asyncio(百万并发)
Jul 07 Python
python 3.6.5 安装配置方法图文教程
Sep 18 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
python3 实现调用串口功能
Dec 26 Python
pytorch GAN生成对抗网络实例
Jan 10 Python
解决jupyter notebook显示不全出现框框或者乱码问题
Apr 09 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
python如何运行js语句
Sep 09 Python
python语言实现贪吃蛇游戏
Nov 13 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 模拟get_headers函数的代码示例
2013/04/27 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
php之可变函数的实例详解
2017/09/13 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
Jquery cookie操作代码
2010/03/14 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
javascript学习之json入门
2016/12/22 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
Python中特殊函数集锦
2015/07/27 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
django settings.py 配置文件及介绍
2019/07/15 Python
python绘制雪景图
2019/12/16 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
如何基于线程池提升request模块效率
2020/04/18 Python
利用Python发送邮件或发带附件的邮件
2020/11/12 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
社区护士演讲稿
2014/08/27 职场文书
财务年终工作总结大全
2019/06/20 职场文书
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers