Python实现基2-FFT

  • 使用递归方法
from math import log, ceil, cos, sin, pi
import matplotlib.pyplot as plt
import numpy as np# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef fft(x, N=None):# DIT-FFT 函数说明# x: 时域序列# N: N点DFT, 理论上N=2**M# 返回值为序列x的DFTif N is None:N = len(x)elif N < len(x):N = len(x)if N == 2:return [x[0]+x[1], x[0]-x[1]]# 补0使得N=2**MM = ceil(log(N, 2))N = 2**Mx = x + [0] * (N-len(x))# 递归地计算偶数项和奇数项的DFTX1 = fft(x[0::2])X2 = fft(x[1::2])X = [0] * Nfor i in range(N//2):# 蝶形计算tmp = (cos(2*pi/N*i)-1j*sin(2*pi/N*i))*X2[i]X[i] = X1[i] + tmpX[i+N//2] = X1[i] - tmpreturn Xif __name__ == '__main__':x = [1]*10y = fft(x, 1024)# print(y)z = [abs(i) for i in y]# print(z)plt.plot(np.arange(len(z))*2/len(z), z, label='10点矩形窗函数的FFT')plt.title("幅度谱")plt.xlabel(r'单位:$\pi$')plt.ylabel(r'$|H(j\omega)|$')plt.grid(linestyle="-.")plt.legend()plt.show()

运行结果:

  • 使用循环,流式计算(极大地节省了内存)
from math import log, ceil, cos, sin, pi
import matplotlib.pyplot as plt
import numpy as np# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef fft(x, N=None):# DIT-FFT 函数说明# x: 时域序列# N: N点DFT, 理论上N=2**M# 返回值为序列x的DFT"""采用流式计算方法,只用了一个N(N=2**M)点的数组内存"""if N is None:N = len(x)elif N < len(x):N = len(x)# 补0使得:N=2**MM = ceil(log(N, 2))N = 2**Mx = x + [0] * (N-len(x))fm = "{:0"+f"{M}"+"b}"X = [0] * Nfor i in range(N//2):index1 = eval('0b'+fm.format(i*2)[::-1])index2 = eval('0b'+fm.format(i*2+1)[::-1])X[2*i] = x[index1] + x[index2]X[2*i+1] = x[index1] - x[index2]for i in range(1, M):# 第i步表示将2**i点DFT合成2**(i+1)点的DFT# 蝶形宽度widthwidth = 2**i"""将X(k)序列进行分组,每组2**(i+1)个点,便于将每组中两组2**i点DFT合成一组2**(i+1)点的DFT"""# num=2*width=2**(i+1), 表示每组点数num = 2*width# 组数groupsgroups = N//numfor j in range(groups):# 对每组将2**i点DFT合成2**(i+1)=num点的DFTfor k in range(num//2):# 旋转因子W = cos(2*pi/num*k) - 1j * sin(2*pi/num*k)# 第j组第k个index = j*num + ktmp = W * X[index+width]    # 每个蝶形一次复数乘法X[index], X[index+width] = X[index]+tmp, X[index]-tmpreturn Xif __name__ == '__main__':x = [1]*10y = fft(x, 1024)# print(y)z = [abs(i) for i in y]# print(z)plt.plot(np.arange(len(z))*2/len(z), z, label='10点矩形窗函数的FFT')plt.title("幅度谱")plt.xlabel(r'单位:$\pi$')plt.ylabel(r'$|H(j\omega)|$')plt.grid(linestyle="-.")plt.legend()plt.show()

运行结果:

# 说明:建议使用第二种方法实现FFT。第一种递归的方法在递归调用时也需要一定的成本,且使用的内存较大;而第二种方法只使用了一个N(N=2**M)点的数组进行计算,内存可重用。

使用python的第三方库进行FFT

import numpy as np
from numpy.fft import fft, ifft
# from scipy.fftpack import fft, ifft
import matplotlib.pyplot as plt# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falseif __name__ == '__main__':x = 2*np.sin(np.pi/2*np.arange(100))+np.sin(np.pi/5*np.arange(100))z = [abs(i) for i in fft(x, 2048)]# print(z)L = len(z)plt.plot((np.arange(L)*2/L)[:L//2], z[:L//2], label='两个不同频率正弦信号相加的DFT')plt.title("幅度谱")plt.xlabel('$\pi$')plt.ylabel('$|H(j\omega)|$')plt.grid(linestyle="-.")plt.legend()plt.show()print('max(abs(ifft(fft(x))-x)) = ', end='')print(max(abs(ifft(fft(x))-x)))

运行结果:

max(abs(ifft(fft(x))-x)) = 9.01467522361575e-16

