在本文中,我們將簡(jiǎn)要介紹不同類型的濾波器,然后學(xué)習(xí)如何實(shí)現(xiàn)移動(dòng)平均濾波器并使用CIC架構(gòu)對(duì)其進(jìn)行優(yōu)化。
在許多設(shè)計(jì)中,濾波非常重要。它為我們提供了一個(gè)機(jī)會(huì),可以提取隱藏在大量噪聲下的所需信號(hào)。我們還可以通過在某些頻率上濾波其輸出來確定系統(tǒng)的非線性。
讓我們首先討論濾波器類型之間的一些差異。
理論
濾波器類型
濾波器可根據(jù)其帶類別分為五組中的一組。每個(gè)人的能力都以他們的名義暗示。例如,低通濾波器是一種通過低頻輸入并阻止高頻輸入等的濾波器。
五種類型是:
低通帶通帶阻高通全部通過濾波器也有不同的形狀。例如,它們的通帶上可能有紋波,或者它們可能具有平坦的過渡帶等。
濾波器形狀
濾波器通??砂葱螤罘诸惾缦拢?/strong>
貝塞爾:與其他人相比最平坦的群體延遲Butterworth**: 設(shè)計(jì)為在通帶內(nèi)具有最平坦的頻率響應(yīng); 也被稱為“最大平坦” Chebyshev :設(shè)計(jì)為在理想濾波器和實(shí)際濾波器之間具有最小誤差; 可以分為兩種類型:通帶中具有紋波的那些以及阻帶中具有紋波的那些Elliptic :在pass和stop波段都有波紋,但是它們?cè)趐ass和stop band之間有最快的過渡選擇濾波器的形狀取決于所需的規(guī)格。例如,我們可能需要輸出信號(hào)幅度盡可能精確地跟隨通帶中的輸入信號(hào)幅度。在這種情況下,我們應(yīng)該使用巴特沃斯濾波器,即使它會(huì)給我們更多的過渡帶。**
另一方面,我們可能希望輸出信號(hào)頻率精確地跟隨輸入信號(hào)的線性相位響應(yīng),因此我們應(yīng)該選擇貝塞爾濾波器。如果我們需要使用盡可能少的組件并且具有與其他濾波器相同的順序和轉(zhuǎn)換速度,則Elliptic或Chebyshev濾波器可以工作,但是我們?cè)谕ㄟ^或阻止頻帶中會(huì)產(chǎn)生紋波。
模擬和數(shù)字濾波器
在另一方面,濾波器可以以兩種方式構(gòu)造:數(shù)字和模擬。
在模擬電路中,無源濾波器是電感器,電容器或電阻器的階梯。有源模擬濾波器可以是利用放大器或諧振器的結(jié)構(gòu)。它們的值可以通過使用已經(jīng)為設(shè)計(jì)模擬濾波器而創(chuàng)建的表格或應(yīng)用程序來確定。
可以使用IIR和FIR兩種方法創(chuàng)建數(shù)字濾波器。IIR(無限脈沖響應(yīng))濾波器是濾波器的類型,其中輸出取決于輸入和先前的輸出。
圖1. IIR濾波器。圖片由Mark Wilde提供
**數(shù)字濾波器的另一種濾波器實(shí)現(xiàn)是FIR(有限脈沖響應(yīng))。這些不使用反饋,它們的輸出僅與當(dāng)前和先前的輸入相關(guān)。關(guān)于穩(wěn)定性,F(xiàn)IR濾波器總是穩(wěn)定的,**因?yàn)樗鼈兊妮敵鰞H與輸入有關(guān)。另一方面,他們需要更高的訂單以滿足與IIR相同的規(guī)格。
圖2. FIR濾波器圖片由Jonathan Blancha
移動(dòng)平均線
移動(dòng)平均線是一個(gè)濾波器,用于平均先前輸入的N個(gè)點(diǎn)并使用它們輸出。
**[ n ] = 1Σi = 0Xn - 我y[n]=1N∑i=0Nxni**
如您所見,移動(dòng)平均濾波器是N個(gè)系數(shù)為 的FIR濾波器。 一些不同n的移動(dòng)平均濾波器的頻率響應(yīng)如圖3所示。
1N1N
圖3.移動(dòng)平均線的頻率響應(yīng)
移動(dòng)平均(MA)濾波器的脈沖響應(yīng)在不在0到N內(nèi)的點(diǎn)中為零。
**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增加,截止頻率降低但是花費(fèi)時(shí)間。我們需要等待第N個(gè)周期才能得到正確的結(jié)果,所以N越大,我們需要更多的時(shí)間。隨著濾波器越來越清晰,其輸出需要達(dá)到穩(wěn)定狀態(tài)的時(shí)間也會(huì)增加。
所需設(shè)計(jì)的濾波和實(shí)現(xiàn)是FPGA設(shè)計(jì)中的主題。需要學(xué)習(xí)很多東西來設(shè)計(jì)合適的濾波器,然后在FPGA上以最少的資源使用或最快的速度實(shí)現(xiàn)它。
在本文中,我們將嘗試實(shí)現(xiàn)N點(diǎn)移動(dòng)平均濾波器。我們假設(shè)N是一個(gè)參數(shù),可以在實(shí)施之前通過Xilinx ISE等CAD工具進(jìn)行更改。
正如我們?cè)趫D2中看到的,F(xiàn)IR濾波器可以通過延遲鏈實(shí)現(xiàn),其長(zhǎng)度為N,即FIR階,將系數(shù)乘以延遲線的乘法器,以及一些加法器,用于增加乘法器的結(jié)果。這種架構(gòu)需要許多乘法器和加法器,這些乘法器和加法器在FPGA中受到限制,具體取決于您使用的FPGA(盡管即使是功能最強(qiáng)大的FPGA也是有限的)。
設(shè)計(jì)FIR過濾器需要一些研究來減少這些資源,因?yàn)樵谠O(shè)計(jì)的每個(gè)階段,任何FPGA都需要減少。然而,我們不會(huì)談?wù)撨@個(gè)話題,相反,我們將用另一個(gè)技巧來設(shè)計(jì)我們的移動(dòng)平均濾波器。在移動(dòng)平均濾波器中,所有系數(shù)都是1n。如果我們想實(shí)現(xiàn)我們的濾波器,如圖2,我們應(yīng)該做一個(gè)點(diǎn)擊延遲線和存儲(chǔ)n最后的輸入,然后乘以1n,最后總結(jié)結(jié)果。但是,我們可以將最后一個(gè)輸入存儲(chǔ)在一個(gè)FIFO中,然后將它們相加,然后在每個(gè)循環(huán)中乘以1/n。用這種方法,我們只需要一個(gè)n乘數(shù)。
代碼說明
首先,我們有N,它是輸入點(diǎn)的數(shù)量,作為可以調(diào)整的參數(shù)。我們將添加這N個(gè)點(diǎn)以產(chǎn)生輸出。
我們還假設(shè)我們的輸入是28位格式,我們希望輸出格式相同。在處理添加N點(diǎn)時(shí),我們可能會(huì)面臨一點(diǎn)點(diǎn)增長(zhǎng)。添加兩個(gè)28位點(diǎn)會(huì)產(chǎn)生28位輸出和一個(gè)溢出位。因此,為了增加N 28位點(diǎn),我們需要一個(gè)(log2(N)+28)位輸出。
假設(shè)所有N個(gè)點(diǎn)都相同,并且添加它們就像將N乘以其中一個(gè)。這就是為什么我們實(shí)現(xiàn)一個(gè)“l(fā)og2”函數(shù),它只是簡(jiǎn)單地計(jì)算其輸入的對(duì)數(shù)。通過知道N的對(duì)數(shù),我們可以設(shè)置輸出長(zhǎng)度。請(qǐng)注意,log2不是可綜合的方法,只能用于Xilinx ISE(即,Xilinx ISE計(jì)算log2,然后將結(jié)果用于其余的實(shí)現(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)在我們?cè)O(shè)置輸入和輸出長(zhǎng)度,我們需要?jiǎng)?chuàng)建一個(gè)存儲(chǔ)N個(gè)前一個(gè)和當(dāng)前輸入的抽頭線。以下代碼將起到作用:
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
最后,我們需要一個(gè)加法器來匯總存儲(chǔ)在FIFO中的所有數(shù)據(jù)。這個(gè)階段有點(diǎn)棘手。如果我們想在每個(gè)時(shí)鐘周期都有輸出,我們需要制作一個(gè)組合電路,逐步將數(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
但是,我們的目標(biāo)FPGA(XC3S400)沒有這么多資源,在這個(gè)FPGA上合成這個(gè)模塊是不可行的。所以,我讓這個(gè)問題變得更簡(jiǎn)單了。我假設(shè)我們希望輸出每N個(gè)時(shí)鐘周期更新一次。有了這個(gè)技巧,我們不再需要存儲(chǔ)所有收到的數(shù)據(jù)。我們可以簡(jiǎn)單地存儲(chǔ)求和并將其添加到每個(gè)周期的當(dāng)前輸入中。以下代碼將起到作用:
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,并將在每個(gè)周期添加到輸入。在N個(gè)點(diǎn)之后,輸出將變?yōu)閟ignal_out_tmp,并且該變量將被設(shè)置為零并開始再次存儲(chǔ)總和。
這種方法使用非常低的資源,但其輸出將每N個(gè)周期更新一次。
模擬
由于它的速度,我們將使用Modelsim進(jìn)行模擬。我們需要將Modelsim集成到Xilinx ISE。要執(zhí)行此操作,請(qǐng)轉(zhuǎn)到編輯>首選項(xiàng)>集成工具。在Model Tech Simulator部分,我們輸入Modelsim位置,我們就完成了,如圖4所示。
圖4.設(shè)置模型技術(shù)模擬器
Modelsim需要使用XILINX ISE庫(kù)才能模擬電路。為此,我們需要單擊項(xiàng)目上的FPGA模型,然后選擇Compile HDL Simulation Libraries,如圖5所示。
圖5.編譯HDL仿真庫(kù)
測(cè)試平臺(tái)包含在項(xiàng)目代碼中,您可以下載。在測(cè)試平臺(tái)中,我們假設(shè)輸入為步驟并保存輸出。在測(cè)試平臺(tái)上讀寫非常簡(jiǎn)單,如下面的代碼所示。我們可以在測(cè)試平臺(tái)上用fopen函數(shù)打開一個(gè)文件,然后用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語言中的簡(jiǎn)單printf函數(shù)。我們還將在測(cè)試平臺(tái)中使用 time變量。使用** time變量為我們提供了可以寫入文本文件的當(dāng)前時(shí)間。在模擬我們的項(xiàng)目之后,我們可以使用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
出于測(cè)試目的,我們首先使用輸入步驟模擬我們的工作臺(tái),然后將輸入更改為正弦。圖顯示在圖6和圖7中。
圖6.步驟響應(yīng)
圖 7.Sin(x)* sin(x)響應(yīng)
從圖6中可以看出,在0.2ms之后,濾波器輸出變得與輸入幅度一樣高。圖6顯示了每N個(gè)周期的響應(yīng),因?yàn)檩敵霾粫?huì)平滑變化。相反,它在第N個(gè)周期后發(fā)生變化。
在圖7中,因?yàn)檩斎胧? * sin(x) sin(x),我們知道這個(gè)輸入的DC偏移是3,因?yàn)槲覀兊牡屯V波器輸出是3。 *
CIC濾波器
級(jí)聯(lián)積分梳狀濾波器是一種硬件高效的FIR數(shù)字濾波器。
CIC濾波器由相同數(shù)量級(jí)的理想積分濾波器和抽取器組成。CIC濾波器架構(gòu)如圖8所示。
圖8. CIC濾波器圖像。通過Wikimedia Co
我們可以通過使用CIC濾波器和重寫移動(dòng)平均方程來優(yōu)化我們的移動(dòng)平均低通濾波器,如下所示:
**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)中,我們將加法器減少到只有三個(gè)部分,這樣我們就可以在每個(gè)周期都有輸出,這是CIC濾波器的神奇之處。
在可供下載的第二個(gè)代碼中,使用CIC濾波器拓?fù)鋬?yōu)化移動(dòng)平均值。我們可以使用以下Verilog代碼在硬件中實(shí)現(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移動(dòng)平均濾波器的Modelsim仿真在下面的視頻中說明。
結(jié)論
數(shù)字和模擬路由都適用于濾波。每個(gè)都有自己的優(yōu)點(diǎn),但數(shù)字濾波允許重新編程和較小的實(shí)現(xiàn)區(qū)域。在本文中,我們首先研究了構(gòu)建濾波器的方法,然后以最簡(jiǎn)單的方式實(shí)現(xiàn)了移動(dòng)平均濾波器。最后,我們使用CIC架構(gòu)對(duì)其進(jìn)行了優(yōu)化。
評(píng)論