这个来自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));;
}
希望这可以帮助!