⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filter.c

📁 通过调节一个可变电阻得到变化的电压来模拟一个湿度度传感器
💻 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 + -