|
发表于 2018-12-14 13:12:05
|
显示全部楼层
我来发个窗口自动调整的中值滤波,欢迎大家指正!
- #define MAX_WINDOW 31
- #define FILTER_DIFFERENCE 200
- typedef struct
- {
- u8 inBuffIndex;
- u8 realWindow;
- u16 inBuff[MAX_WINDOW+1];
- u16 temp[MAX_WINDOW+1];
-
- }FilterDataType;
- u16 testBuff[31] = {4,7,2,32,23,122,244,55,21,11,1,1,34,5531,11,55,223,122,466,211,666,112,33,888,33333,1111,343,111,1122,0};
- u16 MiddleFilter_1sLoop(u16 inData)
- {
- u8 getIndex,i,j;
- u8 compCnt;
- u16 compValue;
-
- FilterData.inBuff[FilterData.inBuffIndex++] = inData;
- FilterData.inBuffIndex %= MAX_WINDOW;
- #if 0
- for (i = 0; i < MAX_WINDOW; i++)
- {
- FilterData.inBuff[i] = testBuff[i]; // test...
- }
- FilterData.realWindow = 20; // test...
- #else
- if (FilterData.realWindow < MAX_WINDOW)
- {
- FilterData.realWindow++;
- }
- #endif
- if (FilterData.realWindow < 3)
- {
- return inData;
- }
- else if (FilterData.realWindow < MAX_WINDOW) // 取最近 realWindow 个数据
- {
- getIndex = MAX_WINDOW + FilterData.inBuffIndex - FilterData.realWindow;
- getIndex %= MAX_WINDOW;
-
- for (i = 0; i < FilterData.realWindow; i++)
- {
- FilterData.temp[i] = FilterData.inBuff[getIndex++];
- getIndex %= MAX_WINDOW;
- }
- }
- else
- {
- for (i = 0; i < MAX_WINDOW; i++)
- {
- FilterData.temp[i] = FilterData.inBuff[i];
- }
- }
-
- compCnt = FilterData.realWindow/2 + 1;
- for (i = 0; i < compCnt; i++) // 冒泡排序
- {
- for (j = 0; j < FilterData.realWindow-i-1; j++)
- {
- if (FilterData.temp[j] > FilterData.temp[j+1])
- {
- compValue = FilterData.temp[j+1];
- FilterData.temp[j+1] = FilterData.temp[j];
- FilterData.temp[j] = compValue;
- }
- }
- }
- if ((inData > FilterData.temp[compCnt-1] + FILTER_DIFFERENCE)||(inData + FILTER_DIFFERENCE < FilterData.temp[compCnt-1]))
- {
- FilterData.realWindow = 7;
- }
-
- return FilterData.temp[compCnt-1];
- }
复制代码 |
|