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

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

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

數(shù)字信號(hào)處理-FPGA FFT IP應(yīng)用實(shí)例

CHANBAEK ? 來(lái)源:FPGA and ICer ? 作者: Vuko ? 2023-05-30 15:03 ? 次閱讀

前言

本文根據(jù)FFT相關(guān)原理進(jìn)行設(shè)計(jì)構(gòu)建工程,仿造前文的工程構(gòu)建的混頻功能的工程,設(shè)計(jì)工程顯示該混頻信號(hào)的功率譜,然后進(jìn)行仿真分析。

FFT仿真與分析

本文不再針對(duì)FFT的原理進(jìn)行過(guò)多贅述,提供一份簡(jiǎn)單的matlab仿真代碼。 根據(jù)仿真簡(jiǎn)述下FFT的相關(guān)使用注意事項(xiàng)。

clc;clear all;
fs=50e6;%采樣率
N=1024;%采樣點(diǎn)數(shù)
t=[0:N-1]/fs; %時(shí)間序列
f1=3e6;%頻點(diǎn)1 3MHZ
f2=4e6;%頻點(diǎn)2 4MHZ
s1=sin(2*pi*f1*t);%信號(hào)1
s2=sin(2*pi*f2*t);%信號(hào)2
mixsign=s1.*s2;%混頻
fftsign=fft(mixsign);%求fft
fftabs=abs(fftsign);%取模運(yùn)算
plot(fftabs);

代碼設(shè)計(jì),模擬生成了兩個(gè)不同頻率的信號(hào)3MHz和4MHz,模擬采樣了1024,將兩個(gè)信號(hào)進(jìn)行混頻后則產(chǎn)生了7MHz和1MHz的信號(hào)。 然后通過(guò)FFT函數(shù),取模運(yùn)算,求得FFT的幅度譜,然后進(jìn)行顯示輸出。

圖片
1024點(diǎn)的FFT結(jié)果

頻率分辨率

頻率分辨率是FFT的一個(gè)重要的參數(shù),橫坐標(biāo)每一個(gè)單位的頻率精度等于 fs/N,N 是 FFT 的點(diǎn)數(shù)。 即求出該仿真情況下的頻率分辨率如下:

將仿真輸出的圖片放大,并標(biāo)注坐標(biāo),可見(jiàn),第一個(gè)峰值的橫坐標(biāo)為21,第二個(gè)峰值的橫坐標(biāo)為144,計(jì)算可知,第一個(gè)峰值對(duì)應(yīng)的頻率為1.0254MHz,第二個(gè)峰值對(duì)應(yīng)的頻率為1.0254MHz,7.0313MHz。

圖片
FFT結(jié)果

可見(jiàn)實(shí)際FFT出來(lái)后的結(jié)果,和仿真設(shè)置的相差了一點(diǎn),但是基本上是在設(shè)置的附近,這是因?yàn)轭l率分辨率不夠,48828.125Hz的分辨率不能恰好對(duì)應(yīng)到設(shè)置的1MHz和7MHz。

如果想恰好得到1MHz和7MHz的FFT的處理結(jié)果,或者想進(jìn)一步減小誤差,則需要進(jìn)行相干采樣,頻率分辨率恰好是所求的頻率的倍數(shù)。

關(guān)于頻譜泄露

頻率分辨率欠佳后,就會(huì)造成頻譜泄露。

當(dāng)信號(hào)X(t)的頻率f0是fs/N的整數(shù)倍時(shí),這說(shuō)明在處理長(zhǎng)度NT內(nèi)有信號(hào)的K個(gè)整周期。 這時(shí)由X(t)構(gòu)成的以NT為周期的周期性信號(hào)是連續(xù)的。 當(dāng)信號(hào)X(t)的頻率f0不是fs/N的整數(shù)倍時(shí),則在NT的處理長(zhǎng)度內(nèi),就不是恰好為信號(hào)周期的整數(shù)倍,有X(t)以NT為周期進(jìn)行周期延拓所得到的周期性信號(hào)就出現(xiàn)了不連續(xù)點(diǎn),造成了頻譜分量從其正常頻譜擴(kuò)展開(kāi)來(lái),就這樣形成了頻譜泄露現(xiàn)象。

