前言
为了直观理解线性卷积和循环卷积的联系,以及方便自己计算,于是结合gpt有了这段程序。
代码
#include <stdio.h>
#include <stdlib.h>
// 线性卷积函数
void linear_convolution(int* M, int* N, int* yc, int M_len, int N_len) {
int i, j;
for (i = 0; i < M_len + N_len - 1; i++) {
yc[i] = 0;
for (j = 0; j < M_len; j++) {
if (i - j >= 0 && i - j < N_len) {
yc[i] += M[j] * N[i - j];
}
}
}
}
// 循环卷积函数
void circular_convolution(int* M, int* N, int* yc, int L, int M_len, int N_len) {
int i, j;
for (i = 0; i < L; i++) {
yc[i] = 0;
for (j = 0; j < M_len; j++) {
yc[i] += M[j] * N[(i - j + N_len) % N_len];
}
}
}
int main() {
int N[] = {1,2,3,4,5};
int M[] = {1,1,1,1,1};
int M_len = sizeof(M) / sizeof(M[0]);
int N_len = sizeof(N) / sizeof(N[0]);
int L = 9; // 循环卷积长度
int* M_padded = (int*)malloc(L * sizeof(int));
int* N_padded = (int*)malloc(L * sizeof(int));
int* yc_circular = (int*)malloc(L * sizeof(int));
int* yc_linear = (int*)malloc((M_len + N_len - 1) * sizeof(int));
// 补零至指定长度
for (int i = 0; i < L; i++) {
M_padded[i] = (i < M_len) ? M[i] : 0;
N_padded[i] = (i < N_len) ? N[i] : 0;
}
// 计算循环卷积
circular_convolution(M_padded, N_padded, yc_circular, L, L, L);
printf("循环卷积结果为:\n");
for (int i = 0; i < L; i++) {
printf("%d ", yc_circular[i]);
}
printf("\n");
// 计算线性卷积
linear_convolution(M, N, yc_linear, M_len, N_len);
printf("线性卷积结果为:\n");
for (int i = 0; i < M_len + N_len - 1; i++) {
printf("%d ", yc_linear[i]);
}
printf("\n");
free(M_padded);
free(N_padded);
free(yc_circular);
free(yc_linear);
return 0;
}
效果
N={1,2,3,4,5}
M={1,1,1,1,1}