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個正弦波疊加而成的。
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軟體,將輸出設定為波形顯示,模擬結果如下圖:
相關推薦
FPGA實現FIR濾波器
1、FIR濾波器總體設計 本設計是基於FPGA實現一個8階的FIR數字低通濾波器。本次設計首先利用MATLAB中的FDAtool工具設計出一個取樣頻率為5KHZ、截止頻率為1KHZ的FIR低通濾波器,通過FDAtool匯出8點係數,然後將係數進行放大、取整,以便於在FPGA
【 FPGA 】FIR濾波器的取樣速率與系統時鐘速率不同時的資源消耗分析
目錄 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濾波器,下面是我的任
【 FPGA 】FIR 濾波器之濾波器的係數資料(Filter Coefficient Data)
Filter Coefficient Data 濾波器係數使用副檔名為.coe的係數檔案提供給FIR編譯器。 這是一個ASCII文字檔案,帶有單行標題,用於定義用於係數資料的數字表示的基數,後跟係數值本身。 對於N抽頭濾波器,如圖3-36所示。 濾波器係數可以以整數的
【 FPGA 】FIR 濾波器之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.
【 FPGA 】FIR 濾波器之 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
【 FPGA 】FIR 濾波器之 Hilbert Transform 的係數資料(Filter Coefficient Data)
Hilbert Transform The impulse response for a 10-term approximation to a Hilbert transformer is show
【 FPGA 】FIR 濾波器之 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
【 FPGA 】FIR濾波器之 多個係數集問題以及 使用非整數實數的係數規範問題
多個係數集 對於多係數過濾器,單個.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−1anz−n(1) 從(1)式中,可以看出,H(z)H(z)
FIR濾波器和IIR濾波器原理及Xilinx System Generator實現
1.FIR數字濾波器 有限衝激響應(FIR)濾波器是對N個取樣資料執行加權和平均的處理。處理過程公式為: 如三抽頭FIR濾波器結構: 一個低通濾波器結構: 設計濾波器就是選取合適的濾波器係數W,使濾波器達到設計的要求。 一階微分濾波器結構: 當低頻