Skip to content

Instantly share code, notes, and snippets.

@lukicdarkoo
Last active July 21, 2024 20:18
Show Gist options
  • Save lukicdarkoo/3f0d056e9244784f8b4a to your computer and use it in GitHub Desktop.
Save lukicdarkoo/3f0d056e9244784f8b4a to your computer and use it in GitHub Desktop.
Basic implementation of Cooley-Tukey FFT algorithm in C++
#include "FFT.h"
void fft(int *x_in,
std::complex<double> *x_out,
int N) {
// Make copy of array and apply window
for (int i = 0; i < N; i++) {
x_out[i] = std::complex<double>(x_in[i], 0);
x_out[i] *= 1; // Window
}
// Start recursion
fft_rec(x_out, N);
}
void fft_rec(std::complex<double> *x, int N) {
// Check if it is splitted enough
if (N <= 1) {
return;
}
// Split even and odd
std::complex<double> odd[N/2];
std::complex<double> even[N/2];
for (int i = 0; i < N / 2; i++) {
even[i] = x[i*2];
odd[i] = x[i*2+1];
}
// Split on tasks
fft_rec(even, N/2);
fft_rec(odd, N/2);
// Calculate DFT
for (int k = 0; k < N / 2; k++) {
std::complex<double> t = exp(std::complex<double>(0, -2 * M_PI * k / N)) * odd[k];
x[k] = even[k] + t;
x[N / 2 + k] = even[k] - t;
}
}
/* ---------------------------------------------------------------------------
** Basic implementation of Cooley-Tukey FFT algorithm in C++
**
** Author: Darko Lukic <[email protected]>
** -------------------------------------------------------------------------*/
#ifndef FFT_h
#define FFT_h
#include <cmath>
#include <complex>
extern void fft(int *x_in,
std::complex<double> *x_out,
int N);
void fft_rec(std::complex<double> *x, int N);
#endif
@boggodan
Copy link

This is a great implementation. No weird data types and building stuff with cmake, just basic, working code.

@funham
Copy link

funham commented Mar 10, 2021

This is pretty good, but is it actually Cooley-Tukey FFT algorithm? I am looking for a non-recursive FFT algotithm...

@sort-nlogn
Copy link

It won't give you proper results in case if you want to do some signal processing with it, since, for example, fft of [1, 2, 3] and same signal padded with zero to nearest power of 2 give you completely different results. So i still wondering how to deal with it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment