本人FPGA小白,只關(guān)注FPGA具體功能實現(xiàn)。如以下描述有誤,望評論區(qū)指正!以下內(nèi)容,純手打,嚴禁未經(jīng)過同意擅自轉(zhuǎn)載,謝謝!
1、基2按時間抽取的FFT流程
相比于基2算法,基4算法對本設(shè)計(32點FFT)運算的復雜度并沒有顯著的降低。
基2按時間抽取的FFT蝶形運算如下圖所示:
可以發(fā)現(xiàn)輸入端與輸出端的序列順序是不一樣的,若想得到輸出端為自然順序(0-31)的序列,則需要將輸入端的序列按一定的規(guī)則重新排列。
復雜的公式推導這里就不列了,需要的可以隨便在一本數(shù)字信號處理的書中找到,這里只說明怎么重新排列輸入端的序列順序。
這里的關(guān)鍵字是“基2”和“按時間抽取”。
按時間抽取的大流程是:將序列按時間順序抽取成奇偶項,并對得到的序列繼續(xù)抽取,直到抽取后得到的序列長度為2(基2)。此時重新排列即為FFT蝶形運算的輸入端序列順序。
2、matlab FFT算法實現(xiàn)
算法比較簡單,只有一個核心運算:蝶形運算。
如上圖所示:C = A + B * Wn D = A - B * Wn,其中Wn為蝶形因子
matlab 蝶形運算
function [outputArg0,outputArg1] = butterfly(arg0,arg1,butterfly_factor)
%BUTTERFLY 蝶形運算
% 此處顯示詳細說明
outputArg0 = arg0 + arg1 * butterfly_factor;
outputArg1 = arg0 - arg1 * butterfly_factor;
end
matlab 蝶形因子計算
N = 32;
BF_factor_L0 = linspace(0,N/32-1,N/32);
BF_factor_L0 = exp(-1j*2*pi/2.*BF_factor_L0) ; % 蝶形因子 * 32767
BF_factor_L1 = linspace(0,N/16-1,N/16);
BF_factor_L1 = exp(-1j*2*pi/4.*BF_factor_L1); % 蝶形因子 * 32767
BF_factor_L2 = linspace(0,N/8-1,N/8);
BF_factor_L2 = exp(-1j*2*pi/8.*BF_factor_L2); % 蝶形因子 * 32767
BF_factor_L3 = linspace(0,N/4-1,N/4);
BF_factor_L3 = exp(-1j*2*pi/16.*BF_factor_L3); % 蝶形因子 * 32767
BF_factor_L4 = linspace(0,N/2-1,N/2);
BF_factor_L4 = exp(-1j*2*pi/32.*BF_factor_L4); % 蝶形因子 * 32767
end
matlab 第0級蝶形運算
% Level_0
[result_L0(1) ,result_L0(2)] = butterfly(data(1) ,data(17),BF_factor_L0(1));
[result_L0(3) ,result_L0(4)] = butterfly(data(9) ,data(25),BF_factor_L0(1));
[result_L0(5) ,result_L0(6)] = butterfly(data(5) ,data(21),BF_factor_L0(1));
[result_L0(7) ,result_L0(8)] = butterfly(data(13),data(29),BF_factor_L0(1));
[result_L0(9) ,result_L0(10)]= butterfly(data(3) ,data(19),BF_factor_L0(1));
[result_L0(11),result_L0(12)]= butterfly(data(11),data(27),BF_factor_L0(1));
[result_L0(13),result_L0(14)]= butterfly(data(7) ,data(23),BF_factor_L0(1));
[result_L0(15),result_L0(16)]= butterfly(data(15),data(31),BF_factor_L0(1));
[result_L0(17),result_L0(18)]= butterfly(data(2) ,data(18),BF_factor_L0(1));
[result_L0(19),result_L0(20)]= butterfly(data(10),data(26),BF_factor_L0(1));
[result_L0(21),result_L0(22)]= butterfly(data(6) ,data(22),BF_factor_L0(1));
[result_L0(23),result_L0(24)]= butterfly(data(14),data(30),BF_factor_L0(1));
[result_L0(25),result_L0(26)]= butterfly(data(4) ,data(20),BF_factor_L0(1));
[result_L0(27),result_L0(28)]= butterfly(data(12),data(28),BF_factor_L0(1));
[result_L0(29),result_L0(30)]= butterfly(data(8) ,data(24),BF_factor_L0(1));
[result_L0(31),result_L0(32)]= butterfly(data(16),data(32),BF_factor_L0(1));
matlab 第1級蝶形運算
% Level_1
[result_L1(1) ,result_L1(3)] = butterfly(result_L0(1) ,result_L0(3) ,BF_factor_L1(1));
[result_L1(2) ,result_L1(4)] = butterfly(result_L0(2) ,result_L0(4) ,BF_factor_L1(2));
[result_L1(5) ,result_L1(7)] = butterfly(result_L0(5) ,result_L0(7) ,BF_factor_L1(1));
[result_L1(6) ,result_L1(8)] = butterfly(result_L0(6) ,result_L0(8) ,BF_factor_L1(2));
[result_L1(9) ,result_L1(11)]= butterfly(result_L0(9) ,result_L0(11),BF_factor_L1(1));
[result_L1(10),result_L1(12)]= butterfly(result_L0(10),result_L0(12),BF_factor_L1(2));
[result_L1(13),result_L1(15)]= butterfly(result_L0(13),result_L0(15),BF_factor_L1(1));
[result_L1(14),result_L1(16)]= butterfly(result_L0(14),result_L0(16),BF_factor_L1(2));
[result_L1(17),result_L1(19)]= butterfly(result_L0(17),result_L0(19),BF_factor_L1(1));
[result_L1(18),result_L1(20)]= butterfly(result_L0(18),result_L0(20),BF_factor_L1(2));
[result_L1(21),result_L1(23)]= butterfly(result_L0(21),result_L0(23),BF_factor_L1(1));
[result_L1(22),result_L1(24)]= butterfly(result_L0(22),result_L0(24),BF_factor_L1(2));
[result_L1(25),result_L1(27)]= butterfly(result_L0(25),result_L0(27),BF_factor_L1(1));
[result_L1(26),result_L1(28)]= butterfly(result_L0(26),result_L0(28),BF_factor_L1(2));
[result_L1(29),result_L1(31)]= butterfly(result_L0(29),result_L0(31),BF_factor_L1(1));
[result_L1(30),result_L1(32)]= butterfly(result_L0(30),result_L0(32),BF_factor_L1(2));
matlab 第2級蝶形運算
% Level_2
[result_L2(1) ,result_L2(5)] = butterfly(result_L1(1) ,result_L1(5) ,BF_factor_L2(1));
[result_L2(2) ,result_L2(6)] = butterfly(result_L1(2) ,result_L1(6) ,BF_factor_L2(2));
[result_L2(3) ,result_L2(7)] = butterfly(result_L1(3) ,result_L1(7) ,BF_factor_L2(3));
[result_L2(4) ,result_L2(8)] = butterfly(result_L1(4) ,result_L1(8) ,BF_factor_L2(4));
[result_L2(9) ,result_L2(13)]= butterfly(result_L1(9) ,result_L1(13),BF_factor_L2(1));
[result_L2(10),result_L2(14)]= butterfly(result_L1(10),result_L1(14),BF_factor_L2(2));
[result_L2(11),result_L2(15)]= butterfly(result_L1(11),result_L1(15),BF_factor_L2(3));
[result_L2(12),result_L2(16)]= butterfly(result_L1(12),result_L1(16),BF_factor_L2(4));
[result_L2(17),result_L2(21)]= butterfly(result_L1(17),result_L1(21),BF_factor_L2(1));
[result_L2(18),result_L2(22)]= butterfly(result_L1(18),result_L1(22),BF_factor_L2(2));
[result_L2(19),result_L2(23)]= butterfly(result_L1(19),result_L1(23),BF_factor_L2(3));
[result_L2(20),result_L2(24)]= butterfly(result_L1(20),result_L1(24),BF_factor_L2(4));
[result_L2(25),result_L2(29)]= butterfly(result_L1(25),result_L1(29),BF_factor_L2(1));
[result_L2(26),result_L2(30)]= butterfly(result_L1(26),result_L1(30),BF_factor_L2(2));
[result_L2(27),result_L2(31)]= butterfly(result_L1(27),result_L1(31),BF_factor_L2(3));
[result_L2(28),result_L2(32)]= butterfly(result_L1(28),result_L1(32),BF_factor_L2(4));
matlab 第3級蝶形運算
% Level_3
[result_L3(1) ,result_L3(9)] = butterfly(result_L2(1) ,result_L2(9) ,BF_factor_L3(1));
[result_L3(2) ,result_L3(10)]= butterfly(result_L2(2) ,result_L2(10),BF_factor_L3(2));
[result_L3(3) ,result_L3(11)]= butterfly(result_L2(3) ,result_L2(11),BF_factor_L3(3));
[result_L3(4) ,result_L3(12)]= butterfly(result_L2(4) ,result_L2(12),BF_factor_L3(4));
[result_L3(5) ,result_L3(13)]= butterfly(result_L2(5) ,result_L2(13),BF_factor_L3(5));
[result_L3(6) ,result_L3(14)]= butterfly(result_L2(6) ,result_L2(14),BF_factor_L3(6));
[result_L3(7) ,result_L3(15)]= butterfly(result_L2(7) ,result_L2(15),BF_factor_L3(7));
[result_L3(8) ,result_L3(16)]= butterfly(result_L2(8) ,result_L2(16),BF_factor_L3(8));
[result_L3(17),result_L3(25)]= butterfly(result_L2(17),result_L2(25),BF_factor_L3(1));
[result_L3(18),result_L3(26)]= butterfly(result_L2(18),result_L2(26),BF_factor_L3(2));
[result_L3(19),result_L3(27)]= butterfly(result_L2(19),result_L2(27),BF_factor_L3(3));
[result_L3(20),result_L3(28)]= butterfly(result_L2(20),result_L2(28),BF_factor_L3(4));
[result_L3(21),result_L3(29)]= butterfly(result_L2(21),result_L2(29),BF_factor_L3(5));
[result_L3(22),result_L3(30)]= butterfly(result_L2(22),result_L2(30),BF_factor_L3(6));
[result_L3(23),result_L3(31)]= butterfly(result_L2(23),result_L2(31),BF_factor_L3(7));
[result_L3(24),result_L3(32)]= butterfly(result_L2(24),result_L2(32),BF_factor_L3(8));
matlab 第4級蝶形運算
% Level_4
[result_L4(1) ,result_L4(17)]= butterfly(result_L3(1) ,result_L3(17),BF_factor_L4(1));
[result_L4(2) ,result_L4(18)]= butterfly(result_L3(2) ,result_L3(18),BF_factor_L4(2));
[result_L4(3) ,result_L4(19)]= butterfly(result_L3(3) ,result_L3(19),BF_factor_L4(3));
[result_L4(4) ,result_L4(20)]= butterfly(result_L3(4) ,result_L3(20),BF_factor_L4(4));
[result_L4(5) ,result_L4(21)]= butterfly(result_L3(5) ,result_L3(21),BF_factor_L4(5));
[result_L4(6) ,result_L4(22)]= butterfly(result_L3(6) ,result_L3(22),BF_factor_L4(6));
[result_L4(7) ,result_L4(23)]= butterfly(result_L3(7) ,result_L3(23),BF_factor_L4(7));
[result_L4(8) ,result_L4(24)]= butterfly(result_L3(8) ,result_L3(24),BF_factor_L4(8));
[result_L4(9) ,result_L4(25)]= butterfly(result_L3(9) ,result_L3(25),BF_factor_L4(9));
[result_L4(10),result_L4(26)]= butterfly(result_L3(10),result_L3(26),BF_factor_L4(10));
[result_L4(11),result_L4(27)]= butterfly(result_L3(11),result_L3(27),BF_factor_L4(11));
[result_L4(12),result_L4(28)]= butterfly(result_L3(12),result_L3(28),BF_factor_L4(12));
[result_L4(13),result_L4(29)]= butterfly(result_L3(13),result_L3(29),BF_factor_L4(13));
[result_L4(14),result_L4(30)]= butterfly(result_L3(14),result_L3(30),BF_factor_L4(14));
[result_L4(15),result_L4(31)]= butterfly(result_L3(15),result_L3(31),BF_factor_L4(15));
[result_L4(16),result_L4(32)]= butterfly(result_L3(16),result_L3(32),BF_factor_L4(16));
與matlab 庫函數(shù)FFT運算比較
通過對比可知,編寫的FFT輸出結(jié)果與調(diào)用庫函數(shù)FFT結(jié)果基本一致。
FPGA FFT算法實現(xiàn)
FPGA中32點并行FFT算法的實現(xiàn)流程與matlab中是完全一致的。工程結(jié)構(gòu)如下:
3、matlab與FPGA實現(xiàn)的結(jié)果對比
matlab輸出結(jié)果
FPGA輸出結(jié)果
FPGA輸出結(jié)果實部
FPGA輸出結(jié)果虛部
文章來源:http://www.zghlxwxcb.cn/news/detail-856462.html
4、IFFT實現(xiàn)
IFFT實現(xiàn)與FFT實現(xiàn)基本一致,可以通過FFT算法得到IFFT的結(jié)果。
1、將IFFT的輸入序列取共軛;
2、進行FFT運算;
3、將FFT運算結(jié)果取共軛,得到的結(jié)果就是原序列IFFT的結(jié)果。文章來源地址http://www.zghlxwxcb.cn/news/detail-856462.html
到了這里,關(guān)于《FPGA數(shù)字信號處理》基于FPGA的32點并行FFT/IFFT設(shè)計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!