使用fir濾波器實現數據擬合
提示:學習筆記
使用fir濾波器實現數據擬合
- 使用fir濾波器實現數據擬合
- 一、問題建模
- 二、 構建矩陣方程(關鍵步驟)
- 三、最小二乘解
- 四、重要注意事項
- 4.1 濾波器長度 M
- 4.2 數據的預處理
- 4.3 延遲問題
- 4.4 性能評估
一、問題建模
我們定義:
-
期望信號(目標信號):d[n] = 第2列的第n個數據點
-
輸入信號:x[n] = 第3列的第n個數據點
-
FIR濾波器:其系數為 h[0], h[1], …, h[M-1],其中 M 是濾波器的長度(階數+1)。
-
濾波后的輸出信號:y[n] = 估計的第2列數據
y[n] = h[0]*x[n] + h[1]*x[n-1] + … + h[M-1]*x[n-M+1] -
我們的目標是讓輸出 y[n] 盡可能接近期望信號 d[n]。誤差信號 e[n] 定義為:
e[n] = d[n] - y[n]
最小二乘法的核心思想是:找到一組濾波器系數 h[k],使得所有數據點上誤差平方和(Sum of Squared Errors, SSE) 最小。
SSE = Σ (e[n])2 = Σ (d[n] - y[n])2
二、 構建矩陣方程(關鍵步驟)
為了利用所有可用的數據點(假設有 N 個),我們將問題轉化為矩陣形式。
首先定義一些向量和矩陣:
-
濾波器系數向量: h = [h[0], h[1], …, h[M-1]]? (一個 Mx1 的列向量)
-
期望信號向量: d = [d[M-1], d[M], …, d[N-1]]? (一個 (N-M+1)x1 的列向量)
注意:由于濾波需要用到前M-1個輸入點,所以輸出y[n]從n=M-1時刻開始才有有效值。因此d也從對應的點開始取。 -
輸入信號矩陣(卷積矩陣/Toeplitz矩陣) X:
這是一個非常關鍵的矩陣,其結構如下:
X = [[x[M-1], x[M-2], ..., x[0] ],[x[M], x[M-1], ..., x[1] ],[x[M+1], x[M], ..., x[2] ],...,[x[N-1], x[N-2], ..., x[N-M] ]
]
這個矩陣是一個 (N-M+1) x M 的矩陣。它的每一行是輸入信號 x[n] 的一段,用于與濾波器系數 h 進行卷積計算得到某一個輸出點 y[n]。
現在,濾波輸出向量 y 可以寫為:
y = X * h
誤差向量 e 為:
e = d - y = d - X * h
我們的目標函數(誤差平方和)的矩陣形式為:
SSE = e?e = (d - Xh)? (d - Xh)
三、最小二乘解
為了最小化 SSE,我們對其關于向量 h 求導,并令導數等于零向量。
經過推導(詳細過程可參考任何線性代數或優化教材),可以得到著名的正規方程(Normal Equation):
(X?X) h = X? d
其中:
-
X?X 是一個 M x M 的方陣(自相關矩陣)。
-
X? d 是一個 M x 1 的列向量(互相關向量)。
這個方程的解即為最優濾波器系數:
h_opt = (X?X)?1 X? d
在數值計算中,我們通常使用更穩定高效的算法來求解這個方程,而不是直接求逆,例如使用Cholesky分解(因為 X?X 是正定對稱矩陣)或奇異值分解(SVD)。Python的numpy.linalg.lstsq函數就封裝了這些方法。
四、重要注意事項
4.1 濾波器長度 M
這是一個關鍵的超參數。
-
M 太小,濾波器模型太簡單,無法捕捉真實的系統特性,導致欠擬合。
-
M 太大,濾波器會開始擬合數據中的噪聲,導致過擬合,雖然在訓練數據上表現好,但泛化能力會變差。
-
需要通過實驗來調整,可以選擇使得均方誤差(MSE)進入平臺且不會顯著回升的 M 值。
4.2 數據的預處理
如果兩列數據的幅度或量綱差異很大,最好先進行標準化(減去均值、除以標準差)或歸一化(縮放到[0,1]或[-1,1]區間),這有助于數值計算的穩定性。
4.3 延遲問題
FIR濾波器會引入 (M-1)/2 個采樣點的延遲。在上面的圖中,你會發現濾波后的信號與真實信號在時間上可能沒有完全對齊。對于要求嚴格對齊的應用,需要對輸出信號進行相應的延遲補償。
4.4 性能評估
除了繪制圖形直觀比較,均方誤差(MSE) 是一個重要的定量指標。你還可以計算信噪比(SNR) 或相關系數(R2) 來評估濾波效果。