整周期截?cái)啵粫?huì)造成頻譜泄露; 非整周期截?cái)?,必然造成頻譜泄露。

前面提到的相干采樣,正式因?yàn)檫M(jìn)行了整數(shù)周期的截?cái)嗖攀沟妙l譜不進(jìn)行泄露,并且FFT后的信號(hào)尖峰也恰好能對(duì)應(yīng)我們?cè)O(shè)置的預(yù)期的頻率。

使用FFT IP進(jìn)行工程設(shè)計(jì)

可以將DDS應(yīng)用實(shí)例的工程進(jìn)行復(fù)制備份,然后添加相關(guān) IP,進(jìn)行工程適配。

實(shí)現(xiàn)功率譜邏輯

FFT 的原理是可以通過(guò)實(shí)部和虛部的數(shù)據(jù)恢復(fù)出周期信號(hào)的相位和幅值; 假如 a 是實(shí)部數(shù)據(jù), b 是虛部數(shù)據(jù), a+bj 是復(fù)數(shù); 對(duì)應(yīng)的模運(yùn)算是=sqrt(a^2+b^2),F(xiàn)FT處理后取模運(yùn)算中的開(kāi)更號(hào)在FPGA中實(shí)現(xiàn)比較麻煩,可以利用自帶的cordic IP去處理,這里可以簡(jiǎn)化一下求FFT處理后的功率譜,也即(a^2+b^2)。

因此在調(diào)用FFT函數(shù)后,將輸出的數(shù)據(jù)的實(shí)部虛部進(jìn)行平方再相加即可得到FFT處理后的功率譜。

添加FFT IP

在配置界面可配置FFT的通道個(gè)數(shù),傅里葉變換的長(zhǎng)度,該結(jié)構(gòu)的時(shí)鐘,以及采用的算法架構(gòu)。 改變通道個(gè)數(shù)為N后,對(duì)應(yīng)的數(shù)據(jù)位寬會(huì)變成一個(gè)通道的N倍。 這里設(shè)置 IP 核 1024 點(diǎn) FFT, 采樣率 50MHz, 選擇基 2 突發(fā)結(jié)構(gòu)。

圖片
FFT IP配置

數(shù)據(jù)格式選擇定點(diǎn)數(shù)類(lèi)型,放縮設(shè)置為塊浮點(diǎn)模式, 輸出 FFT 結(jié)果選擇順序輸出。

圖片
FFT ip配置二

在側(cè)邊欄可以看到IP的接口狀態(tài),以及具體實(shí)現(xiàn)架構(gòu)的相關(guān)細(xì)節(jié),從實(shí)現(xiàn)細(xì)節(jié)界面可看到,在CONFIG接口處的數(shù)據(jù)位,有一個(gè)FWD_INV的配置參數(shù),該參數(shù)是配置正變換還是反變換,因?yàn)?FFT 的計(jì)算正變換和反變換可以用一套算法實(shí)現(xiàn)。 這里 FWD_INV=1 為正變換, 為 0 是反變換。

這里看到 CHAN_0_XN_IM_0(31:16)是復(fù)數(shù)的虛部數(shù)據(jù),并且使用的是 fix16_15 定點(diǎn)數(shù), 意思是最高位為符號(hào)位, 小數(shù)部分有15位。 CHAN_0_XN_RE_0(15:0)是復(fù)數(shù)的實(shí)部數(shù)據(jù); 這里的FFT混頻信號(hào)只提供了實(shí)部的信號(hào),因此,在信號(hào)連接時(shí),只需要把低 16 位賦值為乘法器輸出值, 而高 16 位賦值為 0即可。

圖片
FFT側(cè)邊欄

從側(cè)邊欄還可以對(duì)FFT進(jìn)行延時(shí)分析,從圖中可知,該架構(gòu)的FFT變化需要146.820us才能完成。

圖片
延時(shí)分析

添加DDS IP

添加DDS IP,配置輸出兩路信號(hào)分別為3MHz和4MHz。 匹配FFT的IP采樣頻率的50MHz,修改SFDR為45。

圖片
DDS ip配置

