作者: Mustahsin Zarif
信號和系統是電氣工程的核心概念。利用這兩個概念,我們能夠模擬信息是如何通過電氣元件并被修改的。而且,一旦了解了不同的電氣元件如何影響電壓等信號,我們就可以設計電路,以任何我們想要的方式控制信號。我們竟然能夠使用電阻器、電容器和運算放大器 (op-amps) 等電子元器件組合來模擬積分和微分等數學工具,這著實令人驚嘆。
例如以下電路(圖1):
圖 1:簡單的積分電路。(圖片來源:Mustahsin Zarif)
進入拉普拉斯 (Laplace) 域,我們可以用以下公式表示電路:
Vout = -(1/s) *(1/RC) *Vin
拉普拉斯域中的 1/s 實際上對應于 積分 !因此,我們得到一個基于運算放大器的積分電路模型。然而,當我們轉向現實世界時,系統會一直受到某種形式的隨機噪聲污染。
我們暫將積分電路放一放,來看一個更簡單的示例:電壓放大電路的輸入輸出波形可通過如圖 2 所示的示波器進行測量。
圖 2:電壓放大器的輸入和輸出波形。(圖片來源:Mustahsin Zarif)
在可見正弦波上疊加的隨機噪聲有多種原因造成,例如因電路在面包上搭建而產生的電氣連接不良等問題。這種噪聲同樣會干擾積分器的波形,我們將在本信號處理系列后續的博客中對此進行探討。然而,我們經常考慮的是如何將隨機干擾最小化。
濾波技術
工程師喜歡采用濾波技術來克服這些難題。濾波技術可以分為 1) 有限脈沖響應 (FIR) 濾波器或 2) 無限脈沖響應 (IIR) 濾波器。
FIR 濾波器之所以如此命名,是因為任何時候的輸出僅取決于當前和先前的輸入值值,而不取決于之前的輸出值。因此,這種濾波器具有非遞歸結構,沒有反饋,可按照公式 1 建模。
公式 1:FIR 濾波器示例公式。(圖片來源:Mustahsin Zarif)
積分器電路就如一個 FIR 濾波器,因為其輸出僅取決于輸入。
另一方面,IIR 濾波器具有反饋,因為任何時候的輸出都取決于先前的輸出以及當前輸入。這種情況下,可按照公式 2 建模。
公式 2:IIR 濾波器示例公式。(圖片來源:Mustahsin Zarif)
圖 3 是 可直觀表示 IIR 濾波器的框圖,顯示了輸入和輸出如何延遲 (z-i, z-j)、縮放 (ai, bj) 以及相加后獲得出當前輸出。通過改變這些值,我們可以實現不同類型的濾波器。
圖 3:IIR 濾波器框圖。(圖片來源:Mustahsin Zarif)
如果我們想要一個無反饋的 FIR 濾波器框圖,y[n] 就只是第一次求和的結果(圖 4)。
圖 4:FIR 濾波器框圖。(圖片來源:Mustahsin Zarif)
現在,我們已經掌握了 FIR 和 IIR 濾波器的基礎知識,接下來用一個例子來說明我們所學到的知識:移動平均濾波器。
移動平均線的工作方式是求出當前輸入和一定數量先前輸入的平均值(公式 3)。
公式3:移動平均公式。(圖片來源:Mustahsin Zarif)
其中 N= 窗口大小/影響輸出結果的樣本數
由此看出,這是一個 FIR 濾波器,因為等式右側沒有 y 項。
不過,我們可以巧妙地重組方程,來構造一個 IIR 濾波器。請考慮以下情況:
令 N=5,則
y[5] = (x[5]+x[4]+x[3]+x[2]+x[1])/5,
且 y[6] = (x[6]+x[5]+x[4]+x[3]+x[2])/5
y[6]=(x[6]+y[5]-x[1])/5
因此,當前輸出目前取決于之前的輸出(y[6] 取決于 y[5])!
更普遍地來說,
y[n] = (y[n ? 1] + x[n] ? x[n ? N - 1])/N
其中 N = 窗口大小
該濾波器在平滑時域信號方面效果奇佳,如圖 5 所示,我使用 python 對窗口大小 N = 11 進行了模擬。
圖 5:使用 Python 模擬移動濾波器。(圖片來源:Mustahsin Zarif)
移動濾波器的 Python 模擬代碼:
Copyimport numpy as np
import matplotlib.pyplot as plt
# Parameters for the sinusoidal wave
frequency = 5 # in Hertz
sampling_rate = 100 # Sampling rate in samples per second
duration = 2 # in seconds
# Generate time axis
t = np.linspace(0, duration, int(sampling_rate * duration), endpoint=False)
# Generate a clean sinusoidal signal
clean_signal = np.sin(2 np.pi frequency * t)
# Add random, white (Gaussian) noise to the signal
noise_amplitude = 0.5
noisy_signal = clean_signal + noise_amplitude * np.random.normal(size=t.shape)
def moving_average(signal, window_size):
window = np.ones(window_size) / window_size
return np.convolve(signal, window, mode='same')
# Apply moving average to the noisy signal
window_size = 11
smoothed_signal_ma = moving_average(noisy_signal, window_size)
# Plot the noisy and smoothed signals
plt.figure(figsize=(12, 9))
plt.subplot(2, 1, 1)
plt.plot(t, noisy_signal, label='Noisy Signal', color='orange')
plt.title('Noisy Sinusoidal Signal')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.grid(True)
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(t, smoothed_signal_ma, label='Smoothed Signal (MA)', color='green')
plt.title('Smoothed Signal using Moving Average')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
結束語
本博客的開頭介紹了現實世界中噪音是如何破壞數據的。盡管無法獲得數學方程定義的理想響應,但我們可以通過過濾掉所采集數據中的不良特性,使其盡可能接近理想響應。有多種方法可以實現這一點,并且也有多種我們想要實現這一點的場景。雖然我們以移動平均濾波器的模擬響應結束了本篇博客,但在下一篇博客中,我們將研究指數移動平均濾波器如何平滑嘈雜的慣性測量單元 (IMU) 數據!
-
濾波器
+關注
關注
162文章
8411瀏覽量
185686 -
信號處理
+關注
關注
49文章
1143瀏覽量
105097
發布評論請先 登錄
滑動平均濾波器介紹
MAX262微處理器可編程通用有源濾波器:設計與應用指南
自適應濾波算法介紹之匹配濾波器的基本原理和應用示例
中頻信號處理的“精準篩子”:杰盈JY-SBP-10.7+帶通濾波器技術解析
高頻濾波器精密加工——如何“篩”出純凈信號?
什么是濾波器?維愛普詳細介紹
有源濾波器與無源濾波器的區別
LC濾波器與電感、電容的區別:技術分析與應用
信號處理簡介:移動平均濾波器
評論