TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
Loading...
Searching...
No Matches
fast_fourier_transform.cpp File Reference

A fast Fourier transform (FFT) is an algorithm that computes the discrete Fourier transform (DFT) of a sequence, or its inverse (IDFT). More...

#include <cassert>
#include <cmath>
#include <complex>
#include <cstdint>
#include <iostream>
#include <vector>
Include dependency graph for fast_fourier_transform.cpp:

Go to the source code of this file.

Namespaces

namespace  numerical_methods
 for assert
 

Functions

std::complex< double > * numerical_methods::FastFourierTransform (std::complex< double > *p, uint8_t n)
 FastFourierTransform is a recursive function which returns list of complex numbers.
 
static void test ()
 Self-test implementations.
 
int main (int argc, char const *argv[])
 Main function.
 

Detailed Description

A fast Fourier transform (FFT) is an algorithm that computes the discrete Fourier transform (DFT) of a sequence, or its inverse (IDFT).

This algorithm has application in use case scenario where a user wants to find points of a function in a short time by just using the coefficients of the polynomial function. It can be also used to find inverse fourier transform by just switching the value of omega. Time complexity this algorithm computes the DFT in O(nlogn) time in comparison to traditional O(n^2).

Author
Ameya Chawla

Definition in file fast_fourier_transform.cpp.

Function Documentation

◆ main()

int main ( int argc,
char const * argv[] )

Main function.

Parameters
argccommandline argument count (ignored)
argvcommandline array of arguments (ignored) calls automated test function to test the working of fast fourier transform.
Returns
0 on exit

Definition at line 163 of file fast_fourier_transform.cpp.

163 {
164 test(); // run self-test implementations
165 // with 2 defined test cases
166 return 0;
167}
static void test()
Self-test implementations.

◆ test()

static void test ( )
static

Self-test implementations.

Declaring two test cases and checking for the error in predicted and true value is less than 0.000000000001.

Returns
void

Test case 1

Test case 2

True Answer for test case 1

True Answer for test case 2

Temporary variable used to delete memory location of o1

Temporary variable used to delete memory location of o2

Comparing for both real and imaginary values for test case 1

Comparing for both real and imaginary values for test case 2

Definition at line 105 of file fast_fourier_transform.cpp.

105 {
106 /* descriptions of the following test */
107
108 auto *t1 = new std::complex<double>[2];
109 auto *t2 = new std::complex<double>[4];
110
111 t1[0] = {1, 0};
112 t1[1] = {2, 0};
113 t2[0] = {1, 0};
114 t2[1] = {2, 0};
115 t2[2] = {3, 0};
116 t2[3] = {4, 0};
117
118 uint8_t n1 = 2;
119 uint8_t n2 = 4;
120 std::vector<std::complex<double>> r1 = {
121 {3, 0}, {-1, 0}};
122
123 std::vector<std::complex<double>> r2 = {
124 {10, 0}, {-2, -2}, {-2, 0}, {-2, 2}};
125
126 std::complex<double> *o1 = numerical_methods::FastFourierTransform(t1, n1);
127 std::complex<double> *t3 =
128 o1;
129 std::complex<double> *o2 = numerical_methods::FastFourierTransform(t2, n2);
130 std::complex<double> *t4 =
131 o2;
132 for (uint8_t i = 0; i < n1; i++) {
133 assert((r1[i].real() - o1->real() < 0.000000000001) &&
134 (r1[i].imag() - o1->imag() <
135 0.000000000001));
137 o1++;
138 }
139
140 for (uint8_t i = 0; i < n2; i++) {
141 assert((r2[i].real() - o2->real() < 0.000000000001) &&
142 (r2[i].imag() - o2->imag() <
143 0.000000000001));
145 o2++;
146 }
147
148 delete[] t1;
149 delete[] t2;
150 delete[] t3;
151 delete[] t4;
152 std::cout << "All tests have successfully passed!\n";
153}
std::complex< double > * FastFourierTransform(std::complex< double > *p, uint8_t n)
FastFourierTransform is a recursive function which returns list of complex numbers.