0

WebとStack OverflowでC#のFFTバージョンを検索したところ、これは何度か尋ねられ、いくつかの回答が得られましたが...

  1. 私が見つけたすべての FFT バージョンは、速度が最適化されていますが、理解するのは困難です。
  2. それらのほとんどすべてが反復バージョンであったため、マルチコア システム用に最適化されていませんでした。
  3. Opencl バージョンは、特定の GPU モデル用に最適化されました。

シングル コア、マルチ コア、OpenCL のアルゴリズム比較のケース スタディに取り組んでいるので、最もシンプルで無料の FFT の C# / Opencl バージョンを探しています。前方および逆のオプションは素晴らしいでしょう。また、任意の配列長で機能するのも良いでしょう。誰かがそのようなものに出くわしましたか?

4

1 に答える 1

1

Brahma (私のオープンソース プロジェクト)からのこのサンプル ソースには、Microsoft の調査によるこの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 に答える