程序滤波是一种在数据采集和处理中常用的方法,用于减少或消除噪声和干扰对信号的影响。以下是一些常用的程序滤波方法及其实现:
限幅滤波法
方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)。每次检测到新值时,判断本次值与上次值之差是否大于A,如果是,则本次值无效,放弃本次值,用上次值代替本次值;否则,本次值有效。
优点:能有效克服因偶然因素引起的脉冲干扰。
缺点:无法抑制周期性干扰,平滑度差。
示例代码:
```c
define A 10
char value;
char filter() {
char new_value;
new_value = get_ad();
if ((new_value - value > A) || (value - new_value > A))
return value;
return new_value;
}
```
中位值滤波法
方法:连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。
优点:能有效克服因偶然因素引起的波动干扰,对温度、液位等变化缓慢的被测参数有良好的滤波效果。
缺点:对流量、速度等快速变化的参数不宜。
示例代码:
```c
define N 5
float values[N];
int middle;
float middle_value;
void median_filter() {
for (int i = 0; i < N; i++)
values[i] = get_ad();
for (int i = 0; i < N - 1; i++)
for (int j = i + 1; j < N; j++)
if (values[i] > values[j]) {
float temp = values[i];
values[i] = values[j];
values[j] = temp;
}
middle = N / 2;
middle_value = values[middle];
// Use middle_value as the filtered value
}
```
算术平均滤波法
方法:连续取N个采样值进行算术平均运算。N值较大时,信号平滑度较高,但灵敏度较低;N值较小时,信号平滑度较低,但灵敏度较高。N值的选取一般流量N=12;压力N=4。
优点:适用于对一般具有随机干扰的信号进行滤波,信号的特点是有一个平均值,信号在某一数值范围附近上下波动。
缺点:需要较多的存储空间,且计算量较大。
示例代码:
```c
define N 12
float sum = 0;
float filtered_value;
float average_filter() {
for (int i = 0; i < N; i++)
sum += get_ad();
filtered_value = sum / N;
return filtered_value;
}
```
程序判数滤波
方法:根据生产经验确定两次采样允许的最大偏差值X。若先后两次采样的信号相减数值大于X,表明输入的是干扰信号,应该去掉;用上次采样值作为本次采样值,若小于等于X,表明没有受到干扰,本次采样值有效。
优点:适用于慢变化的物理参数的采样,如温度、物理位置等测量系统。
缺点:对快速变化的参数不宜。
示例代码:
```c
float program_detect_filter(float old_new_value[], float X) {
float sample_value;
if (fabs(old_new_value - old_new_value) > X)
sample_value = old_new_value;
else
sample_value = old_new_value;
return sample_value;
}
```
这些方法各有优缺点,选择哪种方法取决于具体的应用场景和需求。在实际应用中,可能需要根据被测信号的特性(如频率、幅度、变化速度等)进行调整和优化。