找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2613|回复: 0
打印 上一主题 下一主题
收起左侧

数字滤波C程序

[复制链接]
跳转到指定楼层
楼主
ID:71259 发表于 2014-12-29 02:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************限幅滤波*******************/
#define A 10      //A值可根据实际情况调整
char value;       //value为有效值
char filter()
{
    char new_value;   //new value为当前采样值
    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[i]>value_buf[i+1])
            {
                temp=value_buf[i];
                value_buf[i]=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[i]>value_buf[i+1])
            {
                temp=value_buf[i];
                value_buf[i]=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;   //new value为当前采样值
    new_value=get_ad();
    return (a*new_value+(1-a)*value);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表