Devo creare un programma in C/C++ che calcoli la trasformata di Fourier continua di una gaussiana centrata in x=5. Per fare questo considero la gaussiana ristretta all'intervallo x=-20 fino a x=30 (cioè, la finestra nella quale eseguo il sampling è larga T=50) e poi ne considero N=500 valori discreti presi con uno step di T/N=0.5.
Poi usando la libreria FFTW calcolo la dft diretta e da questa risalgo alla trasformata continua. E fin qui tutto bene; ottengo una gaussiana centrata nell'origine.
Il problema è che adesso voglio calcolare la dft inversa di questa gaussiana centrata nell'origine. Mi aspetto di ritrovare la funzione di partenza (la gaussiama centrata in x=5), ma invece ottengo una specie di U centrata nell'origine.
Il codice è questo:
- Codice: Seleziona tutto
double x;
int i;
for(i=0, x=-20; i<N; i++, x+=(T/N)) //Sample the Gaussian with time-step T/N (T=50 'cause I sample from x=-20 to x=30. N=500=# of sampling points)
{
in2[i][0] = 20*exp(-(x-5)*(x-5)); //Real part
in2[i][1] = 0; //Imaginary part
}
fftw_execute(fwd); //Calculate the direct dft of the sequence in in2 and store the result in out2
for(i=0, x=0; i<N; i++, x+=T/N) //Copy the result from out2 to in1
{
in1[i][0] = out2[i][0]; //Real part
in1[i][1] = out2[i][1]; //Imaginary part
}
fftw_execute(rew); //Execute the inverse Dft of the sequence in in1 and store the result in out1
//Draw the result with the function glVertex3f(x,y,z)
glBegin(GL_LINE_STRIP);
for(i=N/2; i<N; i++) glVertex3f((i-N)*2.*PI/T, 1./N*sqrt(out1[i][0]*out1[i][0]+out1[i][1]*out1[i][1]), 0);
for(i=0; i<=N/2; i++) glVertex3f(i*2.*PI/T, 1./N*sqrt(out1[i][0]*out1[i][0]+out1[i][1]*out1[i][1]),0);
glEnd();
Dov'è che sbaglio?


