1. 程式人生 > >FPGA實現FIR濾波器

FPGA實現FIR濾波器

1、FIR濾波器總體設計

本設計是基於FPGA實現一個8階的FIR數字低通濾波器。本次設計首先利用MATLAB中的FDAtool工具設計出一個取樣頻率為5KHZ、截止頻率為1KHZ的FIR低通濾波器,通過FDAtool匯出8點係數,然後將係數進行放大、取整,以便於在FPGA中使用,最後通過QuartusII進行Verilog語言編寫濾波器演算法,然後通過Modesim模擬結果和MATLAB模擬結果的比較來驗證該濾波器的正確性。系統的總體設計框圖如下:

                                           

首先由MATLAB生成一個由三個正弦波疊加的待濾波訊號,三個正弦波的頻率分別是1KHZ,3KHZ,4KHZ。然後將待濾波訊號送入Modesim模擬,觀察濾波後的波形,再利用MATLAB裡面的conv函式將濾波器係數和待濾波訊號卷積並觀察濾波後的波形圖,將Modesim的模擬結果和MATLAB的模擬結果比較並驗證在FPGA中濾波器演算法的正確性。

2、FIR濾波器原理

在學習數字訊號處理時,濾波器是重點,數字濾波器有很多種,比如FIR、IIR、LMS等濾波演算法,FIR (Finite Impulse Response)濾波器的特點是它的衝擊響應是有限的,它跟過去的訊號無關,所以在使用時容易實現,速度快。

要理解FIR濾波器,需要知道訊號的頻域跟時域的關係,訊號的頻譜就是訊號在頻域上的表現形式,如果一個訊號由2個正弦波疊加(圖1)而成,我們在時域是看不出什麼規律的,將訊號進行傅立葉變換到頻域(圖2),我們就可以

                                                  

很清楚的看到該訊號是由2個正弦波疊加而成的。

如果我們要對圖1這個訊號進行濾波,從頻域上看,將訊號的頻譜乘以圖4所示的矩形波,結果的頻譜很顯然就只剩下了低頻段的這個正弦波,那麼我們知道在頻域和一個矩形波相乘就可以將高頻濾出,在時域怎麼做呢?我們學過訊號與系統,知道頻域卷積定理,這個定理的內容就是說:兩個訊號在頻域相乘,那麼在時域就相當於卷積,在時域相乘,在頻域就相當於卷積。知道了這個定理,我們將圖4的頻域訊號反變換到時域,變成圖3所示的訊號,我們將這個訊號和圖1的訊號進行卷積,得到的結果就是圖5所示的波形,這個波形的頻譜如圖6所示。這樣我們便完成了對訊號的濾波。

MATLAB中的FDAtool就是用來根據需要的濾波器生成圖3所示的濾波器係數。

       3、MATLAB生成訊號

  3.1濾波器係數設計

 在MATLAB中輸入fdatool即可開啟濾波器設計工具,如圖7所示。裡面可以設定濾波器的型別,取樣頻率,截止頻率等。本設計設定的引數如圖8所示。


圖7


圖8 

然後將此濾波器係數匯出,然後用以下命令將係數放大、取整:

>> Num

Num =

-0.0325  -0.0384    0.0784    0.2874   0.3984    0.2874    0.0784  -0.0384   -0.0325

>> Num=round(Num*400)//將係數放大並取整

Num =

  -13   -15    31  115   159   115   31   -15   -13

>> Num=Num+20//將係數符號變成正的,便於FPGA使用

Num =

    7     5    51  135   179   135   51     5     7

       最終生成的係數Num即可用於FPGA進行FIR濾波器實現。

3.2 待濾波訊號的設計

         本設計用於模擬的輸入波形是三個正弦波疊加而成,分別是1KHZ、3KHZ、4KHZ。下面是用於生成待濾波訊號的m檔案內容:

%*********產生.data檔案 用於FPGA模擬************%

Fs = 10000; %取樣頻率決定了兩個正弦波點之間的間隔

N = 4096; %取樣點數

N1 = 0 : 1/Fs : N/Fs-1/Fs;

s = sin(1000*2*pi*N1) + sin(3000*2*pi*N1) +sin(4000*2*pi*N1);//三種正弦波

fidc = fopen('D:\FPGA\FIR\mem.txt','wt');  //將結果寫入mem.txt檔案,便於modesim使用

for x = 1 : N

   fprintf(fidc,'%x\n',round((s(x)+2.12)*58));

end 

fclose(fidc);  

4、FPGA實現FIR演算法

       實現FIR濾波器的過程其實就是實現卷積的過程,卷積的公式如下,從如下公式

