注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
zouli415的个人空间 https://home.eeworld.com.cn/space-uid-208109.html [收藏] [复制] [分享] [RSS]
日志

数字滤波C程序

已有 294 次阅读2015-7-14 09:20

/*******************限幅滤波*******************/
#define A 10      //A
值可根据实际情况调整
char value;       //value
为有效值
char filter()
{
    char new_value;   //newvalue
为当前采样值
    new value=get_ad();
    if ((new_value-value>A)
(value-new_value>A)
    return value;
    return new_value;
}
/*******************
中位值滤波*******************/
#define N 11      //N
值可根据实际情况调整
char filter()
{
    char value_buf[N];
    char count,i,j,temp;
    for (count=0;count<N;count++)
    {
       value_buf[count]=get_ad();  //
获取采样值
        delay();
    }
    for (j=0;j<N-1;j++)  //
采样值由小到大排列,排序采用冒泡法
    {
        for(i=0;i<N-j;i++)
        {
           if(value_buf>value_buf[i+1])
           {
               temp=value_buf;
               value_buf=value_buf[i+1];
               value_buf[i+1]=temp;
           }
        }
    }
    return value_buf[(N-1)/2];  //
取中间值
}
/*******************
算术平均滤波*******************/
#define N 12
char filter()
{
    int sum=0;
    for(count=0;count<N;count++)
    {
       sum+=get_ad();
        delay();
    }
    return (char)(sum/N);
}

/*******************
去极值平均滤波*******************/
#define N 11      //N
值可根据实际情况调整
int sum=0;
char filter()
{
    char value_buf[N];
    char count,i,j,temp;
    for (count=0;count<N;count++)
    {
        value_buf[count]=get_ad();   //
获取采样值
        delay();
    }
    for(j=0;j<N-1;j++)  //
采样值由小到大排列,排序采用冒泡法
    {
        for(i=0;i<N-j;i++)
        {
           if(value_buf>value_buf[i+1])
           {
               temp=value_buf;
               value_buf=value_buf[i+1];
               value_buf[i+1]=temp;
           }
        }
    }
   for(count=1;count<(N-1);count++)    //
去掉第一个和末一个数
    {
       sum+=value_buf[count];
        delay();
    }
    return (char)(sum/(N-2));
}
/*******************
移动平均滤波(递推平均滤波)*******************/
#define N 12
char value_buf[N];
char i=0;
char filter()
{
    char count;
    int sum=0;
    value_buf[i++]=get_ad();
    if(i=N)
 i=0;
    for (count=0;count<N;count++)
       sum+=value_buf[count];
    return (char)(sum/N)
}

/*******************
加权平均滤波*******************/
#define N 12
char code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12};//
加权系数表
char code sum_jq=1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
    char count;
    char value_buf[N];
    int sum=0;
    for (count=0;count<N;count++)
    {
       value_buf[count]=get_ad();    //
获取采样值
        delay();
    }
    for (count=0;count<N;count++)
       sum+=value_buf[count]*jq[count];
    return (char)(sum/sum_jq)

}

/*******************
低通滤波*******************/
#define a  0.25
char value;       //value
为已有值
char filter()
{
    char new_value;   //newvalue
为当前采样值
    new_value=get_ad();
    return (a*new_value+(1-a)*value);
}

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册