DFT e FFT

« Older   Newer »
  Share  
Elemento 38
view post Posted on 10/1/2011, 21:02




Aggiornamento.
Il programma iniziale ha un piccolo bug ... usando variabili double per aumentare la precisione il sistema va in overflow con la funzione abs() (valore assoluto), bisogna toglierla. Inoltre non si può fare variabile^2 per elevare al quadrato una variabile(in questo modo si fa una sorta di EX-OR), conviene moltiplicare la variabile per se stessa.
Con questi accorgimenti lo spettro migliora a vista d'occhio, anche se devo ancora capire perché le ampiezze delle varie armoniche sono sempre sbagliate (anche se sono in proporzione).
image
 
Top
view post Posted on 11/1/2011, 08:45
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Per fare quel tipo di calcoli forse sarebbe meglio usare variabili float o real.
Gli integer anche se double non sono un granchè. :unsure:
 
Web  Top
Elemento 38
view post Posted on 11/1/2011, 14:26




I double nel mio compilatore sono come i float ma a doppia precisione :unsure:
 
Top
view post Posted on 11/1/2011, 15:22
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Uhm... di solito integer sono da 0 a 65536. Signed integer sono da -32768 a +32767 ovvero si parla di 16 bit. I double sono a 32 bit e si va -2,147,483,648 a +2,147,483,647 se sono signed oppure da 0 a 4,294,967,295 senza decimali. Mentre i float o real sono trattati in modo diverso ma di solito con una precisione superiore ai double con in più la mantissa e l'esponente. Se un'operazione che comprende operazioni di analisi geometrica o logaritmi viene eseguita con numeri interi anche se di precisione alta si perde sempre qualcosa. In alcuni compilatori, specialmente in "c" mi pare di ricordare, si possono eseguire operazioni promiscue, tra variabili o costanti intere e float. Se il risultato va a finire dentro una variabile integer o double integer la parte decimale si perde ma il risultato che resta, pur mancando della parte decimale non è una tavanata ma non è neppure una buona approssimazione, non so se mi spiego. Forse, con i compilatori moderni hanno riparato a questi casini, che poi, alla fin dei conti basta saperlo che può anche essere utile, o forse no. O peggio, qualcuno si qualcuno no... :lol:
 
Web  Top
Elemento 38
view post Posted on 11/1/2011, 16:31




Ecco quelli che te chiami double io nel compilatore li dichiaro come long int ... i double sono float a 8 byte (64 bit, mentre i float sono a 32), che mi permette valori compresi fra 1,7 x 10^-308 e 1,7 x 10^308 (con 15 cifre significative). Ci sarebbero anche i long double a 10 byte, ma non li ho mai usati (16 cifre significative e numeri immensi).
 
Top
view post Posted on 11/1/2011, 18:05
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Dunque, per essere precisi la faccenda del "double" non è relativa al tipo di numero ma alla precisione riferita alla larghezza di parole del processore. Almeno, ai miei tempi era così. Perciò, in un processore a 8 bit, single precision era un numero ad 8 bit codificato come ti pare, quindi signed integer da -128 a +127, integer da 0 a 255 o character codificato ascii. Un double per un processore a 8 bit è un numero codificato da due byte. Quindi un numero da -322768 a +32767 nel caso si tratti di un double signed integer o di un double integer da 0 a 65535. D'altro canto per un processore a 128 bit di larghezza di parola questo significa 16 byte nei quali può essere contenuto direttamente un floating point e nel caso sia double si parla di un double floating point da 32 bye tra segno mantissa ed esponente (una cosa paurosa). Riassumendo, un "double" non è necessariamente un float.
Per complicare le cose:
Se usi un compilatore che è stato disegnato per macchine a 32 bit un double float è un numero composto da 64 bit ovvero 8 byte o due word da 4 byte.
Credo che fosse la IEEE754 che dettasse che un double float fosse a 64 bit, cioè 8 byte, che implica un processore da 32 bit di word. Questo però, non implica il fatto di avere dei double integer, dove un integer può essere da 2 byte ovvero da 1 bit, mentre il long è da 4 byte ovvero double nel caso di macchine da 16 bit o single in macchine da 32 bit...
Quindi, potendo usare un compilatore per 80386 su macchine compatibili fino a 256 bit di larghezza di parola alla fine non ci si capisce più un ciufulo. :wacko:
 