配置完成基本信息配置下一頁(yè),基本保持默認(rèn)即可,這里只想查看波形,所以相位輸出就關(guān)閉。

圖片
配置界面二

DDS的IP核多通道之間是分時(shí)復(fù)用的,所以在細(xì)節(jié)實(shí)現(xiàn)配置界面最好使能通道ID以供進(jìn)行區(qū)別單個(gè)通道的信號(hào)波形。 其余可以保持默認(rèn)。

圖片
使能通道ID

配置輸出頻率為3MHz和4MHz。 其余保持默認(rèn),點(diǎn)擊OK,完成配置。

圖片
配置輸出頻率

修改乘法器IP

將乘法器適配當(dāng)前的數(shù)據(jù)位寬,并保存設(shè)置。 該乘法器用于實(shí)現(xiàn)混頻乘法。

圖片
乘法器配置

調(diào)用第二個(gè)乘法器,配置輸入位寬為16位,輸出為32位,有符號(hào)類(lèi)型。 該乘法器用于實(shí)現(xiàn)FFT處理后的功率譜邏輯。

圖片
圖片-20221128132020847

編寫(xiě). V文件

根據(jù)上面的邏輯結(jié)構(gòu),例化IP、編寫(xiě)代碼依次實(shí)現(xiàn)DDS的信號(hào)產(chǎn)生、混頻、FFT處理、以及功率譜運(yùn)算邏輯。