DIT-FFT算法的python实现相关推荐

  1. 离散傅里叶变换及matlab实现(按时间抽选(DIT)的基-2 FFT算法(库利-图基算法))

    转,傅里叶变换,很好的解释 很好的文章,可惜水平太差,还没有完全理解. 快速傅里叶的matlab实现 按时间抽选(DIT)的基-2 FFT算法(库利-图基算法) 傅里叶要用到的nn个复数,不是随机找的 ...

  2. 按时间抽选(DIT)的基-2 FFT算法(库利-图基算法)C++程序

    基-2 FFT算法的C++程序,按时间抽选.输入倒位序.输出自然顺序,N=2LN=2^LN=2L #include <complex>int fft(complex<double&g ...

  3. 【 FPGA 】16点并行DIT FFT的实现

    目录 整体架构介绍 旋转因子介绍 代码文件结构 重点难点易错点 整体架构介绍 16点并行FFT分为4级蝶形运算,每一级蝶形运算有一个基本的蝶形单元: 如下是16点DIT FFT的数据流图: 可见,第0 ...

  4. 基4fft算法的蝶形图_原地且自动整序的FFT算法

    传统的计算快速傅里叶变换的Cooley-Tukey算法效率极高,因其主要由蝶形运算构成,所以代码形式也非常简单,只是需要将输入或者输出按照位反转的方式重新排序. 这个重新排序的步骤并不是必须的.Cli ...

  5. 深入浅出理解FFT算法。通俗易懂,xilinxIP核仿真

    深入浅出理解FFT算法,通俗易懂,用xilinxIP核心仿真 1.前言:傅里叶变换:时域到频域的转换 FS连续时间周期傅里叶级数->DFS离散傅里叶级数->FT连续时间非周期信号的傅里叶变 ...

  6. czt算法c语言实现,基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF).ppt

    基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF) 第四节基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF)(Sander-Tu ...

  7. 基于朴素贝叶斯的垃圾分类算法(Python实现)

    有代码和数据集的 https://blog.csdn.net/weixin_33734785/article/details/91428991 附有git库代码的 https://www.cnblog ...

  8. 手把手教你在多种无监督聚类算法实现Python(附代码)

    来源: 机器之心 本文约2704字,建议阅读6分钟. 本文简要介绍了多种无监督学习算法的 Python 实现,包括 K 均值聚类.层次聚类.t-SNE 聚类.DBSCAN 聚类. 无监督学习是一类用于 ...

  9. FFT算法8点12位硬件实现 (verilog)

    FFT算法8点12位硬件实现 (verilog) 1 一.功能描述: 1 二.设计结构: 2 三.设计模块介绍 3 1.蝶形运算(第一级) 3 2.矢量角度旋转(W) 4 3.CORDIC 结果处理 ...

  10. 八大排序算法的 Python 实现

    八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入 ...

最新文章

  1. 我们破解了几乎所有智能手机的人脸识别,唯独没有iPhone
  2. yii框架的下拉框多选,设置默认值等(dropDownList)
  3. 云计算十年 腾讯新一代企业安全助力云化之路
  4. 三年经验前端社招——丰巢科技
  5. Go基础系列:指定goroutine的执行顺序
  6. 编程语言对比 字面常量
  7. Linux中Shell重定向
  8. 【学习 OpenCV】—— core.hpp 核心api
  9. java hostnameverifier_关于HostnameVerifier接口的解读
  10. linux程序设计大作业,LINUX/UNIX Shell编程大作业
  11. 【数据挖掘学习笔记】数据挖掘中主要问题有哪些?
  12. ASP.NET会话(Session) 转载自:寒羽枫(cityhunter172)
  13. java使用ZipOutputStream时出现的“不可预料的压缩文件末端”问题
  14. PUG转HTML格式
  15. 在线2000人的服务器配置,同时线上人数约2000人需要什么等级服务器?
  16. 还原扩容的缩水U盘真实容量方法(转载)
  17. 什么是远程桌面?远程桌面软件是如何进行连接工作的?
  18. 2016年计算机考研408操作系统真题(客观题)
  19. 服务器怎么安装php文档,php在云服务器端的安装教程
  20. 四种形态图解_图解缺口理论,附实例

热门文章

  1. 算法之图论(二)有权最短路
  2. 第三方依赖库中kotlin代码提示/*compiled code*/
  3. Win11删除文件时提示需要管理员权限怎么解决?
  4. 怎么把音频倒放?三个软件帮你倒放声音
  5. rib fib arp fdb
  6. 别把世界和好男人,都让给绿茶婊
  7. html系统模板尿酸原,痛风石的病历模板
  8. [文献阅读]——ERNIE-Gram: Pre-Training with Explicitly N-Gram Masked Language Modeling for NLU(TBC)
  9. 软件设计师(二):操作系统基本原理
  10. 后疫情时代,用吃增强身体这座“城防工事”