Principios comunes del algoritmo de filtrado (la situación real debe cambiarse)

https://zhuanlan.zhihu.com/p/271154535
https://blog.csdn.net/richardgann/article/details/78780040

1. Método de filtro limitante

ventaja

  • Puede superar eficazmente la interferencia de pulso causada por factores accidentales

defecto

  • Incapaz de suprimir la interferencia periódica, y la suavidad es pobre
/*
1、限幅滤波
A值可根据实际情况进行调整
value为有效值,new_value为当前采样值
滤波程序返回有效的真实值
*/
#define A 10 // 两次采样允许的最大偏差值
char value;// 最近一次有效的采样值
char Filter_Value;
void main()
{
    
    
	Filter_Value = filter();
	value = Filter_Value;
}
char filter(void){
    
    
	char new_value;
	new_value = get_ad();
	if((new_value-value>A)||(value-new_value>A)){
    
    
		return value;
	}else{
    
    
	return new_value;
	}
}

2. Método de filtrado de la mediana

ventaja

  • Puede superar efectivamente la interferencia de fluctuación causada por factores accidentales;
  • Tiene un buen efecto de filtrado en los parámetros medidos que cambian lentamente, como la temperatura y el nivel de líquido.

defecto

  • No es adecuado para parámetros que cambian rápidamente, como el caudal y la velocidad.
/*
/*
2、中位值滤波法
N值可根据实际情况调整
排序采用冒泡法(实际情况用快排会好一点)
 */
#define N 11

