【发布时间】:2011-08-30 01:47:40
【问题描述】:
我需要针对 2 个大阵列的一维卷积。我在 C# 中使用此代码,但运行需要很长时间。
我知道,我知道! FFT 卷积非常快。但在这个项目中我不能使用它。 不使用 FFT 是项目的一个限制(请不要问为什么:/)。
这是我的 C# 代码(顺便说一下,从 matlab 移植):
var result = new double[input.Length + filter.Length - 1];
for (var i = 0; i < input.Length; i++)
{
for (var j = 0; j < filter.Length; j++)
{
result[i + j] += input[i] * filter[j];
}
}
那么,有人知道任何快速卷积算法widthout FFT吗?
【问题讨论】:
-
虽然你说不要问,为什么不能用FFT?如果这是针对明确禁止的课堂项目,您可能应该将其标记为家庭作业。
-
C#可以调用CUDA吗?如果是这样,您可以使用并行指令,这会大大加快简单的卷积。或者您可以使用 Winograd 变换或其他东西(不是 Cooley-Tukey 经典 FFT,如果它足够远以满足您的“无 FFT”规则)。或者,如果您对输入或滤波器有所了解(例如仅存在某些频率或其他内容),您可以使用该知识。您必须更具体地了解您的限制条件以及您可能拥有的任何外部知识。
标签: c# optimization convolution