Web  Top
view post Posted on 6/9/2014, 20:32
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Caio a tutti ragazzi, manco da tantissimissimo tempo, spero tutto bene :)
Riesumo questa vecchia discussione.
Ho convertito un file mp3 in formato wav con audacity, gli mp3 sono troppo complessi per fare prove.
Ho usato audacity per farlo.
Mi sono scritto un programma in C che fa la copia (usando files binari) e tutto è ok.
Andando a vedere il protocollo del file wav, si deduce che i dati di campionamento (a 16 bits o 8 a seconda), partono dal byte numero 44.
Tenendo di quanti byte sono stati copiati, una volta arrivati al 44, si può leggere il suono che è stato quantizzato.
Ora, per il discorso fatto sopra in precedenti post, il valore anche alto esempio 30000 su 32767, non rappresenta una frequenza alta, ma
solo il livello sonoro.
Di fatto la traccia intera è composta da numeri che ricomposti danno le varie frequenze.
Ora, io mi domando, come faccio per esempio a fare un filtro passa-basso di tot hz ?
Come faccio a determinare quali numeri andranno a comporre quella frequenza?
piccolo spaccato di onda sinusoidale a 440hz risoluzione 8 bits frequenza campionamento 8 kkz:
0
-128
-85
-48
-19
-4
-3
-17
-45
-82
-125
88
50
20
4
2
14
41
77
120
-93
-54
-23
-5
-2
-14
-39
-74
-117
96
56
25
6
1
11
35
70
112
-101
-60
-28
-8
-2
-10
-33
-67
-109
104
63
30
8
1
8
30
63
104
-109
-67
-33
-10
-2
-8
-28
-60
....

Sicuramente nei programmi tipo audacity, quando vuoi fare un filtro, andrà a scartabellare tra i vari campioni con la FFT.
Mi domandavo come si possa fare, e se posso farlo, non avendo solide basi di matematica avanzata.
Magari esistono programmi per fare tutto ciò, senza impazzire troppo con la teoria che credo sia un po' fuori dalla mia portata.
Grazie a tutti :)
 
Top
view post Posted on 8/9/2014, 08:42
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Ciao Gila e ben risentito.
I numeri che descrivono il campione audio, in effetti, indicano il livello della tensione in uscita per quel campione nel dominio dei campioni. Ovvero in un piano cartesiano le ascisse indicano il tempo ovvero il numero di campioni per secondo, mentre le ordinate indicano il livello del segnale campionato. I campioni integrati insieme (il lavoro che fa il DAC) produce l'onda sonora.
Ora, la domanda è come filtrare matematicamente il segnale prima di riconvertirlo.
La risposta non è delle più semplici e ci vuole molto molto molto tempo e non credo che si possa ottenere più di tanto tramite post. Però a grandi linee si tratta di questo:

https://ccrma.stanford.edu/~jos/filters/

ora mi si dirà che è in inglese e che è terribilmente incasinato. Si, è così. Ma non so cosa farci.
Una alternativa è impiegare processori digitali tipo questi:

http://www.freescale.com/webapp/sps/site/o...&cid=ps47ky8e7y

ma ancora non è semplice. Infine, ci sono i vecchi filtri analogici, meno versatili, ma hanno sempre fatto il loro mestiere.
 
Web  Top
view post Posted on 8/9/2014, 17:35
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ciao Law piacere anche da parte mia risentirti :)
Il discorso è che mi sono imbattuto un po' per caso nei file wav.
Copiando dal byte 44 hai tutto il campionamento, che come abbiamo detto indica la pressione sonora.
mi domandavo come fanno determinati programmi a operare come filtri ecc...
Il dubbio nasce proprio dal fatto che apparentemente non hai più memoria delle frequenze , ma solo dell'intensità.
Evidentemente, visto che le FFT funzionano, le cose non stanno così.
Copiando su un file txt il contenuto dell'array che inizia dal byte 44, ricompongo la forma d'onda:


[IMG]nUQxMiil[/IMG]

