国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于Xilinx vivado FFT ip進行信號頻譜測量

這篇具有很好參考價值的文章主要介紹了基于Xilinx vivado FFT ip進行信號頻譜測量。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文章使用Xilinx的fft ip完成了經(jīng)過參數(shù)化的任意個信號的基頻測量,完整代碼以及代碼解釋在文章中給出。如有錯誤,希望指出。

	SIGNAL_NUM = 2,   //*需要檢測的信號個數(shù)
    FFT_LEN    = 8192,//*fft運算采樣長度
    FFT_WIDTH = 32,   //*fft ip輸出數(shù)據(jù)寬度,實部和虛部位寬為FFT_WIDTH/2
    SAMPLE_RATE = 50, //*ADC采樣率,單位Mhz,比如此時為50Mhz
    ADC_WIDTH = 16,   //*ADC數(shù)據(jù)位寬
    FFT_CONFIG_WIDTH = 8 //*FFT ip的配置信號位寬(未使用)

ps:只使用了fft ip進行頻率測量未測量幅度,為防止錯誤不對幅度測量進行講解,且幅度測量因為未使用其中獲得的幅度是未經(jīng)處理的原始數(shù)據(jù),直接使用應(yīng)該會出現(xiàn)問題。該代碼無法滿足所有場景需求,僅起到拋磚引玉的作用。

1.FFT ip的配置

對于FFT ip核的各個配置的介紹在網(wǎng)上已經(jīng)有很多,故不再詳細解釋各個配置定義,直接附上我對這個ip的配置。

基于Xilinx vivado FFT ip進行信號頻譜測量,算法,fpga開發(fā),傅里葉分析,信號處理
因為使用ADC為20M采樣率,需要測到kHz級別的精度,所以這里目標(biāo)時鐘速率為20Mhz,采樣點數(shù)為8192。這里根據(jù)自己需求設(shè)定即可。
基于Xilinx vivado FFT ip進行信號頻譜測量,算法,fpga開發(fā),傅里葉分析,信號處理

2.FFT ip的使用介紹

FFT ip輸入為時域信息,而輸出為信號的頻域信號,所以需要自己針對頻域信號來分析出傅里葉變換后的結(jié)果,在FFT ip配置中勾選了XK_INDEX這里后面將配合測試出信號的頻率。
對于fft ip直接輸出的實部數(shù)據(jù)和虛部數(shù)據(jù)是不可以直接進行頻率的獲取,需要經(jīng)過一部分處理才可以得到信號的頻譜,傅里葉變換的結(jié)果是一個復(fù)數(shù),包括實部和虛部,信號的頻譜是通過計算復(fù)數(shù)的模得到的。對于信號頻譜的計算,按以下公式: abs(fft_P)= sqrt(實部的平方+虛部的平方)
然后根據(jù)這個得到的頻譜,得到最大值的點,這個點轉(zhuǎn)換后對應(yīng)的頻率,就是信號的頻率,比如對于20k的信號,會在x_index指代20k的地方幅度達到最大值,而對于多個信號,比如一個混合信號(20k的正弦波+50k的正弦波),這樣就檢查這個頻譜的兩個最大值的位置,就可以得到這兩個信號的頻率。
得到實部虛部的平方和并使用vivado的cordic ip進行求根獲得絕對值:

always @(posedge clk) begin : re2_im2_end
   if(rst) begin
       fft_im_end <= 'd0;
       fft_re_end <= 'd0;
       fft_end    <= 'd0;
   end
   else if(m_axis_data_tvalid) begin
       fft_im_end <= $signed(fft_im[ADC_WIDTH-1:0])*$signed(fft_im[ADC_WIDTH-1:0]);  //*one
       fft_re_end <= $signed(fft_re[ADC_WIDTH-1:0])*$signed(fft_re[ADC_WIDTH-1:0]);
       fft_end    <= fft_im_end + fft_re_end;          //*two
   end
end

cordic_0 u_cordic (
   .aclk                              (clk                       ),// input wire aclk
   .aresetn                           (~rst                      ),// input wire aresetn
   .s_axis_cartesian_tvalid           (cordic_valid_reg[1]       ),// input wire s_axis_cartesian_tvalid
   .s_axis_cartesian_tdata            (fft_end                   ),// input wire [39 : 0] s_axis_cartesian_tdata

   .m_axis_dout_tvalid                (cordic_valid              ),// output wire m_axis_dout_tvalid
   .m_axis_dout_tdata                 (cordic_data               ) // output wire [23 : 0] m_axis_dout_tdata
);

