0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基2FFT的算法推導(dǎo)及python仿真

CHANBAEK ? 來源:FPGA自學(xué)筆記分享 ? 作者:FPGA自學(xué)筆記分享 ? 2023-06-02 12:38 ? 次閱讀

FFT的算法推導(dǎo)主要用到旋轉(zhuǎn)因子的周期性、對稱性和可約性:

圖片

基2FFT的頻域抽取法,將x(n)按照n的自然順序劃分為前后兩個部分:

圖片

所以當(dāng)K為偶數(shù)時,前后兩部分相加。當(dāng)k為奇數(shù)時相減。將頻域X(K)劃分為奇偶兩個序列,N點(diǎn)DFT就被分解為兩個N/2點(diǎn)的DFT:

圖片

圖片

可以得到蝶形圖如下:

圖片

進(jìn)而可以得到基2FFT頻域抽取代碼的實(shí)現(xiàn)方法:

圖片

隨后是數(shù)據(jù)倒換,如下圖:

圖片

可以看到基2FFT頻域抽取后的輸出位置排序就是自然數(shù)二進(jìn)制碼按位倒讀的值。

根據(jù)推導(dǎo)結(jié)果我們編寫python實(shí)現(xiàn)代碼:

首先根據(jù)FFT的點(diǎn)數(shù)計算需要迭代的次數(shù),根據(jù)迭代次數(shù)例化一個loop_num+1*N的數(shù)組一共來存儲輸入及中間迭代的結(jié)果,同時將輸入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的迭代,循環(huán)變量i一共來表征迭代的次數(shù);循環(huán)變量p用來表征每次循環(huán)將將數(shù)據(jù)換分為幾塊;循環(huán)變量j用來進(jìn)行蝶形運(yùn)算。通過循環(huán)完成FFT的迭代及運(yùn)算,代碼如下:

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蝶形運(yùn)算的結(jié)果進(jìn)行輸出倒序,定義rev2(k,N)遞歸函數(shù)達(dá)到按bit翻轉(zhuǎn)的目的,最終輸出FFT結(jié)果為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]

最后為了驗(yàn)證代碼正確性,直接調(diào)用python的FFT庫函數(shù)得到xf為庫函數(shù)的結(jié)果,與fft_out相減并畫圖,觀察誤差。

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

輸入1024點(diǎn)的任意復(fù)數(shù):

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

波形如下:

圖片

