0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基2FFT的算法推导及python仿真

CHANBAEK 来源:FPGA自学笔记分享 作者:FPGA自学笔记分享 2023-06-02 12:38 次阅读

FFT的算法推导主要用到旋转因子的周期性、对称性和可约性:

图片

基2FFT的频域抽取法,将x(n)按照n的自然顺序划分为前后两个部分:

图片

所以当K为偶数时,前后两部分相加。当k为奇数时相减。将频域X(K)划分为奇偶两个序列,N点DFT就被分解为两个N/2点的DFT:

图片

图片

可以得到蝶形图如下:

图片

进而可以得到基2FFT频域抽取代码的实现方法:

图片

随后是数据倒换,如下图:

图片

可以看到基2FFT频域抽取后的输出位置排序就是自然数二进制码按位倒读的值。

根据推导结果我们编写python实现代码:

首先根据FFT的点数计算需要迭代的次数,根据迭代次数例化一个loop_num+1*N的数组一共来存储输入及中间迭代的结果,同时将输入X送入第一行作为输入:

import numpy as np
import matplotlib.pyplot as plt


#频域抽取的基2FFT
loop_num= int(np.log2(N))
data=np.zeros((loop_num+1,N),dtype=np.complex)
data[0]=x

随后开始FFT的迭代,循环变量i一共来表征迭代的次数;循环变量p用来表征每次循环将将数据换分为几块;循环变量j用来进行蝶形运算。通过循环完成FFT的迭代及运算,代码如下:

