Newsgroup: it.scienza.informatica
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

Ciao,
non sono un informatico ma un grafico. Sto cercando anche io di capirci
qualcosa in materia per la FFT.
In pratica mi servirebbe un SW capace di scrivermi un file ascii con i dati
dello spettro per 1 ottava (11 frequenze) o anche più per ricostruire un
analizzatore di spettro con flash mx o director.
Purtroppo però la maggior parte dei SW sono in tempo reale e quindi perdono
i dati quando scrivono cono un intervallo di 40ms/s.
Nelle mie ricerche (tra cui anche come implementare la FFT con Javascript)
ho trovato queste pagine. Ci sono in giro molte librerie dll e source code
in C.
Se ti possono interessare:
http://www.yov408.com/html/tutorials.php?page=2&section=8
Ciao
Max