Una domanda sulla Discrete Fourier Transform.
Supponiamo che io abbia un' array di N elementi indicati da 0 a N-1 e voglia fare la trasformata discreta di fourier ottenendo così

coppie di seno (reale) e coseno(immaginario) applicherei le equazioni:
Per la parte reale
![ReX[k]=\sum_{i=0}^{N-1}x[i] cos(\frac{2\pi k i)}{N}) ReX[k]=\sum_{i=0}^{N-1}x[i] cos(\frac{2\pi k i)}{N})](/forum/latexrender/pictures/12dca33807d33520d1da9085bae4f21a.png)
e per la parte immaginaria
![ImX[k]=\sum_{i=0}^{N-1}x[i] sin(\frac{2\pi k i)}{N}) ImX[k]=\sum_{i=0}^{N-1}x[i] sin(\frac{2\pi k i)}{N})](/forum/latexrender/pictures/b05bfccc8581689d6bef4fd516cd55b8.png)
E fin qui tutto è chiaro, almeno a livello teorico.
Scendendo a livello pratico supponiamo che nella mia array abbia dei numeri positivi che vanno da 0 a 255 (campionamento ad 8 bit) il range di valori che otterrei nelle coppie va da - qualcosa a ...
Scusate l' imbranataggine ma non riesco a capirlo.
Edit: ho provato a scoprirlo scrivendo un programmino in C partendo da un' array di 256 campioni caricati da 0 a 255 (una rampa in poche parole) ed ottenendo un valore massimo (modulo) nella prima coppia di 32640 ed un valore minimo di 128. Stessa cosa se inverto i valori (caricando da 255 a 0)
Edit2: Ho anche provato a mettere un valore costante in tutti i campioni e giustamente i moduli delle coppie valgono tutti 0 eccetto che la prima coppia il cui modulo corrisponde al DC offset ma vale 65280.
Non so però come interpretare questi dati o se ho fatto tutto correttamente.
Mah!
Questo è il listato del programmino
- Codice: Seleziona tutto
#define PI 3.14159265
double campioni[256];
double Re[129];
double Im[129];
double modulo[129];
void azzeraCoppie(void)
{
int i;
for(i=0;i<129;i++) Re[i]=Im[i]=0;
}
void riempiCampioni(void)
{
int i;
for(i=0;i<256;i++)
{
campioni[i]=i;
//campioni[i]=255;
}
}
void analisi(void)
{
int i,k;
for(k=0;k<129;k++)
{
printf("%d \n",k);
for(i=0;i<256;i++)
{
Re[k] += campioni[i] * cos(2*PI*k*i/256);
Im[k] += campioni[i] * sin(2*PI*k*i/256);
}
}
// Calcola il modulo
for(k=0;k<129;k++)
{
modulo[k] = sqrt(Re[k]*Re[k] + Im[k]*Im[k]);
}
}
int main(void)
{
int i;
printf("Prova di DFT\n");
azzeraCoppie();
riempiCampioni();
printf("Inizio analisi\n");
analisi();
for(i=0;i<129;i++)
{
printf("Coppia %d %f %f %f \n",i,modulo[i],Re[i],Im[i]);
}
return 0;
}
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.