char filter(void) {
    
    
    char value_buf[N];
    char i, j, temp;
    for(i = 0; i < N; i++) {
    
    
        value_buf[i] = get_ad();
        delay();
    }
    for(j = 0; j < N - 1; j++) {
    
    
        for(i = 0; i < N - j; 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. Método de filtrado de la media aritmética

definición

  • Tome continuamente N valores de muestreo para la operación de promedio aritmético.

ventaja

  • Adecuado para filtrar señales que generalmente tienen interferencias aleatorias.
  • Este tipo de señal se caracteriza por un valor promedio y la señal fluctúa alrededor de un cierto rango de valores.

defecto

  • No es adecuado para el control en tiempo real con una velocidad de medición lenta o un cálculo de datos rápido.
 */
#define N 11

char filter(void) {
    
    
    int sum = 0, i = 0;
    for(i = 0; i < N; i++) {
    
    
        sum += get_ad();
        delay();
    }
    return (char)(sum / N);
}

4. Método de filtrado promedio recursivo

definición

  • Trate N valores de muestreo consecutivos como una cola, y la longitud de la cola se fija en N;
  • Cada vez que se muestrean datos nuevos, se colocan al final de la cola y se descartan los datos que se encuentran al principio de la cola. Promedie los N datos en la cola para obtener un nuevo resultado de filtrado

ventaja

  • Tiene un buen efecto de supresión de interferencias periódicas y alta suavidad; es adecuado para sistemas de oscilación de alta frecuencia.

defecto

  • baja sensibilidad;
  • El efecto de supresión en la interferencia de pulsos ocasionales es pobre y no es adecuado para cambiar los circuitos de suministro de energía en ocasiones donde la interferencia de pulsos es severa.
/*
4、递推平均滤波法
 */
#define N 12

char value_buf[N];
char i = 0;

char filter(void) {
    
    
    char count = 0;
    int sum = 0;

    value_buf[i++] = get_ad();
    if(i == N) {
    
    
        i = 0;    //先进先出
    }
    for(count = 0; count < N; count++) {
    
    
        sum += value_buf[count];
    }
    return (char)(sum / N);
}

5. Método de filtrado de la media mediana

definición

  • Tome un conjunto de colas para eliminar los valores máximo y mínimo

ventaja

  • Combina las ventajas de los dos filtros. Para la interferencia impulsiva ocasional, se puede eliminar la desviación del valor de muestreo causada por ella.
  • Tiene un buen efecto de supresión en la interferencia periódica, alta suavidad y es adecuado para sistemas de oscilación de alta frecuencia.

defecto

  • La medición es lenta.
/*
5、中位值平均滤波法
 */
#define N 12

char filter(void) {
    
    
    char i = 0, j = 0, temp = 0;
    char value_buf[N];
    int sum = 0;

    for(i = 0; i < N; i++){
    
    
        value_buf[i] = get_ad();
        delay();
    }

    for(j = 0; j < N - 1; j++) {
    
    
        for(i = 0; i < N - j; 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;
            }
        }
    }
    for(i = 1; i < N - 1; i++) {
    
    
        sum += value_buf[i];
    }
    return (char)(sum / (N - 2));
}

6. Limitación del método de filtrado promedio

ventaja

  • Combinando las ventajas de los dos métodos de filtrado;
  • Para la interferencia impulsiva ocasional, se puede eliminar la desviación del valor de muestreo causada por ella.

defecto

  • Es un desperdicio de RAM.
/*
6、限幅平均滤波法
结合程序1和3
 */
 #define FILTER_A 1
 #define FILTER_N 12
 
int Filter_Value;
int filter_buf[FILTER_N];

int Filter() {
    
    
  int i;
  int filter_sum = 0;
  filter_buf[FILTER_N - 1] = Get_AD();
  if(((filter_buf[FILTER_N - 1] - filter_buf[FILTER_N - 2]) > FILTER_A) || ((filter_buf[FILTER_N - 2] - filter_buf[FILTER_N - 1]) > FILTER_A))
    filter_buf[FILTER_N - 1] = filter_buf[FILTER_N - 2];
  for(i = 0; i < FILTER_N - 1; i++) {
    
    
    filter_buf = filter_buf[i + 1];
    filter_sum += filter_buf;
  }
  return (int)filter_sum / (FILTER_N - 1);
}

Siete, método de filtrado de paso bajo

ventaja

  • Tiene un buen efecto inhibitorio sobre la interferencia periódica;
  • Es adecuado para ocasiones con alta frecuencia de fluctuación.

defecto

  • Retardo de fase, baja sensibilidad;
  • El grado de histéresis depende del valor de a;
  • Las señales de interferencia cuya frecuencia de filtrado es superior a la mitad de la frecuencia de muestreo no se pueden eliminar.
/*
7、低通滤波
 */
#define A 0.25

char value;    //value 为已有值

char filter(void) {
    
    
    char new_value = 0;

    new_value = get_ad();
    return (a * new_value + (1 - a) * value);
}

Ocho, método de filtrado promedio recursivo ponderado

definición

  • Es una mejora del método de filtrado promedio recursivo, es decir, se agregan diferentes pesos a los datos en diferentes momentos;
  • Generalmente, cuanto más cerca de los datos actuales, mayor es el peso.
  • Cuanto mayor sea el peso dado a los nuevos valores muestreados, mayor será la sensibilidad pero menos suave la señal.

ventaja

  • Aplicable a objetos con grandes constantes de tiempo de retraso puro y sistemas con períodos de muestreo cortos.

defecto

  • Para señales con pequeñas constantes de tiempo de retardo puras, largos períodos de muestreo y cambios lentos;
  • No puede reflejar rápidamente la gravedad de la interferencia actual del sistema y el efecto de filtrado es deficiente.
/*
8、加权递推平均滤波法
coe数组为加权系数表
 */
#define N 12

char coe[N] = {
    
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

char sum_coe = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12;

char filter(void) {
    
    
    char i = 0;
    char value_buf[N];
    int sum = 0;

    for(i = 0; i < N; i++) {
    
    
        value_buf[i] = get_ad();
        delay();
    }
    for(i = 0; i < N; i++) {
    
    
        sum += value_buf[i] * coe[i];
    }
    return (char)(sum / sum_coe);
}

Nueve, método de filtrado antirrebote

definición

  • Configure un contador de filtro para comparar cada valor muestreado con el valor rms actual:
  • Si el valor de muestreo = el valor efectivo actual, el contador se borra;
  • Si el valor de muestreo es mayor que (>) o menor que (<) el valor efectivo actual, entonces el contador +1, y juzga si el contador es >= límite superior N (desbordamiento);
  • Si el contador se desborda, reemplace el valor efectivo actual con el valor actual y borre el contador.

ventaja

  • Tiene un mejor efecto de filtrado para cambiar lentamente los parámetros medidos;
  • Evite los saltos repetidos de encendido/apagado del controlador cerca del valor crítico o la fluctuación del valor en la pantalla.

defecto

  • No apto para parámetros que cambian rápidamente;
  • Si el valor muestreado en el momento en que el contador se desborda es solo el valor de perturbación, el valor de perturbación se importará al sistema como un valor efectivo.
int Filter_Value;
int Value;

void setup() {
    
    
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
  Value = 300;
}

void loop() {
    
    
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
    
    
  return random(295, 305);
}

// 消抖滤波法
#define FILTER_N 12
int i = 0;
int Filter() {
    
    
  int new_value;
  new_value = Get_AD();
  if(Value != new_value) {
    
    
    i++;
    if(i > FILTER_N) {
    
    
      i = 0;
      Value = new_value;
    }
  }
  else
    i = 0;
  return Value;
}

10. Método de filtrado de limitación y antirrebote

definición

  • Equivalente a "Método de filtro de limitación" + "Método de filtro antirrebote";
  • Limite primero, luego rebote.

ventaja

  • Heredó las ventajas de "Limitación" y "Rebote";
  • Mejorar algunas fallas en el "Método de filtrado de rebote" para evitar introducir valores de perturbación en el sistema.

defecto

  • No es adecuado para parámetros que cambian rápidamente.
/*
10、限幅消抖滤波法
参考程序1和9
 */
int Filter_Value;
int Value;

void setup() {
    
    
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
  Value = 300;
}

void loop() {
    
    
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
    
    
  return random(295, 305);
}

// 限幅消抖滤波法
#define FILTER_A 1
#define FILTER_N 5
int i = 0;
int Filter() {
    
    
  int NewValue;
  int new_value;
  NewValue = Get_AD();
  if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A))
    new_value = Value;
  else
    new_value = NewValue;
  if(Value != new_value) {
    
    
    i++;
    if(i > FILTER_N) {
    
    
      i = 0;
      Value = new_value;
    }
  }
  else
    i = 0;
  return Value;
}

Supongo que te gusta

Origin blog.csdn.net/dbqwcl/article/details/127841434
Recomendado
Clasificación