當然N>=3.而且最好N>3為好.在N很大時(shí)就見(jiàn)其優(yōu)點(diǎn)了.
例如: 3中取1,4中取2,5中取3...10中取8...252中取"二百五"~~~
全部只用這4個(gè)寄存器~~~,當然要考慮累加越界類(lèi)型選擇的問(wèn)題.
注意: N最好取4, 6, 10, 34, 66, 130等等~~~!!!!!!!!!!!!!!
/*-----------------------------------------------------------
取ADC轉換電壓
------------------------------------------------------------*/
AdcResult = ADC & 0x3ff;//取ADC轉換電壓結果
/*-----------------------------------------------------------
求累加和
------------------------------------------------------------*/
AdcSum += AdcResult;//存累加和
/*-----------------------------------------------------------
求最大值
------------------------------------------------------------*/
if (AdcResult > AdcMax)
{
AdcMax = AdcResult;//最大值
}
/*-----------------------------------------------------------
求最小值
------------------------------------------------------------*/
if (AdcResult < AdcMin)//注意:千萬(wàn)不敢寫(xiě)成else if ()...
{
AdcMin = AdcResult;//存最小值
}
AdcCount ++;//計數1次
/*-----------------------------------------------------------
10中取8("跳水評分算法---去掉一個(gè)最高分,去掉...最后得分...")
------------------------------------------------------------*/
if (AdcCount >= 10)//每次濾波10點(diǎn)
{
/*-----------------------------------------------------------
求平均值
------------------------------------------------------------*/
val = AdcSum - AdcMax - AdcMin;//自然做到了N-2,以下除法變移位
val *= AdcGain;//乘增益(一定要先乘后除!!!否則精度丟失!!!)
val >>= 13;//10中取8后除以1024.(直接得到10進(jìn)制的mV值)
AdcVal = val;//得到跳水隊員分數~~~
/*-----------------------------------------------------------
下一輪初始化(也是ADC的初始化,這里原本是調用函數的~~~)
------------------------------------------------------------*/
AdcSum = 0;//一定清0
AdcMax = 0;//一定取最小值
AdcMin = 0x3ff;//10位ADC,一定取最大值
AdcCount = 0;//重新開(kāi)始
}
哈哈~~~有時(shí)間再灌灌它與排序的不同和優(yōu)缺點(diǎn)~~~
|
|