Autore Topic: Aprire registrazione audio in un array di double  (Letto 869 volte)

Offline bjorn

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy SII
  • Sistema operativo:
    Windows 7/8
Aprire registrazione audio in un array di double
« il: 16 Febbraio 2015, 14:55:37 CET »
0
Ciao a tutti! Ecco il mio problema: ho un file audio registrato con Mediarecorder, e necessito di aprirlo in un array di double per poter applicare delle funzioni (come ad esempio la Trasformata di Fourier). Se apro il file con un InputStream ovviamente ottengo un array di byte grezzi. Come faccio a convertire questi byte in byte?

Grazie a tutti!
« Ultima modifica: 16 Febbraio 2015, 16:15:22 CET da bjorn »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 596
  • Respect: +133
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Aprire registrazione audio in un array di double
« Risposta #1 il: 16 Febbraio 2015, 16:58:52 CET »
0

Puoi caricare 8 byte in un long e poi usare:

Codice (Java): [Seleziona]
Double.longBitsToDouble(long bits);
Post unito: 16 Febbraio 2015, 17:03:40 CET
Ho trovato un metodo migliore:

Codice (Java): [Seleziona]
DataInputStream input = new DataInputStream(serialPort.getInputStream());
double d = input.readDouble();

Fonte: http://stackoverflow.com/a/15179014/466938
« Ultima modifica: 16 Febbraio 2015, 17:03:41 CET da Ohmnibus, Reason: Merged DoublePost »
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline bjorn

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy SII
  • Sistema operativo:
    Windows 7/8
Re:Aprire registrazione audio in un array di double
« Risposta #2 il: 16 Febbraio 2015, 17:20:47 CET »
0
Innanzi tutto grazie per la risposta!
Quello è il codice che già utilizzo,per la precisione :

Codice (Java): [Seleziona]
FileInputStream fin = new FileInputStream(path);
           DataInputStream din = new DataInputStream(fin);

           ArrayList<Double> values = new ArrayList<Double>();
           
           while (din.available()>0)
           {
               values.add(din.readDouble());

           }

ma ottengo una EOF exception, probabilmente perchè la lunghezza del file audio non è un multiplo dei double. Come potrei risolvere?

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Aprire registrazione audio in un array di double
« Risposta #3 il: 16 Febbraio 2015, 17:36:01 CET »
0
In che formato sono i files?
Non basta convertire da byte a double devi prima estrarre la forma d'onda...

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 596
  • Respect: +133
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Aprire registrazione audio in un array di double
« Risposta #4 il: 16 Febbraio 2015, 17:38:26 CET »
0
Non sono sicuro di quale sia il formato del file, ma suppongo che abbia dell'intestazione e/o delle info in coda che non vanno lette come double.

Quello che puoi fare, comunque, è leggere la lunghezza del file prima ancora di aprire lo stream, poi nel ciclo di lettura aumenti un contatore di 8 prima di leggere un double.

Se il contatore supera la dimensione del file esci prematuramente dal ciclo.

Codice (Java): [Seleziona]
           int size = (new File(path)).length();

           FileInputStream fin = new FileInputStream(path);
           DataInputStream din = new DataInputStream(fin);

           ArrayList<Double> values = new ArrayList<Double>();

           int cnt = 8;
           
           while (din.available()>0 && cnt <= size)
           {
               cnt += 8;
               values.add(din.readDouble());

           }
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Aprire registrazione audio in un array di double
« Risposta #5 il: 16 Febbraio 2015, 17:50:21 CET »
0
Non puoi farlo..  già il formato .wav ha un header di circa 40-50 bytes.
Quando arrivi al data chunk può essere 8 o 16 bit, può essere mono o stereo... dai dati grezzi del data chunk non tiri fuori la forma d'onda in double se non parsi l'header.

Devi prima parsare l'header poi leggere il data chunk e a quel punto lo converti a mano a seconda dei bit e dei canali scalandolo su 1..-1.

