Algorithms_in_C++ 1.0.0
Set of algorithms implemented in C++.
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 <iostream>
#include <vector>
Include dependency graph for fast_fourier_transform.cpp:

Namespaces

namespace  numerical_methods
 for IO operations
 

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. More...
 
static void test ()
 Self-test implementations. More...
 
int main (int argc, char const *argv[])
 Main function. More...
 

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

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
161 {
162 test(); // run self-test implementations
163 // with 2 defined test cases
164 return 0;
165}
static void test()
Self-test implementations.
Definition: fast_fourier_transform.cpp:104
Here is the call graph for this function:

◆ 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

104 {
105 /* descriptions of the following test */
106
107 auto *t1 = new std::complex<double>[2]; /// Test case 1
108 auto *t2 = new std::complex<double>[4]; /// Test case 2
109
110 t1[0] = {1, 0};
111 t1[1] = {2, 0};
112 t2[0] = {1, 0};
113 t2[1] = {2, 0};
114 t2[2] = {3, 0};
115 t2[3] = {4, 0};
116
117 uint8_t n1 = 2;
118 uint8_t n2 = 4;
120 {3, 0}, {-1, 0}}; /// True Answer for test case 1
121
123 {10, 0}, {-2, -2}, {-2, 0}, {-2, 2}}; /// True Answer for test case 2
124
126 std::complex<double> *t3=o1; /// Temporary variable used to delete memory location of o1
128 std::complex<double> *t4=o2; /// Temporary variable used to delete memory location of o2
129 for (uint8_t i = 0; i < n1; i++) {
130 assert((r1[i].real() - o1->real() < 0.000000000001) &&
131 (r1[i].imag() - o1->imag() <
132 0.000000000001)); /// Comparing for both real and imaginary
133 /// values for test case 1
134 o1++;
135 }
136
137 for (uint8_t i = 0; i < n2; i++) {
138 assert((r2[i].real() - o2->real() < 0.000000000001) &&
139 (r2[i].imag() - o2->imag() <
140 0.000000000001)); /// Comparing for both real and imaginary
141 /// values for test case 2
142 o2++;
143 }
144
145
146 delete[] t1;
147 delete[] t2;
148 delete[] t3;
149 delete[] t4;
150 std::cout << "All tests have successfully passed!\n";
151}
T imag(T... args)
std::complex< double > * FastFourierTransform(std::complex< double > *p, uint8_t n)
FastFourierTransform is a recursive function which returns list of complex numbers.
Definition: fast_fourier_transform.cpp:40
T real(T... args)
Here is the call graph for this function: