kopia lustrzana https://github.com/xdsopl/robot36
50 wiersze
1.7 KiB
C
50 wiersze
1.7 KiB
C
/*
|
|
Copyright 2015 Ahmet Inan <xdsopl@googlemail.com>
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
#include <math.h>
|
|
#include <complex.h>
|
|
#include <stdio.h>
|
|
|
|
int main()
|
|
{
|
|
const int N = 512;
|
|
const int dir = -1;
|
|
printf("/* code generated by 'utils/radix2.c' */\n");
|
|
printf("static const int radix2_N = %d;\n", N);
|
|
printf("static const complex_t radix2_z[%d] = {\n", N / 2);
|
|
for (int n = 0; n < N / 2; n++) {
|
|
complex double z = cexp(dir * I * n * 2.0 * M_PI / N);
|
|
printf("\t{ %a, %a }%s\n", creal(z), cimag(z), n < (N/2-1) ? "," : "");
|
|
}
|
|
printf("};\n");
|
|
printf("static inline void dit4(complex_t *out, float *in)\n{\n");
|
|
printf("\tfwd4(out, out + 1, out + 2, out + 3, in[0], in[%i], in[%i], in[%i]);\n}\n", N / 4, N / 2, 3 * N / 4);
|
|
for (int n = 4, s = N / 8; n < N; n *= 2, s /= 2) {
|
|
printf("static void ");
|
|
if (n < N / 2)
|
|
printf("dit%i", n * 2);
|
|
else
|
|
printf("forward");
|
|
printf("(complex_t *out, float *in)\n{\n");
|
|
printf("\tdit%i(out, in);\n", n);
|
|
printf("\tdit%i(out + %i, in + %i);\n", n, n, s);
|
|
printf("\tfor (int k0 = 0, k1 = %i, l1 = 0; k0 < %i; ++k0, ++k1, l1 += %i)\n", n, n, s);
|
|
printf("\t\tdft2(out + k0, out + k1, out[k0], cmul(radix2_z[l1], out[k1]));\n");
|
|
printf("}\n");
|
|
}
|
|
return 0;
|
|
}
|