運(yùn)行python算法得到結(jié)果如下,圖中藍(lán)線是FFT計算的結(jié)果,橙線是FFT庫函數(shù)計算結(jié)果與fft_out相減的差,差值為0,認(rèn)為我們的迭代算法正確。

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4552

    瀏覽量

    92023
  • FFT
    FFT
    +關(guān)注

    關(guān)注

    15

    文章

    430

    瀏覽量

    59021
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    3972

    瀏覽量

    132961
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67767
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84078
收藏 人收藏

    評論

    相關(guān)推薦

    #硬聲創(chuàng)作季 5.4.1 頻域抽取2FFT算法——教學(xué)視頻

    算法FFT快速傅里葉變換
    Mr_haohao
    發(fā)布于 :2022年09月02日 10:17:12

    FFT的基本原理及算法結(jié)構(gòu)

    FFT的基本原理及算法結(jié)構(gòu)FFT是利用了旋轉(zhuǎn)因子的周期性和對稱性,對DFT進(jìn)行簡化的運(yùn)算。各種FFT算法可分兩大類:一類是針對N等于
    發(fā)表于 06-14 00:20

    【NUCLEO-F412ZG試用體驗(yàn)】ARM的FFT使用及誤差分析

    的數(shù)字信號,就可以做FFT變換了。N個采樣點(diǎn)數(shù)據(jù),在經(jīng)過FFT之后,就可以得到N個點(diǎn)的FFT結(jié)果。對于快速FFT算法,有
    發(fā)表于 12-16 20:31

    FFT變換

      4.1 引言   4.2 2FFT算法   4.3 進(jìn)一步減少運(yùn)算量的措施   4.4 分裂FFT
    發(fā)表于 08-11 16:50 ?0次下載

    N為合數(shù)的FFT算法

    N為合數(shù)的FFT算法上面討論的以2(即N=2M)的時間抽選和頻率抽選FFT
    發(fā)表于 10-30 13:16 ?1555次閱讀
    N為合數(shù)的<b class='flag-5'>FFT</b><b class='flag-5'>算法</b>

    FFT算法的應(yīng)用

    FFT算法的應(yīng)用 一. 數(shù)字濾波器設(shè)計:(一)2按時間抽取FFT算法對于有限長離
    發(fā)表于 10-30 13:20 ?1w次閱讀
    <b class='flag-5'>FFT</b><b class='flag-5'>算法</b>的應(yīng)用

    固定幾何結(jié)構(gòu)的FFT算法及其FPGA實(shí)現(xiàn)

    .引言DFT及其快速算法FFT是信號處理領(lǐng)域的核心組成部分。FFT算法多種多樣,按數(shù)據(jù)組合方式不同一般分時域和頻域,按數(shù)據(jù)抽取方式的不同又可分為
    發(fā)表于 06-20 14:18 ?1100次閱讀
    固定幾何結(jié)構(gòu)的<b class='flag-5'>FFT</b><b class='flag-5'>算法</b>及其FPGA實(shí)現(xiàn)

    基于改進(jìn)FFT算法的OFDM調(diào)制解調(diào)模塊設(shè)計

    文章對傳統(tǒng)FFT算法進(jìn)行了改進(jìn),改進(jìn)后的算法將N點(diǎn)DFT分解成二維V萬點(diǎn)DFT的組合,在結(jié)構(gòu)上更適合于用流水線方式實(shí)現(xiàn)FFT。文章首先對算法
    發(fā)表于 09-26 15:38 ?40次下載
    基于改進(jìn)<b class='flag-5'>FFT</b><b class='flag-5'>算法</b>的OFDM調(diào)制解調(diào)模塊設(shè)計

    基于FPGA高精度浮點(diǎn)運(yùn)算器的FFT設(shè)計與仿真

    提出一種2FFT的FPGA方法,完成了基于FPGA高精度浮點(diǎn)運(yùn)算器的FFT的設(shè)計。利用VHDL語言描述了蝶形運(yùn)算過程及地址產(chǎn)生單元,其仿真波形基本能正確的表示輸出結(jié)果。
    發(fā)表于 12-23 14:24 ?46次下載
    基于FPGA高精度浮點(diǎn)運(yùn)算器的<b class='flag-5'>FFT</b>設(shè)計與<b class='flag-5'>仿真</b>

    實(shí)數(shù)FFT算法的設(shè)計及其C語言實(shí)現(xiàn)

    首先分析實(shí)數(shù)FFT算法推導(dǎo)過程,然后給出一種具體實(shí)現(xiàn)FFT算法的C語言程序,可以直接應(yīng)用于需要FFT
    發(fā)表于 01-13 11:32 ?1.1w次閱讀
    實(shí)數(shù)<b class='flag-5'>FFT</b><b class='flag-5'>算法</b>的設(shè)計及其C語言實(shí)現(xiàn)

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

    利和T.W.圖提出的。采用這種算法能使計算機(jī)計算離散傅里葉變換所需要的乘法次數(shù)大為減少,特別是被變換的抽樣點(diǎn)數(shù)N越多,FFT算法計算量的節(jié)省就越顯著。
    發(fā)表于 11-09 09:28 ?8432次閱讀
    <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 算法的實(shí)質(zhì)是把一長序列的 DFT 計算分割為較短序列的 DFT 計算,對于2算法而言,是把序列每次一分為二,最后分割成兩點(diǎn) DFT
    發(fā)表于 11-23 10:58 ?2.9w次閱讀
    <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蝶形圖運(yùn)算單元解析

    蝶形運(yùn)算,2點(diǎn)DFT運(yùn)算稱為蝶形運(yùn)算,而整個FFT就是由若干級迭代的蝶形運(yùn)算組成,而且這種算法采用塬位運(yùn)算,故只需N個存儲單元2. ∑∑(2
    發(fā)表于 11-23 11:48 ?5.8w次閱讀
    <b class='flag-5'>基</b>4<b class='flag-5'>fft</b>蝶形圖運(yùn)算單元解析

    python推導(dǎo)式是什么

    python推導(dǎo)推導(dǎo)式(英文名:comprehensions),也叫解析式,是Python的一種獨(dú)有特性。 推導(dǎo)式是可以從一個數(shù)據(jù)序列構(gòu)
    的頭像 發(fā)表于 02-28 17:13 ?2367次閱讀

    2FFT的verilog代碼實(shí)現(xiàn)及仿真

    上文2FFT算法推導(dǎo)python仿真推導(dǎo)
    的頭像 發(fā)表于 06-02 12:38 ?1041次閱讀
    <b class='flag-5'>基</b><b class='flag-5'>2FFT</b>的verilog代碼實(shí)現(xiàn)及<b class='flag-5'>仿真</b>