最近在试着用stm32做一个基于tdoa的声源定位项目,在最初的互相关函数这卡了一会,网上也没找到有用 的资料,就自己写了一个。
实际上实序列的卷积与互相关都差不多,卷积是两个序列的移位叠加,互相关则是翻转了其中一个序列的卷积。
#互相关 已用matlab验证
#include<stdio.h>
float p1[5]={1,2,3,4,5};
float p2[5]={1,2,3,4,5};
main()
{
int i,j;
int size=5; //待卷积序列的长度,这里默认了两个序列一样长,如果不一样长可以加一个size
//然后替换下面双循环的结束条件
float x[10]={0,0,0,0,0,0,0,0,0,0};
for(j=0;j<size;j++)
{
for(i=0;i<size;i++)
{
x[i+j]+=(p1[j])*(p2[size-1-i]);
printf("x[%d]=%f \n",i+j,x[i+j]);
}
printf("\n");
}
for(i=0;i<10;i++)
{
printf("%f ",x[i]);
}
}
![](https://img-blog.csdnimg.cn/img_convert/039983d7e94e31e0089403e215789372.png)
#卷积 已用matlab验证
#include<stdio.h>
float p1[5]={1,2,3,4,5};
float p2[5]={1,2,3,4,5};
main()
{
int i,j;
int size=5;
float x[10]={0,0,0,0,0,0,0,0,0,0};
for(j=0;j<size;j++)
{
for(i=0;i<size;i++)
{
x[i+j]+=(p1[j])*(p2[i]); //与互相关的差别在这
printf("x[%d]=%f \n",i+j,x[i+j]);
}
printf("\n");
}
for(i=0;i<10;i++)
{
printf("%f ",x[i]);
}
}
![](https://img-blog.csdnimg.cn/img_convert/f0c18d5e6e05f78352f43099abd7960c.png)
//这个是用在32里的,对三个序列求互相关,结果保存在全局变量中
//互相关数据
float xcorr_data_0and0[SendBuff/3*2]={0};
float xcorr_data_0and1[SendBuff/3*2]={0};
float xcorr_data_0and2[SendBuff/3*2]={0};
//平均值
float32_t mean0=1.6;
float32_t mean1=1.6;
float32_t mean2=1.6;
void xcorr(float *data0,float *data1,float *data2,uint16_t size)
{
int i,j;
//清零数组
memset(xcorr_data_0and0,'\0',sizeof(xcorr_data_0and0));
memset(xcorr_data_0and1,'\0',sizeof(xcorr_data_0and1));
memset(xcorr_data_0and2,'\0',sizeof(xcorr_data_0and2));
//求平均值
arm_mean_f32( (float32_t *)data0,SendBuff/3,&mean0 );
arm_mean_f32( (float32_t *)data1,SendBuff/3,&mean1 );
arm_mean_f32( (float32_t *)data2,SendBuff/3,&mean2 );
//互相关代码
for(j=0;j<size;j++)
{
for(i=0;i<size;i++)
{
xcorr_data_0and0[i+j]+=(data0[j])*(data0[size-1-i]);
xcorr_data_0and1[i+j]+=(data0[j])*(data1[size-1-i]);
xcorr_data_0and2[i+j]+=(data0[j])*(data2[size-1-i]);
}
}
}