Ich versuche, diskrete Fourier-Transformationen in C durchzuführen.Diskrete Fourier-Transformation mit falschen Ergebnissen
Zunächst nur die Brute-Force-Methode. Zuerst ließ ich das Programm eine Datendatei (von Amplituden) öffnen und legte die Daten in ein Array (nur eins, da ich mich auf reellwertige Eingaben beschränke).
Aber die Transformation sah falsch aus, also versuchte ich stattdessen, eine einfache Wellenfunktion zu erzeugen und zu überprüfen, ob sie sich richtig transformiert.
Hier ist mein Code, beraubt Drum und Dran:
#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;
}
Das Programm erstellt, abgeschlossen ist, sondern von mehreren scharfen Spitzen auf einer Leistung (Frequenz) Plot, erhalte ich diese: .
Eine einzelne Frequenz oder verschiedene Frequenzen ergeben genau die umgekehrte Badewannenkurve.
Ich habe mehrere Quellen über die DFT und ich weiß immer noch nicht, was falsch läuft, es nicht mit der Funktion keine eklatanten Fehler zu sein scheint:
dftreal
selbst. Ich möchte um Hilfe bitten, was das Problem verursachen könnte. Ich verwende den MinGW-Compiler unter Windows 7. Danke!
Die DFT erfordert eine hohe Dezimalgenauigkeit. Haben Sie versucht, Ihre fprintf-Anweisungen zu ändern, damit sie mehr Dezimalstellen enthalten können? Wie% .10f oder mehr ... –