寫在前面的話
數(shù)字濾波器一般可以分為兩類:有限沖激響應(yīng)(FIR)濾波器和無限沖激響應(yīng)(IIR)濾波器。
在Verilog綜合方面,通??梢詫崿F(xiàn)四種數(shù)字濾波器:
- 基于時域采樣的FIR濾波器(Time Domain Sampling FIR Filter)
- 快速傅里葉變換(FFT)算法實現(xiàn)的FIR濾波器(FFT-based FIR Filter)
- 直接IIR濾波器(Direct Form IIR Filter)
- 級聯(lián)IIR濾波器(Cascade IIR Filter)
其中,基于時域采樣的FIR濾波器適用于低通、高通、帶通、帶阻等常見濾波器類型,但其抗混疊能力較差;FFT-based FIR濾波器適用于平滑頻率特性要求高的濾波器,但需要額外硬件支持FFT運算;直接IIR濾波器和級聯(lián)IIR濾波器適用于需要更少延遲和低硬件成本的濾波器設(shè)計,但容易出現(xiàn)穩(wěn)定性問題。
數(shù)字濾波器分類
數(shù)字濾波器是一種數(shù)字信號處理技術(shù),用于對數(shù)字信號進行去噪、濾波和頻譜分析等處理。根據(jù)其響應(yīng)特性和算法實現(xiàn)方式,數(shù)字濾波器可以分為多種類型。
- FIR濾波器
FIR濾波器是一種有限沖激響應(yīng)(Finite Impulse Response)濾波器,具有線性相位、無回聲等特點,常用于需要精確控制濾波器通帶和阻帶幅度響應(yīng)的應(yīng)用中,如語音和音頻處理、圖像處理和通信系統(tǒng)中的調(diào)制解調(diào)等。
- IIR濾波器
IIR濾波器是一種無限沖激響應(yīng)(Infinite Impulse Response)濾波器,可以通過遞歸方式獲得穩(wěn)定性,具有較低的階數(shù)和更好的全通性能,適用于帶限信號處理和模擬濾波器的數(shù)字實現(xiàn)。
- 頻域濾波器
頻域濾波器是基于傅里葉變換等頻域分析技術(shù)設(shè)計的濾波器,包括低通、高通、帶通和帶阻四種類型,可用于濾波器設(shè)計、頻域分析和信號還原等方面。
- 自適應(yīng)濾波器
自適應(yīng)濾波器是一種能夠根據(jù)輸入信號和環(huán)境的變化自行調(diào)整濾波系數(shù)的濾波器,主要用于去除噪聲和復(fù)雜的干擾。
- 數(shù)字時域處理濾波器
數(shù)字時域處理濾波器是利用離散時間信號的離散微分、差分或積分等進行信號濾波的濾波器,常見的有均值濾波器、中值濾波器和高斯濾波器等。
以上各種數(shù)字濾波器的選擇取決于應(yīng)用場景和設(shè)計要求,需要綜合考慮其性能、穩(wěn)定性、響應(yīng)速度和資源消耗等因素。
經(jīng)典數(shù)字濾波器
FIR濾波器
普通FIR濾波器實現(xiàn)方案
線性相位的FIR濾波器結(jié)構(gòu)圖
FIR特點及注意點
FIR濾波器(Finite Impulse Response Filter,有限脈沖響應(yīng)濾波器)的特點:
-
FIR濾波器具有穩(wěn)定、線性和時不變的特性,能夠精確控制頻率響應(yīng)。
-
FIR濾波器計算簡單,容易實現(xiàn)。
-
理論上,F(xiàn)IR濾波器能夠完全去除濾波器輸入信號中的周期性干擾。
-
FIR濾波器具有簡單的調(diào)整濾波器特性的方式,只需要簡單地添加或減少濾波器的系數(shù)并重新編程即可。
在Verilog設(shè)計FIR濾波器時需要注意以下幾點:
-
定義好濾波器的系數(shù),F(xiàn)IR濾波器的效果和性能主要取決于這些系數(shù)。在計算系數(shù)時,請使用MATLAB或其他專業(yè)工具來保持準確性。
-
確定輸入/輸出數(shù)據(jù)的寬度,這通常需要根據(jù)具體應(yīng)用來確定。您需要考慮您的信號源的噪聲和分辨率,并設(shè)置數(shù)據(jù)寬度以確保不會有過多的噪聲或失真。
-
確定時鐘頻率,這也需要根據(jù)該設(shè)計中的最大數(shù)據(jù)速率來確定。如果時鐘周期不足以處理所有輸入數(shù)據(jù),則需要增加時鐘頻率或引入流水線來處理。
-
注意FIR濾波器延遲的問題。由于FIR濾波器中的系數(shù)乘法運算是串行的,會導(dǎo)致輸出數(shù)據(jù)的延遲。您需要在設(shè)計中考慮這個因素,并相應(yīng)地調(diào)整時序。
-
經(jīng)過設(shè)計和仿真后,需要進行一些性能測試來確保您的FIR濾波器在實際使用中能夠按預(yù)期工作。請?zhí)貏e注意過高的噪聲和失真,這些問題通常可以通過調(diào)整系數(shù)、增加時鐘頻率等方式來解決。
Verilog代碼 example1
module fir_filter
#(
parameter WIDTH = 16, // 數(shù)據(jù)位寬
COEFF_SIZE = 5, // 系數(shù)位寬
TAP_NUM = 10 // 塊大小或階數(shù)
)
(
input clk,
input rst,
input signed [WIDTH-1:0] din,
output reg signed [WIDTH-1:0] dout
);
reg signed [WIDTH-1:0] shift_reg [0:TAP_NUM-1];
reg signed [COEFF_SIZE-1:0] coeff [0:TAP_NUM-1];
integer i;
integer j;
reg signed [WIDTH+COEFF_SIZE-2:0] sum;
initial begin
for (i=0; i < TAP_NUM; i=i+1) begin
shift_reg[i] <= 0;
coeff[i] <= 'd1 ;
end
dout <= 0;
end
always @(posedge clk or posedge rst) begin
if (rst) begin
dout <= 0;
sum <= 0;
for (i=0; i<TAP_NUM; i=i+1) begin
shift_reg[i] <= 0;
end
end else begin
//移位寄存器,最新元素放在第一位
for (i=TAP_NUM-1; i>0; i=i-1) begin
shift_reg[i] <= shift_reg[i-1];
end
shift_reg[0] <= din;
//計算權(quán)值和
for (j=0; j<TAP_NUM; j=j+1) begin
sum <= sum + (shift_reg[i] * coeff[i]);
end
dout <= sum[WIDTH-1:0];
end
end
endmodule
example1仿真波形
Verilog代碼 example2
module FIR_Filter(clk, reset, data_in, data_out);
parameter N = 16;
input clk, reset;
input [N-1:0] data_in;
output reg [N-1:0] data_out;
// coe defination
wire [5:0] b0 = 6'b100000;
wire [5:0] b1 = 6'b100000;
wire [5:0] b2 = 6'b100000;
wire [5:0] b3 = 6'b100000;
wire [N-1:0] x1, x2, x3;
// D Flip Flops
DFF DFF0(clk, 0, data_in, x1); //
DFF DFF1(clk, 0, x1, x2); //
DFF DFF2(clk, 0, x2, x3); //
// Multiplication
wire [N-1:0] Mul0, Mul1, Mul2, Mul3;
assign Mul0 = data_in * b0;
assign Mul1 = x1 * b1;
assign Mul2 = x2 * b2;
assign Mul3 = x3 * b3;
// Addition operation
wire [N-1:0] Add_final;
assign Add_final = Mul0 + Mul1 + Mul2 + Mul3;
// Final calculation to output
always@(posedge clk)
data_out <= Add_final;
endmodule
example2仿真波形(正弦濾波)
FFT—FIR濾波器
基于FFT的FIR數(shù)字濾波器是一種廣泛使用的數(shù)字濾波方法,它使用FFT算法對FIR濾波器的頻率響應(yīng)進行計算,以實現(xiàn)濾波器功能。FIR數(shù)字濾波器具有以下優(yōu)缺點:
優(yōu)點:
-
它具有很高的精度和穩(wěn)定性。FFT算法可以實現(xiàn)非常高的精度和靈敏度,并且在信號噪聲較高時也非常穩(wěn)定。
-
FFT算法的計算速度很快,而且還可以使用硬件加速器來進一步提高計算性能。
-
這種濾波器可以實現(xiàn)非常窄的帶通和帶阻濾波器,以達到更精確的控制和調(diào)整濾波器特性。
-
FIR濾波器的系數(shù)是固定的,所以在進行信號處理時可以更容易地調(diào)整數(shù)據(jù)存儲器。
缺點:
-
FFT算法需要一個大量的存儲器來存儲信號輸入和輸出數(shù)據(jù),這通常會對系統(tǒng)的處理速度產(chǎn)生很大影響。
-
由于FFT算法需要將所有輸入數(shù)據(jù)一次性處理完畢,因此在信號輸入速度超過系統(tǒng)處理能力時,系統(tǒng)將無法按照預(yù)期輸出。
-
與其他數(shù)字濾波器相比,基于FFT的FIR數(shù)字濾波器需要對輸入信號采樣進行大量的信號預(yù)處理,所以它對輸入信號采樣的要求較高。
基于FFT的FIR數(shù)字濾波器具有高精度、高穩(wěn)定性和濾波調(diào)整靈活等多個優(yōu)點,但也存在一些缺陷,如需要大量的存儲器以及對輸入信號采樣的要求較高。
順序結(jié)構(gòu)FFT
順序結(jié)構(gòu)是根據(jù) FFT 中每個蝶形運算單元計算的先后順序。其典型結(jié)構(gòu)如圖 所示,順序結(jié)構(gòu)中僅包含一個蝶形運算單元和一個存儲單元,每級運算單元使用同一個蝶形運算單元,且所有輸入數(shù)據(jù)、每級運算結(jié)果及輸出結(jié)果均使用同一個存儲單元。
流水線結(jié)構(gòu)FFT
流水結(jié)構(gòu)的 FFT 將 FFT 計算分解為 M 個子過程,M 即為 FFT 計算的級數(shù)。每級采用獨立的蝶形運算單元,各級蝶形運算單元先將計算結(jié)果傳輸至下一級,然后再接收上一級的數(shù)據(jù)進行計算,使 FFT 計算過程以流水的方式進行,增加 了FFT 的計算速度。
并行結(jié)構(gòu)FFT
在 FFT 每級中采用 M 個蝶形運算單元同時計算,提升了 FFT 計算速度。FFT并行結(jié)構(gòu)計算速度快,具有高吞吐量,采用多個蝶形運算單元同時計算,相比于只采用一個蝶形運算單元計算,速度是成倍增加的;速度增加,導(dǎo)致了并行計算的 FFT 需要消耗更多的計算資源和存儲資源。
陣列結(jié)構(gòu)FFT
陣列結(jié)構(gòu)全并行的計算特點決定了其計算速度比并行結(jié)構(gòu)和流水結(jié)構(gòu)要快,同時也意味著其具有遠超于并行結(jié)構(gòu)和流水結(jié)構(gòu)的資源消耗。
FFT-based FIR Filter example1
module fft_filter(
input [7:0] in_data,
output reg [7:0] out_data
);
parameter signed [3:0] tw_re = 8'h0F; // 1/sqrt(2)
parameter signed [3:0] tw_im = -8'h0F; // -1/sqrt(2)
reg signed [3:0] x_real, x_imag;
reg signed [3:0] y_real, y_imag;
always @* begin
// Calculate first stage of FFT
x_real = in_data[3:0];
x_imag = 4'h0; // zero-padding imaginary part
y_real = x_real + (tw_re * in_data[7:4]) - (tw_im * 4'h0);
y_imag = (tw_re * 4'h0) + (tw_im * in_data[7:4]) + 4'h0;
// Calculate second stage of FFT
x_real = y_real;
x_imag = y_imag;
y_real = x_real + (tw_re * 4'h0) - (tw_im * y_imag);
y_imag = (tw_re * y_imag) + (tw_im * 4'h0) + 4'h0;
// Output magnitude of second stage
out_data = {y_real[3:0], y_imag[3:0]} ^ 8'hFF; // invert MSB for magnitude display
end
endmodule
example仿真波形
并行FIR濾波器
并行FIR數(shù)字濾波器是一種數(shù)字信號處理器件,它能夠高效地進行數(shù)字信號濾波操作。與串行FIR數(shù)字濾波器不同,它可以同時處理多個輸入樣本,從而實現(xiàn)更快的運算速度和更高的吞吐量。
并行FIR數(shù)字濾波器通常采用多個濾波器核心并行工作,每個核心負責(zé)處理一個輸入樣本,并將處理結(jié)果匯總以生成輸出數(shù)據(jù)。這種并行處理方式可以利用現(xiàn)代并行計算架構(gòu)的優(yōu)勢,例如GPU或FPGA等,從而顯著提高數(shù)字濾波的處理速度和效率。
并行FIR數(shù)字濾波器的主要優(yōu)點包括:
- 高效的運算速度:采用并行計算方式,使得多個輸入樣本可以同時被處理,大幅提高了數(shù)字濾波的運算速度。
- 高性能的吞吐量:并行FIR數(shù)字濾波器可以在相同的時間內(nèi)處理更多的輸入樣本,從而提高了數(shù)字濾波的吞吐量。
- 可擴展性強:由于并行FIR數(shù)字濾波器采用多個濾波器核心并行計算,因此具有很好的可擴展性,可以根據(jù)需要增加處理核心來提高濾波器的處理能力。
但并行FIR數(shù)字濾波器也存在一些缺點:
- 設(shè)計難度較大:由于并行FIR數(shù)字濾波器需要多個濾波器核心協(xié)同工作,因此需要較高的硬件設(shè)計及算法優(yōu)化技術(shù)。這對于初學(xué)者來說可能比較困難。
- 硬件成本相對較高:并行FIR數(shù)字濾波器通常需要更多的硬件資源來實現(xiàn),并且需要更復(fù)雜的控制邏輯,因此在實際應(yīng)用中可能需要更高的成本支出。
下圖為并行結(jié)構(gòu)的FIR濾波器:
Verilog代碼 example
查看菜鳥教程中并行FIR濾波器的代碼:
modelsim仿真波形,高頻濾波:
串行FIR濾波器
串行FIR數(shù)字濾波器是由一系列單級FIR數(shù)字濾波器級聯(lián)構(gòu)成。它的輸入信號經(jīng)過第一個FIR濾波器后,輸出作為下一個FIR濾波器的輸入,以此類推直到輸出最終結(jié)果。串行FIR數(shù)字濾波器被廣泛應(yīng)用于音頻處理、圖像處理和通信系統(tǒng)中。
優(yōu)點:
- 串行FIR數(shù)字濾波器結(jié)構(gòu)簡單,易于實現(xiàn),并且具有穩(wěn)定性和可靠性。
- 串行FIR數(shù)字濾波器具有高階濾波器特性,可以實現(xiàn)更高的濾波器階數(shù)。
- 串行FIR數(shù)字濾波器可以實現(xiàn)多通道濾波器,適用于多通道信號處理。
缺點:
- 串行FIR數(shù)字濾波器的延遲相對較高,可能會導(dǎo)致對實時性要求較高的應(yīng)用存在問題。
- 串行FIR數(shù)字濾波器需要更多的計算資源來實現(xiàn)高階濾波器。
串行FIR濾波器結(jié)構(gòu):
Verilog代碼 example
菜鳥教程,串行FIR濾波器;
CSDN,jk_101博客
CIC濾波器
CIC數(shù)字濾波器是一種高效的數(shù)字濾波器,用于降低采樣率。它通過組合積分器和累加器來實現(xiàn),可實現(xiàn)非常高的抽取因子,并且不需要在濾波器中使用乘法器或除法器。
CIC數(shù)字濾波器的優(yōu)點包括:
- 高效性:由于CIC濾波器只使用加法器和移位器,因此它們可以在硬件中容易地實現(xiàn),而無需使用乘法器或除法器。
- 抗混疊能力強:CIC濾波器對輸入信號的高頻成分具有很好的抑制效果,這使得它們非常適合用于抽取信號中高頻噪聲的應(yīng)用。
- 占用資源少:由于CIC濾波器的簡單結(jié)構(gòu),它們需要的資源相對較少,因此可以在小型FPGA或ASIC中實現(xiàn)。
CIC數(shù)字濾波器的缺點包括:
- 滯后:由于CIC濾波器的設(shè)計原理,它們會引入一定的滯后,這可能會對某些應(yīng)用程序產(chǎn)生影響。
- 靈敏度:當輸入信號變化較小時,CIC濾波器可能會出現(xiàn)較大的輸出變化,這可能會導(dǎo)致一些應(yīng)用程序的精度下降。
在使用verilog設(shè)計CIC數(shù)字濾波器時,需要注意以下幾點:
- 輸入信號的位寬應(yīng)與濾波器的位寬匹配。
- CIC濾波器中的加法器和移位器可以通過verilog語言中的"+=“和”>>"運算符輕松實現(xiàn)。
- 在verilog代碼中,需要注意最后一級積分器輸出的值可能會超過位寬范圍,因此需要進行截斷或飽和處理。
- 由于CIC濾波器的結(jié)構(gòu)比較特殊,因此在verilog中實現(xiàn)時需要仔細考慮其各個部分之間的關(guān)系。
五級CIC濾波器:
Verilog代碼 example
菜鳥教程,CIC濾波器
卡爾曼濾波器
數(shù)字卡爾曼濾波器是一種基于貝葉斯濾波理論的遞歸算法。它的核心思想是將系統(tǒng)狀態(tài)和觀測數(shù)據(jù)視為隨機變量,利用已知的系統(tǒng)模型和測量模型,通過考慮先驗信息和實際測量值來更新狀態(tài)估計值,從而使得最終的估計值具有更高的準確性。
卡爾曼濾波器中包含兩個重要的方程:狀態(tài)預(yù)測方程和狀態(tài)更新方程。狀態(tài)預(yù)測方程描述了系統(tǒng)狀態(tài)如何根據(jù)前一個時刻的狀態(tài)和外部控制輸入進行預(yù)測,并估計預(yù)測誤差的協(xié)方差;狀態(tài)更新方程描述了如何根據(jù)當前時刻的測量值和預(yù)測值來更新估計值,并估計更新后的狀態(tài)誤差的協(xié)方差。
數(shù)字卡爾曼濾波器的優(yōu)點主要包括以下幾個方面:
- 核心算法簡單易懂:卡爾曼濾波器的核心思想非常簡單,容易掌握和實現(xiàn)。
- 適應(yīng)各種噪聲條件:卡爾曼濾波器可以有效地處理多種噪聲類型,包括高斯白噪聲、偏差噪聲等。
- 高效性:卡爾曼濾波器僅需要存儲和更新當前狀態(tài)的估計值和協(xié)方差矩陣,而不需要維護完整的歷史數(shù)據(jù),因此具有較高的計算效率。
數(shù)字卡爾曼濾波器也存在一些缺點:
- 對系統(tǒng)模型和測量模型要求高:卡爾曼濾波器需要準確的系統(tǒng)信息和觀測數(shù)據(jù),如果這些信息存在誤差或不確定性,將影響卡爾曼濾波器的估計效果。
- 不適用于非線性系統(tǒng):卡爾曼濾波器是一種線性濾波器,在處理非線性系統(tǒng)時可能無法達到很好的效果。
- 過去信息權(quán)重過大:由于卡爾曼濾波器的遞推方式,每一次狀態(tài)更新都充分考慮了過去的所有信息,因此過去信息對估計結(jié)果的影響比較大,導(dǎo)致濾波器反應(yīng)比較慢。
Verilog代碼:
//只是一個簡單的卡爾曼濾波器
module kalman_filter(
input clk,
input resetn,
input [3:0] measurement,
output reg [3:0] kf_output
);
parameter R = 2; // 測量噪聲方差
parameter Q = 1; // 狀態(tài)噪聲方差
reg signed [3:0] x_hat_prev; // 上一時刻狀態(tài)估計值
reg signed [3:3] P_prev; // 上一時刻狀態(tài)協(xié)方差矩陣
reg signed [3:0] K; // 卡爾曼增益
reg signed [3:0] x_predict;
reg signed [3:3] P_predict;
reg signed [3:0] innovation;
always @(posedge clk or negedge resetn) begin
if (resetn == 1'b0) begin
x_hat_prev <= 4'sd0;
P_prev <= {4{4'sd1}};
K <= 4'sd0;
kf_output <= 4'sd0;
end else begin
// 狀態(tài)預(yù)測
x_predict = x_hat_prev;
P_predict = P_prev + Q;
// 更新卡爾曼增益
K = P_predict / (P_predict + R);
// 更新狀態(tài)估計和協(xié)方差矩陣
innovation = measurement - x_predict;
x_hat_prev = x_predict + K * innovation;
P_prev = (1 - K) * P_predict;
// 輸出狀態(tài)估計值
kf_output <= x_hat_prev;
end
end
endmodule
modelsim仿真波形
總結(jié)
濾波器是一種用于信號處理的重要工具,常用于濾除噪聲、去除干擾和改善信號質(zhì)量。以下是關(guān)于FIR濾波器、基于FFT的FIR濾波器、并行FIR濾波器、串行FIR濾波器、CIC濾波器以及卡爾曼濾波器的總結(jié):
- FIR濾波器是一種非遞歸濾波器,可以對信號進行線性相應(yīng)。適用于需要較長沖激響應(yīng)的數(shù)字濾波器。
- 基于FFT的FIR濾波器是一種通過快速傅里葉變換(FFT)實現(xiàn)的FIR濾波器,適用于需要實時濾波且具有高計算效率的場合。
- 并行FIR濾波器是一種將輸入數(shù)據(jù)分成多路并在每一路上并行處理以提高計算效率的濾波器。適用于需要高速、高性能、多通道處理的系統(tǒng)。
- 串行FIR濾波器是一種將輸入數(shù)據(jù)串聯(lián)到每個階段的簡單濾波器中進行連續(xù)處理的濾波器。適用于低速且資源有限的系統(tǒng)。
- CIC濾波器是一種特殊的IIR濾波器,適用于對高速采樣率信號進行降采樣處理。CIC濾波器具有低延遲和低計算復(fù)雜度的優(yōu)點,但是在頻率選擇性方面可能不如FIR濾波器。
- 卡爾曼濾波器是一種運用貝葉斯概率理論進行狀態(tài)估計和數(shù)據(jù)處理的濾波器,適用于需要將多個測量值組合在一起獲得更準確的狀態(tài)信息的系統(tǒng),例如慣性導(dǎo)航和目標跟蹤。
各種濾波器的適用范圍相對較寬,最終的應(yīng)用還需根據(jù)具體情況進行選擇。濾波器的設(shè)計更偏向于算法和信號處理,本人涉及的相關(guān)知識點較少,感興趣的同學(xué)可以參考杜勇老師編著的《數(shù)字濾波器的Matlab于FPGA實現(xiàn)》。也歡迎廣大通信相關(guān)的同僚批評指正以及分享資料,感謝!文章來源:http://www.zghlxwxcb.cn/news/detail-483307.html
參考資料
[1]王海淼. 基于FPGA的實時FFT分析方法研究[D].哈爾濱工業(yè)大學(xué),2021.DOI:10.27061/d.cnki.ghgdu.2021.002691.
[2]杜勇. 數(shù)字濾波器的MATLAB與FPGA實現(xiàn).第2版[M]. 電子工業(yè)出版社, 2014.
[3]https://www.runoob.com/w3cnote/verilog-serial-fir.html
[4]https://blog.csdn.net/jk_101/article/details/129148406文章來源地址http://www.zghlxwxcb.cn/news/detail-483307.html
到了這里,關(guān)于數(shù)字IC經(jīng)典電路(4)——經(jīng)典濾波器的實現(xiàn)(濾波器簡介及Verilog實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!