【机械故障】使用fir滤波器实现数据拟合
使用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])² = Σ (d[n] - y[n])²
二、 构建矩阵方程(关键步骤)
为了利用所有可用的数据点(假设有 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)⁻¹ 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) 或相关系数(R²) 来评估滤波效果。