yum/vfft

git clone https://git.yummers.dev/yum/vfft

yumAdjust FFT indexing53efdd4

master
976 B38 linesraw
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}