シングルチップマイクロコンピュータで一般的に使用されるADCデータフィルタリングアルゴリズム

**

シングルチップマイクロコンピュータで一般的に使用されるADCデータフィルタリングアルゴリズム

**

1. リミッティングフィルター

1. 方法:
経験に基づいて 2 回のサンプリングで許容される最大偏差 K を判断し、
新しい値が収集されるたびに判断します。現在値と前回の値の差 <= E の場合は今回が有効で、現在の値の場合は有効です。値が前の値と異なる 2 番目の値の差が > E の場合、今回は無効となり、今回の代わりに前の値が使用されます。

2. 長所と短所:
パルス干渉を克服できますが、周期的な干渉を抑制できず、滑らかさが劣ります。

3. コード

/* K值根据实际调,Value有效值,new_Value当前采样值,程序返回有效的实际值 */
#define E 10
char Value;
char filter()
{
    
    
  char new_Value;
  new_Value = get_ad();                         //获取采样值
  if( abs(new_Value - Value) > E)				//abs()取绝对值函数
  	return Value;             
  return new_Value;
}

2.メディアンフィルタリング

1.方法:
N回連続サンプリングし、サイズごとに並べ、中央の値を今回の実効値とする

2. 長所と短所:
変動干渉を克服し、温度などのゆっくりと変化する測定パラメータに対して良好なフィルタリング効果を持ちますが、速度などの急速に変化するパラメータには適していません。

3. コード

#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);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. 算術平均フィルタリング

1. 方法:
N 回連続サンプリングして平均値
N が大きいと滑らかさが高く感度が低く、
N が小さいと滑らかさが低く感度が高い
一般的には N= 12

2. 長所と短所:
ランダムな干渉があり、大量の RAM を占有し、速度が遅いシステムに適しています。

3. コード:

#define N 12
char filter()
{
    
    
	int sum = 0;
	for(count = 0;count<N;count++){
    
    
		sum += get_ad();
	}
	return (char)(sum/N);
}

4. 再帰的平均フィルタリング

1. 方法:
N 個のサンプリング値を取得してキューを形成し、先入れ先出しで平均を取得します。
一般的に、N=4~12

2. 長所と短所:
周期的干渉の抑制が良好、平滑性が高く、
高周波振動システムに適し
、感度が低く、RAM 占有量が大きく、パルス干渉が深刻

3. コード

/* A值根据实际调,Value有效值,new_Value当前采样值,程序返回有效的实际值 */
#define A 10
char Value;
char filter()
{
    
    
	char new_Value;
	new_Value = get_ad();                   //获取采样值
	if( abs(new_Value - Value) > A){
    
    		//abs()取绝对值函数
		return Value;
	}
	return new_Value;
}

5. メディアン平均フィルター

1. 方法:
N 個の値をサンプリングし、最大値と最小値を削除し、
N-2 の平均値を計算します
N= 3~14

2. 利点と欠点
中央値と平均値の利点を組み合わせる
パルス干渉を排除する
計算速度が遅く、RAM 使用量が大きい

3. コード:

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

6. 限界平均フィルター

1. 方法:
サンプリングされた各データは最初に制限されてからキューに送信され、平均値が取得されます。

2. 長所と短所:
リミッター、平均値、キューの利点を統合し、
パルス干渉を排除し、より多くの RAM を占有します。

3. コード:

#define A 10
#define N 12
char value,i=0;
char value_buf[N];
char filter()
{
    
    
	char new_value,sum=0;
	new_value=get_ad();
	if(Abs(new_value-value)<A){
    
    
		value_buf[i++]=new_value;
	}
	if(i==N){
    
    
		i=0;
	}
	for(count =0 ;count<N;count++){
    
    
		sum+=value_buf[count];
	}
	return (char)(sum/N);
}

7. 一次遅れフィルター

1. 方法:
a=0~1 とし、
今回のフィルタリング結果 = (1-a) * 今回のサンプリング + a * 最後の結果

2. 長所と短所:
周期的干渉の抑制が良好で、変動周波数が高く、
感度が低く、位相遅れのある場面に適しています。

3. コード:

/*为加快程序处理速度,取a=0~100*/
#define a 30
char value;
char filter()
{
    
    
	char new_value;
	new_value=get_ad();
	return ((100-a)*value + a*new_value);
}

8、加重再帰平均フィルター

1. 方法:
再帰的平均フィルターを改善し、さまざまな時点でデータに異なる重みを追加します。通常、データが新しいほど重みが大きくなるため、感度は高くなりますが、滑らかさは低くなります。

2. 長所と短所:
遅れ時定数が大きく、サンプリング周期が短いシステムに適していますが、遅れ時定数が小さく、サンプリング周期が長く、変化が遅い信号の場合は、干渉に迅速に応答できません。

3. コード:

/* coe数组为加权系数表 */
#define N 12
char code coe[N]={
    
    1,2,3,4,5,6,7,8,9,10,11,12};
char code sum_coe={
    
    1+2+3+4+5+6+7+8+9+10+11+12};
char filter()
{
    
    
	char count;
	char value_buf[N];
	int sum=0;
	for(count=0;count<N;count++){
    
    
		value_buf[count]=get_ad();
	}
	for(count=0;count<N;count++){
    
    
		sum+=value_buf[count]*coe[count];
	}
	return (char)(sum/sum_coe);
}

9、デバウンスフィルター

1. 方法:サンプリング値と現在の実効値を比較する
フィルター カウンタを設定します。サンプリング値 = 現在の実効値の場合、カウンタは 0 にクリアされます。サンプリング値が現在の実効値と等しくない場合、カウンタは +1 になります。カウンタがオーバーフローすると、サンプリングされた値が現在の値に置き換わります。有効な値、カウンタは 0 にクリアされます。



2. 長所と短所:
フィルタリング効果は、変化の遅い信号には適していますが、変化の速い信号には適していません。
臨界値付近でジャンプすることは避けてください。カウンタがオーバーフローして干渉値を収集すると、フィルタリングできません。

3. コード:

#define N 12
char filter()
{
    
    
	char count=0,new_value;
	new_value=get_ad();
	while(value!=new_value)
	{
    
    
		count++;
		if(count>=N){
    
    
			return new_value;
		}
		new_value=get_ad();
	}
	return value;
}

10. 制限およびデバウンスフィルタリング

1. 方法:
最初にクリッピングしてからデバウンス

2. 長所と短所:
制限とデバウンスの利点を組み合わせ、
干渉値の導入を回避し、急速に変化する信号には適していません。

3. コード:

#define A 10
#define N 12
char value;
char filter()
{
    
    
	char new_value,count=0;
	new_value=get_ad();
	while(value!=new_value){
    
    
		if(Abs(value-new_value)<A){
    
    
			count++;
			if(count>=N){
    
    
				return new_value;
			}
			new_value=get_ad();
		}
		return value;
	}
}

おすすめ

転載: blog.csdn.net/m0_50862404/article/details/125991727