Das ist OpenCL C. float2 ist ein Vektor-Datatyp. Ich benutze es zur Darstellung imaginärer Zahlen. Z.B. entspricht z = 2 + 3i: float2 z = (float2)(2.0, 3.0);
1 | #define PI 3.141592653589
|
2 | |
3 | float2 mulc(float2 a, float2 b) |
4 | {
|
5 | return (float2)(a.s0 * b.s0 - a.s1 * b.s1, a.s0 * b.s1 + a.s1 * b.s0); |
6 | }
|
7 | |
8 | __kernel void dft(__global float * input, |
9 | __global float * outputRe, |
10 | __global float * outputIm, |
11 | __global int * N) |
12 | {
|
13 | int n, p = get_global_id(0); |
14 | float2 sum = (float2)(0.0, 0.0); |
15 | |
16 | for(n = 0; n < N[0]; n++) |
17 | {
|
18 | sum += mulc((float2)(input[n], 0.0), |
19 | (float2)(cos(2 * PI * n * p / N[0]), |
20 | -sin(2 * PI * n * p / N[0]))); |
21 | }
|
22 | |
23 | outputRe[p] = sum.s0; |
24 | outputIm[p] = sum.s1; |
25 | }
|
Die Ergebnisse stimmen nicht. Eine Gaußglocke wird in ein ganz anderes Gebilde transformiert. Sieht jemand den Fehler auf Anhieb?