Questa è solo una porzione di una frequenza a 440 hz che dura 5 secondi.
La cosa che ho pensato, è che si potrebbe risalire alla frequenza in base alla pendenza (angolo) che c'è tra un campionamento e l'altro.
Se io ho 440hz, 8bits di risoluzione e un campionamento di 8000 hz, tra un campione e l'altro, dovrò seguire un certo angolo caratteristico di quella
frequenza sinusoidale. Trigonometria nuda e cruda.
Andare però a capire in una canzone, che è un gauzzabuglio di frequenza, quali campioni siano adibiti a tot herz, però non è affatto semplice.
Se io modifico dei valori, vado a cambiare i campioni che compongono l'onda dell'immagine sopra, ma la frequenza rimane sempre 440 hz, al limite
distorco il suono e basta.
Poi non mi è chiara una cosa: analizzando con audacity lo spettro, si vede che la frequenza principale è 440 hz, ma ho in insieme di frequenze che compongono
lo spettro. In un oscillatore, posso capire, chissà le porcherie che verranno introdotte, ma in un onda sinusoidale creata a pc, che segue una formula, che in definitiva
e la funzione seno, come è possibile??
La mia spiegazione,a logica,è che per avere un'onda pura, dovrei avere una frequenza di campionamento infinita giusto?
Tra due campioni adiacenti, ho comunque un salto, che sarà ricostruito (mi pare di aver letto tramite interpolazione), ma comunque c'è perdita d'informazione, no?
Diciamo che per quanto posso avvicinare due campioni, rimane sempre spazio, che potrei sempre scomporre in sotto frequenze, no?
Se invece i campioni fossero infiniti (il che non è fattibile) dovrei avere un'onda pura.
Tutto quello proposto da Elemento 38 (che per altro saluto :) ), devo ancora sperimentarlo.
Purtroppo per la fft ci vuole un bagaglio matematico che io non possiedo...mannaggia a me! Ma numeri e calcoli a parte, mi piacerebbe capire.
I link,li guardo domani che sono a casa dal lavoro, grazie Law.
Come vedi è passato il tempo ma i post farneticanti li so fare ancora :)

Edited by GILA75 - 8/9/2014, 19:02
 
Top
view post Posted on 9/9/2014, 08:35
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Se ho capito bene ciò che ti sfugge è che i campioni sono rilevati a tempo costante. Ovvero, per un campionamento con una frequenza di 20kH il tuo convertitore A/D effettua una conversione ogni 1/20 e3 Hz=5 e-5Sec=50uSec. Cioè ogni 50 microsecondi viene letto il valore di tensione del segnale audio. Se prendi questi valori rilevati come numero a 16bit e li rimandi dentro un convertitore DAC questo ad ogni campione fa seguire in uscita il valore corrispondente ricostruendo la forma d'onda originale più il segnale di campionamento a 20kHz da filtrare. Quindi la base dei tempi è data dalla frequenza di campionamento. Niente trigonometria strana.
Ogni forma d'onda ha le sue armoniche. Ovvero, non è perfetta. Peggio se generata con un sistema digitale. Inoltre, se ci fai caso l'ampiezza delle armoniche è in dB quindi, non è lineare. Insomma, se vedi l'ampiezza di una armonica questa può essere di qualche millivolt rispetto alla fondamentale di 1volt. Fatti un'idea prima delle grandezze con cui hai a che fare prima di tentare filtraggi.
Poi, passiamo alla analisi FFT... Le trasformazioni di una serie, ovvero di una certa quantità di campioni, e quindi se i campioni sono fatti a tempo costante anche la frequenza viene implicata, non è altro che la trasformata di fourier nel dominio dei campioni (asse x numero di campioni e quindi campioni legati al tempo, campioni legati alla frequenza, della f(t) ) eseguendo la trasformata della forma d'onda ottieni il valore della V(t) di ogni gruppo di campioni nel dominio delle frequenze. Ovviamente, devi fare sequenzialmente, la trasformata di una finestra di campioni.
 
Web  Top
view post Posted on 9/9/2014, 09:51
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
Se ho capito bene ciò che ti sfugge è che i campioni sono rilevati a tempo costante. Ovvero, per un campionamento con una frequenza di 20kH il tuo convertitore A/D effettua una conversione ogni 1/20 e3 Hz=5 e-5Sec=50uSec. Cioè ogni 50 microsecondi viene letto il valore di tensione del segnale audio. Se prendi questi valori rilevati come numero a 16bit e li rimandi dentro un convertitore DAC questo ad ogni campione fa seguire in uscita il valore corrispondente ricostruendo la forma d'onda originale più il segnale di campionamento a 20kHz da filtrare. Quindi la base dei tempi è data dalla frequenza di campionamento. Niente trigonometria strana.

