IIR濾波器(Infinite Impulse Response Filter)是一種數(shù)字濾波器,具有無(wú)限沖激響應(yīng)特性。相對(duì)于FIR(有限沖激響應(yīng))濾波器,IIR濾波器具有更高的靈活性和更小的計(jì)算復(fù)雜度。本文將介紹IIR濾波器的原理、特點(diǎn)以及常見(jiàn)的設(shè)計(jì)方法。
一、IIR濾波器原理
IIR濾波器的原理基于差分方程,其中當(dāng)前輸出值取決于當(dāng)前輸入值和過(guò)去輸出值的線性組合。這種遞歸結(jié)構(gòu)導(dǎo)致IIR濾波器具有無(wú)限的沖激響應(yīng),因此可以對(duì)輸入信號(hào)進(jìn)行更復(fù)雜的頻率響應(yīng)調(diào)整。
IIR濾波器的差分方程一般形式如下:
y[n] = b0 * x[n] + b1 * x[n-1] + ... + bm * x[n-m] - a1 * y[n-1] - ... - an * y[n-n]
其中, x[n] 是當(dāng)前輸入信號(hào)值, y[n] 是當(dāng)前輸出信號(hào)值,b0, b1, ..., bm是輸入系數(shù),a1, ..., an是輸出系數(shù),m和n分別表示濾波器的輸入和輸出階數(shù)。
IIR濾波器可以分為兩類:無(wú)零點(diǎn)IIR濾波器和有零點(diǎn)IIR濾波器。無(wú)零點(diǎn)IIR濾波器的輸出僅由過(guò)去的輸出值和當(dāng)前輸入值決定,而有零點(diǎn)IIR濾波器的輸出還受到過(guò)去的輸入值的影響。
二、IIR濾波器特點(diǎn)
IIR濾波器具有以下特點(diǎn):
遞歸結(jié)構(gòu) :IIR濾波器通過(guò)反饋將輸出連接到輸入,形成遞歸結(jié)構(gòu)。這種結(jié)構(gòu)可以實(shí)現(xiàn)更高階的濾波器,使得在相同濾波器階數(shù)的情況下,與FIR濾波器相比,IIR濾波器具有更小的延遲和更高的頻率選擇能力。
寬帶特性 :相對(duì)于FIR濾波器,IIR濾波器可以實(shí)現(xiàn)更寬的帶通和帶阻特性,可以更好地適應(yīng)頻率選擇要求。
計(jì)算效率 :IIR濾波器通常比FIR濾波器具有更高的計(jì)算效率,因?yàn)樗鼈儾恍枰鎯?chǔ)大量的前期樣本,而是通過(guò)遞歸運(yùn)算實(shí)現(xiàn)濾波過(guò)程。
頻率選擇 :IIR濾波器可以實(shí)現(xiàn)更復(fù)雜的頻率選擇,例如橢圓濾波器和Chebyshev濾波器等,這些濾波器在某些應(yīng)用中具有更好的頻率響應(yīng)特性。
時(shí)域響應(yīng) :IIR濾波器的時(shí)域響應(yīng)通常具有較長(zhǎng)的尾部,這意味著它們對(duì)輸入信號(hào)的變化有較慢的響應(yīng)。這可以在一些應(yīng)用中產(chǎn)生特殊的效果,如音頻音效處理和混響效果。
穩(wěn)定性 :IIR濾波器的穩(wěn)定性與極點(diǎn)的位置有關(guān)。為了確保濾波器的穩(wěn)定性,極點(diǎn)必須位于單位圓內(nèi)的穩(wěn)定區(qū)域。因此,在IIR濾波器設(shè)計(jì)中,需要采取措施來(lái)控制極點(diǎn)的位置,以確保濾波器的穩(wěn)定性。
三、IIR濾波器種類和設(shè)計(jì)
經(jīng)典的IIR濾波器類型,包括Butterworth濾波器、Chebyshev I類和II類濾波器、橢圓濾波器和Bessel濾波器,都是為了逼近理想的矩形濾波器而設(shè)計(jì)的。
理想的矩形濾波器是在頻率域中具有矩形形狀的濾波器,它可以完全通過(guò)在通帶內(nèi)傳遞所需的頻率分量,同時(shí)在阻帶內(nèi)完全抑制不需要的頻率分量。然而,實(shí)際上很難實(shí)現(xiàn)理想的矩形濾波器,因?yàn)樗笤陬l率域中產(chǎn)生無(wú)限寬的截止帶和無(wú)限陡的過(guò)渡帶。
經(jīng)典的IIR濾波器類型采用不同的設(shè)計(jì)策略來(lái)逼近理想的矩形濾波器:
(1)Butterworth濾波器:通過(guò)在通帶和阻帶之間均勻分布的幅度衰減來(lái)逼近理想矩形濾波器的幅頻響應(yīng)特性。它在通帶內(nèi)具有平坦的幅度響應(yīng),但在阻帶中的衰減率相對(duì)較低。
(2)Chebyshev I類和II類濾波器:通過(guò)引入波紋來(lái)實(shí)現(xiàn)更陡峭的過(guò)渡帶和更高的阻帶衰減,從而更接近理想的矩形濾波器。Chebyshev I類濾波器在通帶內(nèi)具有最小的波紋,而Chebyshev II類濾波器在阻帶內(nèi)具有最小的波紋。
(3)橢圓濾波器:使用Cauer函數(shù)來(lái)設(shè)計(jì),通過(guò)在通帶和阻帶內(nèi)都具有波紋來(lái)實(shí)現(xiàn)更 steepend 的過(guò)渡帶和更高的阻帶衰減。橢圓濾波器在通帶和阻帶內(nèi)都能夠?qū)崿F(xiàn)較小的幅度波紋。
(4)Bessel濾波器:通過(guò)在頻率域中具有線性相位特性來(lái)逼近理想的矩形濾波器的相位響應(yīng)。它對(duì)信號(hào)的相位不會(huì)引入額外的失真,但在幅度響應(yīng)方面具有相對(duì)平滑的特性。
每種IIR濾波器類型都有其特定的設(shè)計(jì)方法和特點(diǎn),適用于不同的應(yīng)用場(chǎng)景和設(shè)計(jì)要求。選擇適當(dāng)?shù)腎IR濾波器類型取決于所需的頻率響應(yīng)特性、相位特性和設(shè)計(jì)復(fù)雜度。
3.1 Butterworth濾波器 :
原理:Butterworth濾波器是一種最常見(jiàn)的IIR濾波器,其設(shè)計(jì)目標(biāo)是在通帶內(nèi)具有盡可能平坦的幅度響應(yīng),同時(shí)保持最小的相位失真。它的特點(diǎn)是具有光滑的頻率響應(yīng)曲線,沒(méi)有幅度波紋。
設(shè)計(jì):Butterworth濾波器的設(shè)計(jì)通過(guò)控制濾波器的階數(shù)和截止頻率來(lái)實(shí)現(xiàn)。階數(shù)越高,濾波器的頻率選擇能力越強(qiáng)。
import numpy as np
from scipy.signal import butter, filtfilt
import matplotlib.pyplot as plt
# 生成示例數(shù)據(jù)
fs = 1000 # 采樣頻率
t = np.arange(0, 1, 1/fs) # 時(shí)間序列
x = np.sin(2 * np.pi * 5 * t) + np.sin(2 * np.pi * 50 * t) + np.random.randn(len(t)) * 0.2 # 混合信號(hào)
# 定義Butterworth濾波器函數(shù)
def butterworth_filter(data, cutoff_freq, filter_type, order, fs):
nyquist_freq = 0.5 * fs
cutoff = cutoff_freq / nyquist_freq
# 設(shè)計(jì)Butterworth濾波器系數(shù)
b, a = butter(order, cutoff, btype=filter_type, analog=False, output='ba')
# 將濾波器應(yīng)用于數(shù)據(jù)
filtered_data = filtfilt(b, a, data)
return filtered_data
# 設(shè)計(jì)并應(yīng)用低通濾波器
cutoff_freq = 30 # 截止頻率
order = 4 # 階數(shù)
filter_type = 'lowpass' # 濾波器類型
lowpass_data = butterworth_filter(x, cutoff_freq, filter_type, order, fs)
# 設(shè)計(jì)并應(yīng)用帶通濾波器
cutoff_freqs = [20, 80] # 截止頻率范圍
order = 4 # 階數(shù)
filter_type = 'bandpass' # 濾波器類型
bandpass_data = butterworth_filter(x, cutoff_freqs, filter_type, order, fs)
# 設(shè)計(jì)并應(yīng)用高通濾波器
cutoff_freq = 50 # 截止頻率
order = 4 # 階數(shù)
filter_type = 'highpass' # 濾波器類型
highpass_data = butterworth_filter(x, cutoff_freq, filter_type, order, fs)
# 設(shè)計(jì)并應(yīng)用帶阻濾波器
cutoff_freqs = [40, 60] # 截止頻率范圍
order = 4 # 階數(shù)
filter_type = 'bandstop' # 濾波器類型
bandstop_data = butterworth_filter(x, cutoff_freqs, filter_type, order, fs)
# 繪制原始信號(hào)和濾波后的信號(hào)
plt.figure(figsize=(10, 6))
plt.subplot(5, 1, 1)
plt.plot(t, x)
plt.title('Original Signal')
plt.subplot(5, 1, 2)
plt.plot(t, lowpass_data)
plt.title('Lowpass Filtered Signal')
plt.subplot(5, 1, 3)
plt.plot(t, bandpass_data)
plt.title('Bandpass Filtered Signal')
plt.subplot(5, 1, 4)
plt.plot(t, highpass_data)
plt.title('Highpass Filtered Signal')
plt.subplot(5, 1, 5)
plt.plot(t, bandstop_data)
plt.title('Bandstop Filtered Signal')
plt.tight_layout()
plt.show()