C语言卷积和C语言互相关:数字信号处理中的卷积和互相关的C语言代码

一、卷积运算

设x(n)和h(n)的卷积结果为y(n),则x(n)和h(n)卷积运算的数学表达式为


其中x(n)的长度为xlen,h(n)的长度为hlen,则卷积之后y(n)的长度为xlen+hlen-1。从公式中我们可以看到在做卷积运算时先将h(n)关于n=0做对称,变为h(-m),然后依次向右平移n个单位来计算y(n),我们在编程的时候就可以考虑到这一点,先将第一个输入序列反转(实际上就是对数组下标的操作),然后依次平移求得y(n)。代码如下

 

//卷积函数,u,v为输入序列,w为输出序列,u的长度为ulen,v的长度为vlen
void conv(int *u,int ulen,int *v,int vlen,int *w){
    int i=0;
    int j=0;
    int k = ulen+vlen-1;
 
    for(i=0; i<k; i++){
        *(w+i) = 0;
        for(j=(0>i+1-vlen?0:i+1-vlen);j<=(i<ulen-1?i:ulen-1); j++){
            w[i] += u[j]*v[i-j];
        }
    }
}


 

二、相关运算

x(n)和y(n)的相关运算的数学表达式为


其中x(n)的长度为xlen,y(n)的长度为ylen,相关运算后的序列长度为xlen+ylen-1。从表达式上可以看出,相关运算跟卷积运算很相似 ,只不过相关运算没有对序列做一个对称处理,代码和卷积运算具有很大的相似性,代码如下:

 

//相关函数,u,v为输入,w为输出,m为u的长度,n为v的长度
void corr(int *u,int m,int *v,int n,int *w){
    int k=0;
    int i=0;//求和次数
    int wLength = m+n-1;//相关输出序列的长度
    for(k=0;k<wLength;k++){
        *(w+k) = 0;
        for(i=(0>k+1-m?0:k+1-m);i<=(k<n-1?k:n-1);i++){
            *(w+k) +=(*(u+k-i)) *(*(v+n-1-i));
        }
    }
}


  • 8
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值