滤波法程序的编写可以根据不同的滤波算法来进行。以下是几种常见滤波算法的C语言程序示例:
1. 限幅滤波法
限幅滤波法是通过设定一个最大允许偏差值A,当新采样值与上次值之差超过这个值时,认为新值无效,用上次值代替。
```c
include
define FILTER_A 1
int Value;
void setup() {
Serial.begin(9600); // 初始化串口通信
randomSeed(analogRead(0)); // 产生随机种子
Value = 300;
}
void loop() {
int NewValue = Get_AD(); // 获取新采样值
if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A)) {
NewValue = Value; // 如果新值与上次值之差超过A,则用上次值代替
}
Value = NewValue; // 更新Value为最近一次有效采样值
Serial.println(Value); // 串口输出
delay(50);
}
int Get_AD() {
return random(295, 305); // 随机生成一个300左右的值
}
```
2. 中位值滤波法
中位值滤波法是连续采样N次,按大小排列取中间值为本次有效值。这种方法适用于温度等变化缓慢的被测参数,但对速度等快速变化的参数不宜。
```c
define N 11
char filter() {
char value_buf[N];
char count, i, j, temp;
for(count = 0; count < N; count++) {
value_buf[count] = get_ad(); // 获取采样值
delay();
}
for(j = 0; j < (N - 1); j++) {
for(i = 0; i < N - j - 1; i++) {
if(value_buf[i] > value_buf[i + 1]) {
temp = value_buf[i];
value_buf[i] = value_buf[i + 1];
value_buf[i + 1] = temp;
}
}
}
return value_buf[(N - 1) / 2]; // 返回中间值
}
```
3. 算术平均滤波法
算术平均滤波法是将连续N个采样值看成一个队列,队列长度固定为N,每次采样到一个新数据放入队尾,并扔掉队首的一次数据,然后对队列中的N个数据进行平均运算。
```c
define N 12
unsigned char value_buf[N];
unsigned char filter() {
unsigned char i;
unsigned char value;
int sum = 0;
value_buf[i++] = get_ad(); // 采集到的数据放入数组
for(i = 0; i < N; i++) {
value_buf[i] = value_buf[i + 1]; // 所有数据左移,低位扔掉
sum += value_buf[i];
}
value = sum / N; // 计算平均值
return value;
}
```
4. 递推平均滤波法
递推平均滤波法类似于算术平均滤波法,不同的是每次采样到一个新数据放入队尾,并扔掉队首的一次数据。
```c
define N 12
unsigned char value_buf[N];
unsigned char filter() {
unsigned char i;
unsigned char value;
int sum = 0;
value_buf[i++] = get_ad(); // 采集到的数据放入数组
for(i = 0; i < N; i++) {
value_buf[i] = value_buf[i + 1]; // 所有数据左移,低位扔掉
sum += value_buf[i];
}
value = sum / N; // 计算平均值
return value;
}
```
这些示例代码可以根据具体的应用场景和需求进行调整和优化。