中可以看出,x(n)是我們的待濾波訊號,h(n)是濾波器係數,卷積的過程其實就是一個乘、累加的過程,所以用FPGA實現8階FIR濾波器的主要分成三級流水線,第一級、將輸入訊號延時,這樣才能將訊號和濾波器係數相乘。第二級、將輸入訊號和係數相乘。第三級、將乘積進行累加得到結果。

第一級流水線的實現程式碼如下:

reg[7:0] delay_pipeline1 ;

reg[7:0] delay_pipeline2 ;

reg[7:0] delay_pipeline3 ;

reg[7:0] delay_pipeline4 ;

reg[7:0] delay_pipeline5 ;

reg[7:0] delay_pipeline6 ;

reg[7:0] delay_pipeline7 ;

reg[7:0] delay_pipeline8 ;

reg[7:0] delay_pipeline9 ;

[email protected](posedge CLK or negedge RSTn)

      if(!RSTn)

               begin

                    delay_pipeline1 <= 8'b0 ;

                    delay_pipeline2 <= 8'b0 ;

                    delay_pipeline3 <= 8'b0 ;

                    delay_pipeline4 <= 8'b0 ;

                    delay_pipeline5 <= 8'b0 ;

                    delay_pipeline6 <= 8'b0 ;

                    delay_pipeline7 <= 8'b0 ;

                                          delay_pipeline8<= 8'b0 ;

                                          delay_pipeline9<= 8'b0 ;

               end

       else

               begin

                    delay_pipeline1 <= FIR_IN     ;

                    delay_pipeline2 <= delay_pipeline1 ;

                    delay_pipeline3 <= delay_pipeline2 ;

                    delay_pipeline4 <= delay_pipeline3 ;

                    delay_pipeline5 <= delay_pipeline4 ;

                    delay_pipeline6 <= delay_pipeline5 ;

                    delay_pipeline7 <= delay_pipeline6 ;

                    delay_pipeline8 <=delay_pipeline7 ;

                                          delay_pipeline9<= delay_pipeline8 ;

               end

這一級的功能是將輸入訊號進行延時,每到來一個時鐘訊號,便將輸入訊號儲存到delay_pipelin1中,然後將剩下的依次移動一位。

第二級流水線的實現的部分程式碼如下:

wire[7:0] coeff1 = 8'd7;  //濾波器係數

wire[7:0] coeff2 = 8'd5;

wire[7:0] coeff3 = 8'd51;

wire[7:0] coeff4 = 8'd135;

wire[7:0] coeff5 = 8'd179;

wire[7:0] coeff6 = 8'd135;

wire[7:0] coeff7 = 8'd51;

wire[7:0] coeff8 = 8'd5;

wire[7:0] coeff9 = 8'd7;

reg signed [16:0] multi_data1 ;//乘積結果

reg signed [16:0] multi_data2 ;

reg signed [16:0] multi_data3 ;

reg signed [16:0] multi_data4 ;

reg signed [16:0] multi_data5 ;

reg signed [16:0] multi_data6 ;

reg signed [16:0] multi_data7 ;

reg signed [16:0] multi_data8 ;

reg signed [16:0] multi_data9 ;

[email protected](posedge CLK or negedge RSTn) //x(0) * h(0)

      if(!RSTn)                                  

          multi_data1 <= 17'b0 ;

       else

          multi_data1 <= delay_pipeline1*coeff1 ;

[email protected](posedge CLK or negedge RSTn) //x(1) * h(1)

      if(!RSTn)                                   

          multi_data2 <= 17'b0 ;

       else

          multi_data2 <= delay_pipeline2*coeff2 ;

這一級的功能是將輸入經過延時的訊號和濾波器係數相乘,每到來一個時鐘便將一個新的乘積結果更新到multi_data中。

第三級的實現程式碼如下:

//===================================================================

//加法器

//===================================================================                

[email protected](posedge CLK or negedge RSTn)

      if(!RSTn)                                  

          FIR_OUT <= 16'b0 ;

       else

          FIR_OUT <= multi_data1 + multi_data2 + multi_data3 + multi_data4 +multi_data5 + multi_data6 + multi_data7 + multi_data8 + multi_data9 ;

       這一級的主要功能是將乘積累加,累加的結果就是濾波後的訊號。

4、模擬結果

4.1 MATLAB模擬結果

       本設計用MATLAB產生一個待濾波訊號,然後將其和濾波器係數卷積,得到輸出即為濾波後訊號,MATLAB模擬的m檔案內容如下:

Fs = 10000; %取樣頻率決定了兩個正弦波點之間的間隔

N = 4096; %取樣點數

N1 = 0 : 1/Fs :N/Fs-1/Fs;

in =sin(1000*2*pi*N1) + sin(3000*2*pi*N1) + sin(4000*2*pi*N1);

