Example #1
0
    public void FFTV32(FFTType fftType)
    {
        int p = 1;

        while (p < n)
        {
            if (p * 32 <= n)
            {
                DispatchFFTV(fftType, 32, p, fftTextureTmp_, fftTextureOut_);
                p <<= 5;
            }
            else
            if (p * 16 <= n)
            {
                DispatchFFTV(fftType, 16, p, fftTextureTmp_, fftTextureOut_);
                p <<= 4;
            }
            else if (p * 8 <= n)
            {
                DispatchFFTV(fftType, 8, p, fftTextureTmp_, fftTextureOut_);
                p <<= 3;
            }
            else if (p * 4 <= n)
            {
                DispatchFFTV(fftType, 4, p, fftTextureTmp_, fftTextureOut_);
                p <<= 2;
            }
            else
            {
                DispatchFFTV(fftType, 2, p, fftTextureTmp_, fftTextureOut_);
                p <<= 1;
            }
        }
    }
Example #2
0
    public void FFTU4(FFTType fftType)
    {
        int p = 1;

        if (p < n)
        {
            if (p * 4 <= n)
            {
                DispatchFFTU(fftType, 4, p, fftTextureIn_, fftTextureOut_);
                p <<= 2;
            }
            else
            {
                DispatchFFTU(fftType, 2, p, fftTextureIn_, fftTextureOut_);
                p <<= 1;
            }

            while (p < n)
            {
                if (p * 4 <= n)
                {
                    DispatchFFTU(fftType, 4, p, fftTextureTmp_, fftTextureOut_);
                    p <<= 2;
                }
                else
                {
                    DispatchFFTU(fftType, 2, p, fftTextureTmp_, fftTextureOut_);
                    p <<= 1;
                }
            }
        }
    }
Example #3
0
    public void DispatchFFTV(FFTType fftType, int radix, int p, Texture fftTextureIn, RenderTexture fftTextureOut)
    {
        int ditKernel = 0;

        switch (radix)
        {
        case 2: ditKernel = fftType == FFTType.DFT ? KERNEL_DIT_Y : KERNEL_DIT_Y_IDFT; break;

        case 4: ditKernel = fftType == FFTType.DFT ? KERNEL_DIT4_Y : KERNEL_DIT4_Y_IDFT; break;

        case 8: ditKernel = fftType == FFTType.DFT ? KERNEL_DIT8_Y : KERNEL_DIT8_Y_IDFT; break;

        case 16: ditKernel = fftType == FFTType.DFT ? KERNEL_DIT16_Y : KERNEL_DIT16_Y_IDFT; break;

        case 32: ditKernel = fftType == FFTType.DFT ? KERNEL_DIT32_Y : KERNEL_DIT32_Y_IDFT; break;

        case 64: ditKernel = fftType == FFTType.DFT ? KERNEL_DIT64_Y : KERNEL_DIT64_Y_IDFT; break;

        case 128: ditKernel = fftType == FFTType.DFT ? KERNEL_DIT128_Y : KERNEL_DIT128_Y_IDFT; break;

        case 256: ditKernel = fftType == FFTType.DFT ? KERNEL_DIT256_Y : KERNEL_DIT256_Y_IDFT; break;

        case 512: ditKernel = fftType == FFTType.DFT ? KERNEL_DIT512_Y : KERNEL_DIT512_Y_IDFT; break;

        case 1024: ditKernel = fftType == FFTType.DFT ? KERNEL_DIT1024_Y : KERNEL_DIT1024_Y_IDFT; break;
        }
        fftShader_.SetTexture(ditKernel, SHADER_NAME_FFT_IN, fftTextureIn);
        fftShader_.SetTexture(ditKernel, SHADER_NAME_FFT_OUT, fftTextureOut);
        fftShader_.SetInt(SHADER_NAME_P, (int)p);

        fftTextureOut.DiscardContents();
        fftShader_.Dispatch(ditKernel, groupN, groupN / radix, 1);
        SwapTex();
    }
Example #4
0
    public void FFTU(FFTType fftType)
    {
        int ditXKernel = fftType == FFTType.DFT ? KERNEL_DIT_X : KERNEL_DIT_X_IDFT;

        uint p = 1;

        if (p < n)
        {
            fftShader_.SetTexture(ditXKernel, SHADER_NAME_FFT_IN, fftTextureIn_);
            fftShader_.SetTexture(ditXKernel, SHADER_NAME_FFT_OUT, fftTextureOut_);
            fftShader_.SetInt(SHADER_NAME_P, (int)p);

            fftTextureOut_.DiscardContents();
            fftShader_.Dispatch(ditXKernel, halfGroupN, groupN, 1);
            SwapTex();
            p <<= 1;

            while (p < n)
            {
                fftShader_.SetTexture(ditXKernel, SHADER_NAME_FFT_IN, fftTextureTmp_);
                fftShader_.SetTexture(ditXKernel, SHADER_NAME_FFT_OUT, fftTextureOut_);
                fftShader_.SetInt(SHADER_NAME_P, (int)p);

                fftTextureOut_.DiscardContents();
                fftShader_.Dispatch(ditXKernel, halfGroupN, groupN, 1);
                SwapTex();
                p <<= 1;
            }
        }
    }
Example #5
0
    public void FFTU16(FFTType fftType)
    {
        int p = 1;

        if (p < n)
        {
            if (p * 16 <= n)
            {
                DispatchFFTU(fftType, 16, p, fftTextureIn_, fftTextureOut_);
                p <<= 4;
            }
            else if (p * 8 <= n)
            {
                DispatchFFTU(fftType, 8, p, fftTextureIn_, fftTextureOut_);
                p <<= 3;
            }
            else if (p * 4 <= n)
            {
                DispatchFFTU(fftType, 4, p, fftTextureIn_, fftTextureOut_);
                p <<= 2;
            }
            else
            {
                DispatchFFTU(fftType, 2, p, fftTextureIn_, fftTextureOut_);
                p <<= 1;
            }


            while (p < n)
            {
                if (p * 16 <= n)
                {
                    DispatchFFTU(fftType, 16, p, fftTextureTmp_, fftTextureOut_);
                    p <<= 4;
                }
                else if (p * 8 <= n)
                {
                    DispatchFFTU(fftType, 8, p, fftTextureTmp_, fftTextureOut_);
                    p <<= 3;
                }
                else if (p * 4 <= n)
                {
                    DispatchFFTU(fftType, 4, p, fftTextureTmp_, fftTextureOut_);
                    p <<= 2;
                }
                else
                {
                    DispatchFFTU(fftType, 2, p, fftTextureTmp_, fftTextureOut_);
                    p <<= 1;
                }
            }
        }
    }
Example #6
0
    public void FFTVWithRadix(FFTType fftType, int maxRadix)
    {
        int maxRadixPow = Math.Max(1, (int)(Math.Log(maxRadix, 2)));
        int p           = 1;

        while (p < n)
        {
            int radixSize = 1 << maxRadixPow;
            int radix     = maxRadixPow;
            while (radixSize >= 2)
            {
                if (p * radixSize <= n)
                {
                    DispatchFFTV(fftType, radixSize, p, fftTextureTmp_, fftTextureOut_);
                    p <<= radix;
                    break;
                }
                radixSize >>= 1;
                radix      -= 1;
            }
        }
    }