zoukankan      html  css  js  c++  java
  • 采用移动平均值法进行数字滤波

    采用移动平均值法进行数字滤波

     移动平均值法进行数字滤波,其滤波思想大概是这样。有一个需要进行滤波的数据数组data[n],我们采用移动p点取平均值,

    data[0] =  (data[0] + data[1] + … + data[0+p])/p

    data[1] =  (data[1] + data[2] + … + data[1+p])/p

    data[2] =  (data[2] + data[3] + … + data[2+p])/p

    data[m]  = (data[m] + data[m+1] + … + data[m+p])/p     (条件:m+p=n-1)

    这样,我们就得到了data[n-p]点前的n-p个点的移动平均值。

    而对于data[n-p]点后面的p个点的值,在这里我是这样处理的,取后面剩余的p个点的平均值,然后对这p个点分别赋值。

    下面是C#的源代码实现,一共提供了两个函数,主要是为了方便调用,一个是针对一维数组,另一个则是针对二维数组:

    /// <summary>

            /// 一维数组的移动平均值法数字滤波。

            /// </summary>

            /// <param name="ps">滤波数据</param>

            /// <param name="dLen">数据的长度</param>

            /// <param name="p">移动的点数</param>

            public void MovePoint(short[] ps, int dLen, int p)

            {

                int i, j;

                int sum = 0;

                for (i = 0; i < dLen - p; i++)

                {

                    for (j = 0; j < p; j++)

                    {

                        sum += ps[i + j];

                    }

                    ps[i] = (short)(sum / p);

                    sum = 0;

                }

                for (j = 0; j < p; j++)

                {

                    sum += ps[dLen - p + j];

                }

                short sum2 = (short)(sum / p);

                for (i = dLen - p; i < dLen; i++)

                {

                    ps[i] = sum2;

                }

            }

            /// <summary>

            /// 二维数组的移动平均值法数字滤波。

            /// </summary>

            /// <param name="ps">滤波数据</param>

            /// <param name="psary1">二维数组的第一维的下标值</param>

            /// <param name="dLen">数据的长度</param>

            /// <param name="p">移动的点数</param>

            public void MovePoint(short[,] ps, int psary1, int dLen, int p)

            {

                int i, j;

                int sum = 0;

               

                for (i = 0; i < dLen - p; i++)

                {

                    for (j = 0; j < p; j++)

                    {

                        sum += ps[psary1, i + j];

                    }

                    ps[psary1, i] = (short)(sum / p);

                    sum = 0;

                }

                for (j = 0; j < p; j++)

                {

                    sum += ps[psary1, dLen - p + j];

                }

                short sum2 = (short)(sum / p);

                for (i = dLen - p; i < dLen; i++)

                {

                    ps[psary1, i] = sum2;

                }

            }

    下面是滤波效果图:

    滤波前:

     

    滤波后:

     

    滤波前:

     

    滤波后:

     

    对于移动的p点值是什么确定的呢?我也没有好的办法或根据,只是多试几个值,放5不行,我就放10,10不行就放100,总能找到比较合适的值。当然,p值越大,得到的滤波效果越光滑,但对原来的数据信息的原貌改变得也越大。因此,p最好尽量保持较小的值,这样在得到较好的滤波效果的同时,以更好保持信息原貌。

    滤波前:

    滤波后:

    滤波前:

     

    滤波后:

     

     

  • 相关阅读:
    自动化部署之jenkins及简介
    gitlab的备份与恢复与迁移
    P2561 [AHOI2002]黑白瓷砖
    P2042 [NOI2005]维护数列
    P2156 [SDOI2009]细胞探索
    P2154 [SDOI2009]虔诚的墓主人
    P2148 [SDOI2009]E&D
    2019.2.26考试T2 矩阵快速幂加速DP
    loj #6485. LJJ 学二项式定理 (模板qwq)
    P3224 [HNOI2012]永无乡
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/5331821.html
Copyright © 2011-2022 走看看