Files
FFT_and_FP_math/C/FP_math.c

57 lines
1.3 KiB
C

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
#define DATA_L (1<<16)
#define FP_acc 1000
#include "FFT_FP_realisation.h"
void imagery2abs(int64_t* inp, uint32_t inp_L, int64_t *out){
printf("+++++++++++++++++++++\n");
printf("calculating abs^2\n");
for (uint32_t i = 0; i < inp_L; ++i){
int64_t re = inp[i*2];
int64_t im = inp[i*2 +1];
int64_t val = (re * re + im * im) / FP_acc;
printf("%lld\n", (long long)val);
out[i] = val;
}
}
void data_generator(int64_t* X, int64_t* Y, uint32_t N){
for (int i = 0; i < N; ++i){
X[i] = (int64_t)i;
Y[i] = lround(sin(((double)i)*2.0* PI/(N/10))*FP_acc);
Y[i] += 1*FP_acc;
}
}
void main(){
char* logfilename = "tmp";
int64_t data_X[DATA_L] = {0,};
int64_t data_Y[DATA_L] = {0,};
int64_t data_res_FFT_imag[DATA_L*2] = {0,};
int64_t data_res_FFT_abs[DATA_L] = {0,};
fft_fp_prepare();
data_generator(data_X, data_Y, DATA_L);
FFT_fp(data_Y, DATA_L, data_res_FFT_imag);
imagery2abs(data_res_FFT_imag, DATA_L, data_res_FFT_abs);
FILE *logfile_ptr;
logfile_ptr = fopen(logfilename, "w");
fprintf(logfile_ptr, "X, Y, FFT\n");
for (uint32_t i = 0; i < DATA_L; ++i){
fprintf(logfile_ptr, "%lld, %lg, %lg \n", (long long)data_X[i], ((double)data_Y[i])/(double)FP_acc , (double)data_res_FFT_abs[i]/(double)FP_acc);
}
fclose(logfile_ptr);
}