ginohorn ha scritto:
Ciao e complimenti, hai acceso una luce su un mondo che per molti di noi appassionati, credo, sia buio e sconosciuto. Tutti "sti cavilli" sono complicati da interpretare proprio come dicevi in chiusura.
Esiste un modo per farcelo capire in modo più elementare? saluti gh
Ciao
non ti preoccupare perché moltissime persone che usano e credono di capire la misura di spettro... in realtà capiscono molto meno di quello credono. Cerco di ridurre al minimo.
Per stimare la potenza di un segnale puoi fare due cose:
A. stimarla a partire dalla distribuzione spettrale
B. stimarla in dominio temporale.
In campo audio, quando è possibile, si preferisce la prima, perché oltre a sapere quale è la potenza sai anche come è spalmata sulle varie frequenze. Ma ci sono dei limiti nell'accuratezza con cui si possono stimare queste cose. Vediamo di capire i principali.
Problema 1: se i segnali in gioco sono stazionari (es rumore bianco, rosa etc) tutte e due le cose sono possibili anche se non sempre è possibile andare per la strada A quando si chiedono costanti temporali basse e si richiede precisione in bassa frequenza (vedi esempio sotto).
Problema 2: se i segnali in gioco sono non stazionari, sia A che B diventano entrambi non banali.
Problema 3: seppure i segnali in gioco sono stazionari ma estiste una forte dose di "discretezza" (masse di energie concentrate su singole frequenze), la stima della densità spettrale è possibile solo dopo aver trattato oppurtunamente i segnali in gioco (ad esempio prefiltering con il quale si elimina prima la parte discreta).
Un segnale musicale reale è: non stazionario, quando va bene è stazionario solo localmente, lo spettro ha una forte componente discreta. In particolare la "discretezza" dello spettro è forte alle basse frequenze dove cadono la maggior parte delle fondamentali.
Conclusione 1: indipendentemente dalla costante temporale, la stima dello spettro di un segnale musicale reale è fortemente compromessa da questi aspetti. Se poi cerchiamo di farlo pure con costanti temporali piccole (es 10ms) siamo alla follia. In media la stima che ottieni puo' significare tutto e niente.
Livello di accuratezza prossimo al nulla.
Veniamo ora alla costante temporale. Quello che dico lo puoi replicare pari pari con un software tipo Audacity. Genero un segnale semplicissimo una sinusoide a 30Hz con un potenza di -3dBFS, supponiamo di campionarla a Fs = 192Khz. Ora data Fs quella sinusoide ha bisono di 6400 campioni (ovvero 33.33 ms) per vedere il suo ciclo tutto intero. Supponiamo di generarla molto più lunga tipo 86ms, in 86ms a quella Fs vedi circa 2.5 cicli completi. Uno supporrebbe di avere sufficiente informazione per stimare la distribuzione spettrale di questo elementare segnale. Se tutto funziona devo ottenere uno spettro con un picco a 30Hz e questo picco deve stare a -3dBFS, se quantizziamo a 16bit dovrei avere anche base di rumore di quantizzazione spianato sotto i -96dBFS.
Come primo tentativo cerchiamo di stimare lo spettro con una costante che sia vicino ai 10ms. Quando di parla di FFT bisogna ragionare per potenze del 2. La cosa più vicina a 10ms che possiamo fare è prendere una FFT con una finestra lunga 2048 campioni. Facciamo qualche conto:
2048/fs * 1000 = 10.666ms (costante temporale effettiva)
e
fs/2048 = 93.75Hz (risoluzione in frequenza)
Ora lascia perdere il grafico interpolato (e spesso fuorviante) dello spettro lisciato che ti passa il softwarino di turno. Andiamo ai numeri, ti riporto sotto il calcolo esatto della FFT fatta con una finestra di Hanning lunga 10.666ms:
Hz / dBFS
93.750000 / -3.979503
187.500000 / -22.716452
281.250000 / -36.823544
375.000000 / -45.338596
468.750000 / -51.596729
etc etc
come vedi la FFT parte da 0Hz e ti misura la potenza solo a step di 93.75Hz... esattamente la risoluzione che ti puoi permettere con una costante temporale così bassa. La FFT non
NON PUO' MISURARE NIENTE TRA 0HZ E 93.75HZ, per effetto del leakage ti trovi a misurare una potenza prossima ai -3dBFS a circa 93.75. Questo perché la distorsione indotta dalla bassa costante temporale porta la FFT a spostare la potenza verso la frequenza più prossima ai 30Hz di cui puoi disporre a quella costante temporale.... un disastro.
OK, allora vediamo a quali costanti temporali si inizia a vedere cosa succede. Sullo stesso segnale prendiamo una finestra con 16384 campioni. Facciamo due conti:
16384/Fs * 1000 = 85.33333ms (costante temporale effettiva)
Fs/16384 = 11.71875hz (risoluzione in frequenza)
Ora ti ricalcolo le stime FFT sulle prime frequenze:
Hz / dBFS
11.718750 / -18.965622
23.437500 / -3.735142
35.156250 / -3.034478
46.875000 / -15.823156
58.593750 / -33.702946
etc etc
come vedi lo step tra due frequenze successive è esattamente di 11.71875Hz, che è la risoluzione che mi posso permettere con una costante di 85.33ms. Come vedi adesso i -3dBFS si trovano in un intorno di 35Hz. Sebbene il risultato sia più soddifacente hai ancora troppa energia spalmata sulle frequenze intorno a quella di picco. Per vedere il picco a 30Hz ed intorno il nulla dovresti avere finestre lunghissime e qundi costanti temporali altissime. Il problema di fondo è che stai cercando un picco in una regione dove gli effetti del "Principio di Incertezza" giocano brutti scherzi. Non esiste altro modo di risolvere il trade-off tra risoluzione in frequenza e risoluzione nel tempo.
Conclusione 2: A costanti temporali basse, si paga il prezzo che in bassa frequenza non si vede niente di accurato. Ad esclusione che tu abbia un picco che cade proprio su una delle frequenze della FFT implicate da una data costante temporale. Nel secondo esempio se la sinusoide fosse stata a 35.156250Hz.... il risultato sarebbe stato totalmente diverso!
Più facile di così non riesco proprio a metterla. Mi dispiace.
Buona serata
PdN