獲得檢測頻率使用的頻譜后,傳到下面一個自定義的信號處理部分,這部分主要是根據(jù)信號的頻譜,獲取頻譜的最大值位置(如果有多個信號就獲取多個極值點),之后根據(jù)這個位置對應(yīng)的x_index來計算出信號的頻率。

比如對于50Mhz的采樣率,8192點的采樣深度,這樣的話每一個x_index值對應(yīng)的頻率便是50M/8192≈6.1kHz,這樣的話FFT運算精度大概就在6kHz
,比如對于X_index值未2的點,該信號的頻率就是12kHz。

下面為得到x_index后,根據(jù)采樣率的參數(shù)定義來計算出具體的信號頻率部分代碼。

always @(posedge clk) begin : result
    if (rst) begin
        for(integer i = 0;i < FFT_SIGNAL_NUM;i++) begin
            post_fft_freq[i] <= 0;
            post_fft_mag[i] <= 0;
            post_fft_index[i] <= 0;
        end
    end
    else if(max_valid) begin
        for(integer i = 0;i < FFT_SIGNAL_NUM;i++) begin
            post_fft_freq[i]  <= SAMPLE_RATE*detect_index[i]*(1000>>($clog2(FFT_SIZE)-10)); 
            //乘1000為M轉(zhuǎn)K單位,因為MHz相比于KHz后面多3個0,所以乘1000轉(zhuǎn)換單位,其中FFT_SIZE為采樣深度
            //右移的時候-10是為了左移10bit,左移十位為了表示為低10位代表小數(shù),高位代表整數(shù)
            post_fft_mag[i]   <= detect_data[i];
            post_fft_index[i] <= detect_index[i];
        end
    end
end
always @(posedge clk) begin
    if(rst) begin
        for(integer i = 0;i < SIGNAL_NUM;i++) begin
            {fft_int[i],fft_real[i]} <= 0;
            fft_mag[i] <= 0;
        end
    end
    else if(post_fft_valid) begin
        for(integer i = 0;i < SIGNAL_NUM;i++) begin
            {fft_int[i],fft_real[i]} <= post_fft_freq[i];//*計算出信號頻率后,高六位為整數(shù)部分,后面為小數(shù)部分
            fft_mag[i] <= post_fft_mag[i];
        end
    end
end

3.代碼仿真

為了便于觀察出仿真結(jié)果,所以使用了兩個Xilinx的dds ip分別輸出了20kHz的信號和50kHz的信號,然后將這兩個信號的輸出混合后作為輸入,一次性測量兩個信號的頻率。參數(shù)配置如文章頂部的參數(shù),未作更改。
下圖為輸入的20kHz和50kHz信號,混合信號為這兩個信號之和:
基于Xilinx vivado FFT ip進行信號頻譜測量,算法,fpga開發(fā),傅里葉分析,信號處理
下圖為獲得的頻譜實部和虛部以及將他們求絕對值后的結(jié)果,可以看出求出實部虛部的模之后即為兩個尖峰,分別對應(yīng)兩個不同的頻率:
基于Xilinx vivado FFT ip進行信號頻譜測量,算法,fpga開發(fā),傅里葉分析,信號處理
下圖為經(jīng)過處理后獲得的信號頻率,第一個為48.8kHz,第二個為18.3kHz,由于上面說明過在50M的采樣率下,只有6.1kHz的精度,所以只能不會完全準確在這里,但是在當(dāng)前精度下,精確測量出了50kHz和20kHz的信號。(要想提高精度需要提高采樣深度或者降低采樣率)
基于Xilinx vivado FFT ip進行信號頻譜測量,算法,fpga開發(fā),傅里葉分析,信號處理

4.完整代碼

對于我認為可能比較難理解的地方在上面已做出解釋。

