一、卷积运算
设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));
}
}
}