gpt4 book ai didi

c - ANSI C代码中的一维线性卷积?

转载 作者:太空狗 更新时间:2023-10-29 16:40:05 25 4
gpt4 key购买 nike

与其重新发明轮子,我想知道是否有人可以向我推荐一维线性 convolution ANSI C 中的代码片段?我在谷歌和堆栈溢出中进行了搜索,但在 C 中找不到任何我可以使用的东西。

例如,对于数组 A、B 和 C,均为 double ,其中 A 和 B 为输入,C 为输出,长度为 len_Alen_B , 和 len_C = len_A + len_B - 1

我的数组很小,因此不需要通过 FFT 实现快速卷积来提高速度。寻找简单的计算。

最佳答案

方法如下:

#include <stddef.h>
#include <stdio.h>

void convolve(const double Signal[/* SignalLen */], size_t SignalLen,
const double Kernel[/* KernelLen */], size_t KernelLen,
double Result[/* SignalLen + KernelLen - 1 */])
{
size_t n;

for (n = 0; n < SignalLen + KernelLen - 1; n++)
{
size_t kmin, kmax, k;

Result[n] = 0;

kmin = (n >= KernelLen - 1) ? n - (KernelLen - 1) : 0;
kmax = (n < SignalLen - 1) ? n : SignalLen - 1;

for (k = kmin; k <= kmax; k++)
{
Result[n] += Signal[k] * Kernel[n - k];
}
}
}

void printSignal(const char* Name,
double Signal[/* SignalLen */], size_t SignalLen)
{
size_t i;

for (i = 0; i < SignalLen; i++)
{
printf("%s[%zu] = %f\n", Name, i, Signal[i]);
}
printf("\n");
}

#define ELEMENT_COUNT(X) (sizeof(X) / sizeof((X)[0]))

int main(void)
{
double signal[] = { 1, 1, 1, 1, 1 };
double kernel[] = { 1, 1, 1, 1, 1 };
double result[ELEMENT_COUNT(signal) + ELEMENT_COUNT(kernel) - 1];

convolve(signal, ELEMENT_COUNT(signal),
kernel, ELEMENT_COUNT(kernel),
result);

printSignal("signal", signal, ELEMENT_COUNT(signal));
printSignal("kernel", kernel, ELEMENT_COUNT(kernel));
printSignal("result", result, ELEMENT_COUNT(result));

return 0;
}

输出:

signal[0] = 1.000000
signal[1] = 1.000000
signal[2] = 1.000000
signal[3] = 1.000000
signal[4] = 1.000000

kernel[0] = 1.000000
kernel[1] = 1.000000
kernel[2] = 1.000000
kernel[3] = 1.000000
kernel[4] = 1.000000

result[0] = 1.000000
result[1] = 2.000000
result[2] = 3.000000
result[3] = 4.000000
result[4] = 5.000000
result[5] = 4.000000
result[6] = 3.000000
result[7] = 2.000000
result[8] = 1.000000

关于c - ANSI C代码中的一维线性卷积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8424170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com