#include #include #include #include #include #define DATA_L (1<<16) #define FP_acc (1<<16) #include "FFT_FP_realisation.h" void imagery2abs(int64_t* inp, uint32_t inp_L, int64_t *out_abs, int64_t *out_phase){ 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; int64_t phase = 0; printf("%lld, %ldd\n", (long long)val, (long long) phase); out_abs[i] = val; out_phase[i] = phase; } } 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] += lround(cos(((double)i)*2.0* PI/(N/20))*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,}; int64_t data_res_FFT_phase[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, data_res_FFT_phase); FILE *logfile_ptr; logfile_ptr = fopen(logfilename, "w"); fprintf(logfile_ptr, "X, Y, FFT_val, FFT_phase, FFT_Re, FFT_Im\n"); for (uint32_t i = 0; i < DATA_L; ++i){ fprintf(logfile_ptr, "%lld, %lg, %lg, %lg, %lg, %lg\n", (long long)data_X[i], ((double)data_Y[i])/(double)FP_acc , (double)data_res_FFT_abs[i]/(double)FP_acc, (double)data_res_FFT_phase[i]/(double)FP_acc, (double)data_res_FFT_imag[2*i]/(double)FP_acc, (double)data_res_FFT_imag[2*i +1]/(double)FP_acc ); } fclose(logfile_ptr); }