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; } } }
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; } } } }
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(); }
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; } } }
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; } } } }
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; } } }