module fft_trans 
#(
    SIGNAL_NUM = 2,
    FFT_LEN    = 8192,
    FFT_WIDTH = 32,
    SAMPLE_RATE = 50,
    ADC_WIDTH = 16,
    FFT_CONFIG_WIDTH = 8
)
(
    input  wire clk,//65m clk
    input  wire rst,

    input  wire                       [ADC_WIDTH-1:0]    adc_data ,
    input  wire                                          adc_valid,
    input  wire                                          adc_last ,

    output reg                  [$clog2(FFT_LEN)-1:0]   fft_index[SIGNAL_NUM-1:0],
    output reg                  [ 6:0]  fft_int  [SIGNAL_NUM - 1:0] ,
    output reg                  [ 9:0]  fft_real [SIGNAL_NUM - 1:0] ,
    output reg                  [16:0]  fft_mag  [SIGNAL_NUM - 1:0] ,//!需要根據(jù)cordic ip的變化而配置
    output reg                          fft_valid                  ,
    output wire                         fft_slave_ready            ,
    output wire                             freq_valid             ,
    output wire        [$clog2(FFT_LEN)-1:0]freq_index             ,
    output wire        [  16:0]             freq_data                  
);
// region:************parameter************
localparam FFT_SECTION = FFT_WIDTH/2;
// endregion:parameter

// region:************logic define************
//*fft signal
wire                   [$clog2(FFT_LEN)-1:0]x_index                ;
wire              [FFT_CONFIG_WIDTH-1:0]s_axis_config_tdata  = 'd1 ;
wire                                   s_axis_config_tvalid  = 1'b1;
wire                                    s_axis_config_tready       ;
wire                   [FFT_SECTION-1:0]fft_im,fft_re              ;
wire                                    m_axis_data_tvalid         ;
wire                                    m_axis_data_tlast          ;
//*fft end
reg                    [ADC_WIDTH*2-1:0]fft_im_end,fft_re_end      ;
reg                    [ADC_WIDTH*2:0]  fft_end                    ;
reg                                     cordic_valid_reg [1:0]     ;

reg                                     sync_index_en [17:0]       ;
//*detect signal
wire                                    post_fft_valid             ;
wire                   [16:0]           post_fft_freq  [SIGNAL_NUM - 1:0];
wire                   [16:0]           post_fft_mag   [SIGNAL_NUM - 1:0];
wire            [$clog2(FFT_LEN)-1:0] post_fft_index [SIGNAL_NUM - 1:0]  ;

wire                                    cordic_valid               ;
wire                   [  16:0]         cordic_data                ;
wire                   [$clog2(FFT_LEN)-1:0]x_index_sync               ;
// endregion:logic define
// region:************assign************
assign freq_data = cordic_data;   //*freq_data
assign freq_index = x_index_sync;
assign freq_valid = cordic_valid;
assign fft_index[0] =( post_fft_index[0]>post_fft_index[1]) ? post_fft_index[0] : post_fft_index[1];
assign fft_index[1] = (post_fft_index[1]<post_fft_index[0]) ? post_fft_index[1] : post_fft_index[0];
// endregion:assign
always @(posedge clk) begin : re2_im2_end
    if(rst) begin
        fft_im_end <= 'd0;
        fft_re_end <= 'd0;
        fft_end    <= 'd0;
    end
    else if(m_axis_data_tvalid) begin
        fft_im_end <= $signed(fft_im[ADC_WIDTH-1:0])*$signed(fft_im[ADC_WIDTH-1:0]);  //*one
        fft_re_end <= $signed(fft_re[ADC_WIDTH-1:0])*$signed(fft_re[ADC_WIDTH-1:0]);
        fft_end    <= fft_im_end + fft_re_end;          //*two
    end
end
always @(posedge clk) begin:cordic_valid_generate
    if(rst) begin
        for(integer i = 0;i < 2;i++) begin
            cordic_valid_reg[i] <= 'd0;
        end
    end
    else begin
        cordic_valid_reg[1] <= cordic_valid_reg[0];
        cordic_valid_reg[0] <= m_axis_data_tvalid;
    end
end
always @(posedge clk) begin:sync_index
    if(rst) begin
        for(integer i = 0;i < 18;i++) begin
            sync_index_en[i] <= 'd0;
        end
    end
    else begin
        for(integer i = 0;i < 18;i++) begin
            if (i== 0) begin
                sync_index_en[i] <= m_axis_data_tvalid;
            end
            else begin
                sync_index_en[i] <= sync_index_en[i-1];
            end
        end
    end