coeff =[-0.0325,-0.0384,0.0784,0.2874,0.3984,0.2874,0.0784,-0.0384,-0.0325];

out =conv(in,coeff);%卷積濾波

subplot(2,1,1);

plot(in);

xlabel('濾波前');

axis([0 200 -33]);

subplot(2,1,2);

plot(out);

xlabel('濾波後');

axis([100 200 -22]);

       程式中的coeff就是用fdatool生成的濾波器係數,取樣頻率為10000,和設定fdatool時的取樣頻率必須一致,conv是MATLAB中的用來實現卷積的函式,它將待濾波訊號in和coeff濾波器係數卷積,結果賦值給out,最後畫出濾波前和濾波後的波形圖,執行結果如下圖所示:

  

4.2 Modesim模擬結果

       使用modesim模擬時,將第3節裡面生成好的待濾波訊號讀入mem,然後模擬時將mem依次賦值給FIR_IN埠,模擬檔案如下:                                           

module FIR_vlg_tst();

reg CLK;

reg [7:0] FIR_IN;

reg RSTn;

reg [7:0] mem[1:4096];

wire [15:0] FIR_OUT;

reg [12:0] i;

FIR i1 (

       .CLK(CLK),

       .FIR_IN(FIR_IN),

       .FIR_OUT(FIR_OUT),

       .RSTn(RSTn)

);

initial                                               

       begin 

                     $readmemh("D:/FPGA/FIR/mem.txt",mem);//將待濾波訊號讀入mem

                     RSTn= 0;

                     CLK= 0;

                     #50;

                     RSTn= 1;

                     #50000;

                     $stop;

       end  

initial

       forever

          #10 CLK = ~CLK;

[email protected](posedge CLK or negedge RSTn) 

      if(!RSTn)                                

          FIR_IN <= 8'b0 ;

       else

                       FIR_IN <= mem[i];     

[email protected](posedge CLK or negedge RSTn) 

      if(!RSTn)

                       i <= 12'd0;

       else

                       i <= i + 1'd1;

endmodule

       在Quartus中執行Modesim軟體,將輸出設定為波形顯示,模擬結果如下圖:


將上圖和用MATLAB模擬的結果對比,兩者完全一樣,驗證了在FPGA中的FIR濾波器演算法。



相關推薦

FPGA實現FIR濾波器

1、FIR濾波器總體設計 本設計是基於FPGA實現一個8階的FIR數字低通濾波器。本次設計首先利用MATLAB中的FDAtool工具設計出一個取樣頻率為5KHZ、截止頻率為1KHZ的FIR低通濾波器,通過FDAtool匯出8點係數,然後將係數進行放大、取整,以便於在FPGA

FPGAFIR濾波器的取樣速率與系統時鐘速率不同時的資源消耗分析

目錄   MATLAB操作 Vivado操作 MATLAB操作 在matlab中命令視窗中輸入:filterDesigner,設計如下引數的帶通濾波器; 在左側第三個功能設定:Set quantization parameters,選擇Filter

Vivado HLS實現FIR濾波器(2)——Vivado呼叫HLS生成的FIR IP核

系統框圖 器件xq7a50tfg484-2I,兩個DDS,輸入時鐘100MHz,輸出分別為8MHz和12MHz,位寬為16位,相乘後輸出位寬32位,三角函式積化和差得4MHz訊號和20MHz訊號,濾波器設計採用Filter Solutions 2015,截止頻率10MHz,取樣率10

Vivado HLS實現FIR濾波器(1)——使用官方C程式碼實現FIR

使用官方C程式碼實現FIR 參考資料: 不同點說明 程式結構 C語言程式碼 模擬綜合 參考資料: 教程——基於HLS實現FIR濾波器https://blog.csdn.net/LZY27

基於HLS實現FIR濾波器--轉載我之前的blog的內容

  受人之拖要做個HLS的高階綜合,找了半天,一開始打算做一個FFT,但是一同操作下來,發現難度太大了,回來做一個簡單的硬體的矩陣相乘,發現難度太低,老師不答應做,於是挑了一個FIR濾波器,於是有開始拾起本科時學的濾波器原理,發現好多都忘記了因此接來下就做一個FIR濾波器,下面是我的任

FPGAFIR 濾波器濾波器的係數資料(Filter Coefficient Data)

Filter Coefficient Data 濾波器係數使用副檔名為.coe的係數檔案提供給FIR編譯器。 這是一個ASCII文字檔案,帶有單行標題,用於定義用於係數資料的數字表示的基數,後跟係數值本身。 對於N抽頭濾波器,如圖3-36所示。 濾波器係數可以以整數的

FPGAFIR 濾波器之Single-rate FIR濾波器的係數資料(Filter Coefficient Data)

