均值濾波也稱為線性濾波,其采用的主要方法為鄰域平均法。線性濾波的基本原理是用均值代替原圖像中的各個像素值,即對待處理的當(dāng)前像素點(x,y),選擇一個模板,該模板由其近鄰的若干像素組成,求模板中所有像素的均值,再把該均值賦予當(dāng)前像素點(x,y),作為處理后圖像在該點上的灰度g(x,y),即g(x,y)=∑f(x,y)/m,m為該模板中包含當(dāng)前像素在內(nèi)的像素總個數(shù)。這本是數(shù)字圖像處理的一種方法,但也可以用在我們數(shù)字電壓電流表的ADC采樣數(shù)據(jù)上。我們選取二十次的ADC采樣值存儲在數(shù)組 Volt_Buffer 中,然后去除掉數(shù)組中的最大值和最小值后再取平均,得到的值作為結(jié)果顯示在數(shù)碼管上,這樣可以較大程度獲得準(zhǔn)確的、不易波動的數(shù)據(jù)。程序在實驗五的基礎(chǔ)上略作修改即可,首先是增加和修改變量:
#define ADC_SAMPLE_SIZE (20) //規(guī)定采樣20個數(shù)據(jù)用來濾波 uint16_t Volt_Buffer[ADC_SAMPLE_SIZE]; //存儲ADC轉(zhuǎn)換值 uint32_t Led_Dis_Time; //計數(shù),300ms改變一次數(shù)碼管顯示值
接下來是均值濾波的主體函數(shù):
uint32_t Mean_Value_Filter(uint16_t *value, uint32_t size) //均值濾波 { uint32_t sum = 0; //ADC采樣數(shù)據(jù)和 uint16_t max = 0; uint16_t min = 0xffff; //min初值取最大是為了將第一個數(shù)據(jù)記錄 int i; for(i = 0; i < size; i++) { sum += value[i]; if(value[i] > max) { max = value[i]; } if(value[i] < min) { min = value[i]; } } sum -= max + min; //去除最大最小值 sum = sum / (size - 2); return sum; }
對之前的電壓計算函數(shù) Volt_Cal() 修改如下:
void Volt_Cal(void) { Cal_Buffer = Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE); Cal_Buffer = (Cal_Buffer * ADC_REF_VALUE >> 12) * (R2 + R1)/R1; // 四舍五入 if(Cal_Buffer % 10 >= 5) { Cal_Buffer = Cal_Buffer / 10 + 1; } else { Cal_Buffer = Cal_Buffer / 10; } }
在主函數(shù)的 while 循環(huán)里每隔300ms刷新一次:
while(1) { if(GetTick() >= (Led_Dis_Time + 300)) { Led_Dis_Time = GetTick(); Volt_Cal(); Display(Cal_Buffer); } }
在之前未加濾波函數(shù)時,數(shù)碼管上顯示的電壓數(shù)據(jù)是不穩(wěn)定、跳變的,而加了濾波函數(shù)之后,數(shù)碼管顯示的電壓數(shù)據(jù)可以穩(wěn)定下來,并且有一定的抗干擾能力。至于電壓準(zhǔn)確性的問題,在后續(xù)章節(jié)的數(shù)據(jù)標(biāo)定和校準(zhǔn)中說明。
審核編輯 黃宇
-
數(shù)據(jù)處理
+關(guān)注
關(guān)注
0文章
610瀏覽量
28599 -
濾波算法
+關(guān)注
關(guān)注
2文章
89瀏覽量
13755 -
均值濾波
+關(guān)注
關(guān)注
0文章
10瀏覽量
7132 -
電壓電流表
+關(guān)注
關(guān)注
0文章
25瀏覽量
2087 -
CW32
+關(guān)注
關(guān)注
1文章
210瀏覽量
699
發(fā)布評論請先 登錄
相關(guān)推薦
評論