yum/vfft
git clone https://git.yummers.dev/yum/vfft
53efdd4
master
1import lib.util; 2 3[[vk::binding(0, 0)]] 4StructuredBuffer<float2> input; 5 6[[vk::binding(1, 0)]] 7RWStructuredBuffer<float2> output; 8 9[[vk::binding(2, 0)]] 10StructuredBuffer<float2> twiddles; 11 12[[vk::binding(3, 0)]] 13cbuffer Uniforms { 14 // Note: stride * big_n always = N, where N = input length 15 uint stride; 16 uint big_n; 17}; 18 19[shader("compute")] 20[numthreads(256, 1, 1)] 21void fft_v0_basic(uint3 globalId : SV_DispatchThreadID) 22{ 23 const uint id = globalId.x; 24 const uint stride = Uniforms.stride; 25 const uint big_n = Uniforms.big_n; 26 const uint half_big_n = big_n / 2; 27 const uint start_idx = id % stride; 28 const uint k = id / stride; 29 30 // Get odd and even elements. 31 let p = input[start_idx + 2 * k * stride]; 32 let q = input[start_idx + (2 * k + 1) * stride]; 33 // Combine. 34 let factor = twiddles[k * stride]; 35 let qf = cmul(q, factor); 36 output[start_idx + k * stride] = p + qf; 37 output[start_idx + (k + half_big_n) * stride] = p - qf; 38}