Fin qui ci sono.
CITAZIONE
Poi, passiamo alla analisi FFT... Le trasformazioni di una serie, ovvero di una certa quantità di campioni, e quindi se i campioni sono fatti a tempo costante anche la frequenza viene implicata, non è altro che la trasformata di fourier nel dominio dei campioni (asse x numero di campioni e quindi campioni legati al tempo, campioni legati alla frequenza, della f(t) ) eseguendo la trasformata della forma d'onda ottieni il valore della V(t) di ogni gruppo di campioni nel dominio delle frequenze. Ovviamente, devi fare sequenzialmente, la trasformata di una finestra di campioni.

Questo non capisco, e forse se no si ha basi, non lo si può capire, comunque.
Vorrei capire, se riesci a spiegarmi in modo semplice (ho girato il web ,ma è troppo complessa la cosa).
Una fft, per esempio su un campione di dati, credo che necessiti di alcume cose: frequenza campionamento e risoluzione adottata, giusto?
Il legame tra il tempo intercorso tra un campione e l'latro, e l'ampiezza dei segnali adiacenti, dovrebbero ricostruire la frequenza.
Ma l'operazione base qual'è?
8000 hz di campionamento, ovvero 1/8000=0.000125 secondi ,valore campione esempio 210, come li uso sti dati?
Da un pdf ho trovato:

CITAZIONE
Per determinare lo spettro del segnale campionato è sufficiente ricordare che al prodotto
algebrico nel tempo corrisponde il prodotto di convoluzione nel dominio della frequenza:

Sto cercando di capire!!!
Io in un file, ho tutti i 40kb che compongono una canzone wav, e vorrei "truccarla".
In teoria dovrei mandare alla fft i 40kb, dire a che frequenza sono campionati, poi a blocchi di mettiamo 1000 byte eseguire la fft.
Questa mi restituisce la frequenza, poi con un controllo dire: è nella gamma che posso modificare? si..fai, no...non fai.
Scusa Law se ti tiro matto, ma il succo della faccenda è come fare a capire come legare il tempo dei campioni con l'intensità.
Molto probabilmente sul web c'è, ma in linguaggio matematico, con simboli che purtroppo non conosco.
Se hai tempo è voglia...mi piacerebbe molto capire
Poi al limite mi scrivo un programma in C con i dati che ho raccolto nel file contenente i campioni, e vedo che salta fuori.
 
Top
view post Posted on 9/9/2014, 14:54
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ho trovato un tool che fa la fft, immettendo i campioni del file wav, in questo caso ne ho immesso sono una porzione che rappresenterebbe 23 onde a 440hz.


solo che non so come interpretare i dati. Non voglio entrare nel rigore matematico, ma solo capire cosa rappresentano, se è possibile.
 
Top
view post Posted on 11/9/2014, 08:59
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Prima di tutto per "trasformare" una serie di campioni dal dominio dei tempi al dominio delle frequenze questi campioni devono essere veramente tanti, non possono essere solo qualcuno. In pratica, la tua forma d'onda deve essere campionata più volte, maggiori sono le volte che viene campionata e più precisa risulta essere l'analisi. Non ho idea di come funzioni il tuo programmino, quindi non so che altro suggerirti.

Come fa la FFT a scoprire quale frequenza è quale? Il tempo di campionamento e quanti campioni intercorrono tra un evento "coerente" con un'altro.

Leggiti questa roba, studiala, pensaci sopra, non è digeribile in qualche decina di minuti, ti ci vorrà un pò di tempo. L'Alka seltzer, in questo caso non giova.

http://en.wikipedia.org/wiki/Fast_Fourier_transform

http://en.wikipedia.org/wiki/Cooley%E2%80%...y_FFT_algorithm

http://mathworld.wolfram.com/FastFourierTransform.html

Ciao.
 
Web  Top
view post Posted on 11/9/2014, 17:29
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Grazie Law...certo, tu non puoi fare i miracoli, spetta a me capire e studiare, anche se la vedo un po' dura.
Mi bastava capire questo:

CITAZIONE
Per determinare lo spettro del segnale campionato è sufficiente ricordare che al prodotto
algebrico nel tempo corrisponde il prodotto di convoluzione nel dominio della frequenza:

Cerco di decifrare i link... :)
 
Top
view post Posted on 15/9/2014, 09:22
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Ok, in bocca al pupo... :)
 
Web  Top
99 replies since 28/12/2010, 17:38   1846 views
  Share