`timescale 1ns / 1ps
module top(
    input clk
    );

    wire          m_axis_data_tvalid_ch3;
    wire [7 : 0]  m_axis_data_tdata_ch3;
    wire [0 : 0]  m_axis_data_tuser_ch3;

    //多通道測(cè)試
    dds_compiler_1 multi_ch_dds(
    .aclk(clk),                                // input wire aclk
    .m_axis_data_tvalid(m_axis_data_tvalid_ch3),    // output wire m_axis_data_tvalid
    .m_axis_data_tdata(m_axis_data_tdata_ch3),      // output wire [7 : 0] m_axis_data_tdata
    .m_axis_data_tuser(m_axis_data_tuser_ch3)
    );

    reg [7 : 0] data3MHz;
    reg [7 : 0] data4MHz;
    always @(posedge clk) begin
        case(m_axis_data_tuser_ch3)
            0:data3MHz<=m_axis_data_tdata_ch3;
            1:data4MHz<=m_axis_data_tdata_ch3;
        endcase
     end

    //混頻測(cè)試
    wire [15 : 0]  mixer_singal;
    mult_gen_0 mult_mixer (
        .CLK(clk),  // input wire CLK
        .A(data3MHz),      // input wire [7 : 0] A
        .B(data4MHz),      // input wire [7 : 0] B
        .P(mixer_singal)      // output wire [15 : 0] P
    );

    reg div_clk=0;
    always @(posedge clk ) begin
        div_clk<=!div_clk;
    end

    wire mixer_singal_tready;
    wire [31 : 0] after_fft_data;
    wire [7 : 0] m_axis_data_tuser;
    wire m_axis_data_tvalid;

    xfft_0 uut_fft(
    .aclk(div_clk),                                                // input wire aclk
    .s_axis_config_tdata('d1),                  // input wire [7 : 0] s_axis_config_tdata
    .s_axis_config_tvalid(1),                // input wire s_axis_config_tvalid
    .s_axis_config_tready(),                // output wire s_axis_config_tready
    .s_axis_data_tdata({16'd0,mixer_singal}),                      // input wire [31 : 0] s_axis_data_tdata
    .s_axis_data_tvalid(1),                    // input wire s_axis_data_tvalid
    .s_axis_data_tready(mixer_singal_tready),                    // output wire s_axis_data_tready
    .s_axis_data_tlast(0),                      // input wire s_axis_data_tlast
    .m_axis_data_tdata(after_fft_data),                      // output wire [31 : 0] m_axis_data_tdata
    .m_axis_data_tuser(m_axis_data_tuser),                      // output wire [7 : 0] m_axis_data_tuser
    .m_axis_data_tvalid(m_axis_data_tvalid),                    // output wire m_axis_data_tvalid
    .m_axis_data_tready(1),                    // input wire m_axis_data_tready
    .m_axis_data_tlast(),                      // output wire m_axis_data_tlast
    .m_axis_status_tdata(),                  // output wire [7 : 0] m_axis_status_tdata
    .m_axis_status_tvalid(),                // output wire m_axis_status_tvalid
    .m_axis_status_tready(1),                // input wire m_axis_status_tready
    .event_frame_started(),                  // output wire event_frame_started
    .event_tlast_unexpected(),            // output wire event_tlast_unexpected
    .event_tlast_missing(),                  // output wire event_tlast_missing
    .event_status_channel_halt(),      // output wire event_status_channel_halt
    .event_data_in_channel_halt(),    // output wire event_data_in_channel_halt
    .event_data_out_channel_halt()  // output wire event_data_out_channel_halt
    );
    
    wire [31 : 0] fft_re_2;
    mult_gen_1 mult_re (
        .CLK(div_clk),  // input wire CLK
        .A(after_fft_data[15:0]),      // input wire [15 : 0] A
        .B(after_fft_data[15:0]),      // input wire [15 : 0] B
        .P(fft_re_2)      // output wire [31 : 0] P
    );

    wire [31 : 0] fft_im_2;
    mult_gen_1 mult_im (
        .CLK(div_clk),  // input wire CLK
        .A(after_fft_data[31:15]),      // input wire [15 : 0] A
        .B(after_fft_data[31:15]),      // input wire [15 : 0] B
        .P(fft_im_2)      // output wire [31 : 0] P
    );

    wire [32 : 0] sum = fft_re_2 + fft_im_2;

endmodule

運(yùn)行仿真測(cè)試

這里仿真只需要給一個(gè)時(shí)鐘源即可,編寫(xiě)仿真代碼實(shí)現(xiàn)100MHz的時(shí)鐘。 運(yùn)行仿真將相關(guān)信號(hào)添加到波形窗口中,觀察信號(hào)。 這里的sum為做完FFT處理后,實(shí)現(xiàn)功率譜邏輯的信號(hào)。 將波形轉(zhuǎn)換成模擬形式后可看出波形和matlab的代碼仿真類(lèi)似,然后確定下橫坐標(biāo)是否為21和144,即對(duì)應(yīng)信號(hào)頻率是否為1MHz和7MHz。

圖片
仿真波形

從下圖可看出,從FFT處理輸出的第一個(gè)信號(hào)到輸出第一個(gè)峰值花費(fèi)了420ns,F(xiàn)FT的配置頻率和工作頻率是50MHz,也就是周期就是20ns,恰好對(duì)應(yīng)了第21個(gè)點(diǎn),和仿真結(jié)果一致。

圖片
波形分析

第二個(gè)峰值距離FFT輸出第一個(gè)數(shù)據(jù)的時(shí)間花費(fèi)了2880ns,換算下來(lái)也就是144個(gè)時(shí)鐘周期,和仿真結(jié)果一致。

圖片
波形分析

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

    關(guān)注

    1629

    文章

    21754

    瀏覽量

    604222
  • matlab
    +關(guān)注

    關(guān)注

    185

    文章

    2977

    瀏覽量

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

    關(guān)注

    15

    文章

    436

    瀏覽量

    59411
  • 信號(hào)
    +關(guān)注

    關(guān)注

    11

    文章

    2794

    瀏覽量

    76880
  • 仿真分析
    +關(guān)注

    關(guān)注

    3

    文章

    105

    瀏覽量

    33674
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【參考書(shū)籍】基于FPGA數(shù)字信號(hào)處理——高亞軍著

    `《基于FPGA數(shù)字信號(hào)處理》是一本有關(guān)如何在FPGA上實(shí)現(xiàn)數(shù)字信號(hào)處理的著作。本書(shū)以Xili
    發(fā)表于 04-24 09:33

    利用FPGA怎么實(shí)現(xiàn)數(shù)字信號(hào)處理?

    DSP技術(shù)廣泛應(yīng)用于各個(gè)領(lǐng)域,但傳統(tǒng)的數(shù)字信號(hào)處理器由于以順序方式工作使得數(shù)據(jù)處理速度較低,且在功能重構(gòu)及應(yīng)用目標(biāo)的修改方面缺乏靈活性。而使用具有并行處理特性的
    發(fā)表于 10-17 08:12

    基于FPGA數(shù)字信號(hào)處理

    基于FPGA數(shù)字信號(hào)處理
    發(fā)表于 04-04 18:08

    數(shù)字信號(hào)處理FPGA實(shí)現(xiàn)

    FPGA正在掀起一場(chǎng)數(shù)字信號(hào)處理的變革。本書(shū)旨在講解前端數(shù)字信號(hào)處理算法的高效實(shí)現(xiàn)。首先概述了當(dāng)前的FP
    發(fā)表于 09-19 06:38

    數(shù)字信號(hào)處理fft的verilog應(yīng)用程序

    在學(xué)習(xí)了數(shù)字信號(hào)處理之后,在底部使用verilog實(shí)現(xiàn)了FFT的應(yīng)用
    發(fā)表于 09-28 06:49

    基于FPGA數(shù)字信號(hào)處理

    基于FPGA數(shù)字信號(hào)處理,本文主要探討了基于FPGA數(shù)字信號(hào)處理的實(shí)現(xiàn)
    發(fā)表于 10-30 10:39 ?34次下載

    數(shù)字信號(hào)處理FPGA實(shí)現(xiàn)

    本書(shū)比較全面地闡述了fpga數(shù)字信號(hào)處理中的應(yīng)用問(wèn)題。本書(shū)共分8章,主要內(nèi)容包括典型fpga器件的介紹、vhdl硬件描述語(yǔ)言、fpga設(shè)計(jì)
    發(fā)表于 12-23 11:07 ?45次下載

    基于FPGA數(shù)字信號(hào)處理算法研究與高效實(shí)現(xiàn)

    基于FPGA數(shù)字信號(hào)處理算法研究與高效實(shí)現(xiàn)
    發(fā)表于 08-29 23:20 ?42次下載

    基于FPGA數(shù)字信號(hào)處理

    基于FPGA數(shù)字信號(hào)處理
    發(fā)表于 12-14 22:08 ?20次下載

    數(shù)字信號(hào)處理FPGA實(shí)現(xiàn)

    數(shù)字信號(hào)處理FPGA實(shí)現(xiàn)
    發(fā)表于 12-14 22:08 ?32次下載

    數(shù)字信號(hào)處理第4章-快速傅里葉變換(FFT)

    數(shù)字信號(hào)處理第4章-快速傅里葉變換(FFT)
    發(fā)表于 12-28 14:23 ?0次下載

    數(shù)字信號(hào)處理技術(shù)FFT算法與FPGAFFT變換設(shè)計(jì)

    隨著集成電路的飛速發(fā)展,在圖像處理,通信和多媒體等很多領(lǐng)域中,數(shù)字信號(hào)處理技術(shù)已經(jīng)被廣泛應(yīng)用??焖俑盗⑷~變換(FFT)算法的提出,使得數(shù)字信號(hào)
    發(fā)表于 10-15 10:54 ?20次下載

    多抽樣率的數(shù)字信號(hào)處理及其FPGA實(shí)現(xiàn)

    多抽樣率的數(shù)字信號(hào)處理及其FPGA實(shí)現(xiàn)
    發(fā)表于 10-30 11:42 ?12次下載
    多抽樣率的<b class='flag-5'>數(shù)字信號(hào)</b><b class='flag-5'>處理</b>及其<b class='flag-5'>FPGA</b>實(shí)現(xiàn)

    數(shù)字信號(hào)處理FFT的Verilog工程文件和程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)字信號(hào)處理FFT的Verilog工程文件和程序免費(fèi)下載。
    發(fā)表于 11-29 17:13 ?33次下載
    <b class='flag-5'>數(shù)字信號(hào)</b><b class='flag-5'>處理</b><b class='flag-5'>FFT</b>的Verilog工程文件和程序免費(fèi)下載

    數(shù)字信號(hào)處理FPGA實(shí)現(xiàn).第3版英文

    數(shù)字信號(hào)處理FPGA實(shí)現(xiàn).第3版英文
    發(fā)表于 10-18 10:55 ?0次下載