Calcolare la durata di un file audio WAV
Un segnale per poter essere ricostruito a partire dai suoi campioni, deve essere campionato con una "frequenza di campionamento" fc pari al doppio della banda del segnale, ossia più precisamente della frequenza più alta contenuta nello spettro del segnale di partenza (Teorema di Nyquist-Shannon). Nel caso di segnali audio avremo:
fc = 2 * 20000 = 40000Hz
(per motivi tecnici i CD vengono campionati con fc = 44000Hz = 44KHz).
Se ad ogni campione associamo n bit, allora abbiamo il "bit-rate" ("Velocità di trasmissione"), che è dato dal prodotto della frequenza di campionamento per la risoluzione del campionamento per il numero dei canali di uscita:
Br = fc * nbit * canali
(nei CD: 16 bit => Br = 44000 * 16bit/secondo * canali)
Quindi se il brano è, ad esempio, mono a 16 bit campionato con frequenza fc e dura T secondi, significa che un lettore CD legge nell'unità di tempo un numero di bit pari a:
numero di bit del brano = T * Br
Indice
Conoscere la durata in secondi di un brano audio
Se conosciamo la dimensione in bit del brano (bit_letti), e vogliamo conoscere la durata in secondi del brano, si usa la formula inversa:
sia se mono che stereo: Tsec = bit_letti / Br
e non resta che calcolare Br in base ai dati disponibili del brano (mono o stereo, frequenza di campionamento, risoluzione di campionamento).
Il calcolo, dunque, è:
Tsec = (dimensione_del_file_in_byte * 8) / Br
La dimensione (ad esempio di un file audio) espressa in byte va moltiplicata per 8, perché - come già detto sopra - si fa riferimento ai bit .
Conoscere in particolare la durata di un file WAV
In particolare, volendo conoscere la durata di un file WAV, è possibile adottare almeno le modalità che qui seguono.
1a modalità
durata = (dimensione_dei_dati_grezzi_in_byte * 8) / (frequenza * nbit * canali)
laddove la variabile frequenza rappresenta la frequenza di campionamento dell'onda audio.
Questa modalità molto precisa prevede, dunque, che per calcolare la durata di un file wav sono necessari:
- quantità dei dati audio grezzi;
- frequenza di campionamento;
- risoluzione di campionamento in bit;
- numero dei canali di uscita.
2a modalità
durata = (dimensione_dei_dati_grezzi_in_byte / ((nbit * canali) / 8)) / frequenza
3a modalità
durata = (dimensione_dei_dati_grezzi_in_byte / block_align) / frequenza
laddove la variabile block_align è data dal valore, espresso in little-endian, del 33° e 34° byte (byte n. 32 e n. 33) del blocco di intestazione del file WAV.
4a modalità
durata = dimensione_dei_dati_grezzi_in_byte / Byte_rate_per_secondo
laddove la variabile Byte_rate_per_secondo è data dal valore, espresso in little-endian, del 29°, 30°, 31° e 32° byte (byte dal n. 28 e n. 31) del blocco di intestazione del file WAV.
Il "Byte_rate_per_secondo" è la quantità di byte processati (ed eseguiti) ogni secondo.
Modalità usando i frames audio scritti ad ogni ciclo
Se dalla funzione, che invia una certa quantità di dati audio al sistema audio, viene ritornato il numero di frames scritti per volta (come avviene per esempio con la funzione snd_pcm_writei() di ALSA), allora è possibile ottenere il tempo trascorso sino a quel momento dall'inizio della esecuzione, così:
somma_frames_finora_ritornati += frames_attualmente_ritornati_dalla_funzione tempo_trascorso = somma_frames_finora_ritornati / frequenza_di_campionamento
Ovviamente la variabile "tempo_trascorso" dovrà essere di un tipo di valore in virgola mobile (Single o Float).
E' possibile riportarli in formato hh:mm:ss,ms:
h = (tempo_trascorso / 3600) m = (tempo_trascorso - (3600 * h)) / 60 Write "\r" & Format(h, "00:") & Format(m, "00:") & Format((tempo_trascorso - (3600 * h) - (m * 60)), "00.000")
oppure:
Write "\r" & CStr(Date(0, 0, 0, 0, 0, 0, tempo_trascorso * 1000))