Sto provando a fare trasformazioni discrete di Fourier in C.Trasformata di Fourier discreta che fornisce risultati errati
Inizialmente solo il metodo forza bruta. Per prima cosa ho avuto il programma aprire un file di dati (di ampiezze) e mettere i dati in un array (solo uno, dato che mi sto limitando a input di valore reale).
Ma la trasformazione sembrava errata, così invece ho cercato di generare una semplice funzione d'onda e controllare se si trasforma correttamente.
Ecco il mio codice, spogliato delle campane e fischietti:
#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;
}
Il programma viene compilato, completa, ma invece di diversi picchi taglienti su un terreno di alimentazione (frequenza), ottengo questo: .
Una singola frequenza o frequenze diverse danno la stessa identica curva della vasca da bagno invertita.
ho controllato diverse fonti circa la DFT e io ancora non so cosa non va, non sembrano essere eventuali errori evidenti con la funzione:
dftreal
stessa. Mi piacerebbe chiedere aiuto su ciò che potrebbe causare il problema. Sto usando il compilatore MinGW su Windows 7. Grazie!
Il DFT richiede una precisione decimale elevata. Hai provato a cambiare le tue dichiarazioni fprintf in modo che possano includere più decimali? Come% .10f o più ... –