📄 filter.c
字号:
#include <math.h>
#define N 7
int _buf[N];
unsigned char _n = 0;
unsigned char _ptr = 0;
//限幅滤波
//滤波幅度
int _filter_0(int v) {
return 0;
}
//中值滤波
int _filter_1(int v) {
int tmp[N];
unsigned char i = 0, j = 0;
int s = 0;
_buf[_ptr] = v;
if (++_ptr == N) _ptr = 0;
if (_n < N) _n++;
for (i = 0 ; i < _n ; i++) tmp[i] = _buf[i];
//对tmp排序(冒泡法)
for (i = 0 ; i < _n - 1 ; i++) {
for (j = i + 1 ; j < _n ; j++) {
if (tmp[i] > tmp[j]) {
s = tmp[i];
tmp[i] = tmp[j];
tmp[j] = s;
}
}
}
return tmp[_n / 2];
}
//算术平均值滤波
int _filter_2(int v) {
return 0;
}
//滑动平均值滤波
int _filter_3(int v) {
unsigned char i = 0;
int sum = 0;
buf[_ptr] = v;
if (++_ptr == N) _ptr = 0;
if (_n < N) _n++;
for (i = 0 ; i < _n ; i++)
sum += buf[i];
return sum / _n;
}
//加权滑动平均值滤波
//unsigned char weight[N] = {1, 1, 2, 2, 2, 2, 90};//接近于不滤波
unsigned char code weight[N] = {1, 2, 2, 5, 10, 20, 60};
//unsigned char weight[N] = {5, 7, 8, 12, 18, 25, 25};
//unsigned char weight[N] = {14, 14, 14, 14, 14, 14, 16};//相当于不加权
int _filter_4(int v) {
unsigned char i = 0, j = 0;
float rst = 0;
_buf[_ptr] = v;
if (_n < N) _n++;
for (i = 0 ; i < _n ; i++) {
j = _ptr + i;
if (j >= _n) j -= _n;
rst += (float)_buf[j] / 100.0 * (float)weight[_n - 1 - i];
}
if (++_ptr == N) _ptr = 0;
return rst;
}
int filter(int v, unsigned char flt_idx) {
switch (flt_idx) {
case 0:
return v;
case 1:
return _filter_0(v);//限幅
case 2:
return _filter_1(v);//中值
case 3:
return _filter_2(v);//算术平均
case 4:
return _filter_3(v);//滑动
case 5:
return _filter_4(v);//加权滑动
default:
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -