I'm trying to write simple DFT and IDFT functions which will be my core for future projects. Trouble means that IDFT returns different value from input value, and i can't understand, where is the mistake. Below my source code:
vector<double> input; vector<double> result; vector<complex<double>> output; double IDFT(int n) { double a = 0; double b = 0; int N = output.size(); for(int k = 0; k < N; k++) { double value = abs(output[k]); a+= cos((2 * M_PI * k * n) / N) * value; b+= sin((2 * M_PI * k * n) / N) * value; } complex<double> temp(a, b); double result = abs(temp); result /= N; return result; } complex<double> DFT(double in, int k) { double a = 0; double b = 0; int N = input.size(); for(int n = 0; n < N; n++) { a+= cos((2 * M_PI * k * n) / N) * input[n]; b+= -sin((2 * M_PI * k * n) / N) * input[n]; } complex<double> temp(a, b); return temp; } int main() { input.push_back(55); input.push_back(15); input.push_back(86); input.push_back(24); input.push_back(66); input.push_back(245); input.push_back(76); for(int k = 0; k < input.size(); k++) { output.push_back(DFT(input[k], k)); cout << "#" << k << ":\t" << input[k] << " \t>> abs: " << abs(output[k]) << " >> phase: " << arg(output[k]) << endl; } for(int n = 0; n < output.size(); n++) { result.push_back(IDFT(n)); cout << result[n] << endl; } return 0; }