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

    文章

    4456

    浏览量

    90757
  • FFT
    FFT
    +关注

    关注

    15

    文章

    425

    浏览量

    58644
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132163
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66772
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83467
收藏 人收藏

    评论

    相关推荐

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

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

    #硬声创作季 数字信号处理-05.02.01 2FFT算法-2

    dsp算法数字信号处理FFT快速傅里叶变换
    水管工
    发布于 :2022年09月28日 00:55:34

    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时间抽取和频域抽取算法比较

    [table][tr][td] //原理请查看按时间抽取2FFT算法的实现 *FFT
    发表于 07-06 01:53

    FFT算法在嵌入式系统中有哪些应用?

    倒位序算法分析实数蝶形运算算法推导DIT FFT算法的基本思想分析
    发表于 04-26 06:03

    python推导

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

    FFT变换

      4.1 引言   4.2 基2FFT算法   4.3 进一步减少运算量的措施   4.4 分裂基FFT算法   4.5 离散哈特莱变换(DHT)
    发表于 08-11 16:50 0次下载

    基于改进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三峰插值修正的电能计量新算法

    积窗函数的频谱,拟合推导出信号基波和谐波的通用幅值、相位和频率插值修正公式,并给出了基于该窗函数的一种电能计量新算法。计算精度对比仿真实验以及基波频率波动仿真实验结果表明,基于Hann
    发表于 03-10 10:31 1次下载

    基于Quartus II的综合仿真实现FFT IP核的FFT算法

    数字信号处理领域中FFT算法有着广泛的应用。目前现有的文献大多致力于研究利用FFT算法做有关信号处理、参数估计、F+FT蝶形运算单元与地址单元设计、不同
    的头像 发表于 01-07 09:33 9108次阅读
    基于Quartus II的综合<b class='flag-5'>仿真</b>实现<b class='flag-5'>FFT</b> IP核的<b class='flag-5'>FFT</b><b class='flag-5'>算法</b>

    python推导式是什么

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

    2FFT的verilog代码实现及仿真

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