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
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 C 语言实现卷积操作的代码和详细注释: ```c #include <stdio.h> #define ROWS 3 // 卷积核的行数 #define COLS 3 // 卷积核的列数 // 定义卷积核 int kernel[ROWS][COLS] = { {1, , -1}, {1, , -1}, {1, , -1} }; // 定义输入矩阵 int input[5][5] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}, {16, 17, 18, 19, 20}, {21, 22, 23, 24, 25} }; // 定义输出矩阵 int output[3][3]; int main() { // 遍历输出矩阵的每一个元素 for (int i = ; i < 3; i++) { for (int j = ; j < 3; j++) { // 计算卷积结果 int sum = ; for (int k = ; k < ROWS; k++) { for (int l = ; l < COLS; l++) { sum += input[i + k][j + l] * kernel[k][l]; } } output[i][j] = sum; } } // 输出结果 for (int i = ; i < 3; i++) { for (int j = ; j < 3; j++) { printf("%d ", output[i][j]); } printf("\n"); } return ; } ``` 注释: 1. `#include <stdio.h>`:引入标准输入输出库。 2. `#define ROWS 3` 和 `#define COLS 3`:定义卷积核的行数和列数。 3. `int kernel[ROWS][COLS]`:定义卷积核。 4. `int input[5][5]`:定义输入矩阵。 5. `int output[3][3]`:定义输出矩阵。 6. `for (int i = ; i < 3; i++)` 和 `for (int j = ; j < 3; j++)`:遍历输出矩阵的每一个元素。 7. `for (int k = ; k < ROWS; k++)` 和 `for (int l = ; l < COLS; l++)`:遍历卷积核的每一个元素。 8. `sum += input[i + k][j + l] * kernel[k][l]`:计算卷积结果。 9. `output[i][j] = sum`:将卷积结果存入输出矩阵。 10. `printf("%d ", output[i][j])`:输出结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值