色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數字信號處理-FPGA FFT IP應用實例

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

前言

本文根據FFT相關原理進行設計構建工程,仿造前文的工程構建的混頻功能的工程,設計工程顯示該混頻信號的功率譜,然后進行仿真分析。

FFT仿真與分析

本文不再針對FFT的原理進行過多贅述,提供一份簡單的matlab仿真代碼。 根據仿真簡述下FFT的相關使用注意事項。

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

代碼設計,模擬生成了兩個不同頻率的信號3MHz和4MHz,模擬采樣了1024,將兩個信號進行混頻后則產生了7MHz和1MHz的信號。 然后通過FFT函數,取模運算,求得FFT的幅度譜,然后進行顯示輸出。

圖片
1024點的FFT結果

頻率分辨率

頻率分辨率是FFT的一個重要的參數,橫坐標每一個單位的頻率精度等于 fs/N,N 是 FFT 的點數。 即求出該仿真情況下的頻率分辨率如下:

將仿真輸出的圖片放大,并標注坐標,可見,第一個峰值的橫坐標為21,第二個峰值的橫坐標為144,計算可知,第一個峰值對應的頻率為1.0254MHz,第二個峰值對應的頻率為1.0254MHz,7.0313MHz。

圖片
FFT結果

可見實際FFT出來后的結果,和仿真設置的相差了一點,但是基本上是在設置的附近,這是因為頻率分辨率不夠,48828.125Hz的分辨率不能恰好對應到設置的1MHz和7MHz。

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

關于頻譜泄露

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

當信號X(t)的頻率f0是fs/N的整數倍時,這說明在處理長度NT內有信號的K個整周期。 這時由X(t)構成的以NT為周期的周期性信號是連續的。 當信號X(t)的頻率f0不是fs/N的整數倍時,則在NT的處理長度內,就不是恰好為信號周期的整數倍,有X(t)以NT為周期進行周期延拓所得到的周期性信號就出現了不連續點,造成了頻譜分量從其正常頻譜擴展開來,就這樣形成了頻譜泄露現象。

整周期截斷,不會造成頻譜泄露; 非整周期截斷,必然造成頻譜泄露。

前面提到的相干采樣,正式因為進行了整數周期的截斷才使得頻譜不進行泄露,并且FFT后的信號尖峰也恰好能對應我們設置的預期的頻率。

使用FFT IP進行工程設計

可以將DDS應用實例的工程進行復制備份,然后添加相關 IP,進行工程適配。

實現功率譜邏輯

FFT 的原理是可以通過實部和虛部的數據恢復出周期信號的相位和幅值; 假如 a 是實部數據, b 是虛部數據, a+bj 是復數; 對應的模運算是=sqrt(a^2+b^2),FFT處理后取模運算中的開更號在FPGA中實現比較麻煩,可以利用自帶的cordic IP去處理,這里可以簡化一下求FFT處理后的功率譜,也即(a^2+b^2)。

因此在調用FFT函數后,將輸出的數據的實部虛部進行平方再相加即可得到FFT處理后的功率譜。

添加FFT IP

在配置界面可配置FFT的通道個數,傅里葉變換的長度,該結構的時鐘,以及采用的算法架構。 改變通道個數為N后,對應的數據位寬會變成一個通道的N倍。 這里設置 IP 核 1024 點 FFT, 采樣率 50MHz, 選擇基 2 突發結構。

圖片
FFT IP配置

數據格式選擇定點數類型,放縮設置為塊浮點模式, 輸出 FFT 結果選擇順序輸出。

圖片
FFT ip配置二

在側邊欄可以看到IP的接口狀態,以及具體實現架構的相關細節,從實現細節界面可看到,在CONFIG接口處的數據位,有一個FWD_INV的配置參數,該參數是配置正變換還是反變換,因為 FFT 的計算正變換和反變換可以用一套算法實現。 這里 FWD_INV=1 為正變換, 為 0 是反變換。

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

圖片
FFT側邊欄

從側邊欄還可以對FFT進行延時分析,從圖中可知,該架構的FFT變化需要146.820us才能完成。

圖片
延時分析

添加DDS IP

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

圖片
DDS ip配置

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

圖片
配置界面二

DDS的IP核多通道之間是分時復用的,所以在細節實現配置界面最好使能通道ID以供進行區別單個通道的信號波形。 其余可以保持默認。

圖片
使能通道ID

配置輸出頻率為3MHz和4MHz。 其余保持默認,點擊OK,完成配置。

圖片
配置輸出頻率

修改乘法器IP

將乘法器適配當前的數據位寬,并保存設置。 該乘法器用于實現混頻乘法。

圖片
乘法器配置

調用第二個乘法器,配置輸入位寬為16位,輸出為32位,有符號類型。 該乘法器用于實現FFT處理后的功率譜邏輯。

圖片
圖片-20221128132020847

編寫. V文件

根據上面的邏輯結構,例化IP、編寫代碼依次實現DDS的信號產生、混頻、FFT處理、以及功率譜運算邏輯。

