Ciao ragazzi è da un po' che manco...causa...1000 cause
CITAZIONE
Il Gila è un pò testardo, ma quando parte non lo ferma nessuno.
Vedo che mi conosci bene Law!!!
Quando una cosa m'interessa, cerco d'impegnarmi. Poi la dft,fft (insomma la trasformata di Fourie), è uno strumento matematico
talmente potente, che vale la pena di studiare un po'.
Purtroppo nella trasformata inversa ho qualche problema...non mi riesce.
Comunque nel frattempo, mi sono messo anche a studiare la libreria FFTW3 presente in gcc (Linux).
A differenza della dft che ho scritto io, è un fulmine, anche se non sono entrato nei dettagli tecnici/matematici.
Però ci sono cose un po' oscure che vorrei chiarire:
Nella "mia" dft, con due cicli for andavo a scansionare un insieme di dati, diciamo da 0 a x per un range di frequenza da 0 a y es:
for (r=0; r<1000; r++)
{
w=0;
somma=0;
somma_2=0;
for (j=0; j<2000; j++ )
{
res=(campioni[j]*cos(w*r*2*M_PI)); //calcolo parte real
somma=somma+res;
real[k]=real[k]+somma;
//_______________________________________________
res=(campioni[j]*sin(w*r*2*M_PI)); //calcolo parte immaginaria
somma_2=somma_2+res;
unreal[k]=unreal[k]+somma_2;
risultato_dft[k]=sqrt( (real[k]*real[k])+ (unreal[k]*unreal[k]));
w=w+0.000125; //(inverso frequenza campionamento 1/8000)
}
k++;
}Come potete notare, ho due cicli for:con il ciclo r vado ad analizzare frequenze da 0-1000 e con il cilclo j, vado a scansionare
l'array dal dato 0 a 2000.
quindi analizzo i dati a 8,16,32 bits che vanno da 0 a 2000 e posso analizzare solo frequenze minori di 1000.
Così facendo ho una risoluzione di 1hz, bella precisa.
In effetti registrando da microfono i toni dtmf, salvandoli in wave e sottoponendoli a dft, la singola frequenza viene rilevata ottimamente.
Con la fft invece ho una situazione diversa, e vorrei capire se ragiono nel verso giusto.
Abbiamo una traccia audio supponiamo.
Scegliamo una finestra di osservazione a 128,256,512 punti.
Per natura della FFT la finestra per una massima prestazione deve essere una potenza del 2, non so bene il perchè, dettagli puramente tecnici, che per ora
non mi interessano.
La cosa "scocciante", è che non è detto che con la fft si abbia una risoluzione di 1 hz preciso.
Mi spiego:
Traccia a sample rate 44100 Hz (formato cd).
La massima frequenza riproducibile senza incorrere in alias (non so se si dice così), è 44100/2=22050 (teorema di Nyquist).
Supponiamo che la nostra finestra (e ne esistono di vari tipi, ma per ora tralasciamo) sia di 4096.
Il minimo step in Hz che posso leggere, se non ho preso granchi è:
(44100/2)/(4096/2)=22050/2048=10.76 Hz
Giusto?
Logicamente se aumento i punti della finestra a parità di sample_rate la risoluzione aumenta.
Un'altra particolarità che ho notato usando la fftw3, che contiene un sacco di routine diverse, è che su una finestra esempio di 1024
i pesi delle frequenze dati da sqr (parte_reale)*(parte_reale)+(parte_immag.)*(parte_immag.)
Sono nella prima metà e nella seconda metà della finestra
0------>512 pesi frequenza fondamentale
512---->1024 pesi frequenza fondamentale ridondanti.
esempio : a 1024 punti la frequenza fondamentale è in posizione 10, quella ridondante è a 512-10=502
Credo che la parte ridondante sia la parte negativa.
Ad ogni modo non si visualizza e non si tiene in considerazione a meno che si debba operare un filtraggio.
Allora in quel caso va modificata anche la parte ridondande, per poi darla in pasto alla FFT inversa.
Un'altra cosa che ho notato: nella mia dft le linee spettrali erano in perfetto accordo con la potenza associata a quella frequenza:
100 hz "forza" 5
50 hz "forza" 10
la linea spettrale dei 50 hz, è perfettamente il doppio rispetto a quella dei 100 hz.
Con la fft da libreria, non è così.
Forse la routine di default non usa una finestra rettangolare, o forse il tutto è logaritmico, non so.
Comunque al di la di tutto, mi piacerebbe capire se i miei ragionamenti sono esatti.
Analizzando per esempio un wave di 200000 campioni con una finestra da 1024, per avere lo spettro totale dovrei fare 200000/1024=195.3 fft giusto?
la prima finestra da 1024 punti, mi fa la fft SOLO di quel punto no?
a 44100 hz sample_rate con 1024 punti andrei ad analizzare la traccia da 0 secondi a:
1/44100*1024=0.0232*1000=23.219 millisecondi
Grazie a tutti...e scusate per la lunghezza
Edited by GILA75 - 12/1/2015, 20:02