一个简易的c语言卷积或互相关函数写法

最近在试着用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]);
    }
    
}
#卷积 已用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]);
    }
    
}

//这个是用在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]);    
            }
    }
    
}
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值