2009-10-16 18 views
6

Ciao Ho bisogno di downsampling una frequenza di campionamento di un file audio wav da 44.1kHz a 8kHz. Devo fare tutto il lavoro manualmente con un array di byte ... è per scopi accademici.Java - file audio wav di downsampling

Attualmente sto usando 2 classi, Sink e Source, per pop e push array di byte. Tutto va bene fino a quando non raggiungo la parte in cui ho bisogno di eseguire il downsampling del blocco dati utilizzando un'interpolazione lineare.

Poiché eseguo il downsampling da 44100 a 8000 Hz, come faccio a interpolare un array di byte contenente qualcosa come 128 000 000 byte? In questo momento sto spuntando 5, 6 o 7 byte a seconda di i% 2 == 0, i% 2 == 1 e i% 80 == 0 e spingo la media di questi 5, 6 o 7 byte nel nuovo file .

Il risultato è effettivamente un file audio più piccolo dell'originale ma non può essere riprodotto su Windows Media Player (si dice che c'è un errore durante la lettura del file) e c'è molto rumore anche se riesco a sentire la traccia giusta dietro il rumore.

Quindi, per riassumere, ho bisogno di aiuto per quanto riguarda la parte di interpolazione lineare. Grazie in anticipo.

+0

Sarà più facile per noi aiutare a trovare i bug se pubblichi il codice che stai utilizzando ora. –

risposta

7

Penso che non dovresti usare la media di quei campioni in quanto sarebbe un filtro mediano, non esattamente sottocampionamento. Usa solo ogni 5 °/6 °/7 ° campione e scrivilo nel nuovo file.

Questo probabilmente avrà alcuni artefatti di aliasing ma potrebbe essere nel complesso riconoscibile.

Un'altra soluzione più complessa ma probabilmente con risultati migliori, in termini di qualità, sarebbe in primo luogo convertire i campioni in una distribuzione di frequenza utilizzando un FFT o DFT e quindi riconvertirli con la frequenza di campionamento appropriata. È passato un po 'di tempo da quando ho fatto una cosa del genere ma è sicuramente fattibile. Potresti aver bisogno di giocherellare un po 'per farlo funzionare correttamente, però.

Anche quando non si utilizza un FT dell'array completo ma piuttosto in segmenti si ha il problema dei limiti del segmento pari a 0. Alcuni anni fa, quando ho giocato con quelle cose, non ho trovato una soluzione valida per questo (dal momento che genera anche gli artefatti) ma probabilmente ce n'è uno se leggete i libri giusti :-)

Come per WMP che si lamenta del file: ha fatto modificare l'intestazione che si scrive di conseguenza, giusto?

+0

La media è probabilmente una cattiva idea sì. Potresti solo eseguire l'upsample e poi ridurlo se vuoi meno artefatti di quelli che otterresti solo con i campioni di cherry-picking. –

+2

Woah! Grazie mille "Basta usare ogni 5 °/6 °/7 ° campione e scriverlo nel nuovo file" è proprio ciò che ha corretto il mio intero problema! Non posso credere di aver passato ore su questo mentre ci sono voluti esattamente 2 minuti per scriverlo! Grazie ancora! –

+1

Prego :-) Se ci pensate, la media è una pessima idea. La forma complessiva completa della forma d'onda viene persa. E questo è quello che per noi è importante sentire qualcosa di sensato :) – Joey