这个AD滤波算法是不是有问题啊?
递推平均滤波法(又称滑动平均滤波法)#define N 12
char value_buf;
char i=0;
char filter()
{
char count;
intsum=0;
value_buf = get_ad();
if ( i == N ) i = 0;
for ( count=0;count<N,count++)
sum = value_buf;//?????
return (char)(sum/N);
}
那个value_buf就付了一次值,如何求平均? 我改了一下不知道这样是否还是“递推平均滤波法”:uint ad_filter(uchar channel)
{
/*递推平均滤波法(又称滑动平均滤波法)*/
#define N 12 //滤波初始化
uint value_buf;
uchar count;
uint sum=0;
uchar i=0;
for(count=0;count<N;count++)
{
value_buf=MessAD(channel);
sum+=value_buf;
}
return (sum/N);
} 已 i++ 过了 sum += value_buf; waterx3 发表于 2013-10-25 16:32 static/image/common/back.gif
已 i++ 过了
那就给value_buf赋过一次值啊。。。 对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧
后面的判断是用在buffer不满是也能出有效数字, 因为我的系统滑动时间达到了3秒, 不能让这三秒不出数或者出无效数. 坏处当然是需要做除法,影响速度, 如果都视着满buffer处理, 直接移位即可 oldDat = temp;
temp = readD;
iter = ++iter%32;
sum = sum + readD - oldDat;
if (len<32)
{
len++;
}
readD = sum / len; albert_w 发表于 2013-10-25 20:41 static/image/common/back.gif
对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧
后面的判断是用在buffer不满是也能出有 ...
的确,我该之后的程序只是平均,没有滑动。。但是楼主位的程序看起来真的不对,原帖如下:
http://www.amobbs.com/forum.php?mod=viewthread&tid=4508857&highlight=ad%2B滤波
albert_w 发表于 2013-10-25 20:41 static/image/common/back.gif
对不起, 只有平均没有滑动.... 顺手贴一个刚刚写的硬件测试代码吧
后面的判断是用在buffer不满是也能出有 ...
他这个滑动貌似是先进先出原则,看您的程序,貌似不是啊。。 我有个自己写的滑动滤波,要看看不 for(k=0;k<10;k++)//将待排序数据传入排序缓存
{
sort_buff = Motor_U;
}
data_sort(sort_buff);//调用数据排序程序
Motor_V = (sort_buff+sort_buff+sort_buff+sort_buff+
sort_buff+sort_buff+sort_buff+sort_buff)>>3;//计算母线电压
//----------------------------------------------------------------
//数据排序程序
//----------------------------------------------------------------
unsigned int data_sort(unsigned int sort_buff)
{
unsigned intswap_data;
unsigned char j=0,k=0;
for(k=0;k<=9;k++) //数据排序
{
for(j=k+1;j<10;j++)
{
if(sort_buff>sort_buff)
{
swap_data= sort_buff;
sort_buff = sort_buff;
sort_buff = swap_data;
}
}
}
return sort_buff;
} 干脆贴出来,滑动排序,去极值,然后取平均 R88 发表于 2013-10-26 09:09 static/image/common/back.gif
的确,我该之后的程序只是平均,没有滑动。。但是楼主位的程序看起来真的不对,原帖如下:
http://www.am ...
sum = value_buf;//?????弄成+=就对了 R88 发表于 2013-10-26 09:09 static/image/common/back.gif
的确,我该之后的程序只是平均,没有滑动。。但是楼主位的程序看起来真的不对,原帖如下:
http://www.am ...
我也是先进先出的, 看temp, 在转圈. 缓冲区其实可以理解为32成员的环形. 刚被替换的位置iter要转一圈才再次轮到.
只是求和的时候偷懒了下, 利用上次的和,直接运算了两个元素. 坏处就是你要上带符号数了 albert_w 发表于 2013-10-26 12:12 static/image/common/back.gif
我也是先进先出的, 看temp, 在转圈. 缓冲区其实可以理解为32成员的环形. 刚被替换的位置iter要转一圈才再 ...
我刚看懂,原来头12次的函数执行读取的值都是不对的。。。 asdmaill 发表于 2013-10-26 10:25 static/image/common/back.gif
干脆贴出来,滑动排序,去极值,然后取平均
我觉得还是楼主位的程序比较简单哈。。。去极值在这个语句value_buf = get_ad();后面加上判断即可了。。。 R88 发表于 2013-10-26 12:45 static/image/common/back.gif
我刚看懂,原来头12次的函数执行读取的值都是不对的。。。
嗯, lz位开机会逐渐逼近. 所以我写了个变长的, 缓存多少个就计算多少个, 理解出数据 albert_w 发表于 2013-10-26 13:09 static/image/common/back.gif
嗯, lz位开机会逐渐逼近. 所以我写了个变长的, 缓存多少个就计算多少个, 理解出数据 ...
贴得代码太少了,没怎么看懂哈。。{:lol:} asdmaill 发表于 2013-10-26 10:24
for(k=0;k>3;//计算母线电压
谢谢分享 最近正要给AD进行滤波{:smile:} 学习学习
页:
[1]