Я пытаюсь сделать дискретные преобразования Фурье в C.
Сначала просто методом грубой силы. Сначала я попросил программу открыть файл данных (амплитуд) и поместить данные в массив (только один, так как я ограничиваюсь вводом вещественных значений).
Но преобразование выглядело неправильно, поэтому вместо этого я попытался сгенерировать простую волновую функцию и проверить, правильно ли она преобразуется.
Вот мой код, лишенный наворотов:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M_PI 3.14159265358979323846
//the test wavefunction
double theoretical(double t)
{
double a = sin(M_PI * t) + 2 * sin(2 * M_PI * t) + 4 * sin(4 * M_PI * t);
return a;
}
//-------------------------------------------------------------------------
void dftreal(double inreal[], double outreal[], double outimag[], int linecount)
{
int n, k;
for (k = 0; k < linecount; k++)
{
double sumreal = 0;
double sumimag = 0;
for (n = 0; n < linecount; n++)
{
double angle = 2 * M_PI * n * ( k / (double) linecount);
sumreal += inreal[n] * cos(angle);
sumimag += inreal[n] * sin(angle);
}
outreal[k] = sumreal;
outimag[k] = sumimag;
}
}
//=========================================================================
int main(void)
{
int linecount = 44100;
//creates all necessary arrays
double inreal[linecount], outreal[linecount], outimag[linecount], p[linecount];
FILE *fout = fopen("Output.txt", "w");
for (int i = 0 ; i < linecount ; ++i)
{
inreal[i] = theoretical( i / (double) linecount);
}
//actually computes the transform
dftreal(inreal, outreal, outimag, linecount);
for (int i = 0 ; i < linecount ; ++i)
{
p[i] = 2*(outreal[i] * outreal[i] + outimag[i] * outimag[i]);
fprintf(fout, "%f %f \n", (i / (double) linecount), p[i]);
}
fclose(fout);
printf("\nEnd of program");
getchar();
return 0;
}
Программа компилируется, завершается, но вместо нескольких острых пиков на графике мощности (частоты) я получаю следующее: .
Одна частота или разные частоты дают точно такую же кривую перевернутой ванны.
Я проверил несколько источников о ДПФ, и я до сих пор не знаю, что происходит не так, вроде бы нет никаких вопиющих ошибок с функцией:
dftreal
сам. Я хотел бы попросить помощи в том, что может быть причиной проблемы. Я использую компилятор MinGW в Windows 7. Спасибо!