我想随着时间的推移过滤来自 ADC 的偏差(低通),这不是很关键。所以我首先尝试了指数平均,比如 y= (7*y+x)/8。这给出了有用的结果,但存在一个明显的舍入问题(只要 x 小于 y+8,就不会增加,如果 x 小于 y,则减少)。添加+4并不能真正解决问题。
所以我根据从http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html提取的系数实现了一个定点低通巴特沃斯三阶滤波器,具有各种截止频率(不幸的是,几个月以来)。
对于 0.033 采样截止,代码如下所示
byte dtTI[4], // filter input (0 newest)
dtTIFast[8]; // filter output, [0]=y, [1]=8 bit decimals
// dtTIFast[2,4,6]= previous filter outputs
dtTIFast[7]=dtTIFast[5]; dtTIFast[5]=dtTIFast[3]; dtTIFast[3]=dtTIFast[1];
dtTIFast[6]=dtTIFast[4]; dtTIFast[4]=dtTIFast[2]; dtTIFast[2]=dtTIFast[0];
unsigned long modifier = 30UL*64*(dtTI[0] + dtTI[3] + 3*dtTI[1] + 3*dtTI[2]);
modifier += 84739UL*(dtTIFast[3]/4+64*dtTIFast[2]);
modifier -= 73839UL*(dtTIFast[5]/4+64*dtTIFast[4]);
modifier += 21628UL*(dtTIFast[7]/4+64*dtTIFast[6]);
dtTIFast[0]=modifier>>21; dtTIFast[1]=modifier>>13; // No need to add 2^12, 0.0004deg
起初,输出似乎给出了正确的结果,但如果我用相同的输入迭代过滤器 50 次,我会看到它一直在振荡,而不是收敛到一个稳定的值,并且不以 x 输入为中心。对于其他值(例如 0.001 截止值),情况更糟!
你能告诉我哪里错了吗?我检查了我的系数之和是32768,看起来不可能有任何溢出。我现在使用 14 位 y 值,系数的实际值为 2.586028659、-2.253398256、0.660048953 和 0,000915081。我应该需要更高的精度吗?
谢谢你的帮助