0

我在网络和 Stack Overflow 上搜索了 C# 中的 FFT 版本,这被问了好几次,并给出了一些答案,但是......

  1. 我发现的所有 FFT 版本都针对速度进行了优化,但很难理解。
  2. 几乎所有这些都是迭代版本,因此没有针对多核系统进行优化。
  3. Opencl 版本针对某些 gpu 模型进行了优化。

当我正在研究单核、多核、opencl 算法比较的案例研究时,我正在寻找 FFT 的最简单和免费的 C#/Opencl 版本,使用 float[](真实,不需要复杂),正向和反向可选会很棒。如果它们可以在任何数组长度上工作,那也很好。有没有人偶然发现这样的?

4

1 回答 1

1

这个来自Brahma(我的开源项目)的示例源代码包含 Microsoft Research的这篇FFT 论文的 C# 实现和 LINQ 实现 (OpenCL)。

Brahma 自动生成的内核是:

FFT 内核

    __kernel void brahmaKernel(int fftSize,__global float* a,__global float* ib,__global float* c,__global float* id,int size) 
    {
        int x = get_global_id(0);
        int b = ((floor(convert_float((x / fftSize))) * fftSize) / ((int)2));
        int offset = (x % (fftSize / ((int)2)));
        int x0 = (b + offset);
        int x1 = (x0 + (size / ((int)2)));
        float val0A = a[x0];
        float val0B = ib[x0];
        float val1A = a[x1];
        float val1B = ib[x1];
        float angle = (((float)-6.283185) * (convert_float(x) / convert_float(fftSize)));
        float tA = native_cos(angle);
        float tB = native_sin(angle);
        (c[x] = ((val0A + (tA * val1A)) - (tB * val1B)));(id[x] = ((val0B + (tB * val1A)) + (tA * val1B)));
    }

共轭和缩放内核

    __kernel void brahmaKernel(float scale,__global float* a,__global float* ib) 
    {
        int x = get_global_id(0);
        (a[x] = (a[x] * scale));(ib[x] = (-(ib[x]) * scale));;
    }

希望这可以帮助!

于 2012-06-05T19:30:00.137 回答