for i in range(loop_num):
    k=i+1
    for p in range(2**i):
        for j in range(N//(2**k)):
            data[i+1][j           +p*(N//(2**i))] =  data[i,j+p*(N//(2**i))] + data[i,j+N//(2**k) +p*(N//(2**i))]
            data[i+1][j+N//(2**k) +p*(N//(2**i))] = (data[i,j+p*(N//(2**i))] - data[i,j+N//(2**k) +p*(N//(2**i))])*np.e**(-1j*2*j*np.pi*(2**i)/N)

最终将FFT蝶形运算的结果进行输出倒序,定义rev2(k,N)递归函数达到按bit翻转的目的,最终输出FFT结果为fft_out:

def rev2(k,N):
    if (k==0):
        return (0)
    else:
        return(((rev2(k//2,N)//2)+(k%2)*(N//2)))


#输出倒序
fft_out = np.ones_like(data[0,:])
for k  in range (N):
    fft_out[rev2(k,N)] = data[loop_num,k]

最后为了验证代码正确性,直接调用python的FFT库函数得到xf为库函数的结果,与fft_out相减并画图,观察误差。

xf = np.fft.fft(x)
plt.plot(abs(xf))
plt.plot(abs(fft_out-xf))

输入1024点的任意复数:

x = [int(np.round(np.sin(i)*1024))+int(np.round(np.cos(i)*1024))*1j for i in n]

波形如下:

图片

运行python算法得到结果如下,图中蓝线是FFT计算的结果,橙线是FFT库函数计算结果与fft_out相减的差,差值为0,认为我们的迭代算法正确。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4613

    浏览量

    92945
  • FFT
    FFT
    +关注

    关注

    15

    文章

    434

    浏览量

    59393
  • 仿真
    +关注

    关注

    50

    文章

    4087

    浏览量

    133644
  • 代码
    +关注

    关注

    30

    文章

    4790

    浏览量

    68649
  • python
    +关注

    关注

    56

    文章

    4797

    浏览量

    84718
收藏 人收藏

    评论

    相关推荐

    #硬声创作季 5.4.1 频域抽取2FFT算法——教学视频

    算法FFT快速傅里叶变换
    Mr_haohao
    发布于 :2022年09月02日 10:17:12

    FFT的基本原理及算法结构

    FFT的基本原理及算法结构FFT是利用了旋转因子的周期性和对称性,对DFT进行简化的运算。各种FFT算法可分两大类:一类是针对N等于
    发表于 06-14 00:20

    【NUCLEO-F412ZG试用体验】ARM的FFT使用及误差分析

    的数字信号,就可以做FFT变换了。N个采样点数据,在经过FFT之后,就可以得到N个点的FFT结果。对于快速FFT算法,有
    发表于 12-16 20:31

    FFT变换

      4.1 引言   4.2 2FFT算法   4.3 进一步减少运算量的措施   4.4 分裂FFT
    发表于 08-11 16:50 0次下载

    N为合数的FFT算法

    N为合数的FFT算法上面讨论的以2(即N=2M)的时间抽选和频率抽选FFT
    发表于 10-30 13:16 1596次阅读
    N为合数的<b class='flag-5'>FFT</b><b class='flag-5'>算法</b>

    FFT算法的应用

    FFT算法的应用 一. 数字滤波器设计:(一)2按时间抽取FFT算法对于有限长离
    发表于 10-30 13:20 1w次阅读
    <b class='flag-5'>FFT</b><b class='flag-5'>算法</b>的应用

    固定几何结构的FFT算法及其FPGA实现

    .引言DFT及其快速算法FFT是信号处理领域的核心组成部分。FFT算法多种多样,按数据组合方式不同一般分时域和频域,按数据抽取方式的不同又可分为
    发表于 06-20 14:18 1147次阅读
    固定几何结构的<b class='flag-5'>FFT</b><b class='flag-5'>算法</b>及其FPGA实现

    基于改进FFT算法的OFDM调制解调模块设计

    文章对传统FFT算法进行了改进,改进后的算法将N点DFT分解成二维V万点DFT的组合,在结构上更适合于用流水线方式实现FFT。文章首先对算法
    发表于 09-26 15:38 40次下载
    基于改进<b class='flag-5'>FFT</b><b class='flag-5'>算法</b>的OFDM调制解调模块设计

    基于FPGA高精度浮点运算器的FFT设计与仿真

    提出一种2FFT的FPGA方法,完成了基于FPGA高精度浮点运算器的FFT的设计。利用VHDL语言描述了蝶形运算过程及地址产生单元,其仿真波形基本能正确的表示输出结果。
    发表于 12-23 14:24 46次下载
    基于FPGA高精度浮点运算器的<b class='flag-5'>FFT</b>设计与<b class='flag-5'>仿真</b>

    实数FFT算法的设计及其C语言实现

    首先分析实数FFT算法推导过程,然后给出一种具体实现FFT算法的C语言程序,可以直接应用于需要FFT
    发表于 01-13 11:32 1.1w次阅读
    实数<b class='flag-5'>FFT</b><b class='flag-5'>算法</b>的设计及其C语言实现

    fft算法是什么_如何提高fft算法分辨率

    利和T.W.图提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。
    发表于 11-09 09:28 8563次阅读
    <b class='flag-5'>fft</b><b class='flag-5'>算法</b>是什么_如何提高<b class='flag-5'>fft</b><b class='flag-5'>算法</b>分辨率

    24时分FFT算法浅析及其比较

    FFT 算法的实质是把一长序列的 DFT 计算分割为较短序列的 DFT 计算,对于2算法而言,是把序列每次一分为二,最后分割成两点 DFT
    发表于 11-23 10:58 3w次阅读
    <b class='flag-5'>基</b><b class='flag-5'>2</b>与<b class='flag-5'>基</b>4时分<b class='flag-5'>FFT</b><b class='flag-5'>算法</b>浅析及其比较

    4fft蝶形图运算单元解析

    蝶形运算,2点DFT运算称为蝶形运算,而整个FFT就是由若干级迭代的蝶形运算组成,而且这种算法采用塬位运算,故只需N个存储单元2. ∑∑(2
    发表于 11-23 11:48 5.9w次阅读
    <b class='flag-5'>基</b>4<b class='flag-5'>fft</b>蝶形图运算单元解析

    python推导式是什么

    python推导推导式(英文名:comprehensions),也叫解析式,是Python的一种独有特性。 推导式是可以从一个数据序列构
    的头像 发表于 02-28 17:13 2741次阅读

    2FFT的verilog代码实现及仿真

    上文2FFT算法推导python仿真推导
    的头像 发表于 06-02 12:38 1701次阅读
    <b class='flag-5'>基</b><b class='flag-5'>2FFT</b>的verilog代码实现及<b class='flag-5'>仿真</b>