使用python实现离散时间傅里叶变换的方法

作者:weijifen000 时间:2021-10-26 19:44:07 

我们经常使用傅里叶变换来计算数字信号的频谱,进而分析数字信号,离散时间傅里叶变换的公式为:

使用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实现离散时间傅里叶变换的方法

此处实现的是传统的傅里叶变换,这种方法实际已经不用了,现在使用快速傅里叶变换,其实两种是等价的,但是快速傅里叶变换时间复杂度要小很多。

来源:https://blog.csdn.net/weijifen000/article/details/79598258

标签:python,离散,傅里叶变换
0
投稿

猜你喜欢

  • ACCESS中Field对象的标题属性

    2008-11-20 17:44:00
  • PYQT5开启多个线程和窗口,多线程与多窗口的交互实例

    2023-07-19 04:21:21
  • python3 简单实现组合设计模式

    2023-06-12 19:15:50
  • asp如何让用户也能修改密码?

    2010-05-13 16:41:00
  • SQL学习笔记二 创建表、插入数据的语句

    2011-09-30 11:17:32
  • 解析一个通过添加本地分区索引提高SQL性能的案例

    2023-07-22 13:29:32
  • web2.0中流行的设计元素:颜色

    2007-12-10 12:16:00
  • Oracle相关组件版本信息的介绍

    2023-07-14 09:19:53
  • 天气预报调用代码

    2008-11-18 15:59:00
  • 解决golang编译提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed(推荐)

    2023-07-16 04:24:49
  • Tensorflow简单验证码识别应用

    2023-08-10 14:13:14
  • 运行(runCode)复制(copyCode)保存(saveCode)代码框方法

    2007-10-21 08:41:00
  • javascript二维数组转置实例

    2023-08-25 07:11:14
  • ThinkPHP发送邮件示例代码

    2023-11-21 19:17:31
  • python中yaml配置文件模块的使用详解

    2021-06-05 08:06:45
  • Golang中interface的基本用法详解

    2023-07-14 17:00:33
  • oracle & mysql 多实例启动区别

    2011-02-23 12:28:00
  • 如何计算ASP页面的加载时间/载入时间?

    2009-11-25 20:10:00
  • PHP Session ID的实现原理与实例

    2023-07-13 13:36:53
  • FrontPage2002简明教程三:网页布局

    2008-09-17 11:19:00
  • asp之家 网络编程 m.aspxhome.com