Newsgroup: it.comp.lang.c
Titolo: Aiuto per la fft

Salve a tutti,
sto cercando di tirar fuori la fft da file Wave Pcm quantizzati su 24
bit e campionati alla freq di 48 KHz (file un po' inusuali visto che
sono quasi tutti su 16 bit e 44100 Hz).
Per far ciò e soprattutto per capire la fft mi sono creato un file di
testo (invL.log) con all'interno il valore intero di 48000 campioni di
una sinusoide a 3000 Hz quantizzata su 24 bit e a -6dB e campionata
alla freq di 48000 Hz. Quindi 1 secondo.
48000/3000=16 campioni esatti per sinusoide e ricavati da una formula
tipo val=pow(10,dB/10.0)*pow(2,23)*sin((2*PI*(freqsin*i))/48000)
risultano essere
0
806361
1489961
1946727
2107123
1946727
1489961
806361
0
-806361
-1489961
-1946727
-2107123
-1946727
-1489961
-806361
replicati quindi per 3000 volte nel file di testo in modo da avere 1
secondo = 48000 campioni e verificando che gli ultimi fossero sempre
una replica dei primi (in quanto la formula deriva).
Ho compilato il sorgente trovato all'indirizzo
http://www.gweep.net/~rocko/FFT/fft.c
e fatto girare ottenendo i seguenti risultati (ho fatto solo una
piccola modifica al sorgente in modo che mi stampasse anche il valore
del canale "i"):
----------------caso 1-----------------
$> ./fft invL.log 1024 2 > 1024.txt
$> grep -v '^0.0' 1024.txt
//delle 1024 righe faccio stampare solo quelle che non cominciano con
0.0
103214208.000000                i=64
103214208.000000                i=576
----------------caso 2-----------------
$> ./fft invL.log 2048 2 > 2048.txt
$> grep -v '^0.0' 2048.txt
903685187.059279                i=128
206428416.000000                i=384
381430016.000000                i=640
237246218.346880                i=1152
206428416.000000                i=1408
381430016.000000                i=1664
----------------caso 3-----------------
$> ./fft invL.log 4096 2 > 4096.txt
$> grep -v '^0.0' 4096.txt
4315387138
.760638               i=256
287.007774                      i=768
232.114227                      i=1280
820.132909                      i=1792
820.132909                      i=2304
232.114227                      i=2816
287.007774                      i=3328
4315387138
.760638               i=3840
---------------------------------------
Non riesco a capire attraverso i vari risultati ottenuti:
1- come suddividere le frequenze nei vari canali;
2- se considerare tutti i canali o solo la metà superiore o quella
inferiore;
3- se considero solo la metà dei canali posso buttare completamente
l'altra o devo sommare specularmente (in che modo?) i risultati;
4- perchè il caso 2 sembra un po' anomalo sia per la diversa
specularità che per i valori non trascurabili;
5- dove ritrovo la mia frequenza a 3000 Hz e perchè ci sono altre
frequenze spurie;
6- se di tutti i 48000 valori del file invL.txt il programma considera
rispettivamente solo i primi 1024, 2048, 4096 valori;
7- se quindi dovrei far scorrere (di 1 o di 512/1024/2048 o di
1024/2048/4096 valori alla volta) la finestra per considerare i
successivi valori per le varie istantanee della fft.
Vi ringrazio per l'attenzione e anticipatamente per la collaborazione.
Tommaso Depalma
--
studente al Politecnico di Torino
in ingegneria delle Telecomunicazioni
email: 
no_spam...@email.it

 Non riesco a capire attraverso i vari risultati ottenuti:
Sei nel posto sbagliato, dato che qui si discute del linguaggio C 
(mentre il tuo e` un problema indipendente da esso). Ti consiglierei un 
newsgroup piu` appropriato (cosi` su due piedi direi it.comp.programmare 
o uno relativo all'argomento ``campionamento audio'').