滤波程序怎么写啊

时间:2025-01-17 21:43:48 游戏攻略

滤波法程序的编写可以根据不同的滤波算法来进行。以下是几种常见滤波算法的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;

}

```

这些示例代码可以根据具体的应用场景和需求进行调整和优化。