首先要明確什麼是單速率 FIR 濾波器? The basic FIR filter core is a single-rate (input sample rate = output sample rate) finite impulse response filter.

FPGAFIR 濾波器之 Half-band Filter 的係數資料(Filter Coefficient Data)

Half-band Filter As previously described, every second filter coefficient for a half-band filter with an odd number of terms is zero. Whe

FPGAFIR 濾波器之 Hilbert Transform 的係數資料(Filter Coefficient Data)

Hilbert Transform The impulse response for a 10-term approximation to a Hilbert transformer is show

FPGAFIR 濾波器之 Interpolated Filter 的係數資料(Filter Coefficient Data)

Interpolated Filter  A previous section explained that an IFIR filter is similar to a conventional FIR, but with the unit delay operator

FPGAFIR濾波器之 多個係數集問題以及 使用非整數實數的係數規範問題

多個係數集 對於多係數過濾器,單個.coe檔案用於指定係數集。 每個係數集應附加到前一組係數。 例如,如果設計了一個2係數集,10抽頭對稱濾波器, 係數集#0為:coefdata = -1,-2,-3,4,5,5,4,-3,-2 ,-1; 和係數集#1是: coef

教程——基於HLS實現FIR濾波器

注:本博文所需工程下載連結:http://download.csdn.net/detail/lzy272942518/8863107 1.FIR濾波器簡介 FIR(Finite Impulse Response)濾波器:有限長單位衝激響應濾波器,又稱為非遞迴型濾波器,是數字

濾波器開篇,線性相位FIR濾波器FPGA實現

         可以看到,經濾波器濾波後,頻率為400hz的訊號被保留,時域訊號是完整的正弦波,有些朋友可能會說,怎麼會有失真呢?失真可能是有點,但是還是由於我們的取樣頻率不夠高,都是還原的波形不夠圓滑。還有人可能會說,根據時域取樣定理,不是取樣頻率大於2倍的訊號頻率就可以被還原成原始訊號嗎?但是我們這裡並

FIR數字濾波器FPGA實現(二)-序列FIR濾波器設計(1)

(二)FIR數字濾波器的FPGA實現-序列FIR濾波器設計 文章目錄 (二)FIR數字濾波器的FPGA實現-序列FIR濾波器設計 0 序列FIR濾波器基本原理 1 基於移位暫存器的序列 FIR 濾波器 1.1 基本理論

直接型FIR濾波器fpga實現

FIR濾波器根據輸入資料速率的不同可分為序列結構、半並行結構和全並行結構。序列結構的FIR濾波器是將並行資料序列輸入,所需的DSP資源較少,但是資料吞吐率較低;而全並行結構的FIR濾波器資料是並行輸入,濾波係數的個數就決定了所需DSP資源的個數,資源耗用較多,但是吞吐率可

FIR濾波器FPGA實現

  在時域中,FIR濾波器的輸入/輸出就是一個輸入訊號與單位脈衝相應的卷積。離散方程為y(n)=x(n)*h(n)=∑x(k)h(n-k)=∑h(k)x(n-k),其中y(n)為濾波輸出,x(n)為取樣資料,h(n)為濾波抽頭係數.設計FIR濾波器就是要找到N個係數。N-1階濾波器通常需要N個係數描述,通常需

FPGA 】SMAC(脈動型乘累加結構)FIR濾波器總結

先貼出來傳統的FIR濾波器實現結構作為後面的對比: 傳統的FIR濾波器的實現結構: (【 FPGA 】FIR濾波器開篇之傳統抽頭延遲線FIR濾波器實現介紹)                 &nbs

CIC濾波器FPGA實現

CIC濾波器 CIC濾波器是用不同抽樣頻率進行數字訊號處理的一種FIR濾波器。主要用於數字訊號的抽取和內插。 CIC濾波器由一對或多對積分-梳狀濾波器組成,在抽取CIC中,輸入訊號依次經過積分、降取樣,以及與積分環節數目相同的梳狀濾波器。在內插CIC中,輸入訊號

FIR濾波器實現全通特性的充要條件——理論推導

對於FIR數字濾波器,可設其系統函式為 (1)H(z)=∑n=0N−1anz−n H(z)=\sum_{n=0}^{N-1} a_n z^{-n} \quad \tag{1} H(z)=n=0∑N−1​an​z−n(1) 從(1)式中,可以看出,H(z)H(z)

FIR濾波器和IIR濾波器原理及Xilinx System Generator實現

1.FIR數字濾波器 有限衝激響應(FIR)濾波器是對N個取樣資料執行加權和平均的處理。處理過程公式為: 如三抽頭FIR濾波器結構: 一個低通濾波器結構: 設計濾波器就是選取合適的濾波器係數W,使濾波器達到設計的要求。 一階微分濾波器結構: 當低頻