Se devi applicare un filtro temporale devi sapere anche il sample rate ovviamente un file audio a 44khz viene filtrato diversamente da uno a 8khz.

Se poi il file é mp3 serve una libreria per tirare fuori la forma d'onda.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 596
  • Respect: +133
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Aprire registrazione audio in un array di double
« Risposta #6 il: 16 Febbraio 2015, 17:58:09 CET »
0
Infatti ho scritto:

Non sono sicuro di quale sia il formato del file, ma suppongo che abbia dell'intestazione e/o delle info in coda che non vanno lette come double.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Aprire registrazione audio in un array di double
« Risposta #7 il: 16 Febbraio 2015, 18:40:03 CET »
0
Si era per spiegare il procedimento teorico.  :-)

Offline bjorn

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy SII
  • Sistema operativo:
    Windows 7/8
Re:Aprire registrazione audio in un array di double
« Risposta #8 il: 16 Febbraio 2015, 19:44:59 CET »
0
Eccomi ragazzuoli! Il file è un m4a registrato con il mediarecorder di android, alla frequenza di sampling pari a 44100 e il bitrate a 16. L'encoder audio è AAC. Come posso procedere?

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Aprire registrazione audio in un array di double
« Risposta #9 il: 16 Febbraio 2015, 20:01:46 CET »
0
Non è semplice, devi estrarre la forma d'onda dall'aac.
Ti conviene trovare una libreria o del codice già fatto che converte un file AAC in PCM.

 :-(

Offline bjorn

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy SII
  • Sistema operativo:
    Windows 7/8
Re:Aprire registrazione audio in un array di double
« Risposta #10 il: 16 Febbraio 2015, 20:12:48 CET »
0
Caspita... ma se invece utilizzassi audioRecord invece di mediarecorder la situazione migliorerebbe?

Post unito: 16 Febbraio 2015, 20:34:11 CET
Scusate il repost. Secondo voi la classe http://developer.android.com/reference/android/media/MediaCodec.html potrebbe essermi utile?
« Ultima modifica: 16 Febbraio 2015, 20:34:11 CET da bjorn, Reason: Merged DoublePost »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Aprire registrazione audio in un array di double
« Risposta #11 il: 16 Febbraio 2015, 21:12:33 CET »
0
Tralasciamo il fatto che la lettura raw di un file compresso non ha praticamente senso, AAC è un algoritmo di compressione audio molto sofisticato, non mi risulta che riesce a trattare campioni nel formato double a 64 bit, non esiste al mondo un campionatore audio con una risoluzione del genere, al massimo i file audio possono avere 24 bit se di altissima qualità.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline bjorn

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy SII
  • Sistema operativo:
    Windows 7/8
Re:Aprire registrazione audio in un array di double
« Risposta #12 il: 16 Febbraio 2015, 21:21:40 CET »
0
Il fatto è che dovrei applicare la FFT su questo file audio. Se AAC è tutto sto casino,in che formato posso registrare il file? Calcola che la registrazione la effettuo tramite smartphone con mediarecorder!

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Aprire registrazione audio in un array di double
« Risposta #13 il: 16 Febbraio 2015, 21:24:07 CET »
0
non esiste al mondo un campionatore audio con una risoluzione del genere, al massimo i file audio possono avere 24 bit se di altissima qualità.
Infatti l'unico modo per venirne a capo è estrarre la forma d'onda. Una volta che sa quanti canali e quanti bit e ha un array di dati grezzi se li converte/scala a piacimento.

Offline bjorn

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy SII
  • Sistema operativo:
    Windows 7/8
Re:Aprire registrazione audio in un array di double
« Risposta #14 il: 16 Febbraio 2015, 21:47:43 CET »
0
Infatti l'unico modo per venirne a capo è estrarre la forma d'onda. Una volta che sa quanti canali e quanti bit e ha un array di dati grezzi se li converte/scala a piacimento.
Credo che MediaExtractor estrae tutte le info che citi (bit e canali), quindi credo che devo utilizzare quello!