首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单的快速傅立叶变换在C#作为单核,多核和OpenCL版本?

简单的快速傅立叶变换在C#作为单核,多核和OpenCL版本?
EN

Stack Overflow用户
提问于 2012-06-05 02:54:10
回答 1查看 1.7K关注 0票数 0

我在C#中搜索网页和堆栈溢出以查找FFT版本,这被问了好几次并给出了一些答案,但是.

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

当我正在为单核、多核、opencl算法比较做一个案例研究时,我正在寻找最简单、最免费的C# / Opencl版本的快速傅立叶变换,工作在浮点真实,复杂,不需要上,正反可选将是很棒的。如果它们能在任何数组长度上工作,那也是很好的。有没有人偶然发现这种情况?

EN

回答 1

Stack Overflow用户

发布于 2012-06-05 19:30:00

这个样本源婆罗门 (我的开源项目)有一个C#实现和LINQ实现(OpenCL)的 FFT论文,从微软的研究。

梵天自动生成的核心是:

快速傅立叶变换核

代码语言:javascript
运行
复制
    __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)));
    }

共轭与尺度核

代码语言:javascript
运行
复制
    __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));;
    }

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10890980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档