C#实现RC低通滤波

方程

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;
        }

经过滤波后,会有相位延迟和幅值衰减,具体如下:

  1. 当 f截 = f目标 时,幅值衰减为原幅值的√2/2,相位滞后 45°(滞后点数 = f采/(8*f截))。
  2. 当 f截 > f目标时,幅值衰减逐渐减弱,相位滞后:θ=arctan(f目标/fc)。
  3. 当 f截 >= 3 * f目标 时。幅值几乎不衰减,相位滞后:θ=arctan(f目标/fc)。
  4. 既然是低通滤波就不需要讨论 f截 < f 目标的情况了。

如果不考虑相位与幅值变化的影响,完全可以舍弃 fc 与 fl , 只需要调整滤波系数即可。滤波系数 a (0<a<1)越小曲线越平滑、a越大 曲线越接近原曲线。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值