在本文中,我們將簡要介紹不同類型的濾波器,然后學(xué)習如何實現(xiàn)移動平均濾波器并使用CIC架構(gòu)對其進行優(yōu)化。
在許多設(shè)計中,濾波非常重要。它為我們提供了一個機會,可以提取隱藏在大量噪聲下的所需信號。我們還可以通過在某些頻率上濾波其輸出來確定系統(tǒng)的非線性。
讓我們首先討論濾波器類型之間的一些差異。
理論
濾波器類型
濾波器可根據(jù)其帶類別分為五組中的一組。每個人的能力都以他們的名義暗示。例如,低通濾波器是一種通過低頻輸入并阻止高頻輸入等的濾波器。
五種類型是:
低通帶通帶阻高通全部通過濾波器也有不同的形狀。例如,它們的通帶上可能有紋波,或者它們可能具有平坦的過渡帶等。
濾波器形狀
濾波器通??砂葱螤罘诸惾缦拢?/strong>
貝塞爾:與其他人相比最平坦的群體延遲Butterworth**: 設(shè)計為在通帶內(nèi)具有最平坦的頻率響應(yīng); 也被稱為“最大平坦” Chebyshev :設(shè)計為在理想濾波器和實際濾波器之間具有最小誤差; 可以分為兩種類型:通帶中具有紋波的那些以及阻帶中具有紋波的那些Elliptic :在pass和stop波段都有波紋,但是它們在pass和stop band之間有最快的過渡選擇濾波器的形狀取決于所需的規(guī)格。例如,我們可能需要輸出信號幅度盡可能精確地跟隨通帶中的輸入信號幅度。在這種情況下,我們應(yīng)該使用巴特沃斯濾波器,即使它會給我們更多的過渡帶。**
另一方面,我們可能希望輸出信號頻率精確地跟隨輸入信號的線性相位響應(yīng),因此我們應(yīng)該選擇貝塞爾濾波器。如果我們需要使用盡可能少的組件并且具有與其他濾波器相同的順序和轉(zhuǎn)換速度,則Elliptic或Chebyshev濾波器可以工作,但是我們在通過或阻止頻帶中會產(chǎn)生紋波。
模擬和數(shù)字濾波器
在另一方面,濾波器可以以兩種方式構(gòu)造:數(shù)字和模擬。
在模擬電路中,無源濾波器是電感器,電容器或電阻器的階梯。有源模擬濾波器可以是利用放大器或諧振器的結(jié)構(gòu)。它們的值可以通過使用已經(jīng)為設(shè)計模擬濾波器而創(chuàng)建的表格或應(yīng)用程序來確定。
可以使用IIR和FIR兩種方法創(chuàng)建數(shù)字濾波器。IIR(無限脈沖響應(yīng))濾波器是濾波器的類型,其中輸出取決于輸入和先前的輸出。
圖1. IIR濾波器。圖片由Mark Wilde提供
**數(shù)字濾波器的另一種濾波器實現(xiàn)是FIR(有限脈沖響應(yīng))。這些不使用反饋,它們的輸出僅與當前和先前的輸入相關(guān)。關(guān)于穩(wěn)定性,F(xiàn)IR濾波器總是穩(wěn)定的,**因為它們的輸出僅與輸入有關(guān)。另一方面,他們需要更高的訂單以滿足與IIR相同的規(guī)格。
圖2. FIR濾波器圖片由Jonathan Blancha
移動平均線
移動平均線是一個濾波器,用于平均先前輸入的N個點并使用它們輸出。
**[ n ] = 1Σi = 0Xn - 我y[n]=1N∑i=0Nxni**
如您所見,移動平均濾波器是N個系數(shù)為 的FIR濾波器。 一些不同n的移動平均濾波器的頻率響應(yīng)如圖3所示。
1N1N
圖3.移動平均線的頻率響應(yīng)
移動平均(MA)濾波器的脈沖響應(yīng)在不在0到N內(nèi)的點中為零。
**h [ n ] = 1Σk = 0- 1δ[ n - k ]h[n]=1N∑k=0N1δ[nk]**
因此,MA濾波器的頻率響應(yīng)是:
H(ω)=1NejωN/2ejω/2j2sin(ωN2)j2sin(ω2)=1NejωN/2ejω/2sin(ωN2)sin(ω2)H(ω)=1NejωN/2ejω/2j2sin(ωN2)j2sin(ω2)=1NejωN/2ejω/2sin(ωN2)sin(ω2)
截止頻率可以估算為:
Fc o= 0.4429472- 1- - - - - - √Fco=0.442947N21
根據(jù)這些公式,截止頻率僅與N有關(guān)。隨著N增加,截止頻率降低但是花費時間。我們需要等待第N個周期才能得到正確的結(jié)果,所以N越大,我們需要更多的時間。隨著濾波器越來越清晰,其輸出需要達到穩(wěn)定狀態(tài)的時間也會增加。
所需設(shè)計的濾波和實現(xiàn)是FPGA設(shè)計中的主題。需要學(xué)習很多東西來設(shè)計合適的濾波器,然后在FPGA上以最少的資源使用或最快的速度實現(xiàn)它。
在本文中,我們將嘗試實現(xiàn)N點移動平均濾波器。我們假設(shè)N是一個參數(shù),可以在實施之前通過Xilinx ISE等CAD工具進行更改。
正如我們在圖2中看到的,F(xiàn)IR濾波器可以通過延遲鏈實現(xiàn),其長度為N,即FIR階,將系數(shù)乘以延遲線的乘法器,以及一些加法器,用于增加乘法器的結(jié)果。這種架構(gòu)需要許多乘法器和加法器,這些乘法器和加法器在FPGA中受到限制,具體取決于您使用的FPGA(盡管即使是功能最強大的FPGA也是有限的)。
設(shè)計FIR過濾器需要一些研究來減少這些資源,因為在設(shè)計的每個階段,任何FPGA都需要減少。然而,我們不會談?wù)撨@個話題,相反,我們將用另一個技巧來設(shè)計我們的移動平均濾波器。在移動平均濾波器中,所有系數(shù)都是1n。如果我們想實現(xiàn)我們的濾波器,如圖2,我們應(yīng)該做一個點擊延遲線和存儲n最后的輸入,然后乘以1n,最后總結(jié)結(jié)果。但是,我們可以將最后一個輸入存儲在一個FIFO中,然后將它們相加,然后在每個循環(huán)中乘以1/n。用這種方法,我們只需要一個n乘數(shù)。
代碼說明
首先,我們有N,它是輸入點的數(shù)量,作為可以調(diào)整的參數(shù)。我們將添加這N個點以產(chǎn)生輸出。
我們還假設(shè)我們的輸入是28位格式,我們希望輸出格式相同。在處理添加N點時,我們可能會面臨一點點增長。添加兩個28位點會產(chǎn)生28位輸出和一個溢出位。因此,為了增加N 28位點,我們需要一個(log2(N)+28)位輸出。
假設(shè)所有N個點都相同,并且添加它們就像將N乘以其中一個。這就是為什么我們實現(xiàn)一個“l(fā)og2”函數(shù),它只是簡單地計算其輸入的對數(shù)。通過知道N的對數(shù),我們可以設(shè)置輸出長度。請注意,log2不是可綜合的方法,只能用于Xilinx ISE(即,Xilinx ISE計算log2,然后將結(jié)果用于其余的實現(xiàn))。
“l(fā)og2”函數(shù)如下代碼所示:
**function integer log2(input integer v); begin log2=0; while(v>>log2) log2=log2+1; end endfunction**
現(xiàn)在我們設(shè)置輸入和輸出長度,我們需要創(chuàng)建一個存儲N個前一個和當前輸入的抽頭線。以下代碼將起到作用:
genvar i;
generate
for (i = 0; i < N-1 ; i = i + 1) begin: gd
always @(posedge clock_in) begin
if(reset==1'b1)
begin
data[i+1]<=0;
end
else
begin
data[i+1] <= data[i];
end
end
end
endgenerate
最后,我們需要一個加法器來匯總存儲在FIFO中的所有數(shù)據(jù)。這個階段有點棘手。如果我們想在每個時鐘周期都有輸出,我們需要制作一個組合電路,逐步將數(shù)據(jù)添加到FIFO中。下面顯示的代碼將執(zhí)行此操作:
genvar c;
generate
assign summation_steps[0] = data[0] + data[1];
for (c = 0; c < N-2 ; c = c + 1) begin: gdz
assign summation_steps[c+1] = summation_steps[c] + data[c+2];
end
endgenerate
但是,我們的目標FPGA(XC3S400)沒有這么多資源,在這個FPGA上合成這個模塊是不可行的。所以,我讓這個問題變得更簡單了。我假設(shè)我們希望輸出每N個時鐘周期更新一次。有了這個技巧,我們不再需要存儲所有收到的數(shù)據(jù)。我們可以簡單地存儲求和并將其添加到每個周期的當前輸入中。以下代碼將起到作用:
always@(posedge clock_in)
begin
if(reset)
begin
signal_out_tmp<=0;
count<=0;
signal_out<=0;
end
else
begin
if(down_sample_clk==N_down_sample)
begin
if(count begin
count<=count+1'b1;
signal_out_tmp<=signal_out_tmp+signal_in;
end
else
begin
count<=0;
signal_out<=signal_out_tmp[27+N2:N2];
signal_out_tmp<=0;
end
end
end
end
在此代碼中,總和保存為signal_out_tmp,并將在每個周期添加到輸入。在N個點之后,輸出將變?yōu)閟ignal_out_tmp,并且該變量將被設(shè)置為零并開始再次存儲總和。
這種方法使用非常低的資源,但其輸出將每N個周期更新一次。
模擬
由于它的速度,我們將使用Modelsim進行模擬。我們需要將Modelsim集成到Xilinx ISE。要執(zhí)行此操作,請轉(zhuǎn)到編輯>首選項>集成工具。在Model Tech Simulator部分,我們輸入Modelsim位置,我們就完成了,如圖4所示。
圖4.設(shè)置模型技術(shù)模擬器
Modelsim需要使用XILINX ISE庫才能模擬電路。為此,我們需要單擊項目上的FPGA模型,然后選擇Compile HDL Simulation Libraries,如圖5所示。
圖5.編譯HDL仿真庫
測試平臺包含在項目代碼中,您可以下載。在測試平臺中,我們假設(shè)輸入為步驟并保存輸出。在測試平臺上讀寫非常簡單,如下面的代碼所示。我們可以在測試平臺上用fopen函數(shù)打開一個文件,然后用fwrite函數(shù)寫入它。
f = $fopen("output.txt","w");
f2 = $fopen("time.txt","w");
$fwrite(f,"%d %dn",signal_in,signal_out);
$fwrite(f2,"%dn",cur_time);
在fwrite中格式化很像C語言中的簡單printf函數(shù)。我們還將在測試平臺中使用 time變量。使用** time變量為我們提供了可以寫入文本文件的當前時間。在模擬我們的項目之后,我們可以使用MATLAB中的書面文件來確保它們是正確的。用MATLAB編寫的代碼首先讀取文件并繪制它們。**
A = importdata('D:low_testoutput.txt');
B = importdata('D:low_testtime.txt');
M2=A(:,2);
M1=A(:,1);
*T=B(:,1)10e-9;
M1=M1/(2^24);
M2=M2/(2^24);
plot(M1);
hold on;
plot(M2);
s=size(M1);
val=0;
t=0:s(1,1)-1;
t=t*50e-9;
for i=405:s(1,1)
- if(abs(M1(i,1)-M2(i,1))<1 .1)* *
val=i;
break;
end
end
stepp=stepinfo(M2,t);
pp=stepp.RiseTime;
fc=.35/pp
cycles=val-405
*time=((cycles)50)/1000
出于測試目的,我們首先使用輸入步驟模擬我們的工作臺,然后將輸入更改為正弦。圖顯示在圖6和圖7中。
圖6.步驟響應(yīng)
圖 7.Sin(x)* sin(x)響應(yīng)
從圖6中可以看出,在0.2ms之后,濾波器輸出變得與輸入幅度一樣高。圖6顯示了每N個周期的響應(yīng),因為輸出不會平滑變化。相反,它在第N個周期后發(fā)生變化。
在圖7中,因為輸入是6 * sin(x) sin(x),我們知道這個輸入的DC偏移是3,因為我們的低通濾波器輸出是3。 *
CIC濾波器
級聯(lián)積分梳狀濾波器是一種硬件高效的FIR數(shù)字濾波器。
CIC濾波器由相同數(shù)量級的理想積分濾波器和抽取器組成。CIC濾波器架構(gòu)如圖8所示。
圖8. CIC濾波器圖像。通過Wikimedia Co
我們可以通過使用CIC濾波器和重寫移動平均方程來優(yōu)化我們的移動平均低通濾波器,如下所示:
**y[n]=∑k=0N1x[nk]=y[n1]+x[n]x[nN].y[n]=∑k=0N1x[nk]=y[n1]+x[n]x[nN].**
該架構(gòu)由梳狀部分(c [n] = x [n] -x [nN])和積分器(y [n] = y [n-1] + c [n])組成,因此我們可以使用CIC架構(gòu)這里。在這種架構(gòu)中,我們將加法器減少到只有三個部分,這樣我們就可以在每個周期都有輸出,這是CIC濾波器的神奇之處。
在可供下載的第二個代碼中,使用CIC濾波器拓撲優(yōu)化移動平均值。我們可以使用以下Verilog代碼在硬件中實現(xiàn)上述等式:
wire signed [27+N2:0] signal_out_tmp_2=signal_out_tmp_3+signal_in-data[N-1];
具有sin(x) sin(x)輸入的新結(jié)構(gòu)的輸出如圖9所示。 *
圖9. CIC輸出
我們的CIC移動平均濾波器的Modelsim仿真在下面的視頻中說明。
結(jié)論
數(shù)字和模擬路由都適用于濾波。每個都有自己的優(yōu)點,但數(shù)字濾波允許重新編程和較小的實現(xiàn)區(qū)域。在本文中,我們首先研究了構(gòu)建濾波器的方法,然后以最簡單的方式實現(xiàn)了移動平均濾波器。最后,我們使用CIC架構(gòu)對其進行了優(yōu)化。
評論
查看更多