end
//*out signals
always @(posedge clk) begin
    if(rst) begin
        for(integer i = 0;i < SIGNAL_NUM;i++) begin
            {fft_int[i],fft_real[i]} <= 0;
            fft_mag[i] <= 0;
        end
    end
    else if(post_fft_valid) begin
        for(integer i = 0;i < SIGNAL_NUM;i++) begin
            {fft_int[i],fft_real[i]} <= post_fft_freq[i];
            fft_mag[i] <= post_fft_mag[i];
        end
    end
end
always @(posedge clk) begin
    if(rst) begin
        fft_valid <= 1'b0;
    end
    else begin
        fft_valid <= post_fft_valid;
    end
end


xfft_0 u_xfft_0(
    .aclk                              (clk                       ),
    .aresetn                           (~rst                      ),
    //*fft配置信號
    .s_axis_config_tdata               (s_axis_config_tdata       ),
    .s_axis_config_tvalid              (s_axis_config_tvalid      ),
    .s_axis_config_tready              (s_axis_config_tready      ),
    //*前級adc傳入數(shù)據(jù)
    .s_axis_data_tdata                 ({{{FFT_WIDTH-ADC_WIDTH}{1'b0}},adc_data}),
    .s_axis_data_tvalid                (adc_valid                 ),
    .s_axis_data_tready                (fft_slave_ready           ),
    .s_axis_data_tlast                 (                  ),
    //*out channel
    .m_axis_data_tdata                 ({fft_im,fft_re}           ),
    .m_axis_data_tuser                 (x_index                   ),
    .m_axis_data_tvalid                (m_axis_data_tvalid        ),
    .m_axis_data_tlast                 (m_axis_data_tlast         ),
    //*status channel
    .m_axis_status_tdata               (                          ),
    .m_axis_status_tvalid              (                          ),
    //*event channel
    .event_frame_started               (                          ),
    .event_tlast_unexpected            (                          ),
    .event_tlast_missing               (                          ),
    .event_data_in_channel_halt        (                          ) 
);
//*17 latency
cordic_0 u_cordic (
    .aclk                              (clk                       ),// input wire aclk
    .aresetn                           (~rst                      ),// input wire aresetn
    .s_axis_cartesian_tvalid           (cordic_valid_reg[1]       ),// input wire s_axis_cartesian_tvalid
    .s_axis_cartesian_tdata            (fft_end                   ),// input wire [39 : 0] s_axis_cartesian_tdata

    .m_axis_dout_tvalid                (cordic_valid              ),// output wire m_axis_dout_tvalid
    .m_axis_dout_tdata                 (cordic_data               ) // output wire [23 : 0] m_axis_dout_tdata
);
fifo_generator_0 u_fifo_generator_0(
    .clk                               (clk                       ),
    .srst                              (rst                       ),
    .din                               (x_index                   ),
    .wr_en                             (m_axis_data_tvalid        ),
    .rd_en                             (sync_index_en[17]         ),//!根據(jù)cordic ip的變化而配置
    .dout                              (x_index_sync              ),
    .full                              (                          ),
    .empty                             (                          ) 
);

signal_detect
#(
    .FFT_SIZE                          (FFT_LEN                   ),
    .FFT_SIGNAL_NUM                    (SIGNAL_NUM                ),
    .SAMPLE_RATE                       (SAMPLE_RATE               ) 
)
u_signal_detect(
    .clk                               (clk                       ),
    .rst                               (rst                       ),
    .fft_data                          (cordic_data               ),
    .fft_index                         (x_index_sync              ),
    .fft_valid                         (cordic_valid              ),

    .post_fft_index                    (post_fft_index            ),
    .post_fft_valid                    (post_fft_valid            ),
    .post_fft_freq                     (post_fft_freq             ),
    .post_fft_mag                      (post_fft_mag              ) 
);

endmodule //fft_trans


在例化中除了signal_detect均為Xilinx的 ip,其中cordic_0 實現(xiàn)了求根,xfft_0 為fft ip,fifo_generator_0 為一個異步FIFO用于數(shù)據(jù)對齊,下面給出signal_detect代碼

module signal_detect 
#(
    parameter FFT_SIZE = 4096,
    parameter FFT_SIGNAL_NUM = 1,
    parameter integer  SAMPLE_RATE = 'd100 //100MHz,用來計算頻率
)
(
    input  wire  clk,
    input  wire  rst,

    input  wire  [16:0] fft_data,//!輸入的cordic數(shù)據(jù)
    input  wire  [$clog2(FFT_SIZE)-1:0] fft_index,
    input  wire        fft_valid,

    output reg  [$clog2(FFT_SIZE)-1:0] post_fft_index [FFT_SIGNAL_NUM],
    output reg  post_fft_valid,
    output reg  [16:0] post_fft_freq [FFT_SIGNAL_NUM-1:0],     //*高16bit為整數(shù),低10bit為小數(shù)
    output reg  [16:0] post_fft_mag  [FFT_SIGNAL_NUM-1:0]      //*低位最低,高位最高
);
localparam DETECT_RANGE = FFT_SIZE/2;

reg [$clog2(FFT_SIZE)-1:0] detect_index [FFT_SIGNAL_NUM-1:0]; 
//wire [$clog2(FFT_SIGNAL_NUM):0] detect_cnt;
reg [16:0] detect_data [FFT_SIGNAL_NUM-1:0];
reg [$clog2(DETECT_RANGE):0] cnt;
reg [4:0] state;
reg max_valid;

//*1 state design
always @(posedge clk) begin
    if (rst) begin
        cnt <= {$clog2(DETECT_RANGE){1'b0}};
        state <= 0;
    end
    else begin
        case (state)
            0:  if (fft_valid && (fft_index == 0)) begin//*one clk delay
                    cnt <= 0;
                    state <= 1;
                end
                else begin
                    state <= 0;
                end
            1:  if (fft_valid && (cnt < DETECT_RANGE)) begin
                    cnt <= cnt + 1;
                    state <= 1;
                end
                else if(cnt == DETECT_RANGE)begin
                    state <= 2;
                    cnt <= 0;
                end
            2:  begin
                state <= 0;
                cnt <= 0;
            end
            default: begin
                state <= 0;
                cnt <= 0;
            end
        endcase
    end
end
//*2 output design
generate if(FFT_SIGNAL_NUM == 1) begin
    always @(posedge clk) begin
    if (rst) begin
            detect_data[0] <= 0;
            detect_index[0] <= 0;
            max_valid <= 0;
    end
    else begin
        case (state)
            0:  begin
                    detect_data[0] <= 0;
                    detect_index[0] <= 0;
                    max_valid <= 0;
                end
            1: begin //*只捕獲一個信號時
                    if (cnt == DETECT_RANGE-1) begin
                        max_valid <= 1'b1;
                    end
                    else begin
                        max_valid <= 0;
                    end

                    if (fft_data > detect_data[0]) begin
                        detect_data[0] <= fft_data;
                        detect_index[0] <= cnt+1;
                    end
                    
                end
            2:  begin
                max_valid <= 0;
                detect_data[0] <= 0;
                detect_index[0] <= 0;
            end
            default: begin
                max_valid <= 0;
                detect_data[0] <= 0;
                detect_index[0] <= 0;
            end
        endcase
    end
end
end
else begin //*捕獲多個信號時
    always @(posedge clk) begin
    if (rst) begin
        max_valid <= 0;
        for(integer i = 0;i < FFT_SIGNAL_NUM;i++) begin
            detect_data[i] <= 0;
            detect_index[i] <= 0;
        end
    end
    else begin
        case (state)
            0:  begin
                    for(integer i = 0;i < FFT_SIGNAL_NUM;i++) begin
                        detect_data[i] <= 0;
                        detect_index[i] <= 0;
                    end
                    max_valid <= 0;
                end
            1: begin
                    if( fft_data > detect_data[0] && detect_data[0] <= detect_data[1]) begin
                        detect_data[0] <= fft_data;
                        detect_index[0] <= cnt + 'd1;
                    end
                    else if(fft_data > detect_data[1] && detect_data[1] <= detect_data[0]) begin
                        detect_data[1] <= fft_data;
                        detect_index[1] <= cnt + 'd1;
                    end
                    if (cnt == DETECT_RANGE-1) begin
                        max_valid <= 1'b1;
                    end
                    else begin
                        max_valid <= 0;
                    end
                end
            2:  begin
                max_valid <= 0;
                for(integer i = 0;i < FFT_SIGNAL_NUM;i++) begin
                    detect_data[i] <= 0;
                    detect_index[i] <= 0;
                end
            end
            default: begin
                max_valid <= 0;
                for(integer i = 0;i < FFT_SIGNAL_NUM;i++) begin
                    detect_data[i] <= 0;
                    detect_index[i] <= 0;
                end
            end
        endcase
    end
end
end
endgenerate
//*output
always @(posedge clk) begin : result
    if (rst) begin
        for(integer i = 0;i < FFT_SIGNAL_NUM;i++) begin
            post_fft_freq[i] <= 0;
            post_fft_mag[i] <= 0;
            post_fft_index[i] <= 0;
        end
    end
    else if(max_valid) begin
        for(integer i = 0;i < FFT_SIGNAL_NUM;i++) begin
            post_fft_freq[i]  <= SAMPLE_RATE*detect_index[i]*(1000>>($clog2(FFT_SIZE)-10)); //<<10/1024 //*1000為M轉(zhuǎn)K單位
            post_fft_mag[i]   <= detect_data[i];
            post_fft_index[i] <= detect_index[i];
        end
    end
end
always @(posedge clk) begin : valid
    if (rst) begin
        post_fft_valid <= 0;
    end
    else if(max_valid) begin
        post_fft_valid <= 1;
    end
    else begin
        post_fft_valid <= 0;
    end
end

endmodule //signal_detect

如有疑問或者文章中有錯誤,請在評論區(qū)指出??。

參考鏈接:利用Vivado的 FFT IP 核估計信號的幅度和頻率
文章來源地址http://www.zghlxwxcb.cn/news/detail-809501.html

到了這里,關(guān)于基于Xilinx vivado FFT ip進行信號頻譜測量的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Matlab中利用FFT實現(xiàn)信號頻譜搬移

    Matlab中利用FFT實現(xiàn)信號頻譜搬移

    在fft的理論中,fft的頻移特性表示為: 也就是說,要想對信號f(t)實現(xiàn)頻域的頻譜搬移,只要在時域乘以一個矩陣,即可實現(xiàn)頻譜的搬移。常用的振幅調(diào)制和解調(diào)就是如此,頻譜搬移前后對比如下: 其特點就是僅頻譜搬移,不產(chǎn)生新的頻譜分量。利用歐拉公式: e^(ix)可以

    2024年01月20日
    瀏覽(35)
  • Python中利用FFT(快速傅里葉變換)進行頻譜分析

    Python中利用FFT(快速傅里葉變換)進行頻譜分析

    本文將從實例的角度出發(fā)講解fft函數(shù)的基本使用,不包含復(fù)雜的理論推導(dǎo)。 要對一個信號進行頻譜分析,首先需要知道幾個基本條件。 采樣頻率fs 信號長度N(信號的點數(shù)) 采樣頻率fs: 根據(jù)采樣定理可知,采樣頻率應(yīng)當(dāng)大于等于被測信號里最高頻率的2倍,才能保證不失真

    2024年01月17日
    瀏覽(26)
  • Simulink HDL Coder FPGA初級開發(fā)實踐(五)FFT以及CORDIC算法進行信號相位校正

    Simulink HDL Coder FPGA初級開發(fā)實踐(五)FFT以及CORDIC算法進行信號相位校正

    前言: 本欄目除特別說明以外,均采用的黑金AX7103開發(fā)板,該開發(fā)板時鐘頻率為200M,并且是雙端時鐘,因此在每個項目中都有一段原語將雙端時鐘變成200MHz的單端時鐘。文章僅作為學(xué)習(xí)記錄,如有不足請在評論區(qū)指出,博主不會對各位的問題作出解答,請諒解。博主深知網(wǎng)

    2024年02月06日
    瀏覽(29)
  • 基于FPGA的信號處理算法,F(xiàn)FT法相差檢測verilog實現(xiàn)

    基于FPGA的信號處理算法,F(xiàn)FT法相差檢測verilog實現(xiàn)

    基于FPGA的信號處理算法,F(xiàn)FT法相差檢測verilog實現(xiàn) 。 1.硬件平臺:altera芯片 2.軟件平臺:Quartusii 13.1 Verilog 3.實現(xiàn)功能:檢測兩路正弦波的相位差 基于FPGA的信號處理算法,F(xiàn)FT法相差檢測verilog實現(xiàn) 引言 在現(xiàn)代通信系統(tǒng)中,信號處理算法在實時性和精度方面面臨著巨大的挑戰(zhàn)。

    2024年04月16日
    瀏覽(36)
  • Xilinx 的FFT IP核使用方法(配置為FFT 、IFFT兩種模式)

    Xilinx 的FFT IP核使用方法(配置為FFT 、IFFT兩種模式)

    Configuration 配置通道數(shù)和FFT長度 時鐘頻率以及數(shù)據(jù)吞吐速率 FFT的結(jié)構(gòu)選擇 Srteaming , 可以對數(shù)據(jù)進行流水處理 Radix-4 , 基4的迭代算法,使用資源比流水線結(jié)構(gòu)多,但是轉(zhuǎn)換時間長 Radix-2, Radix-2 lite 都為基2的迭代算法,Radix-2 lite的資源占用更少,但是轉(zhuǎn)換時間也更長。 Run Time

    2024年02月04日
    瀏覽(22)
  • 基于vivado DDS ip核的DDS信號發(fā)生器(可調(diào)頻調(diào)相)

    基于vivado DDS ip核的DDS信號發(fā)生器(可調(diào)頻調(diào)相)

    基于Vivado DDS ip核的DDS信號發(fā)生器: 在Vivado軟件中調(diào)出DDS ip核進行設(shè)置,很多參數(shù)可以參考xilinx官方手冊,比較重要的是System Clock系統(tǒng)時鐘和Phase Widh相位寬度的設(shè)置,這是最終得到波形的頻率和相位所需要的基礎(chǔ)參數(shù),在這里我分別設(shè)置為50Mhz和16bit。 在implementation頁面設(shè)置頻

    2024年02月12日
    瀏覽(18)
  • 基于stm32f407的示波器+FFT頻譜分析

    基于stm32f407的示波器+FFT頻譜分析

    1 設(shè)計思路 2 DMA傳輸ADC采樣值 使用DMA直接將ADC-DR中的數(shù)據(jù)傳輸?shù)紸DC數(shù)據(jù)緩存區(qū),節(jié)省cpu資源,高速AD采集,代碼如下: 3 ADC定時器觸發(fā)(可修改ADC采樣率) 為了實現(xiàn)ADC采樣率可調(diào),我將AD的出發(fā)方式設(shè)置為定時器觸發(fā),使用TIM3來觸發(fā)adc采集,首先初始化定時器,先預(yù)設(shè)幾種初

    2024年02月05日
    瀏覽(19)
  • Vivado_FFT IP核 使用詳解

    Vivado_FFT IP核 使用詳解

    本文介紹Vivado中Fast Fourier Transform V9.1的使用方法。 參考資料:pg109 FFT是用于計算樣本大小為2的正整數(shù)冪的離散傅里葉變換(DFT)的高效計算方法。序列的DFT定義為 X ( k ) = ∑ n = 0 N ? 1 x ( n ) e ? j n k 2 π / N ?? k = 0 , … N ? 1 X(k) = sum_{n=0}^{N-1}x(n)e^{-jnk2pi /N} k = 0,dots N-1

    2023年04月15日
    瀏覽(16)
  • Vivado中的FFT IP核使用(含代碼)

    Vivado中的FFT IP核使用(含代碼)

    本文介紹了Vidado中FFT IP核的使用,具體內(nèi)容為:調(diào)用IP核配置界面介紹IP核端口介紹MATLAB生成測試數(shù)據(jù)測試verilogHDLTestBench仿真結(jié)果驗證FFT運算。 該IP核對應(yīng)手冊pg109_xfft.pdf,首先按照圖片找到IP核: 本小節(jié)主要介紹Fast Fourier Transform9.1這個IP核配置界面的一些選項: 第1頁:Con

    2023年04月13日
    瀏覽(20)
  • 基于STM32&FFT(快速傅里葉變換)音頻頻譜顯示功能實現(xiàn)

    基于STM32&FFT(快速傅里葉變換)音頻頻譜顯示功能實現(xiàn)

    + v hezkz17進數(shù)字音頻系統(tǒng)研究開發(fā)交流答疑 一實驗效果 ? 二 設(shè)計過程 要用C語言實現(xiàn)STM32頻譜顯示功能,可以按照以下步驟進行操作: 1 確保已經(jīng)安裝好了適當(dāng)?shù)拈_發(fā)環(huán)境和工具鏈,例如Keil MDK或者GCC工具鏈。 2 創(chuàng)建一個新的STM32項目,并選擇適合的MCU型號。 3 配置GPIO引腳用

    2024年02月12日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包