复习冒泡排序,学习ADC采样数据滤波
目录
前言
排序是C语言经常使用的基础算法,最简单的就是使用冒泡法对数组进行排序。
一、使用场景
在ADC采集到一次数据时,可能会因为干扰导致单次的数据产生很大的误差,就需要多次采样,对数据进行处理滤波后再进行使用,这样处理后的数据就能更准确的表达真实场景。
ADC滤波通常使用的是:中位值平均滤波法(又称防脉冲干扰平均滤波法),其具体操作是连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值,这样处理时,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。
二、使用步骤
代码如下(示例):
char filter()
{
char count,i,j;
char ADValue_buf[N];
int sum=0;
for(count=0;count<N;count++)//获取多次ad采样的值
{
ADValue_buf[count]= Get_AdValue();//存取AD采样值至缓存区
}
//将ad缓存区的值通过冒泡法进行从小到大排序
for(j=0;j<(N-1);j++)//排序次数=N-1,最后一个数不需要排序
{
for(i=0;i<(N-j);i++)//每次交换排序完成后,下次交换次数都会少1
{
if(ADValue_buf[i]>ADValue_buf[i+1])//判断前一个元素和后一个元素大小
{
temp = ADValue_buf[i];
ADValue_buf[i]= ADValue_buf[i+1];
ADValue_buf[i+1]=temp;
}
}
}
//去掉一个最大值和一个最小值后求和
for(count =1;count<N-1;count++)
{
sum += ADValue_buf[count];
}
//将求和后的值取平均
return (char)(sum/(N-2));
}
2.冒泡法排序
uint8_t arr[4]={4,5,7,3};
uint8_t i,j,temp,Swith_Flag=1;
if(Swith_Flag)//判断排序过程中是否提前完成
{
for(i=0;i<3;i++)//遍历一次时的最大交换次数为N-1次
{
Swith_Flag=0;//提前完成标志位
for(j=0;j<(3-i);j++)//3-i表示每遍历一次,下次需要排序的数位少一
{
if(arr[i]<arr[i+1])
{
temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
Swith_Flag=1;//表明未完成排序,继续进行交换
}
}
}
}
对于冒泡排序进行优化处理,在排序过程当中提前完成排序时就退出,提高程序运行的效率。
总结
在学习stm32的adc采样滤波处理时,常用的就是中位值平均滤波法,其中需要用到排序,所以在这里复习一下,用于大家进行参考,有不足之处还请指正。