Repost BG100 - Vector FFT/iFFT Implementation in C

Register
Submit a solution
The challenge is finished.

Challenge Overview

Our client BG100 has a vector of samples representing Complex numbers with real and imaginary parts in the range -1.0 <= x < 1.0, mapped to 16 bit integers as int(x * 2^16), so that -1.0 is mapped to -32768 and (1.0 – 1.0/32768.0) is mapped to 32767.

As part of this challenge, we need to create a set of functions, callable from a C program that performs fixed point 1536 points FFT and inverse FFT of such vectors, optimized for the x86 AVX2 architecture.

Detailed requirements

The Complex numbers are defined as following:

typedef struct {

 int16_t re;

 int16_t im;

} Complex;

 

The twiddle factors needed should be initialized at run-time.

The function prototypes may look like:

 

void init_fft();  // Initialize FFT twiddle factors

void fft(Complex *out, Complex *in);  // Perform out = FFT(in)

 

void init_ifft();  // Initialize inverse FFT twiddle factors

void ifft(Complex *out, Complex *in); // Perform out = inverse FFT(in)

 

Each function should also print the CPU time and the CPU cycles used.

IMPORTANT! In order for a submission to be considered eligible, all intermediate calculations must be performed in the 16 bit format. Any conversions to/from fp32, for example, are not permitted.

NOTE: Customer expects the Library to work on a single core as a pure library. Solutions that spawn additional worker-threads, are not valid and will be rejected.

 


Final Submission Guidelines

Please submit your source code in a zip file including a detailed deployment guide and an explanation of your implementation.

ELIGIBLE EVENTS:

2018 Topcoder(R) Open

Review style

Final Review

Community Review Board

Approval

User Sign-Off

ID: 30062754