采样信号滤波
什么是滤波
滤波(Wave filtering)是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。
它可以从含有干扰的接收信号中提取有用信号,很大程度上保证了采集到的信号的真实性和稳定性。
正因如此,滤波算法也成了在智能车控制中不可或缺的一种控制算法。
常见的软件滤波办法
软件滤波在嵌入式的数据采集和处理中有着很重要的作用。
对于电磁车来说,我们需要对采集到的赛道电磁信号进行滤波处理,这里我们介绍几种常见的软件滤波处理办法。
限幅法
一般来说,每个电感在赛道上采集到的值都有一个固定的范围。
由于电感排布方案的不同(水平电感、竖直电感或斜电感等)或不同赛道电磁信号的差别,这个范围也会随之变化。
这时我们可以在程序的初始化中加入一个扫描赛道的程序,在初始化程序运行时令车左右扫描。
将每个电感的最大值和最小值分别记录入两个一维数组中,让其作为每个电感采集信号值的上下限(这样也是为了提高赛车对于不同赛道的适应性)。
在后续赛车行驶过程中,便可以过滤在这个范围之外的电感值,从而排除偶然误差,达到软件滤波的效果。
具体代码如下(此处只写一个其中电感的处理):
// 扫描赛道 //
void saomiao()
{
uint32 i;
uint16 max1=0,min1=4095;
for(i=0;i< 1000;i++)
{
LeftADC[0]=ADC_Ave(ADC0,ADC1_SE8,ADC_12bit,10);
if(LeftADC[0] >max1)
max1=LeftADC[0];
if(LeftADC[0]< min1)
min1=LeftADC[0];
}
}
// 限幅法滤波 //
void AD_value()
{
LeftADC[0]=ADC_Ave(ADC0,ADC1_SE8,ADC_12bit,10);
if(LeftADC[0] >max1)
LeftADC[0]=max1;
if(LeftADC[0]< min1)
LeftADC[0]=min1;
}
算术平均值滤波
算术平均值滤波,指的是将每个电感采集到的一组值用冒泡排序按从大到小或者从小到大的顺序排布,再丢弃最大值与最小值。
取剩下数据的算术平均数,作为反馈给单片机的实时数据。这也是最常见的软件滤波算法之一。
具体代码如下:
void Ad_Value()
{
uint16 LeftADC[7];
int i,j,t;
for(i=0;i< 7;i++)
{
LeftADC[i]= ADC_Ave(ADC0,ADC1_SE8 ,ADC_12bit,10);
}
for(i=0;i< 6;i++)
{
for(j=0;j< 6-i;j++)
{
if(LeftADC[j] >LeftADC[j+1])
{
t=LeftADC[j+1];
LeftADC[j+1]=LeftADC[j];
LeftADC[j]=t;
}
}
}
LeftAverage[0]=(uint16)((LeftADC[1]+LeftADC[2]+LeftADC[3]+LeftADC[4]+LeftADC[5])/5.0);
}
全部0条评论
快来发表一下你的评论吧 !