`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;

    //多通道測試
    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

    //混頻測試
    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

運行仿真測試

這里仿真只需要給一個時鐘源即可,編寫仿真代碼實現100MHz的時鐘。 運行仿真將相關信號添加到波形窗口中,觀察信號。 這里的sum為做完FFT處理后,實現功率譜邏輯的信號。 將波形轉換成模擬形式后可看出波形和matlab的代碼仿真類似,然后確定下橫坐標是否為21和144,即對應信號頻率是否為1MHz和7MHz。

圖片
仿真波形

從下圖可看出,從FFT處理輸出的第一個信號到輸出第一個峰值花費了420ns,FFT的配置頻率和工作頻率是50MHz,也就是周期就是20ns,恰好對應了第21個點,和仿真結果一致。

圖片
波形分析

第二個峰值距離FFT輸出第一個數據的時間花費了2880ns,換算下來也就是144個時鐘周期,和仿真結果一致。

圖片
波形分析

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1629

    文章

    21729

    瀏覽量

    603048
  • matlab
    +關注

    關注

    185

    文章

    2974

    瀏覽量

    230410
  • FFT
    FFT
    +關注

    關注

    15

    文章

    434

    瀏覽量

    59368
  • 信號
    +關注

    關注

    11

    文章

    2790

    瀏覽量

    76734
  • 仿真分析
    +關注

    關注

    3

    文章

    105

    瀏覽量

    33651
收藏 人收藏

    評論

    相關推薦

    【參考書籍】基于FPGA數字信號處理——高亞軍著

    `《基于FPGA數字信號處理》是一本有關如何在FPGA上實現數字信號處理的著作。本書以Xili
    發表于 04-24 09:33

    利用FPGA怎么實現數字信號處理?

    DSP技術廣泛應用于各個領域,但傳統的數字信號處理器由于以順序方式工作使得數據處理速度較低,且在功能重構及應用目標的修改方面缺乏靈活性。而使用具有并行處理特性的
    發表于 10-17 08:12

    基于FPGA數字信號處理

    基于FPGA數字信號處理
    發表于 04-04 18:08

    數字信號處理FPGA實現

    FPGA正在掀起一場數字信號處理的變革。本書旨在講解前端數字信號處理算法的高效實現。首先概述了當前的FP
    發表于 09-19 06:38

    數字信號處理fft的verilog應用程序

    在學習了數字信號處理之后,在底部使用verilog實現了FFT的應用
    發表于 09-28 06:49

    基于FPGA數字信號處理

    基于FPGA數字信號處理,本文主要探討了基于FPGA數字信號處理的實現
    發表于 10-30 10:39 ?34次下載

    數字信號處理FPGA實現

    本書比較全面地闡述了fpga數字信號處理中的應用問題。本書共分8章,主要內容包括典型fpga器件的介紹、vhdl硬件描述語言、fpga設計
    發表于 12-23 11:07 ?45次下載

    基于FPGA數字信號處理算法研究與高效實現

    基于FPGA數字信號處理算法研究與高效實現
    發表于 08-29 23:20 ?42次下載

    基于FPGA數字信號處理

    基于FPGA數字信號處理
    發表于 12-14 22:08 ?20次下載

    數字信號處理FPGA實現

    數字信號處理FPGA實現
    發表于 12-14 22:08 ?32次下載

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

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

    數字信號處理技術FFT算法與FPGAFFT變換設計

    隨著集成電路的飛速發展,在圖像處理,通信和多媒體等很多領域中,數字信號處理技術已經被廣泛應用。快速傅立葉變換(FFT)算法的提出,使得數字信號
    發表于 10-15 10:54 ?20次下載

    多抽樣率的數字信號處理及其FPGA實現

    多抽樣率的數字信號處理及其FPGA實現
    發表于 10-30 11:42 ?12次下載
    多抽樣率的<b class='flag-5'>數字信號</b><b class='flag-5'>處理</b>及其<b class='flag-5'>FPGA</b>實現

    數字信號處理FFT的Verilog工程文件和程序免費下載

    本文檔的主要內容詳細介紹的是數字信號處理FFT的Verilog工程文件和程序免費下載。
    發表于 11-29 17:13 ?33次下載
    <b class='flag-5'>數字信號</b><b class='flag-5'>處理</b><b class='flag-5'>FFT</b>的Verilog工程文件和程序免費下載

    數字信號處理FPGA實現.第3版英文

    數字信號處理FPGA實現.第3版英文
    發表于 10-18 10:55 ?0次下載
    主站蜘蛛池模板: 中文字幕va一区二区三区| 动漫美女搞鸡| 综合精品欧美日韩国产在线| 日本美女抠逼| 色欲人妻无码AV专区| 性xxx欧美| 伊人久久综合影院首页| 51精品少妇人妻AV一区二区| 99热久久爱五月天婷婷| 亞洲人妻AV無碼在線視頻| 尤物久久99国产综合精品| 97人妻中文字幕免费视频| 伊人精品在线| 一抽一出BGM免费50分动漫| 34g污奶绵uk甩奶| 东北女人一级毛片| 韩国女人高潮嗷嗷叫视频 | 黑人巨大交牲老太| 快播可乐网| 日韩视频中文字幕精品偷拍| 亚洲精品国产专区91在线| 18未满不能进的福利社| 亚洲欧美人成视频在线| 18动漫在线观看| 公交车被CAO到合不拢腿| 娇妻玩4P被三个男人伺候电影| 免费国产成人高清在线观看视频| 日韩中文字幕亚洲无线码| 亚洲精品久久久久久蜜臀| 757一本到午夜宫| 国产精品久久久久久人妻精品流| 久久AAAA片一区二区| 久久国产高清字幕中文| 全身无赤裸裸美女网站| 日本精品在线观看视频| 亚洲欧美一区二区成人片| yellow视频免费观看| 花蝴蝶高清观看免费| 青春草久久| 四虎精品久久| 91免费网站在线看入口黄|