方程
Y(n)= a * X(n) + (1-a) * Y(n-1);
a = (fc*2π) / fl
fc :截止频率
fl :采样频率
具体的推导过程这里就不写了,很复杂,本文只说明用法。
代码实现
/// RC低通滤波/// </summary>/// <param name=\"DataArray\">数据源</param>/// <param name=\"fc\">截止频率</param>/// <param name=\"fl\">采样频率</param>public static double[] RCLowPass(double[]DataArray,double fc,double fl){double a = fc * 2 * Math.PI / fl; //滤波系数double[] result = new double[DataArray.Length];result[0] = DataArray[0];for (int i = 1; i < DataArray.Length; i++){result[i] = a * DataArray[i] + (1 - a) * result[i - 1];}return result;}
经过滤波后,会有相位延迟和幅值衰减,具体如下:
- 当 f截 = f目标 时,幅值衰减为原幅值的√2/2,相位滞后 45°(滞后点数 = f采/(8*f截))。
- 当 f截 > f目标时,幅值衰减逐渐减弱,相位滞后:θ=arctan(f目标/fc)。
- 当 f截 >= 3 * f目标 时。幅值几乎不衰减,相位滞后:θ=arctan(f目标/fc)。
- 既然是低通滤波就不需要讨论 f截 < f 目标的情况了。
如果不考虑相位与幅值变化的影响,完全可以舍弃 fc 与 fl , 只需要调整滤波系数即可。滤波系数 a (0<a<1)越小曲线越平滑、a越大 曲线越接近原曲线。